from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword from Components.Console import Console from os import system from string import maketrans, strip import sys import types from re import compile as re_compile, search as re_search from pythonwifi.iwlibs import getNICnames, Wireless, Iwfreq, getWNICnames from pythonwifi import flags as wififlags list = [] list.append("WEP") list.append("WPA") list.append("WPA2") list.append("WPA/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.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)) class Wlan: def __init__(self, iface): 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.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 = [] 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 getNetworkList(self): 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" if scanresults is not None: aps = {} (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: print element 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, } #print "GOT APS ENTRY:",aps[bssid] 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 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') else: fp.write('ap_scan=1\n') fp.write('network={\n') if essid == 'hidden...': fp.write('\tssid="'+hiddenessid+'"\n') else: fp.write('\tssid="'+essid+'"\n') fp.write('\tscan_ssid=0\n') if encrypted: 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 /etc/wpa_supplicant.conf") def loadConfig(self): try: #parse the wpasupplicant configfile fp = file('/etc/wpa_supplicant.conf', 'r') supplicant = fp.readlines() fp.close() ap_scan = False essid = None 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 else: ap_scan = False elif split[0] == 'ssid': print "[Wlan.py] Got SSID "+split[1][1:-1] essid = split[1][1:-1] elif split[0] == 'proto': config.plugins.wlan.encryption.enabled.value = True if split[1] == 'WPA' : mode = 'WPA' if split[1] == 'RSN': mode = 'WPA2' if split[1] in ('WPA RSN', 'WPA WPA2'): mode = 'WPA/WPA2' config.plugins.wlan.encryption.type.value = mode print "[Wlan.py] Got Encryption: "+mode elif split[0] == 'wep_key0': config.plugins.wlan.encryption.enabled.value = True config.plugins.wlan.encryption.type.value = '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] else: config.plugins.wlan.encryption.wepkeytype.value = 'HEX' config.plugins.wlan.encryption.psk.value = split[1] elif split[0] == 'psk': config.plugins.wlan.encryption.psk.value = split[1][1:-1] else: pass 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, } for (key, item) in wsconfig.items(): if item is "None" or item is "": if key == 'hiddenessid': wsconfig['hiddenessid'] = "home" if key == 'ssid': wsconfig['ssid'] = "home" 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" except: print "[Wlan.py] Error parsing /etc/wpa_supplicant.conf" wsconfig = { 'hiddenessid': "home", 'ssid': "home", 'encryption': True, 'encryption_type': "WPA/WPA2", 'encryption_wepkeytype': "ASCII", 'key': "mysecurewlan", } print "[Wlan.py] WS-CONFIG-->",wsconfig return wsconfig class Status: def __init__(self): self.wlaniface = {} self.backupwlaniface = {} self.WlanConsole = Console() def stopWlanConsole(self): if self.WlanConsole is not None: print "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]) 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 } 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)] if ap is not None: data['acesspoint'] = ap if ap == "Not-Associated": data['essid'] = _("No Connection") 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" if br is not None: data['bitrate'] = br if 'Encryption key' in line: if ":off" in line: if data['acesspoint'] is not "Not-Associated": enc = _("Unsupported") else: enc = _("Disabled") else: enc = line[line.index('Encryption key')+15 :line.index(' Security')] if enc is not None: enc = _("Enabled") 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')] 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')] signal += " 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 "self.wlaniface after loading:", self.wlaniface if callback is not None: callback(True,self.wlaniface) 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()