X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/dea2fe0418b7e3761ff8f7a1f59e4066b3ed2cc8..80c9ad7d8d0e709d8bed740481b46ff23654fcaa:/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py old mode 100644 new mode 100755 index e69de29b..a1851579 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py @@ -0,0 +1,371 @@ +from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword +from Components.Console import Console +from Components.Network import iNetwork + +from os import system, path as os_path +from string import maketrans, strip +import sys +import types +from re import compile as re_compile, search as re_search, escape as re_escape +from pythonwifi.iwlibs import getNICnames, Wireless, Iwfreq, getWNICnames +from pythonwifi import flags as wififlags + +list = [] +list.append("Unencrypted") +list.append("WEP") +list.append("WPA") +list.append("WPA/WPA2") +list.append("WPA2") + +weplist = [] +weplist.append("ASCII") +weplist.append("HEX") + +config.plugins.wlan = ConfigSubsection() +config.plugins.wlan.essid = NoSave(ConfigText(default = "", fixed_size = False)) +config.plugins.wlan.hiddenessid = NoSave(ConfigYesNo(default = False)) +config.plugins.wlan.encryption = NoSave(ConfigSelection(list, default = "WPA2")) +config.plugins.wlan.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) +config.plugins.wlan.psk = NoSave(ConfigPassword(default = "", fixed_size = False)) + + +def getWlanConfigName(iface): + return '/etc/wpa_supplicant.' + iface + '.conf' + +class Wlan: + def __init__(self, iface = None): + self.iface = iface + self.oldInterfaceState = None + + a = ''; b = '' + for i in range(0, 255): + a = a + chr(i) + if i < 32 or i > 127: + b = b + ' ' + else: + b = b + chr(i) + + self.asciitrans = maketrans(a, b) + + def asciify(self, str): + return str.translate(self.asciitrans) + + def getWirelessInterfaces(self): + return getWNICnames() + + def setInterface(self, iface = None): + self.iface = iface + + def getInterface(self): + return self.iface + + def getNetworkList(self): + if self.oldInterfaceState is None: + self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") + if self.oldInterfaceState is False: + if iNetwork.getAdapterAttribute(self.iface, "up") is False: + iNetwork.setAdapterAttribute(self.iface, "up", True) + system("ifconfig "+self.iface+" up") + + ifobj = Wireless(self.iface) # a Wireless NIC Object + + try: + scanresults = ifobj.scan() + except: + scanresults = None + print "[Wlan.py] No wireless networks could be found" + aps = {} + if scanresults is not None: + (num_channels, frequencies) = ifobj.getChannelInfo() + index = 1 + for result in scanresults: + bssid = result.bssid + + if result.encode.flags & wififlags.IW_ENCODE_DISABLED > 0: + encryption = False + elif result.encode.flags & wififlags.IW_ENCODE_NOKEY > 0: + encryption = True + else: + encryption = None + + signal = str(result.quality.siglevel-0x100) + " dBm" + quality = "%s/%s" % (result.quality.quality,ifobj.getQualityMax().quality) + + extra = [] + for element in result.custom: + element = element.encode() + extra.append( strip(self.asciify(element)) ) + for element in extra: + if 'SignalStrength' in element: + signal = element[element.index('SignalStrength')+15:element.index(',L')] + if 'LinkQuality' in element: + quality = element[element.index('LinkQuality')+12:len(element)] + + aps[bssid] = { + 'active' : True, + 'bssid': result.bssid, + 'channel': frequencies.index(ifobj._formatFrequency(result.frequency.getFrequency())) + 1, + 'encrypted': encryption, + 'essid': strip(self.asciify(result.essid)), + 'iface': self.iface, + 'maxrate' : ifobj._formatBitrate(result.rate[-1][-1]), + 'noise' : '',#result.quality.nlevel-0x100, + 'quality' : str(quality), + 'signal' : str(signal), + 'custom' : extra, + } + + index = index + 1 + return aps + + def stopGetNetworkList(self): + if self.oldInterfaceState is not None: + if self.oldInterfaceState is False: + iNetwork.setAdapterAttribute(self.iface, "up", False) + system("ifconfig "+self.iface+" down") + self.oldInterfaceState = None + self.iface = None + +iWlan = Wlan() + +class wpaSupplicant: + def __init__(self): + pass + + def writeConfig(self, iface): + essid = config.plugins.wlan.essid.value + hiddenessid = config.plugins.wlan.hiddenessid.value + encryption = config.plugins.wlan.encryption.value + wepkeytype = config.plugins.wlan.wepkeytype.value + psk = config.plugins.wlan.psk.value + fp = file(getWlanConfigName(iface), 'w') + fp.write('#WPA Supplicant Configuration by enigma2\n') + fp.write('ctrl_interface=/var/run/wpa_supplicant\n') + fp.write('eapol_version=1\n') + fp.write('fast_reauth=1\n') + + if hiddenessid: + fp.write('ap_scan=2\n') + else: + fp.write('ap_scan=1\n') + fp.write('network={\n') + fp.write('\tssid="'+essid+'"\n') + fp.write('\tscan_ssid=0\n') + if encryption in ('WPA', 'WPA2', 'WPA/WPA2'): + fp.write('\tkey_mgmt=WPA-PSK\n') + if encryption == 'WPA': + fp.write('\tproto=WPA\n') + fp.write('\tpairwise=TKIP\n') + fp.write('\tgroup=TKIP\n') + elif encryption == 'WPA2': + fp.write('\tproto=RSN\n') + fp.write('\tpairwise=CCMP\n') + fp.write('\tgroup=CCMP\n') + else: + fp.write('\tproto=WPA RSN\n') + fp.write('\tpairwise=CCMP TKIP\n') + fp.write('\tgroup=CCMP TKIP\n') + fp.write('\tpsk="'+psk+'"\n') + elif encryption == 'WEP': + fp.write('\tkey_mgmt=NONE\n') + if wepkeytype == 'ASCII': + fp.write('\twep_key0="'+psk+'"\n') + else: + fp.write('\twep_key0='+psk+'\n') + else: + fp.write('\tkey_mgmt=NONE\n') + fp.write('}') + fp.write('\n') + fp.close() + #system('cat ' + getWlanConfigName(iface)) + + def loadConfig(self,iface): + configfile = getWlanConfigName(iface) + if not os_path.exists(configfile): + configfile = '/etc/wpa_supplicant.conf' + try: + #parse the wpasupplicant configfile + print "[Wlan.py] parsing configfile: ",configfile + fp = file(configfile, 'r') + supplicant = fp.readlines() + fp.close() + essid = None + encryption = "Unencrypted" + + for s in supplicant: + split = s.strip().split('=',1) + if split[0] == 'ap_scan': + if split[1] == '2': + config.plugins.wlan.hiddenessid.value = True + else: + config.plugins.wlan.hiddenessid.value = False + + elif split[0] == 'ssid': + essid = split[1][1:-1] + config.plugins.wlan.essid.value = essid + + elif split[0] == 'proto': + if split[1] == 'WPA' : + mode = 'WPA' + if split[1] == 'RSN': + mode = 'WPA2' + if split[1] in ('WPA RSN', 'WPA WPA2'): + mode = 'WPA/WPA2' + encryption = mode + + elif split[0] == 'wep_key0': + encryption = 'WEP' + if split[1].startswith('"') and split[1].endswith('"'): + config.plugins.wlan.wepkeytype.value = 'ASCII' + config.plugins.wlan.psk.value = split[1][1:-1] + else: + config.plugins.wlan.wepkeytype.value = 'HEX' + config.plugins.wlan.psk.value = split[1] + + elif split[0] == 'psk': + config.plugins.wlan.psk.value = split[1][1:-1] + else: + pass + + config.plugins.wlan.encryption.value = encryption + + wsconfig = { + 'hiddenessid': config.plugins.wlan.hiddenessid.value, + 'ssid': config.plugins.wlan.essid.value, + 'encryption': config.plugins.wlan.encryption.value, + 'wepkeytype': config.plugins.wlan.wepkeytype.value, + 'key': config.plugins.wlan.psk.value, + } + + for (key, item) in wsconfig.items(): + if item is "None" or item is "": + if key == 'hiddenessid': + wsconfig['hiddenessid'] = False + if key == 'ssid': + wsconfig['ssid'] = "" + if key == 'encryption': + wsconfig['encryption'] = "WPA2" + if key == 'wepkeytype': + wsconfig['wepkeytype'] = "ASCII" + if key == 'key': + wsconfig['key'] = "" + except: + print "[Wlan.py] Error parsing ",configfile + wsconfig = { + 'hiddenessid': False, + 'ssid': "", + 'encryption': "WPA2", + 'wepkeytype': "ASCII", + 'key': "", + } + #print "[Wlan.py] WS-CONFIG-->",wsconfig + return wsconfig + + +class Status: + def __init__(self): + self.wlaniface = {} + self.backupwlaniface = {} + self.statusCallback = None + self.WlanConsole = Console() + + def stopWlanConsole(self): + if self.WlanConsole is not None: + print "[iStatus] killing self.WlanConsole" + self.WlanConsole.killAll() + self.WlanConsole = None + + def getDataForInterface(self, iface, callback = None): + self.WlanConsole = Console() + cmd = "iwconfig " + iface + if callback is not None: + self.statusCallback = callback + self.WlanConsole.ePopen(cmd, self.iwconfigFinished, iface) + + def iwconfigFinished(self, result, retval, extra_args): + iface = extra_args + data = { 'essid': False, 'frequency': False, 'accesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False } + for line in result.splitlines(): + line = line.strip() + if "ESSID" in line: + if "off/any" in line: + ssid = "off" + else: + if "Nickname" in line: + ssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) + else: + ssid=(line[line.index('ESSID')+7:len(line)-1]) + if ssid is not None: + data['essid'] = ssid + if "Frequency" in line: + frequency = line[line.index('Frequency')+10 :line.index(' GHz')] + if frequency is not None: + data['frequency'] = frequency + if "Access Point" in line: + if "Sensitivity" in line: + ap=line[line.index('Access Point')+14:line.index(' Sensitivity')] + else: + ap=line[line.index('Access Point')+14:len(line)] + if ap is not None: + data['accesspoint'] = ap + if "Bit Rate" in line: + if "kb" in line: + br = line[line.index('Bit Rate')+9 :line.index(' kb/s')] + else: + br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + if br is not None: + data['bitrate'] = br + if "Encryption key" in line: + if ":off" in line: + enc = "off" + elif "Security" in line: + enc = line[line.index('Encryption key')+15 :line.index(' Security')] + if enc is not None: + enc = "on" + else: + enc = line[line.index('Encryption key')+15 :len(line)] + if enc is not None: + enc = "on" + if enc is not None: + data['encryption'] = enc + if 'Quality' in line: + if "/100" in line: + qual = line[line.index('Quality')+8:line.index(' Signal')] + else: + qual = line[line.index('Quality')+8:line.index('Sig')] + if qual is not None: + data['quality'] = qual + if 'Signal level' in line: + if "dBm" in line: + signal = line[line.index('Signal level')+13 :line.index(' dBm')] + " dBm" + elif "/100" in line: + if "Noise" in line: + signal = line[line.index('Signal level')+13:line.index(' Noise')] + else: + signal = line[line.index('Signal level')+13:len(line)] + else: + if "Noise" in line: + signal = line[line.index('Signal level')+13:line.index(' Noise')] + else: + signal = line[line.index('Signal level')+13:len(line)] + if signal is not None: + data['signal'] = signal + + self.wlaniface[iface] = data + self.backupwlaniface = self.wlaniface + + if self.WlanConsole is not None: + if len(self.WlanConsole.appContainers) == 0: + print "[Wlan.py] self.wlaniface after loading:", self.wlaniface + if self.statusCallback is not None: + self.statusCallback(True,self.wlaniface) + self.statusCallback = None + + def getAdapterAttribute(self, iface, attribute): + self.iface = iface + if self.wlaniface.has_key(self.iface): + if self.wlaniface[self.iface].has_key(attribute): + return self.wlaniface[self.iface][attribute] + return None + +iStatus = Status()