aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoracid-burn <acid-burn@opendreambox.org>2010-10-05 12:57:56 +0200
committeracid-burn <acid-burn@opendreambox.org>2010-10-05 12:57:56 +0200
commitb6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901 (patch)
tree5d6fa8fb417a3ec0c90a6a1f068ef883f630495c
parente2be31452f7c2d90fa7008583f36d6a6583cc83a (diff)
parent996081f3ac0b17e0609fb74b11db49112eeec43e (diff)
downloadenigma2-b6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901.tar.gz
enigma2-b6da0afe0cd5cf7ba08427fd1b8e2fe9bb270901.zip
Merge commit 'origin/bug_558_wlanfixes'
Conflicts: lib/python/Components/Network.py
-rwxr-xr-x[-rw-r--r--]lib/python/Components/About.py11
-rwxr-xr-xlib/python/Components/Network.py54
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py3
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py179
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/flags.py104
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py1114
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/plugin.py74
-rwxr-xr-xlib/python/Screens/NetworkSetup.py68
9 files changed, 252 insertions, 1357 deletions
diff --git a/lib/python/Components/About.py b/lib/python/Components/About.py
index 8e332e33..6b322c9d 100644..100755
--- a/lib/python/Components/About.py
+++ b/lib/python/Components/About.py
@@ -1,5 +1,6 @@
from Tools.Directories import resolveFilename, SCOPE_SYSETC
from enigma import getEnigmaVersionString
+from os import popen
class About:
def __init__(self):
@@ -43,4 +44,14 @@ class About:
def getEnigmaVersionString(self):
return getEnigmaVersionString()
+ def getKernelVersionString(self):
+ try:
+ result = popen("uname -r","r").read().strip("\n").split('-')
+ kernel_version = result[0]
+ return kernel_version
+ except:
+ pass
+
+ return "unknown"
+
about = About()
diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py
index e8a3d459..e980cb8c 100755
--- a/lib/python/Components/Network.py
+++ b/lib/python/Components/Network.py
@@ -4,6 +4,7 @@ from socket import *
from enigma import eConsoleAppContainer
from Components.Console import Console
from Components.PluginComponent import plugins
+from Components.About import about
from Plugins.Plugin import PluginDescriptor
class Network:
@@ -349,8 +350,10 @@ class Network:
return _("Zydas")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.")
elif os_path.realpath(driverdir).endswith('rt73'):
return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.")
+ elif os_path.realpath(driverdir).endswith('rt73usb'):
+ return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.")
else:
- return _("Unknown network adapter.")
+ return str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.")
else:
return _("Unknown network adapter.")
@@ -606,24 +609,39 @@ class Network:
if callback is not None:
callback(True)
- def detectWlanModule(self):
+ def detectWlanModule(self, iface = None):
self.wlanmodule = None
- rt73_dir = "/sys/bus/usb/drivers/rt73/"
- zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/"
- madwifi_dir = "/sys/bus/pci/drivers/ath_pci/"
- if os_path.exists(madwifi_dir):
- files = listdir(madwifi_dir)
- if len(files) >= 1:
- self.wlanmodule = 'madwifi'
- if os_path.exists(rt73_dir):
- rtfiles = listdir(rt73_dir)
- if len(rtfiles) == 2 or len(rtfiles) == 5:
- self.wlanmodule = 'ralink'
- if os_path.exists(zd1211b_dir):
- zdfiles = listdir(zd1211b_dir)
- if len(zdfiles) == 1 or len(zdfiles) == 5:
- self.wlanmodule = 'zydas'
- return self.wlanmodule
+ classdir = "/sys/class/net/" + iface + "/device/"
+ driverdir = "/sys/class/net/" + iface + "/device/driver/"
+ if os_path.exists(classdir):
+ classfiles = listdir(classdir)
+ driver_found = False
+ nl80211_found = False
+ for x in classfiles:
+ if x == 'driver':
+ driver_found = True
+ if x.startswith('ieee80211:'):
+ nl80211_found = True
+
+ if driver_found and nl80211_found:
+ #print about.getKernelVersionString()
+ self.wlanmodule = "nl80211"
+ else:
+ if driver_found and not nl80211_found:
+ driverfiles = listdir(driverdir)
+ if os_path.realpath(driverdir).endswith('ath_pci'):
+ if len(driverfiles) >= 1:
+ self.wlanmodule = 'madwifi'
+ if os_path.realpath(driverdir).endswith('rt73'):
+ if len(driverfiles) == 2 or len(driverfiles) == 5:
+ self.wlanmodule = 'ralink'
+ if os_path.realpath(driverdir).endswith('zd1211b'):
+ if len(driverfiles) == 1 or len(driverfiles) == 5:
+ self.wlanmodule = 'zydas'
+ if self.wlanmodule is None:
+ self.wlanmodule = "wext"
+ print 'Using "%s" as wpa-supplicant driver' % (self.wlanmodule)
+ return self.wlanmodule
def calc_netmask(self,nmask):
from struct import pack, unpack
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
diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py
index 2e33ac3b..de2fa993 100755
--- a/lib/python/Screens/NetworkSetup.py
+++ b/lib/python/Screens/NetworkSetup.py
@@ -745,14 +745,21 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
if self.iface in iNetwork.wlan_interfaces:
try:
from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan
- from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+ from pythonwifi.iwlibs import Wireless
except ImportError:
self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
else:
ifobj = Wireless(self.iface) # a Wireless NIC Object
- self.wlanresponse = ifobj.getStatistics()
- if self.wlanresponse[0] != 19: # Wlan Interface found.
- self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface)
+ try:
+ self.wlanresponse = ifobj.getAPaddr()
+ except IOError:
+ self.wlanresponse = ifobj.getStatistics()
+ if self.wlanresponse:
+ if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+ self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface)
+ else:
+ # Display Wlan not available Message
+ self.showErrorMessage()
else:
# Display Wlan not available Message
self.showErrorMessage()
@@ -765,28 +772,42 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
if self["menulist"].getCurrent()[1] == 'scanwlan':
try:
from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan
- from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+ from pythonwifi.iwlibs import Wireless
except ImportError:
self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
else:
ifobj = Wireless(self.iface) # a Wireless NIC Object
- self.wlanresponse = ifobj.getStatistics()
- if self.wlanresponse[0] != 19:
- self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface)
+ try:
+ self.wlanresponse = ifobj.getAPaddr()
+ except IOError:
+ self.wlanresponse = ifobj.getStatistics()
+ if self.wlanresponse:
+ if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+ self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface)
+ else:
+ # Display Wlan not available Message
+ self.showErrorMessage()
else:
# Display Wlan not available Message
self.showErrorMessage()
if self["menulist"].getCurrent()[1] == 'wlanstatus':
try:
from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus
- from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+ from pythonwifi.iwlibs import Wireless
except ImportError:
self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
else:
ifobj = Wireless(self.iface) # a Wireless NIC Object
- self.wlanresponse = ifobj.getStatistics()
- if self.wlanresponse[0] != 19:
- self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+ try:
+ self.wlanresponse = ifobj.getAPaddr()
+ except IOError:
+ self.wlanresponse = ifobj.getStatistics()
+ if self.wlanresponse:
+ if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+ self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+ else:
+ # Display Wlan not available Message
+ self.showErrorMessage()
else:
# Display Wlan not available Message
self.showErrorMessage()
@@ -898,14 +919,21 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
if ret[0] == 'ok' and (self.iface in iNetwork.wlan_interfaces) and iNetwork.getAdapterAttribute(self.iface, "up") is True:
try:
from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus
- from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+ from pythonwifi.iwlibs import Wireless
except ImportError:
self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
else:
ifobj = Wireless(self.iface) # a Wireless NIC Object
- self.wlanresponse = ifobj.getStatistics()
- if self.wlanresponse[0] != 19:
- self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+ try:
+ self.wlanresponse = ifobj.getAPaddr()
+ except IOError:
+ self.wlanresponse = ifobj.getStatistics()
+ if self.wlanresponse:
+ if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+ self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+ else:
+ # Display Wlan not available Message
+ self.showErrorMessage()
else:
# Display Wlan not available Message
self.showErrorMessage()
@@ -916,7 +944,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
def WlanStatusClosed(self, *ret):
if ret is not None and len(ret):
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
iStatus.stopWlanConsole()
self.updateStatusbar()
@@ -924,7 +952,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
if ret[0] is not None:
self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1])
else:
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
iStatus.stopWlanConsole()
self.updateStatusbar()
@@ -1335,7 +1363,7 @@ class NetworkAdapterTest(Screen):
def getLinkState(self,iface):
if iface in iNetwork.wlan_interfaces:
try:
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
except:
self["Network"].setForegroundColorNum(1)
self["Network"].setText(_("disconnected"))
@@ -1417,7 +1445,7 @@ class NetworkAdapterTest(Screen):
iNetwork.stopLinkStateConsole()
iNetwork.stopDNSConsole()
try:
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
except ImportError:
pass
else: