mirror of
https://github.com/gryf/wicd.git
synced 2025-12-20 21:08:06 +01:00
Fix issue where signal strength wouldn't be reported correctly if the first link quality regex didn't match.
Add some helper methods that will eventually be used for encryption template parsing. Use more specific exception checking in a few places.
This commit is contained in:
@@ -23,3 +23,4 @@ scripts/wicd-client
|
||||
scripts/wicd-curses
|
||||
translations/*
|
||||
wicd/wpath.py
|
||||
*tags
|
||||
|
||||
@@ -33,8 +33,7 @@ from wicd import misc
|
||||
from wicd import wnettools
|
||||
from wicd import wpath
|
||||
from wicd.wnettools import *
|
||||
from wicd.wnettools import strength_pattern, altstrength_pattern, wep_pattern, \
|
||||
signaldbm_pattern
|
||||
from wicd.wnettools import wep_pattern, signaldbm_pattern
|
||||
|
||||
import iwscan
|
||||
import wpactrl
|
||||
@@ -311,15 +310,8 @@ class WirelessInterface(Interface, wnettools.BaseWirelessInterface):
|
||||
|
||||
# Link Quality
|
||||
ap['qual_found'] = True
|
||||
try:
|
||||
[(strength, max_strength)] = strength_pattern.findall(cell["stats"])
|
||||
if max_strength:
|
||||
ap["quality"] = 100 * int(strength) // int(max_strength)
|
||||
else:
|
||||
ap["quality"] = int(strength)
|
||||
except ValueError:
|
||||
ap['quality'] = misc.RunRegex(altstrength_pattern,cell["stats"])
|
||||
if not ap['quality']:
|
||||
ap['quality'] = self._get_link_quality(cell['stats'])
|
||||
if ap['quality'] is None:
|
||||
ap['qual_found'] = False
|
||||
ap['quality'] = -1
|
||||
|
||||
@@ -498,10 +490,12 @@ class WirelessInterface(Interface, wnettools.BaseWirelessInterface):
|
||||
buff = get_iw_ioctl_result(self.iface, SIOCGIWSTATS)
|
||||
strength = ord(buff[2])
|
||||
max_strength = self._get_max_strength()
|
||||
if strength and max_strength:
|
||||
if strength not in ['', None] and max_strength:
|
||||
return 100 * int(strength) // int(max_strength)
|
||||
|
||||
return strength
|
||||
elif strength not in ['', None]:
|
||||
return int(strength)
|
||||
else:
|
||||
return None
|
||||
|
||||
def _get_max_strength(self):
|
||||
""" Gets the maximum possible strength from the wireless driver. """
|
||||
|
||||
36
wicd/misc.py
36
wicd/misc.py
@@ -26,6 +26,7 @@ import gobject
|
||||
from threading import Thread
|
||||
from subprocess import Popen, STDOUT, PIPE, call
|
||||
from commands import getoutput
|
||||
from itertools import repeat, chain, izip
|
||||
|
||||
# wicd imports
|
||||
import wpath
|
||||
@@ -243,9 +244,11 @@ def ParseEncryption(network):
|
||||
|
||||
# Write the data to the files then chmod them so they can't be read
|
||||
# by normal users.
|
||||
f = open(wpath.networks + network["bssid"].replace(":", "").lower(), "w")
|
||||
os.chmod(wpath.networks + network["bssid"].replace(":", "").lower(), 0600)
|
||||
os.chown(wpath.networks + network["bssid"].replace(":", "").lower(), 0, 0)
|
||||
file_loc = os.path.join(wpath.networks,
|
||||
network['bssid'].replace(":", "").lower())
|
||||
f = open(file_loc, "w")
|
||||
os.chmod(file_loc, 0600)
|
||||
os.chown(file_loc, 0, 0)
|
||||
# We could do this above, but we'd like to read protect
|
||||
# them before we write, so that it can't be read.
|
||||
f.write(config_file)
|
||||
@@ -691,3 +694,30 @@ def timeout_add(time, func, milli=False):
|
||||
if not milli: time = time * 1000
|
||||
return gobject.timeout_add(time, func)
|
||||
|
||||
def izip_longest(*args, **kwds):
|
||||
""" Implement the itertools.izip_longest method.
|
||||
|
||||
We implement the method here because its new in Python 2.6.
|
||||
|
||||
"""
|
||||
# izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
|
||||
fillvalue = kwds.get('fillvalue')
|
||||
def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
|
||||
yield counter() # yields the fillvalue, or raises IndexError
|
||||
fillers = repeat(fillvalue)
|
||||
iters = [chain(it, sentinel(), fillers) for it in args]
|
||||
try:
|
||||
for tup in izip(*iters):
|
||||
yield tup
|
||||
except IndexError:
|
||||
pass
|
||||
|
||||
def grouper(n, iterable, fillvalue=None):
|
||||
""" Iterate over several elements at once
|
||||
|
||||
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
|
||||
|
||||
"""
|
||||
args = [iter(iterable)] * n
|
||||
return izip_longest(fillvalue=fillvalue, *args)
|
||||
|
||||
|
||||
@@ -1053,7 +1053,7 @@ class WirelessDaemon(dbus.service.Object):
|
||||
""" Returns the current signal strength. """
|
||||
try:
|
||||
strength = int(self.wifi.GetSignalStrength(iwconfig))
|
||||
except:
|
||||
except TypeError:
|
||||
strength = 0
|
||||
return strength
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ essid_pattern = re.compile('.*ESSID:"?(.*?)"?\s*\n', __re_mode)
|
||||
ap_mac_pattern = re.compile('.*Address: (.*?)\n', __re_mode)
|
||||
channel_pattern = re.compile('.*Channel:? ?(\d\d?)', __re_mode)
|
||||
strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)', __re_mode)
|
||||
altstrength_pattern = re.compile('.*Signal level:?=? ?(\d\d*)', __re_mode)
|
||||
altstrength_pattern = re.compile('.*Signal level:?=? ?(\d+)\s*/?\s*(\d*)', __re_mode)
|
||||
signaldbm_pattern = re.compile('.*Signal level:?=? ?(-\d\d*)', __re_mode)
|
||||
mode_pattern = re.compile('.*Mode:(.*?)\n', __re_mode)
|
||||
freq_pattern = re.compile('.*Frequency:(.*?)\n', __re_mode)
|
||||
@@ -383,7 +383,7 @@ class BaseInterface(object):
|
||||
the connection attempt.
|
||||
|
||||
Keyword arguments:
|
||||
pipe -- stdout pipe to the dhcpcd process.
|
||||
pipe -- stdout pipe to the dhclient process.
|
||||
|
||||
Returns:
|
||||
'success' if succesful', an error code string otherwise.
|
||||
@@ -408,7 +408,7 @@ class BaseInterface(object):
|
||||
""" Determines if obtaining an IP using pump succeeded.
|
||||
|
||||
Keyword arguments:
|
||||
pipe -- stdout pipe to the dhcpcd process.
|
||||
pipe -- stdout pipe to the pump process.
|
||||
|
||||
Returns:
|
||||
'success' if succesful, an error code string otherwise.
|
||||
@@ -443,7 +443,7 @@ class BaseInterface(object):
|
||||
|
||||
while not dhcpcd_complete:
|
||||
line = pipe.readline()
|
||||
if line.startswith("Error"):
|
||||
if "Error" in line or "timed out" in line:
|
||||
dhcpcd_success = False
|
||||
dhcpcd_complete = True
|
||||
elif line == '':
|
||||
@@ -1083,18 +1083,8 @@ class BaseWirelessInterface(BaseInterface):
|
||||
|
||||
# Link Quality
|
||||
# Set strength to -1 if the quality is not found
|
||||
|
||||
# more of the patch from
|
||||
# https://bugs.launchpad.net/wicd/+bug/175104
|
||||
if (strength_pattern.match(cell)):
|
||||
[(strength, max_strength)] = strength_pattern.findall(cell)
|
||||
if max_strength:
|
||||
ap["quality"] = 100 * int(strength) // int(max_strength)
|
||||
else:
|
||||
ap["quality"] = int(strength)
|
||||
elif misc.RunRegex(altstrength_pattern,cell):
|
||||
ap['quality'] = misc.RunRegex(altstrength_pattern, cell)
|
||||
else:
|
||||
ap['quality'] = self._get_link_quality(cell)
|
||||
if ap['quality'] is None:
|
||||
ap['quality'] = -1
|
||||
|
||||
# Signal Strength (only used if user doesn't want link
|
||||
@@ -1190,6 +1180,22 @@ class BaseWirelessInterface(BaseInterface):
|
||||
bssid = misc.RunRegex(bssid_pattern, output)
|
||||
return bssid
|
||||
|
||||
def _get_link_quality(self, output):
|
||||
""" Parse out the link quality from iwlist scan or iwconfig output. """
|
||||
try:
|
||||
[(strength, max_strength)] = strength_pattern.findall(output)
|
||||
except ValueError:
|
||||
(strength, max_strength) = (None, None)
|
||||
|
||||
if strength in ['', None]:
|
||||
[(strength, max_strength)] = altstrength_pattern.findall(output)
|
||||
if strength not in ['', None] and max_strength:
|
||||
return (100 * int(strength) // int(max_strength))
|
||||
elif strength not in ["", None]:
|
||||
return int(strength)
|
||||
else:
|
||||
return None
|
||||
|
||||
def GetSignalStrength(self, iwconfig=None):
|
||||
""" Get the signal strength of the current network.
|
||||
|
||||
@@ -1203,22 +1209,7 @@ class BaseWirelessInterface(BaseInterface):
|
||||
output = misc.Run(cmd)
|
||||
else:
|
||||
output = iwconfig
|
||||
|
||||
strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)',
|
||||
re.I | re.M | re.S)
|
||||
altstrength_pattern = re.compile('.*Signal level:?=? ?(\d\d*)', re.I | re.M | re.S)
|
||||
[(strength, max_strength)] = strength_pattern.findall(output)
|
||||
if max_strength and strength:
|
||||
if int(max_strength) != 0:
|
||||
return 100 * int(strength) // int(max_strength)
|
||||
else:
|
||||
# Prevent a divide by zero error.
|
||||
strength = int(strength)
|
||||
|
||||
if strength is None:
|
||||
strength = misc.RunRegex(altstrength_pattern, output)
|
||||
|
||||
return strength
|
||||
return self._get_link_quality(output)
|
||||
|
||||
def GetDBMStrength(self, iwconfig=None):
|
||||
""" Get the dBm signal strength of the current network.
|
||||
|
||||
Reference in New Issue
Block a user