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/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 } diff --git a/setup.py b/setup.py index f55b4a4..6d504de 100755 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ import subprocess VERSION_NUM = '1.6.0a1' # REVISION_NUM is automatically updated REVISION_NUM = 'unknown' -CURSES_REVNO = 'r278' +CURSES_REVNO = 'r279' try: if not os.path.exists('vcsinfo.py'): diff --git a/wicd/backends/be-ioctl.py b/wicd/backends/be-ioctl.py index aafe454..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) @@ -338,7 +330,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 @@ -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/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 36c8ba5..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") 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.