Merge remote-tracking branch 'origin/bug_747_cancel_waiting_tasks'
[enigma2.git] / lib / python / Plugins / SystemPlugins / WirelessLan / Wlan.py
old mode 100644 (file)
new mode 100755 (executable)
index e69de29..a185157
@@ -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()