X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/59f769f0eaf89c090a18c780f626a6ff0df3a016..HEAD:/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 index baefd435..a1851579 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py @@ -1,36 +1,42 @@ 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 +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 +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("WPA2") 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 = "home", fixed_size = False)) -config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False)) +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)) + -config.plugins.wlan.encryption = ConfigSubsection() -config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = True)) -config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2")) -config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) -config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False)) +def getWlanConfigName(iface): + return '/etc/wpa_supplicant.' + iface + '.conf' class Wlan: - def __init__(self, iface): + def __init__(self, iface = None): + self.iface = iface + self.oldInterfaceState = None + a = ''; b = '' for i in range(0, 255): a = a + chr(i) @@ -39,135 +45,37 @@ class Wlan: else: b = b + chr(i) - self.iface = iface - self.wlaniface = {} - self.WlanConsole = Console() self.asciitrans = maketrans(a, b) - def stopWlanConsole(self): - if self.WlanConsole is not None: - print "killing self.WlanConsole" - self.WlanConsole = None - del self.WlanConsole - - def getDataForInterface(self, callback = None): - #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. - print "self.iface im getDataForInterface",self.iface - if len(self.WlanConsole.appContainers) == 0: - self.WlanConsole = Console() - cmd = "iwconfig " + self.iface - self.WlanConsole.ePopen(cmd, self.iwconfigFinished, callback) - - def iwconfigFinished(self, result, retval, extra_args): - print "self.iface im iwconfigFinished",self.iface - callback = extra_args - data = { 'essid': False, 'frequency': False, 'acesspoint': 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 = _("No Connection") - else: - if "Nickname" in line: - tmpssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid - else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid - - 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: - ap=line[line.index('Access Point')+14:len(line)-1] - if ap is not None: - data['acesspoint'] = ap - if "Bit Rate" in line: - 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 = _("Disabled") - else: - enc = line[line.index('Encryption key')+15 :line.index(' Security')] - if enc is not None: - data['encryption'] = _("Enabled") - if 'Quality' in line: - if "/100" in line: - qual = line[line.index('Quality')+8:line.index('/100')] - else: - qual = line[line.index('Quality')+8:line.index('Sig')] - if qual is not None: - data['quality'] = qual - if 'Signal level' in line: - signal = line[line.index('Signal level')+13 :line.index(' dBm')] - if signal is not None: - data['signal'] = signal - - self.wlaniface[self.iface] = data - - if len(self.WlanConsole.appContainers) == 0: - print "self.wlaniface after loading:", self.wlaniface - self.WlanConsole = None - if callback is not None: - callback(True,self.wlaniface) - - def getAdapterAttribute(self, attribute): - if self.wlaniface.has_key(self.iface): - print "self.wlaniface.has_key",self.iface - if self.wlaniface[self.iface].has_key(attribute): - return self.wlaniface[self.iface][attribute] - return None - def asciify(self, str): return str.translate(self.asciitrans) - def getWirelessInterfaces(self): - device = re_compile('[a-z]{2,}[0-9]*:') - ifnames = [] + return getWNICnames() + + def setInterface(self, iface = None): + self.iface = iface - fp = open('/proc/net/wireless', 'r') - for line in fp: - try: - # append matching pattern, without the trailing colon - ifnames.append(device.search(line).group()[:-1]) - except AttributeError: - pass - return ifnames + def getInterface(self): + return self.iface - def getNetworkList(self): - system("ifconfig "+self.iface+" up") + 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 - - #Association mappings - #stats, quality, discard, missed_beacon = ifobj.getStatistics() - #snr = quality.signallevel - quality.noiselevel try: scanresults = ifobj.scan() except: scanresults = None - print "[Wlan.py] No Wireless Networks could be found" - + print "[Wlan.py] No wireless networks could be found" + aps = {} if scanresults is not None: - aps = {} (num_channels, frequencies) = ifobj.getChannelInfo() index = 1 for result in scanresults: @@ -188,7 +96,6 @@ class Wlan: element = element.encode() extra.append( strip(self.asciify(element)) ) for element in extra: - print element if 'SignalStrength' in element: signal = element[element.index('SignalStrength')+15:element.index(',L')] if 'LinkQuality' in element: @@ -207,277 +114,222 @@ class Wlan: 'signal' : str(signal), 'custom' : extra, } - #print "GOT APS ENTRY:",aps[bssid] - index = index + 1 - return aps + index = index + 1 + return aps - def getStatus(self): - ifobj = Wireless(self.iface) - fq = Iwfreq() - try: - self.channel = str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))) - except: - self.channel = 0 - status = { - 'BSSID': str(ifobj.getAPaddr()), #ifobj.getStatistics() - 'ESSID': str(ifobj.getEssid()), - 'quality': "%s/%s" % (ifobj.getStatistics()[1].quality,ifobj.getQualityMax().quality), - 'signal': str(ifobj.getStatistics()[1].siglevel-0x100) + " dBm", - 'bitrate': str(ifobj.getBitrate()), - 'channel': str(self.channel), - #'channel': str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))), - } - - for (key, item) in status.items(): - if item is "None" or item is "": - status[key] = _("N/A") - - return status + 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): - - essid = config.plugins.wlan.essid.value - hiddenessid = config.plugins.wlan.hiddenessid.value - encrypted = config.plugins.wlan.encryption.enabled.value - encryption = config.plugins.wlan.encryption.type.value - wepkeytype = config.plugins.wlan.encryption.wepkeytype.value - psk = config.plugins.wlan.encryption.psk.value - fp = file('/etc/wpa_supplicant.conf', '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 essid == 'hidden...': - fp.write('ap_scan=2\n') + 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('ap_scan=1\n') - fp.write('network={\n') - if essid == 'hidden...': - fp.write('\tssid="'+hiddenessid+'"\n') + 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('\tssid="'+essid+'"\n') - fp.write('\tscan_ssid=0\n') - if encrypted: - if encryption == 'WPA' or encryption == 'WPA2' or encryption == '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=WPA RSN\n') - fp.write('\tpairwise=CCMP TKIP\n') - fp.write('\tgroup=CCMP TKIP\n') - else: - fp.write('\tproto=WPA WPA2\n') - fp.write('\tpairwise=CCMP\n') - fp.write('\tgroup=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 /etc/wpa_supplicant.conf") + 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): + def loadConfig(self,iface): + configfile = getWlanConfigName(iface) + if not os_path.exists(configfile): + configfile = '/etc/wpa_supplicant.conf' try: #parse the wpasupplicant configfile - fp = file('/etc/wpa_supplicant.conf', 'r') + print "[Wlan.py] parsing configfile: ",configfile + fp = file(configfile, 'r') supplicant = fp.readlines() fp.close() - ap_scan = False essid = None + encryption = "Unencrypted" for s in supplicant: split = s.strip().split('=',1) if split[0] == 'ap_scan': - print "[Wlan.py] Got Hidden SSID Scan Value "+split[1] if split[1] == '2': - ap_scan = True + config.plugins.wlan.hiddenessid.value = True else: - ap_scan = False - + config.plugins.wlan.hiddenessid.value = False + elif split[0] == 'ssid': - print "[Wlan.py] Got SSID "+split[1][1:-1] essid = split[1][1:-1] - + config.plugins.wlan.essid.value = essid + elif split[0] == 'proto': - config.plugins.wlan.encryption.enabled.value = True - if split[1] == "WPA" : + if split[1] == 'WPA' : mode = 'WPA' - if split[1] == "WPA WPA2" : - mode = 'WPA/WPA2' - if split[1] == "WPA RSN" : + if split[1] == 'RSN': mode = 'WPA2' - config.plugins.wlan.encryption.type.value = mode - print "[Wlan.py] Got Encryption: "+mode - - #currently unused ! - #elif split[0] == 'key_mgmt': - # print "split[1]",split[1] - # if split[1] == "WPA-PSK" : - # config.plugins.wlan.encryption.enabled.value = True - # config.plugins.wlan.encryption.type.value = "WPA/WPA2" - # print "[Wlan.py] Got Encryption: "+ config.plugins.wlan.encryption.type.value + if split[1] in ('WPA RSN', 'WPA WPA2'): + mode = 'WPA/WPA2' + encryption = mode elif split[0] == 'wep_key0': - config.plugins.wlan.encryption.enabled.value = True - config.plugins.wlan.encryption.type.value = 'WEP' + encryption = 'WEP' if split[1].startswith('"') and split[1].endswith('"'): - config.plugins.wlan.encryption.wepkeytype.value = 'ASCII' - config.plugins.wlan.encryption.psk.value = split[1][1:-1] + config.plugins.wlan.wepkeytype.value = 'ASCII' + config.plugins.wlan.psk.value = split[1][1:-1] else: - config.plugins.wlan.encryption.wepkeytype.value = 'HEX' - config.plugins.wlan.encryption.psk.value = split[1] + config.plugins.wlan.wepkeytype.value = 'HEX' + config.plugins.wlan.psk.value = split[1] elif split[0] == 'psk': - config.plugins.wlan.encryption.psk.value = split[1][1:-1] + config.plugins.wlan.psk.value = split[1][1:-1] else: pass + + config.plugins.wlan.encryption.value = encryption - if ap_scan is True: - config.plugins.wlan.hiddenessid.value = essid - config.plugins.wlan.essid.value = 'hidden...' - else: - config.plugins.wlan.hiddenessid.value = essid - config.plugins.wlan.essid.value = essid wsconfig = { 'hiddenessid': config.plugins.wlan.hiddenessid.value, 'ssid': config.plugins.wlan.essid.value, - 'encryption': config.plugins.wlan.encryption.enabled.value, - 'encryption_type': config.plugins.wlan.encryption.type.value, - 'encryption_wepkeytype': config.plugins.wlan.encryption.wepkeytype.value, - 'key': config.plugins.wlan.encryption.psk.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'] = "home" + wsconfig['hiddenessid'] = False if key == 'ssid': - wsconfig['ssid'] = "home" + wsconfig['ssid'] = "" if key == 'encryption': - wsconfig['encryption'] = True - if key == 'encryption': - wsconfig['encryption_type'] = "WPA/WPA2" - if key == 'encryption': - wsconfig['encryption_wepkeytype'] = "ASCII" - if key == 'encryption': - wsconfig['key'] = "mysecurewlan" - + wsconfig['encryption'] = "WPA2" + if key == 'wepkeytype': + wsconfig['wepkeytype'] = "ASCII" + if key == 'key': + wsconfig['key'] = "" except: - print "[Wlan.py] Error parsing /etc/wpa_supplicant.conf" + print "[Wlan.py] Error parsing ",configfile wsconfig = { - 'hiddenessid': "home", - 'ssid': "home", - 'encryption': True, - 'encryption_type': "WPA/WPA2", - 'encryption_wepkeytype': "ASCII", - 'key': "mysecurewlan", + 'hiddenessid': False, + 'ssid': "", + 'encryption': "WPA2", + 'wepkeytype': "ASCII", + 'key': "", } - print "[Wlan.py] WS-CONFIG-->",wsconfig + #print "[Wlan.py] WS-CONFIG-->",wsconfig return wsconfig - - def restart(self, iface): - system("start-stop-daemon -K -x /usr/sbin/wpa_supplicant") - system("start-stop-daemon -S -x /usr/sbin/wpa_supplicant -- -B -i"+iface+" -c/etc/wpa_supplicant.conf") 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 "killing self.WlanConsole" + print "[iStatus] killing self.WlanConsole" + self.WlanConsole.killAll() self.WlanConsole = None def getDataForInterface(self, iface, callback = None): self.WlanConsole = Console() cmd = "iwconfig " + iface - self.WlanConsole.ePopen(cmd, self.iwconfigFinished, [iface, callback]) + if callback is not None: + self.statusCallback = callback + self.WlanConsole.ePopen(cmd, self.iwconfigFinished, iface) def iwconfigFinished(self, result, retval, extra_args): - (iface, callback) = extra_args - data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False } + 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 = _("No Connection") + ssid = "off" else: if "Nickname" in line: - tmpssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid + ssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid + ssid=(line[line.index('ESSID')+7:len(line)-1]) if ssid is not None: data['essid'] = ssid - if 'Frequency' in line: + 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: - ap=line[line.index('Access Point')+14:len(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['acesspoint'] = ap - if ap == "Not-Associated": - data['essid'] = _("No Connection") + data['accesspoint'] = ap if "Bit Rate" in line: if "kb" in line: br = line[line.index('Bit Rate')+9 :line.index(' kb/s')] - if br == '0': - br = _("Unsupported") - else: - br += " Mb/s" else: - br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + " Mb/s" + 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 "Encryption key" in line: if ":off" in line: - if data['acesspoint'] is not "Not-Associated": - enc = _("Unsupported") - else: - enc = _("Disabled") - else: + enc = "off" + elif "Security" in line: enc = line[line.index('Encryption key')+15 :line.index(' Security')] if enc is not None: - enc = _("Enabled") + 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('/100')] qual = line[line.index('Quality')+8:line.index(' Signal')] else: qual = line[line.index('Quality')+8:line.index('Sig')] @@ -485,8 +337,7 @@ class Status: data['quality'] = qual if 'Signal level' in line: if "dBm" in line: - signal = line[line.index('Signal level')+13 :line.index(' dBm')] - signal += " dBm" + 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')] @@ -505,9 +356,10 @@ class Status: if self.WlanConsole is not None: if len(self.WlanConsole.appContainers) == 0: - print "self.wlaniface after loading:", self.wlaniface - if callback is not None: - callback(True,self.wlaniface) + 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