From 5aaaa117e7a9698a3931151aa4cd0466b1f9e6cf Mon Sep 17 00:00:00 2001 From: Dan O'Reilly Date: Sat, 21 Feb 2009 13:11:55 -0500 Subject: [PATCH 1/4] Fix typo --- wicd/backends/be-ioctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wicd/backends/be-ioctl.py b/wicd/backends/be-ioctl.py index aafe454..e421ced 100644 --- a/wicd/backends/be-ioctl.py +++ b/wicd/backends/be-ioctl.py @@ -338,7 +338,7 @@ class WirelessInterface(Interface, wnettools.BaseWirelessInterface): socket_loc = os.path.join(ctrl_iface, self.iface) if os.path.exists(socket_loc): try: - return wpactrl.WPACtrl(socket) + return wpactrl.WPACtrl(socket_loc) except wpactrl.error, e: print "Couldn't open ctrl_interface: %s" % e return None From af62a5d76a3500423fef7718b9e02d86f39f3697 Mon Sep 17 00:00:00 2001 From: Andrew Psaltis Date: Tue, 24 Feb 2009 10:28:03 -0500 Subject: [PATCH 2/4] Made the Slackware init script look more like the rest of the Slackware init scripts. --- in/init=slackware=rc.wicd.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/in/init=slackware=rc.wicd.in b/in/init=slackware=rc.wicd.in index b15439c..10b3317 100755 --- a/in/init=slackware=rc.wicd.in +++ b/in/init=slackware=rc.wicd.in @@ -5,6 +5,7 @@ # This is defined in /usr/lib/python2.5/site-packages/wicd/wpath.py PIDFILE="%PIDFILE%" +DAEMON="%SBIN%wicd" # Define start and stop functions @@ -15,7 +16,7 @@ wicd_start() { echo "$PIDFILE and try again..." exit 1 else - echo "Starting wicd daemon..." + echo "Starting wicd daemon: $DAEMON" wicd 2>/dev/null 1>&2 fi } From ae0f589d43ffcd1edbbfadeb02a0a566d0d65d2e Mon Sep 17 00:00:00 2001 From: Dan O'Reilly Date: Fri, 27 Feb 2009 00:08:31 -0500 Subject: [PATCH 3/4] 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. --- .bzrignore | 1 + wicd/backends/be-ioctl.py | 26 +++++++----------- wicd/misc.py | 38 ++++++++++++++++++++++++--- wicd/wicd-client.py | 2 +- wicd/wicd-daemon.py | 2 +- wicd/wnettools.py | 55 ++++++++++++++++----------------------- 6 files changed, 70 insertions(+), 54 deletions(-) diff --git a/.bzrignore b/.bzrignore index 4521dc6..29a8142 100644 --- a/.bzrignore +++ b/.bzrignore @@ -23,3 +23,4 @@ scripts/wicd-client scripts/wicd-curses translations/* wicd/wpath.py +*tags diff --git a/wicd/backends/be-ioctl.py b/wicd/backends/be-ioctl.py index e421ced..b4681a0 100644 --- a/wicd/backends/be-ioctl.py +++ b/wicd/backends/be-ioctl.py @@ -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,17 +310,10 @@ 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['qual_found'] = False - ap['quality'] = -1 + ap['quality'] = self._get_link_quality(cell['stats']) + if ap['quality'] is None: + ap['qual_found'] = False + ap['quality'] = -1 # Signal Strength (only used if user doesn't want link # quality displayed or it isn't found) @@ -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. """ diff --git a/wicd/misc.py b/wicd/misc.py index e0a69c6..feafbf7 100644 --- a/wicd/misc.py +++ b/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) @@ -690,4 +693,31 @@ def timeout_add(time, func, milli=False): else: 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) + diff --git a/wicd/wicd-client.py b/wicd/wicd-client.py index 36c8ba5..b1a0c91 100755 --- a/wicd/wicd-client.py +++ b/wicd/wicd-client.py @@ -625,7 +625,7 @@ class TrayIcon(object): def __init__(self, use_tray=True): TrayIcon.TrayIconGUI.__init__(self, use_tray) self.use_tray = use_tray - if not use_tray: + if not use_tray: self.toggle_wicd_gui() return diff --git a/wicd/wicd-daemon.py b/wicd/wicd-daemon.py index 96ae287..c4015ce 100644 --- a/wicd/wicd-daemon.py +++ b/wicd/wicd-daemon.py @@ -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 diff --git a/wicd/wnettools.py b/wicd/wnettools.py index 2bfe775..774bb6d 100644 --- a/wicd/wnettools.py +++ b/wicd/wnettools.py @@ -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. From 0af4c5331e18f801a886b6b2f08c12129a6d2784 Mon Sep 17 00:00:00 2001 From: Dan O'Reilly Date: Fri, 27 Feb 2009 00:35:53 -0500 Subject: [PATCH 4/4] Get rid of unneeded "use_tray" variable being passed around in wicd-client. Remove some extra whitespace in networking.py --- wicd/networking.py | 10 +++++----- wicd/wicd-client.py | 47 +++++++++++++++------------------------------ 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/wicd/networking.py b/wicd/networking.py index 8ea3fe8..c308790 100644 --- a/wicd/networking.py +++ b/wicd/networking.py @@ -396,7 +396,7 @@ class ConnectThread(threading.Thread): print 'Setting the broadcast address...' + self.network['broadcast'] iface.SetAddress(broadcast=self.network['broadcast']) - @abortable + @abortable def set_ip_address(self, iface): """ Set the IP address for the given interface. @@ -420,7 +420,7 @@ class ConnectThread(threading.Thread): self.abort_connection(dhcp_status) return - @abortable + @abortable def set_dns_addresses(self): """ Set the DNS address(es). @@ -443,7 +443,7 @@ class ConnectThread(threading.Thread): self.network.get('dns_domain'), self.network.get('search_domain')) - @abortable + @abortable def release_dhcp_clients(self, iface): """ Release all running dhcp clients. """ print "Releasing DHCP leases..." @@ -474,7 +474,7 @@ class ConnectThread(threading.Thread): finally: self.lock.release() - @abortable + @abortable def put_iface_up(self, iface): """ Bring up given interface. """ print 'Putting interface up...' @@ -819,7 +819,7 @@ class WirelessConnectThread(ConnectThread): print 'Stopping wpa_supplicant' wiface.StopWPA() - @abortable + @abortable def generate_psk_and_authenticate(self, wiface): """ Generates a PSK and authenticates if necessary. diff --git a/wicd/wicd-client.py b/wicd/wicd-client.py index b1a0c91..e69c5fd 100755 --- a/wicd/wicd-client.py +++ b/wicd/wicd-client.py @@ -109,12 +109,12 @@ class TrayIcon(object): Base Class for implementing a tray icon to display network status. """ - def __init__(self, use_tray, animate): + def __init__(self, animate): if USE_EGG: - self.tr = self.EggTrayIconGUI(use_tray) + self.tr = self.EggTrayIconGUI() else: - self.tr = self.StatusTrayIconGUI(use_tray) - self.icon_info = self.TrayConnectionInfo(self.tr, use_tray, animate) + self.tr = self.StatusTrayIconGUI() + self.icon_info = self.TrayConnectionInfo(self.tr, animate) def is_embedded(self): if USE_EGG: @@ -125,7 +125,7 @@ class TrayIcon(object): class TrayConnectionInfo(object): """ Class for updating the tray icon status. """ - def __init__(self, tr, use_tray=True, animate=True): + def __init__(self, tr, animate=True): """ Initialize variables needed for the icon status methods. """ self.last_strength = -2 self.still_wired = False @@ -133,7 +133,6 @@ class TrayIcon(object): self.tried_reconnect = False self.connection_lost_counter = 0 self.tr = tr - self.use_tray = use_tray self.last_sndbytes = -1 self.last_rcvbytes = -1 self.max_snd_gain = 10000 @@ -203,7 +202,7 @@ class TrayIcon(object): @catchdbus def update_tray_icon(self, state=None, info=None): """ Updates the tray icon and current connection status. """ - if not self.use_tray or not DBUS_AVAIL: return False + if not DBUS_AVAIL: return False if not state or not info: [state, info] = daemon.GetConnectionStatus() @@ -330,7 +329,7 @@ class TrayIcon(object): tray icons. """ - def __init__(self, use_tray): + def __init__(self): menu = """ @@ -361,7 +360,6 @@ class TrayIcon(object): props.parent) self.gui_win = None self.current_icon_path = None - self.use_tray = use_tray self._is_scanning = False net_menuitem = self.manager.get_widget("/Menubar/Menu/Connect/") net_menuitem.connect("activate", self.on_net_menu_activate) @@ -571,14 +569,9 @@ class TrayIcon(object): for machines running versions of GTK < 2.10. """ - def __init__(self, use_tray=True): + def __init__(self): """Initializes the tray icon""" - TrayIcon.TrayIconGUI.__init__(self, use_tray) - self.use_tray = use_tray - if not use_tray: - self.toggle_wicd_gui() - return - + TrayIcon.TrayIconGUI.__init__(self) self.tooltip = gtk.Tooltips() self.eb = gtk.EventBox() self.tray = egg.trayicon.TrayIcon("WicdTrayIcon") @@ -601,7 +594,6 @@ class TrayIcon(object): def set_from_file(self, val=None): """ Calls set_from_file on the gtk.Image for the tray icon. """ - if not self.use_tray: return self.pic.set_from_file(val) def set_tooltip(self, val): @@ -611,7 +603,6 @@ class TrayIcon(object): tray icon. """ - if not self.use_tray: return self.tooltip.set_tip(self.eb, val) @@ -622,13 +613,8 @@ class TrayIcon(object): Uses gtk.StatusIcon to implement a tray icon. """ - def __init__(self, use_tray=True): - TrayIcon.TrayIconGUI.__init__(self, use_tray) - self.use_tray = use_tray - if not use_tray: - self.toggle_wicd_gui() - return - + def __init__(self): + TrayIcon.TrayIconGUI.__init__(self) gtk.StatusIcon.__init__(self) self.current_icon_path = '' @@ -645,7 +631,6 @@ class TrayIcon(object): def set_from_file(self, path=None): """ Sets a new tray icon picture. """ - if not self.use_tray: return if path != self.current_icon_path: self.current_icon_path = path gtk.StatusIcon.set_from_file(self, path) @@ -716,9 +701,6 @@ def main(argv): argv -- The arguments passed to the script. """ - use_tray = True - animate = True - try: opts, args = getopt.getopt(sys.argv[1:], 'nha', ['help', 'no-tray', 'no-animate']) @@ -727,6 +709,8 @@ def main(argv): usage() sys.exit(2) + use_tray = True + animate = True for opt, a in opts: if opt in ('-h', '--help'): usage() @@ -750,7 +734,7 @@ def main(argv): sys.exit(0) # Set up the tray icon GUI and backend - tray_icon = TrayIcon(use_tray, animate) + tray_icon = TrayIcon(animate) # Check to see if wired profile chooser was called before icon # was launched (typically happens on startup or daemon restart). @@ -767,7 +751,8 @@ def main(argv): 'org.wicd.daemon.wireless') bus.add_signal_receiver(tray_icon.tr.tray_scan_started, 'SendStartScanSignal', 'org.wicd.daemon.wireless') - bus.add_signal_receiver(lambda: handle_no_dbus() or tray_icon.icon_info.set_not_connected_state(), + bus.add_signal_receiver(lambda: (handle_no_dbus() or + tray_icon.icon_info.set_not_connected_state()), "DaemonClosing", 'org.wicd.daemon') bus.add_signal_receiver(lambda: setup_dbus(force=False), "DaemonStarting", "org.wicd.daemon")