diff options
| author | acid-burn <acid-burn@opendreambox.org> | 2010-10-05 12:57:56 +0200 |
|---|---|---|
| committer | acid-burn <acid-burn@opendreambox.org> | 2010-10-05 12:57:56 +0200 |
| commit | b6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901 (patch) | |
| tree | 5d6fa8fb417a3ec0c90a6a1f068ef883f630495c /lib/python/Plugins | |
| parent | e2be31452f7c2d90fa7008583f36d6a6583cc83a (diff) | |
| parent | 996081f3ac0b17e0609fb74b11db49112eeec43e (diff) | |
| download | enigma2-b6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901.tar.gz enigma2-b6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901.zip | |
Merge commit 'origin/bug_558_wlanfixes'
Conflicts:
lib/python/Components/Network.py
Diffstat (limited to 'lib/python/Plugins')
6 files changed, 157 insertions, 1319 deletions
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py index 6096ca8b..d7e83072 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py @@ -257,7 +257,7 @@ class NetworkWizard(WizardLanguage, Rc): text1 = _("Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\n") text2 = _('Accesspoint:') + "\t" + str(status[self.selectedInterface]["acesspoint"]) + "\n" text3 = _('SSID:') + "\t" + str(status[self.selectedInterface]["essid"]) + "\n" - text4 = _('Link Quality:') + "\t" + str(status[self.selectedInterface]["quality"])+"%" + "\n" + text4 = _('Link Quality:') + "\t" + str(status[self.selectedInterface]["quality"])+ "\n" text5 = _('Signal Strength:') + "\t" + str(status[self.selectedInterface]["signal"]) + "\n" text6 = _('Bitrate:') + "\t" + str(status[self.selectedInterface]["bitrate"]) + "\n" text7 = _('Encryption:') + " " + str(status[self.selectedInterface]["encryption"]) + "\n" @@ -421,3 +421,4 @@ class NetworkWizard(WizardLanguage, Rc): def ChoicesSelectionMoved(self): pass + diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am index 2f362379..bdc1a884 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am @@ -4,8 +4,6 @@ SUBDIRS = meta install_PYTHON = \ __init__.py \ - flags.py \ - iwlibs.py \ plugin.py \ Wlan.py diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py index 1c1471ce..baefd435 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py @@ -1,7 +1,3 @@ -#from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER -#from Components.MultiContent import MultiContentEntryText -#from Components.GUIComponent import GUIComponent -#from Components.HTMLComponent import HTMLComponent from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword from Components.Console import Console @@ -10,7 +6,8 @@ from string import maketrans, strip import sys import types from re import compile as re_compile, search as re_search -from iwlibs import getNICnames, Wireless, Iwfreq +from pythonwifi.iwlibs import getNICnames, Wireless, Iwfreq, getWNICnames +from pythonwifi import flags as wififlags list = [] list.append("WEP") @@ -65,38 +62,42 @@ class Wlan: 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 } - #print "result im iwconfigFinished",result for line in result.splitlines(): - #print "line",line line = line.strip() if "ESSID" in line: if "off/any" in line: ssid = _("No Connection") else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") + 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: - ssid = tmpssid - #print "SSID->",ssid + 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')] - #print "Frequency",frequency if frequency is not None: data['frequency'] = frequency if "Access Point" in line: ap=line[line.index('Access Point')+14:len(line)-1] - #print "AP",ap if ap is not None: data['acesspoint'] = ap if "Bit Rate" in line: br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] - #print "Bitrate",br if br is not None: data['bitrate'] = br if 'Encryption key' in line: @@ -104,7 +105,6 @@ class Wlan: enc = _("Disabled") else: enc = line[line.index('Encryption key')+15 :line.index(' Security')] - #print "Encryption key",enc if enc is not None: data['encryption'] = _("Enabled") if 'Quality' in line: @@ -112,12 +112,10 @@ class Wlan: qual = line[line.index('Quality')+8:line.index('/100')] else: qual = line[line.index('Quality')+8:line.index('Sig')] - #print "Quality",qual if qual is not None: data['quality'] = qual if 'Signal level' in line: - signal = line[line.index('Signal level')+14 :line.index(' dBm')] - #print "Signal level",signal + signal = line[line.index('Signal level')+13 :line.index(' dBm')] if signal is not None: data['signal'] = signal @@ -130,7 +128,6 @@ class Wlan: callback(True,self.wlaniface) def getAdapterAttribute(self, attribute): - print "im getAdapterAttribute" if self.wlaniface.has_key(self.iface): print "self.wlaniface.has_key",self.iface if self.wlaniface[self.iface].has_key(attribute): @@ -142,13 +139,17 @@ class Wlan: def getWirelessInterfaces(self): - iwifaces = None - try: - iwifaces = getNICnames() - except: - print "[Wlan.py] No Wireless Networkcards could be found" - - return iwifaces + 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): @@ -156,8 +157,8 @@ class Wlan: ifobj = Wireless(self.iface) # a Wireless NIC Object #Association mappings - stats, quality, discard, missed_beacon = ifobj.getStatistics() - snr = quality.signallevel - quality.noiselevel + #stats, quality, discard, missed_beacon = ifobj.getStatistics() + #snr = quality.signallevel - quality.noiselevel try: scanresults = ifobj.scan() @@ -167,55 +168,47 @@ class Wlan: if scanresults is not None: aps = {} + (num_channels, frequencies) = ifobj.getChannelInfo() + index = 1 for result in scanresults: - bssid = result.bssid - - encryption = map(lambda x: hex(ord(x)), result.encode) - - if encryption[-1] == "0x8": + + if result.encode.flags & wififlags.IW_ENCODE_DISABLED > 0: + encryption = False + elif result.encode.flags & wififlags.IW_ENCODE_NOKEY > 0: encryption = True else: - encryption = False - + 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)) ) - - if result.quality.sl is 0 and len(extra) > 0: - begin = extra[0].find('SignalStrength=')+15 - - done = False - end = begin+1 - - while not done: - if extra[0][begin:end].isdigit(): - end += 1 - else: - done = True - end -= 1 - - signal = extra[0][begin:end] - #print "[Wlan.py] signal is:" + str(signal) + 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)] - else: - signal = str(result.quality.sl) - aps[bssid] = { 'active' : True, 'bssid': result.bssid, - 'channel': result.frequency.getChannel(result.frequency.getFrequency()), + 'channel': frequencies.index(ifobj._formatFrequency(result.frequency.getFrequency())) + 1, 'encrypted': encryption, 'essid': strip(self.asciify(result.essid)), 'iface': self.iface, - 'maxrate' : result.rate[-1], - 'noise' : result.quality.getNoiselevel(), - 'quality' : str(result.quality.quality), - 'signal' : signal, + 'maxrate' : ifobj._formatBitrate(result.rate[-1][-1]), + 'noise' : '',#result.quality.nlevel-0x100, + 'quality' : str(quality), + 'signal' : str(signal), 'custom' : extra, } - print aps[bssid] + #print "GOT APS ENTRY:",aps[bssid] + index = index + 1 return aps @@ -226,12 +219,11 @@ class Wlan: self.channel = str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))) except: self.channel = 0 - #print ifobj.getStatistics() status = { - 'BSSID': str(ifobj.getAPaddr()), + 'BSSID': str(ifobj.getAPaddr()), #ifobj.getStatistics() 'ESSID': str(ifobj.getEssid()), - 'quality': str(ifobj.getStatistics()[1].quality), - 'signal': str(ifobj.getStatistics()[1].sl), + '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]))), @@ -326,7 +318,6 @@ class wpaSupplicant: essid = split[1][1:-1] elif split[0] == 'proto': - print "split[1]",split[1] config.plugins.wlan.encryption.enabled.value = True if split[1] == "WPA" : mode = 'WPA' @@ -354,12 +345,9 @@ class wpaSupplicant: else: config.plugins.wlan.encryption.wepkeytype.value = 'HEX' config.plugins.wlan.encryption.psk.value = split[1] - print "[Wlan.py] Got Encryption: WEP - keytype is: "+config.plugins.wlan.encryption.wepkeytype.value - print "[Wlan.py] Got Encryption: WEP - key0 is: "+config.plugins.wlan.encryption.psk.value elif split[0] == 'psk': config.plugins.wlan.encryption.psk.value = split[1][1:-1] - print "[Wlan.py] Got PSK: "+split[1][1:-1] else: pass @@ -436,24 +424,30 @@ class Status: if "off/any" in line: ssid = _("No Connection") else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") + 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: - ssid = tmpssid - #print "SSID->",ssid + 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')] - #print "Frequency",frequency if frequency is not None: data['frequency'] = frequency if "Access Point" in line: ap=line[line.index('Access Point')+14:len(line)] - #print "AP",ap if ap is not None: data['acesspoint'] = ap if ap == "Not-Associated": @@ -467,7 +461,6 @@ class Status: br += " Mb/s" else: br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + " Mb/s" - #print "Bitrate",br if br is not None: data['bitrate'] = br if 'Encryption key' in line: @@ -480,28 +473,30 @@ class Status: enc = line[line.index('Encryption key')+15 :line.index(' Security')] if enc is not None: enc = _("Enabled") - #print "Encryption key",enc 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('/100')] + qual = line[line.index('Quality')+8:line.index(' Signal')] else: qual = line[line.index('Quality')+8:line.index('Sig')] - #print "Quality",qual if qual is not None: data['quality'] = qual if 'Signal level' in line: if "dBm" in line: - signal = line[line.index('Signal level')+14 :line.index(' dBm')] + signal = line[line.index('Signal level')+13 :line.index(' dBm')] signal += " dBm" elif "/100" in line: - signal = line[line.index('Signal level')+13:line.index('/100 Noise')] - signal += "%" + 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: - signal = line[line.index('Signal level')+13:line.index(' Noise')] - signal += "%" - #print "Signal level",signal + 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 @@ -515,12 +510,10 @@ class Status: callback(True,self.wlaniface) def getAdapterAttribute(self, iface, attribute): - print "im getAdapterAttribute" self.iface = iface 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 -iStatus = Status()
\ No newline at end of file +iStatus = Status() diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/flags.py b/lib/python/Plugins/SystemPlugins/WirelessLan/flags.py deleted file mode 100755 index 4435f845..00000000 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/flags.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: ISO-8859-1 -*- -# python-wifi -- a wireless library to access wireless cards via python -# Copyright (C) 2004, 2005, 2006 Róman Joost -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License -# as published by the Free Software Foundation; either version 2.1 of -# the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA - -modes = ['Auto', - 'Ad-Hoc', - 'Managed', - 'Master', - 'Repeat', - 'Second', - 'Monitor'] - -IFNAMSIZE = 16 -IW_ESSID_MAX_SIZE = 16 - -KILO = 10**3 -MEGA = 10**6 -GIGA = 10**9 - -# ioctl calls for the Linux/i386 kernel -SIOCIWFIRST = 0x8B00 # FIRST ioctl identifier -SIOCGIFCONF = 0x8912 # ifconf struct -SIOCGIWNAME = 0x8B01 # get name == wireless protocol -SIOCGIWFREQ = 0x8B05 # get channel/frequency -SIOCSIWMODE = 0x8B06 # set the operation mode -SIOCGIWMODE = 0x8B07 # get operation mode -SIOCGIWSENS = 0x8B09 # get sensitivity -SIOCGIWAP = 0x8B15 # get AP MAC address -SIOCSIWSCAN = 0x8B18 # set scanning off -SIOCGIWSCAN = 0x8B19 # get scanning results -SIOCGIWRATE = 0x8B21 # get default bit rate -SIOCGIWRTS = 0x8B23 # get rts/cts threshold -SIOCGIWFRAG = 0x8B25 # get fragmention thrh -SIOCGIWTXPOW = 0x8B27 # get transmit power (dBm) -SIOCGIWRETRY = 0x8B29 # get retry limit -SIOCGIWRANGE = 0x8B0B # range -SIOCGIWSTATS = 0x8B0F # get wireless statistics -SIOCSIWESSID = 0x8B1A # set essid -SIOCGIWESSID = 0x8B1B # get essid -SIOCGIWPOWER = 0x8B2D # get power managment settings -SIOCGIWENCODE = 0x8B2B # get encryption information -SIOCIWLAST = 0x8BFF # LAST ioctl identifier - -# Power management flags -IW_POWER_ON = 0x0000 # No details ... -IW_POWER_TYPE = 0xF000 # Type of parameter -IW_POWER_PERIOD = 0x1000 # Value is a period/duration of -IW_POWER_TIMEOUT = 0x2000 # Value is a timeout -IW_POWER_MODE = 0x0F00 # Power management mode -IW_POWER_MIN = 0x0001 # Value is a minimum -IW_POWER_MAX = 0x0002 # Value is a maximum -IW_POWER_RELATIVE = 0x0004 # Value is not in seconds/ms/us - -# Retry limits -IW_RETRY_TYPE = 0xF000 # Type of parameter - -# encoding stuff -IW_ENCODE_DISABLED = 0x8000 # encoding is disabled -IW_ENCODE_NOKEY = 0x0800 # key is write only, not present - -# constants responsible for scanning -IW_SCAN_MAX_DATA = 4096 - -IW_EV_LCP_LEN = 4 -IW_EV_CHAR_LEN = IW_EV_LCP_LEN + IFNAMSIZE -IW_EV_UINT_LEN = IW_EV_LCP_LEN + 4 -IW_EV_FREQ_LEN = IW_EV_LCP_LEN + 8 -IW_EV_ADDR_LEN = IW_EV_LCP_LEN + 16 -IW_EV_POINT_LEN = IW_EV_LCP_LEN + 4 -IW_EV_PARAM_LEN = IW_EV_LCP_LEN + 8 -IW_EV_QUAL_LEN = IW_EV_LCP_LEN + 4 - -EPERM = 1 -E2BIG = 7 -EAGAIN = 11 - -IWHT_NULL = 0 -IWHT_CHAR = 2 -IWHT_UINT = 4 -IWHT_FREQ = 5 -IWHT_ADDR = 6 -IWHT_POINT = 8 -IWHT_PARAM = 9 -IWHT_QUAL = 10 - -IWEVFIRST = 0x8C00 # FIRST event identifier -IWEVQUAL = 0x8C01 # Quality statistics from scan -IWEVCUSTOM = 0x8C02 # Custom Ascii string from Driver -IWEVLAST = 0x8C0A # LAST event identifier diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py b/lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py deleted file mode 100755 index c5f9c6d2..00000000 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py +++ /dev/null @@ -1,1114 +0,0 @@ -# -*- coding: ISO-8859-1 -*- -# python-wifi -- a wireless library to access wireless cards via python -# Copyright (C) 2004, 2005, 2006 Róman Joost -# -# Contributions from: -# Mike Auty <m.auty@softhome.net> (Iwscanresult, Iwscan) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License -# as published by the Free Software Foundation; either version 2.1 of -# the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA - -from struct import pack as struct_pack, \ - unpack as struct_unpack, \ - calcsize as struct_calcsize - -from array import array -from math import ceil, log10 -from fcntl import ioctl -from socket import AF_INET, SOCK_DGRAM, socket -from time import sleep -from re import compile - -from flags import * - -def getNICnames(): - """ extract wireless device names of /proc/net/wireless - - returns empty list if no devices are present - - >>> getNICnames() - ['eth1', 'wifi0'] - """ - device = compile('[a-z]+[0-9]+') - ifnames = [] - - f = open('/proc/net/wireless', 'r') - data = f.readlines() - for line in data: - try: - ifnames.append(device.search(line).group()) - except AttributeError: - pass - # if we couldn't lookup the devices, try to ask the kernel - if ifnames == []: - ifnames = getConfiguredNICnames() - - return ifnames - -def getConfiguredNICnames(): - """get the *configured* ifnames by a systemcall - - >>> getConfiguredNICnames() - [] - """ - iwstruct = Iwstruct() - ifnames = [] - buff = array('c', '\0'*1024) - caddr_t, length = buff.buffer_info() - s = iwstruct.pack('iP', length, caddr_t) - try: - result = iwstruct._fcntl(SIOCGIFCONF, s) - except IOError, (i, e): - return i, e - - # get the interface names out of the buffer - for i in range(0, 1024, 32): - ifname = buff.tostring()[i:i+32] - ifname = struct_unpack('32s', ifname)[0] - ifname = ifname.split('\0', 1)[0] - if ifname: - # verify if ifnames are really wifi devices - wifi = Wireless(ifname) - result = wifi.getAPaddr() - if result[0] == 0: - ifnames.append(ifname) - - return ifnames - -def makedict(**kwargs): - return kwargs - - -class Wireless(object): - """Access to wireless interfaces""" - - def __init__(self, ifname): - self.sockfd = socket(AF_INET, SOCK_DGRAM) - self.ifname = ifname - self.iwstruct = Iwstruct() - - def getAPaddr(self): - """ returns accesspoint mac address - - >>> from iwlibs import Wireless, getNICnames - >>> ifnames = getNICnames() - >>> ifnames - ['eth1', 'wifi0'] - >>> wifi = Wireless(ifnames[0]) - >>> wifi.getAPaddr() - '00:0D:88:8E:4E:93' - - Test with non-wifi card: - >>> wifi = Wireless('eth0') - >>> wifi.getAPaddr() - (95, 'Operation not supported') - - Test with non-existant card: - >>> wifi = Wireless('eth2') - >>> wifi.getAPaddr() - (19, 'No such device') - """ - buff, s = self.iwstruct.pack_wrq(32) - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWAP, - data=s) - if i > 0: - return result - - return self.iwstruct.getMAC(result) - - def getBitrate(self): - """returns device currently set bit rate - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getBitrate() - '11 Mb/s' - """ - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWRATE) - if i > 0: - return result - iwfreq = Iwfreq(result) - return iwfreq.getBitrate() - - def getBitrates(self): - """returns the number of available bitrates for the device - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> num, rates = wifi.getBitrates() - >>> num == len(rates) - True - """ - range = Iwrange(self.ifname) - if range.errorflag: - return (range.errorflag, range.error) - return (range.num_bitrates, range.bitrates) - - def getChannelInfo(self): - """returns the number of channels and available frequency for - the device - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> num, rates = wifi.getChannelInfo() - >>> num == len(rates) - True - """ - range = Iwrange(self.ifname) - if range.errorflag: - return (range.errorflag, range.error) - return (range.num_channels, range.frequencies) - - def getEssid(self): - """get essid information - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getEssid() - 'romanofski' - """ - essid = "" - buff, s = self.iwstruct.pack_wrq(32) - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWESSID, - data=s) - if i > 0: - return result - str = buff.tostring() - return str.strip('\x00') - - def setEssid(self, essid): - """set essid """ - raise NotImplementedError - if len(essid) > IW_ESSID_MAX_SIZE: - return "essid to big" - buff, s = self.iwstruct.pack_test(essid, 32) - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCSIWESSID, - data=s) - if i > 0: - return result - - def getEncryption(self): - """get encryption information which is probably a string of '*', - 'open', 'private' - - as a normal user, you will get a 'Operation not permitted' - error: - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getEncryption() - (1, 'Operation not permitted') - """ - iwpoint = Iwpoint(self.ifname) - if iwpoint.errorflag: - return (iwpoint.errorflag, iwpoint.error) - return iwpoint.getEncryptionKey() - - def getFragmentation(self): - """returns fragmentation threshold - - It depends on what the driver says. If you have fragmentation - threshold turned on, you'll get an int. If it's turned of - you'll get a string: 'off'. - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getFragmentation() - 'off' - """ - iwparam = Iwparam(self.ifname, SIOCGIWFRAG) - if iwparam.errorflag: - return (iwparam.errorflag, iwparam.error) - return iwparam.getValue() - - def getFrequency(self): - """returns currently set frequency of the card - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getFrequency() - '2.417GHz' - """ - i, r = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWFREQ) - if i > 0: - return (i, r) - iwfreq = Iwfreq(r) - return iwfreq.getFrequency() - - - def getMode(self): - """returns currently set operation mode - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getMode() - 'Managed' - """ - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWMODE) - if i > 0: - return result - mode = self.iwstruct.unpack('i', result[:4])[0] - return modes[mode] - - def setMode(self, mode): - """sets the operation mode """ - try: - this_modes = [x.lower() for x in modes] - mode = mode.lower() - wifimode = this_modes.index(mode) - except ValueError: - return "Invalid operation mode!" - - s = self.iwstruct.pack('I', wifimode) - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCSIWMODE, - data=s) - if i > 0: - return result - - def getWirelessName(self): - """ returns wireless name - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getWirelessName() - 'IEEE 802.11-DS' - """ - i, result = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWNAME) - if i > 0: - return result - return result.split('\0')[0] - - def getPowermanagement(self): - """returns power management settings - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getPowermanagement() - 'off' - """ - iwparam = Iwparam(self.ifname, SIOCGIWPOWER) - if iwparam.errorflag: - return (iwparam.errorflag, iwparam.error) - return iwparam.getValue() - - - def getRetrylimit(self): - """returns limit retry/lifetime - - man iwconfig: - Most cards have MAC retransmissions, and some allow to set - the behaviour of the retry mechanism. - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getRetrylimit() - 16 - """ - iwparam = Iwparam(self.ifname, SIOCGIWRETRY) - if iwparam.errorflag: - return (iwparam.errorflag, iwparam.error) - return iwparam.getValue() - - def getRTS(self): - """returns rts threshold - - returns int, 'auto', 'fixed', 'off' - - man iwconfig: - RTS/CTS adds a handshake before each packet transmission to - make sure that the channel is clear. This adds overhead, but - increases performance in case of hidden nodes or a large - number of active nodes. This parameter sets the size of the - smallest packet for which the node sends RTS; a value equal - to the maximum packet size disable the mechanism. - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getRTS() - 'off' - """ - iwparam = Iwparam(self.ifname, SIOCGIWRTS) - if iwparam.errorflag: - return (iwparam.errorflag, iwparam.error) - return iwparam.getValue() - - def getSensitivity(self): - """returns sensitivity information - - man iwconfig: - This is the lowest signal level for which the hardware - attempt packet reception, signals weaker than this are - ignored. This is used to avoid receiving background noise, - so you should set it according to the average noise - level. Positive values are assumed to be the raw value used - by the hardware or a percentage, negative values are - assumed to be dBm. - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getSensitivity() - 'off' - - """ - iwparam = Iwparam(self.ifname, SIOCGIWSENS) - if iwparam.errorflag: - return (iwparam.errorflag, iwparam.error) - return iwparam.getValue() - - def getTXPower(self): - """returns transmit power in dBm - - >>> from iwlibs import Wireless - >>> wifi = Wireless('eth1') - >>> wifi.getTXPower() - '17 dBm' - """ - i, r = self.iwstruct.iw_get_ext(self.ifname, - SIOCGIWTXPOW) - if i > 0: - return (i, r) - iwfreq = Iwfreq(r) - return iwfreq.getTransmitPower() - - def getStatistics(self): - """returns statistics information which can also be found in - /proc/net/wireless - """ - iwstats = Iwstats(self.ifname) - if iwstats.errorflag > 0: - return (iwstats.errorflag, iwstats.error) - return [iwstats.status, iwstats.qual, iwstats.discard, - iwstats.missed_beacon] - - def scan(self): - """returns Iwscanresult objects, after a successful scan""" - iwscan = Iwscan(self.ifname) - return iwscan.scan() - - -class Iwstruct(object): - """basic class to handle iwstruct data """ - - def __init__(self): - self.idx = 0 - self.sockfd = socket(AF_INET, SOCK_DGRAM) - - def parse_data(self, fmt, data): - """ unpacks raw C data """ - size = struct_calcsize(fmt) - idx = self.idx - - str = data[idx:idx + size] - self.idx = idx+size - value = struct_unpack(fmt, str) - - # take care of a tuple like (int, ) - if len(value) == 1: - return value[0] - else: - return value - - def pack(self, fmt, *args): - """ calls struct_pack and returns the result """ - return struct_pack(fmt, *args) - - def pack_wrq(self, buffsize): - """ packs wireless request data for sending it to the kernel """ - # Prepare a buffer - # We need the address of our buffer and the size for it. The - # ioctl itself looks for the pointer to the address in our - # memory and the size of it. - # Dont change the order how the structure is packed!!! - buff = array('c', '\0'*buffsize) - caddr_t, length = buff.buffer_info() - s = struct_pack('Pi', caddr_t, length) - return buff, s - - def pack_test(self, string, buffsize): - """ packs wireless request data for sending it to the kernel """ - buffsize = buffsize - len(string) - buff = array('c', string+'\0'*buffsize) - caddr_t, length = buff.buffer_info() - s = struct_pack('Pii', caddr_t, length, 1) - return buff, s - - def unpack(self, fmt, packed_data): - """ unpacks data with given format """ - return struct_unpack(fmt, packed_data) - - def _fcntl(self, request, args): - return ioctl(self.sockfd.fileno(), request, args) - - def iw_get_ext(self, ifname, request, data=None): - """ read information from ifname """ - # put some additional data behind the interface name - if data is not None: - buff = IFNAMSIZE-len(ifname) - ifreq = ifname + '\0'*buff - ifreq = ifreq + data - else: - ifreq = (ifname + '\0'*32) - - try: - result = self._fcntl(request, ifreq) - except IOError, (i, e): - return i, e - - return (0, result[16:]) - - def getMAC(self, packed_data): - """ extracts mac addr from packed data and returns it as str """ - mac_addr = struct_unpack('xxBBBBBB', packed_data[:8]) - return "%02X:%02X:%02X:%02X:%02X:%02X" % mac_addr - -class Iwparam(object): - """class to hold iwparam data """ - - def __init__(self, ifname, ioctl): - # (i) value, (b) fixed, (b) disabled, (b) flags - self.fmt = "ibbH" - self.value = 0 - self.fixed = 0 - self.disabled = 0 - self.flags = 0 - self.errorflag = 0 - self.error = "" - self.ioctl = ioctl - self.ifname = ifname - self.update() - - def getValue(self): - """returns the value if not disabled """ - - if self.disabled: - return 'off' - if self.flags & IW_RETRY_TYPE == 0: - return self.getRLAttributes() - else: - return self.getPMAttributes() - - def getRLAttributes(self): - """returns a string with attributes determined by self.flags - """ - return self.value - - def getPMAttributes(self): - """returns a string with attributes determined by self.flags - and IW_POWER* - """ - result = "" - - # Modifiers - if self.flags & IW_POWER_MIN == 0: - result = " min" - if self.flags & IW_POWER_MAX == 0: - result = " max" - - # Type - if self.flags & IW_POWER_TIMEOUT == 0: - result = " period:" - else: - result = " timeout:" - # Value with or without units - # IW_POWER_RELATIVE - value is *not* in s/ms/us - if self.flags & IW_POWER_RELATIVE: - result += "%f" %(float(self.value)/MEGA) - else: - if self.value >= MEGA: - result += "%fs" %(float(self.value)/MEGA) - elif self.value >= KILO: - result += "%fms" %(float(self.value)/KILO) - else: - result += "%dus" % self.value - - return result - - def update(self): - iwstruct = Iwstruct() - i, r = iwstruct.iw_get_ext(self.ifname, - self.ioctl) - if i > 0: - self.errorflag = i - self.error = r - self._parse(r) - - def _parse(self, data): - """ unpacks iwparam data """ - iwstruct = Iwstruct() - self.value, self.fixed, self.disabled, self.flags =\ - iwstruct.parse_data(self.fmt, data) - -class Iwfreq(object): - """ class to hold iwfreq data - delegates to Iwstruct class - """ - - def __init__(self, data=None): - self.fmt = "ihbb" - if data is not None: - self.frequency = self.parse(data) - else: - self.frequency = 0 - self.iwstruct = Iwstruct() - - def __getattr__(self, attr): - return getattr(self.iwstruct, attr) - - def parse(self, data): - """ unpacks iwparam""" - - size = struct_calcsize(self.fmt) - m, e, i, pad = struct_unpack(self.fmt, data[:size]) - # XXX well, its not *the* frequency - we need a better name - if e == 0: - return m - else: - return float(m)*10**e - - def getFrequency(self): - """returns Frequency (str) - - data - binary data returned by systemcall (iw_get_ext()) - """ - freq = self.frequency - - if freq >= GIGA: - return "%0.3fGHz" %(freq/GIGA) - - if freq >= MEGA: - return "%0.3fMHZ" %(freq/MEGA) - - if freq >= KILO: - return "%0.3fKHz" %(freq/KILO) - - def getBitrate(self): - """ returns Bitrate in Mbit - - data - binary data returned by systemcall (iw_get_ext()) - """ - bitrate = self.frequency - - if bitrate >= GIGA: - return "%i Gb/s" %(bitrate/GIGA) - - if bitrate >= MEGA: - return "%i Mb/s" %(bitrate/MEGA) - - if bitrate >= KILO: - return "%i Kb/s" %(bitrate/KILO) - - def getTransmitPower(self): - """ returns transmit power in dbm """ - # XXX something flaky is going on with m and e - # eg. m = 50 and e should than be 0, because the number is stored in - # m and don't needs to be recalculated - return "%i dBm" %self.mw2dbm(self.frequency/10) - - def getChannel(self, freq): - """returns channel information given by frequency - - returns None if frequency can't be converted - freq = frequency to convert (int) - iwrange = Iwrange object - """ - - try: - freq = float(freq) - except: - return None - - lut = {} - #13 Channels beginning at 2.412GHz and inreasing by 0,005 GHz steps - for i in range(0,12): - cur = float( 2.412 + ( i * 0.005 ) ) - lut[str(cur)] = i+1 - # Channel 14 need special actions ;) - lut['2.484'] = 14 - - - if str(freq) in lut.keys(): - return lut[str(freq)] - - return None - - - def mw2dbm(self, mwatt): - """ converts mw to dbm(float) """ - return ceil(10.0 * log10(mwatt)) - - def _setFrequency(self, list): - """sets self.frequency by given list - - currently only used by Iwrange - """ - assert len(list) == 4 - m, e, i, pad = list - if e == 0: - self.frequency = m - else: - self.frequency = m #float(m)*10**e - -class Iwstats(object): - """ class to hold iwstat data """ - - def __init__(self, ifname): - # (2B) status, 4B iw_quality, 6i iw_discarded - self.fmt = "2B4B6i" - self.status = 0 - self.qual = Iwquality() - self.discard = {} - self.missed_beacon = 0 - self.ifname = ifname - self.errorflag = 0 - self.error = "" - self.update() - - def update(self): - iwstruct = Iwstruct() - buff, s = iwstruct.pack_wrq(32) - i, result = iwstruct.iw_get_ext(self.ifname, - SIOCGIWSTATS, - data=s) - if i > 0: - self.error = result - self.errorflag = i - self._parse(buff.tostring()) - - def _parse(self, data): - """ unpacks iwstruct data """ - struct = Iwstruct() - iwqual = Iwquality() - iwstats_data = struct.parse_data(self.fmt, data) - - self.status = iwstats_data[0:2] - self.qual.quality, self.qual.sl, self.qual.nl,\ - self.qual.flags = iwstats_data[2:6] - nwid, code, frag, retries, flags = iwstats_data[6:11] - self.missed_beacon = iwstats_data[11:12][0] - self.discard = makedict(nwid=nwid, code=code, - fragment=frag, retries=retries, misc=flags) - -class Iwquality(object): - """ class to hold iwquality data """ - - def __init__(self): - self.quality = 0 - self.sl = 0 - self.nl = 0 - self.updated = 0 - self.fmt = "4B" - - def parse(self, data): - """ unpacks iwquality data """ - struct = Iwstruct() - qual, sl, nl, flags = struct.parse_data(self.fmt, data) - - # compute signal and noise level - self.signal_level = sl - self.noise_level = nl - - # asign the other values - self.quality = qual - self.updated = flags - - def setValues(self, list): - """ assigns values given by a list to our attributes """ - attributes = ["quality", "signallevel", "noise_level", - "updated"] - assert len(list) == 4 - - for i in range(len(list)): - setattr(self, attributes[i], list[i]) - - def getSignallevel(self): - """ returns signal level """ - return self.sl-0x100 - - def setSignallevel(self, sl): - """ sets signal level """ - self.sl = sl - signallevel = property(getSignallevel, setSignallevel) - - def getNoiselevel(self): - """ returns noise level """ - return self.nl - 0x100 - - def setNoiselevel(self): - raise NotImplementedError - self.nl = nl - noiselevel = property(getNoiselevel, setNoiselevel) - -class Iwpoint(object): - """ class to hold iwpoint data """ - - def __init__(self, ifname): - self.key = [0,0,0,0] - self.fields = 0 - self.flags = 0 - # (4B) pointer to data, H length, H flags - self.fmt = "4BHH" - self.errorflag = 0 - self.error = "" - self.ifname = ifname - self.update() - - def __getattr__(self, attr): - return getattr(self.iwstruct, attr) - - def update(self): - iwstruct = Iwstruct() - buff, s = iwstruct.pack_wrq(32) - i, result = iwstruct.iw_get_ext(self.ifname, - SIOCGIWENCODE, - data=s) - if i > 0: - self.errorflag = i - self.error = result - self._parse(result) - - def getEncryptionKey(self): - """ returns encryption key as '**' or 'off' as str """ - if self.flags & IW_ENCODE_DISABLED != 0: - return 'off' - elif self.flags & IW_ENCODE_NOKEY != 0: - # a key is set, so print it - return '**' * self.fields - - def _parse(self, data): - """ unpacks iwpoint data - """ - iwstruct = Iwstruct() - ptr, ptr, ptr, ptr, self.fields, self.flags =\ - iwstruct.parse_data(self.fmt, data) - self.key = [ptr, ptr, ptr, ptr] - -class Iwrange(object): - """holds iwrange struct """ - IW_MAX_FREQUENCIES = 32 - - def __init__(self, ifname): - self.fmt = "iiihb6ii4B4Bi32i2i2i2i2i3h8h2b2bhi8i2b3h2i2ihB17x"\ - + self.IW_MAX_FREQUENCIES*"ihbb" - - self.ifname = ifname - self.errorflag = 0 - self.error = "" - - # informative stuff - self.throughput = 0 - - # nwid (or domain id) - self.min_nwid = self.max_nwid = 0 - - # frequency for backward compatibility - self.old_num_channels = self.old_num_frequency = self.old_freq = 0 - - # signal level threshold - self.sensitivity = 0 - - # link quality - self.max_qual = Iwquality() - self.avg_qual = Iwquality() - - # rates - self.num_bitrates = 0 - self.bitrates = [] - - # rts threshold - self.min_rts = self.max_rts = 0 - - # fragmention threshold - self.min_frag = self.max_frag = 0 - - # power managment - self.min_pmp = self.max_pmp = 0 - self.min_pmt = self.max_pmt = 0 - self.pmp_flags = self.pmt_flags = self.pm_capa = 0 - - # encoder stuff - self.encoding_size = 0 - self.num_encoding_sizes = self.max_encoding_tokens = 0 - self.encoding_login_index = 0 - - # transmit power - self.txpower_capa = self.num_txpower = self.txpower = 0 - - # wireless extension version info - self.we_vers_compiled = self.we_vers_src = 0 - - # retry limits and lifetime - self.retry_capa = self.retry_flags = self.r_time_flags = 0 - self.min_retry = self.max_retry = 0 - self.min_r_time = self.max_r_time = 0 - - # frequency - self.num_channels = self.num_frequency = 0 - self.frequencies = [] - self.update() - - def update(self): - """updates Iwrange object by a system call to the kernel - and updates internal attributes - """ - iwstruct = Iwstruct() - buff, s = iwstruct.pack_wrq(640) - i, result = iwstruct.iw_get_ext(self.ifname, - SIOCGIWRANGE, - data=s) - if i > 0: - self.errorflag = i - self.error = result - data = buff.tostring() - self._parse(data) - - def _parse(self, data): - struct = Iwstruct() - result = struct.parse_data(self.fmt, data) - - # XXX there is maybe a much more elegant way to do this - self.throughput, self.min_nwid, self.max_nwid = result[0:3] - self.old_num_channels, self.old_num_frequency = result[3:5] - self.old_freq = result[5:11] - self.sensitivity = result[11] - self.max_qual.setValues(result[12:16]) - self.avg_qual.setValues(result[16:20]) - self.num_bitrates = result[20] # <- XXX - raw_bitrates = result[21:53] - for rate in raw_bitrates: - iwfreq = Iwfreq() - iwfreq.frequency = rate - br = iwfreq.getBitrate() - if br is not None: - self.bitrates.append(br) - - self.min_rts, self.max_rts = result[53:55] - self.min_frag, self.max_frag = result[55:57] - self.min_pmp, self.max_pmp = result[57:59] - self.min_pmt, self.max_pmt = result[59:61] - self.pmp_flags, self.pmt_flags, self.pm_capa = result[61:64] - self.encoding_size = result[64:72] - self.num_encoding_sizes, self.max_encoding_tokens = result[72:74] - self.encoding_login_index = result[74:76] - self.txpower_capa, self.num_txpower = result[76:78] - self.txpower = result[78:86] - self.we_vers_compiled, self.we_vers_src = result[86:88] - self.retry_capa, self.retry_flags, self.r_time_flags = result[88:91] - self.min_retry, self.max_retry = result[91:93] - self.min_r_time, self.max_r_time = result[93:95] - self.num_channels = result[95] - self.num_frequency = result[96] - freq = result[97:] - - i = self.num_frequency - for x in range(0, len(freq), 4): - iwfreq = Iwfreq() - iwfreq._setFrequency(freq[x:x+4]) - fq = iwfreq.getFrequency() - if fq is not None: - self.frequencies.append(fq) - i -= 1 - if i <= 0: - break - -class Iwscan(object): - """class to handle AP scanning""" - - def __init__(self, ifname): - self.ifname = ifname - self.range = Iwrange(ifname) - self.errorflag = 0 - self.error = "" - self.stream = None - self.aplist = None - - def scan(self, fullscan=True): - """Completes a scan for available access points, - and returns them in Iwscanresult format - - fullscan: If False, data is read from a cache of the last scan - If True, a scan is conducted, and then the data is read - """ - # By default everything is fine, do not wait - result = 1 - if fullscan: - self.setScan() - if self.errorflag > EPERM: - raise RuntimeError, 'setScan failure ' + str(self.errorflag) + " " + str(self.error) - return None - elif self.errorflag < EPERM: - # Permission was NOT denied, therefore we must WAIT to get results - result = 250 - - while (result > 0): - sleep(result/1000) - result = self.getScan() - - if result < 0 or self.errorflag != 0: - raise RuntimeError, 'getScan failure ' + str(self.errorflag) + " " + str(self.error) - - return self.aplist - - - def setScan(self): - """Triggers the scan, if we have permission - """ - iwstruct = Iwstruct() - s = iwstruct.pack('Pii', 0, 0, 0) - i, result = iwstruct.iw_get_ext(self.ifname, - SIOCSIWSCAN,s) - if i > 0: - self.errorflag = i - self.error = result - return result - - def getScan(self): - """Retreives results, stored from the most recent scan - Returns 0 if successful, a delay if the data isn't ready yet - or -1 if something really nasty happened - """ - iwstruct = Iwstruct() - i = E2BIG - bufflen = IW_SCAN_MAX_DATA - - # Keep resizing the buffer until it's large enough to hold the scan - while (i == E2BIG): - buff, s = iwstruct.pack_wrq(bufflen) - i, result = iwstruct.iw_get_ext(self.ifname, - SIOCGIWSCAN, - data=s) - if i == E2BIG: - pbuff, newlen = iwstruct.unpack('Pi', s) - if bufflen < newlen: - bufflen = newlen - else: - bufflen = bufflen * 2 - - if i == EAGAIN: - return 100 - if i > 0: - self.errorflag = i - self.error = result - return -1 - - pbuff, reslen = iwstruct.unpack('Pi', s) - if reslen > 0: - # Initialize the stream, and turn it into an enumerator - self.aplist = self._parse(buff.tostring()) - return 0 - - def _parse(self, data): - """Parse the event stream, and return a list of Iwscanresult objects - """ - iwstruct = Iwstruct() - scanresult = None - aplist = [] - - # Run through the stream, until broken - while 1: - # If we're the stream doesn't have enough space left for a header, break - if len(data) < IW_EV_LCP_LEN: - break; - - # Unpack the header - length, cmd = iwstruct.unpack('HH', data[:4]) - # If the header says the following data is shorter than the header, then break - if length < IW_EV_LCP_LEN: - break; - - # Put the events into their respective result data - if cmd == SIOCGIWAP: - if scanresult is not None: - aplist.append(scanresult) - scanresult = Iwscanresult(data[IW_EV_LCP_LEN:length], self.range) - elif scanresult is None: - raise RuntimeError, 'Attempting to add an event without AP data' - else: - scanresult.addEvent(cmd, data[IW_EV_LCP_LEN:length]) - - # We're finished with the preveious event - data = data[length:] - - # Don't forgset the final result - if scanresult.bssid != "00:00:00:00:00:00": - aplist.append(scanresult) - else: - raise RuntimeError, 'Attempting to add an AP without a bssid' - return aplist - -class Iwscanresult(object): - """An object to contain all the events associated with a single scanned AP - """ - - def __init__(self, data, range): - """Initialize the scan result with the access point data""" - self.iwstruct = Iwstruct() - self.range = range - self.bssid = "%02X:%02X:%02X:%02X:%02X:%02X" % struct_unpack('BBBBBB', data[2:8]) - self.essid = None - self.mode = None - self.rate = [] - self.quality = Iwquality() - self.frequency = None - self.encode = None - self.custom = [] - self.protocol = None - - def addEvent(self, cmd, data): - """Attempts to add the data from an event to a scanresult - Only certain data is accept, in which case the result is True - If the event data is invalid, None is returned - If the data is valid but unused, False is returned - """ - if cmd <= SIOCIWLAST: - if cmd < SIOCIWFIRST: - return None - elif cmd >= IWEVFIRST: - if cmd > IWEVLAST: - return None - else: - return None - - if cmd == SIOCGIWESSID: - self.essid = data[4:] - elif cmd == SIOCGIWMODE: - self.mode = modes[self.iwstruct.unpack('i', data[:4])[0]] - elif cmd == SIOCGIWRATE: - # TODO, deal with multiple rates, or at least the highest rate - freqsize = struct_calcsize("ihbb") - while len(data) >= freqsize: - iwfreq = Iwfreq(data) - self.rate.append(iwfreq.getBitrate()) - data = data[freqsize:] - elif cmd == IWEVQUAL: - self.quality.parse(data) - elif cmd == SIOCGIWFREQ: - self.frequency = Iwfreq(data) - elif cmd == SIOCGIWENCODE: - self.encode = data - elif cmd == IWEVCUSTOM: - self.custom.append(data[1:]) - elif cmd == SIOCGIWNAME: - self.protocol = data[:len(data)-2] - else: - #print "Cmd:", cmd - return False - return True
\ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py index a687714d..28ee363e 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py @@ -1,4 +1,4 @@ -from enigma import eTimer +from enigma import eTimer, eTPM from Screens.Screen import Screen from Components.ActionMap import ActionMap, NumberActionMap from Components.Pixmap import Pixmap,MultiPixmap @@ -14,7 +14,9 @@ from Plugins.Plugin import PluginDescriptor from os import system, path as os_path, listdir from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE from Tools.LoadPixmap import LoadPixmap +from Tools.HardwareInfo import HardwareInfo from Wlan import Wlan, wpaSupplicant, iStatus +import sha plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan" @@ -122,7 +124,7 @@ class WlanStatus(Screen): if status is not None: self["BSSID"].setText(status[self.iface]["acesspoint"]) self["ESSID"].setText(status[self.iface]["essid"]) - self["quality"].setText(status[self.iface]["quality"]+"%") + self["quality"].setText(status[self.iface]["quality"]) self["signal"].setText(status[self.iface]["signal"]) self["bitrate"].setText(status[self.iface]["bitrate"]) self["enc"].setText(status[self.iface]["encryption"]) @@ -373,6 +375,45 @@ class WlanScan(Screen): return self.WlanList +def bin2long(s): + return reduce( lambda x,y:(x<<8L)+y, map(ord, s)) + +def long2bin(l): + res = "" + for byte in range(128): + res += chr((l >> (1024 - (byte + 1) * 8)) & 0xff) + return res + +def rsa_pub1024(src, mod): + return long2bin(pow(bin2long(src), 65537, bin2long(mod))) + +def decrypt_block(src, mod): + if len(src) != 128 and len(src) != 202: + return None + dest = rsa_pub1024(src[:128], mod) + hash = sha.new(dest[1:107]) + if len(src) == 202: + hash.update(src[131:192]) + result = hash.digest() + if result == dest[107:127]: + return dest + return None + +def validate_cert(cert, key): + buf = decrypt_block(cert[8:], key) + if buf is None: + return None + return buf[36:107] + cert[139:196] + +def read_random(): + try: + fd = open("/dev/urandom", "r") + buf = fd.read(8) + fd.close() + return buf + except: + return None + def WlanStatusScreenMain(session, iface): session.open(WlanStatus, iface) @@ -387,8 +428,32 @@ def callFunction(iface): def configStrings(iface): - driver = iNetwork.detectWlanModule() - print "Found WLAN-Driver:",driver + hardware_info = HardwareInfo() + if hardware_info.device_name != "dm7025": + rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?'] + etpm = eTPM() + l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) + if l2cert is None: + return + l2key = validate_cert(l2cert, rootkey) + if l2key is None: + return + l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) + if l3cert is None: + print "better run the genuine dreambox plugin" + return + l3key = validate_cert(l3cert, l2key) + if l3key is None: + return + rnd = read_random() + if rnd is None: + return + val = etpm.challenge(rnd) + result = decrypt_block(val, l3key) + if hardware_info.device_name == "dm7025" or result[80:88] == rnd: + driver = iNetwork.detectWlanModule(iface) + else: + driver = 'dreambox' if driver in ('ralink', 'zydas'): return " pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -D"+driver+"\n post-down wpa_cli terminate" else: @@ -399,4 +464,3 @@ def configStrings(iface): def Plugins(**kwargs): return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."}) -
\ No newline at end of file |
