=== modified file 'mandos' --- mandos 2011-03-15 19:15:24 +0000 +++ mandos 2011-04-02 06:37:18 +0000 @@ -151,6 +151,7 @@ self.group = None # our entry group self.server = None self.bus = bus + self.entry_group_state_changed_match = None def rename(self): """Derived from the Avahi example code""" if self.rename_count >= self.max_renames: @@ -168,7 +169,7 @@ self.remove() try: self.add() - except dbus.exceptions.DBusException, error: + except dbus.exceptions.DBusException as error: logger.critical("DBusException: %s", error) self.cleanup() os._exit(1) @@ -176,17 +177,26 @@ def remove(self): """Derived from the Avahi example code""" if self.group is not None: - self.group.Reset() + try: + self.group.Free() + except (dbus.exceptions.UnknownMethodException, + dbus.exceptions.DBusException) as e: + pass + self.group = None + if self.entry_group_state_changed_match is not None: + self.entry_group_state_changed_match.remove() + self.entry_group_state_changed_match = None def add(self): """Derived from the Avahi example code""" - if self.group is None: - self.group = dbus.Interface( - self.bus.get_object(avahi.DBUS_NAME, - self.server.EntryGroupNew()), - avahi.DBUS_INTERFACE_ENTRY_GROUP) - self.group.connect_to_signal('StateChanged', - self - .entry_group_state_changed) + self.remove() + self.group = dbus.Interface( + self.bus.get_object(avahi.DBUS_NAME, + self.server.EntryGroupNew(), + follow_name_owner_changes=True), + avahi.DBUS_INTERFACE_ENTRY_GROUP) + self.entry_group_state_changed_match = ( + self.group.connect_to_signal( + 'StateChanged', self .entry_group_state_changed)) logger.debug("Adding Zeroconf service '%s' of type '%s' ...", self.name, self.type) self.group.AddService( @@ -214,23 +224,32 @@ % unicode(error)) def cleanup(self): """Derived from the Avahi example code""" - if self.group is not None: - self.group.Free() - self.group = None - def server_state_changed(self, state): + self.remove() + def server_state_changed(self, state, error=None): """Derived from the Avahi example code""" logger.debug("Avahi server state change: %i", state) - if state == avahi.SERVER_COLLISION: - logger.error("Zeroconf server name collision") + bad_states = { avahi.SERVER_INVALID: + "Zeroconf server invalid", + avahi.SERVER_REGISTERING: None, + avahi.SERVER_COLLISION: + "Zeroconf server name collision", + avahi.SERVER_FAILURE: + "Zeroconf server failure" } + if state in bad_states: + if bad_states[state]: + logger.error(bad_states[state]) self.remove() elif state == avahi.SERVER_RUNNING: self.add() + else: + logger.debug("Unknown state: %r", state) def activate(self): """Derived from the Avahi example code""" if self.server is None: self.server = dbus.Interface( self.bus.get_object(avahi.DBUS_NAME, - avahi.DBUS_PATH_SERVER), + avahi.DBUS_PATH_SERVER, + follow_name_owner_changes=True), avahi.DBUS_INTERFACE_SERVER) self.server.connect_to_signal("StateChanged", self.server_state_changed) @@ -445,7 +464,7 @@ # If a checker exists, make sure it is not a zombie try: pid, status = os.waitpid(self.checker.pid, os.WNOHANG) - except (AttributeError, OSError), error: + except (AttributeError, OSError) as error: if (isinstance(error, OSError) and error.errno != errno.ECHILD): raise error @@ -472,7 +491,7 @@ try: command = self.checker_command % escaped_attrs - except TypeError, error: + except TypeError as error: logger.error('Could not format string "%s":' ' %s', self.checker_command, error) return True # Try again later @@ -497,7 +516,7 @@ if pid: gobject.source_remove(self.checker_callback_tag) self.checker_callback(pid, status, command) - except OSError, error: + except OSError as error: logger.error("Failed to start subprocess: %s", error) # Re-run this periodically if run by gobject.timeout_add @@ -516,7 +535,7 @@ #time.sleep(0.5) #if self.checker.poll() is None: # os.kill(self.checker.pid, signal.SIGKILL) - except OSError, error: + except OSError as error: if error.errno != errno.ESRCH: # No such process raise self.checker = None @@ -704,7 +723,7 @@ xmlstring = document.toxml("utf-8") document.unlink() except (AttributeError, xml.dom.DOMException, - xml.parsers.expat.ExpatError), error: + xml.parsers.expat.ExpatError) as error: logger.error("Failed to override Introspection method", error) return xmlstring @@ -813,13 +832,12 @@ *args, **kwargs) def checked_ok(self, *args, **kwargs): - r = Client.checked_ok(self, *args, **kwargs) + Client.checked_ok(self, *args, **kwargs) # Emit D-Bus signal self.PropertyChanged( dbus.String("LastCheckedOK"), (self._datetime_to_dbus(self.last_checked_ok, variant_level=1))) - return r def need_approval(self, *args, **kwargs): r = Client.need_approval(self, *args, **kwargs) @@ -922,7 +940,7 @@ # CheckedOK - method @dbus.service.method(_interface) def CheckedOK(self): - return self.checked_ok() + self.checked_ok() # Enable - method @dbus.service.method(_interface) @@ -1204,14 +1222,14 @@ try: if int(line.strip().split()[0]) > 1: raise RuntimeError - except (ValueError, IndexError, RuntimeError), error: + except (ValueError, IndexError, RuntimeError) as error: logger.error("Unknown protocol version: %s", error) return # Start GnuTLS connection try: session.handshake() - except gnutls.errors.GNUTLSError, error: + except gnutls.errors.GNUTLSError as error: logger.warning("Handshake failed: %s", error) # Do not run session.bye() here: the session is not # established. Just abandon the request. @@ -1223,7 +1241,8 @@ try: fpr = self.fingerprint(self.peer_certificate (session)) - except (TypeError, gnutls.errors.GNUTLSError), error: + except (TypeError, + gnutls.errors.GNUTLSError) as error: logger.warning("Bad certificate: %s", error) return logger.debug("Fingerprint: %s", fpr) @@ -1292,7 +1311,7 @@ while sent_size < len(client.secret): try: sent = session.send(client.secret[sent_size:]) - except (gnutls.errors.GNUTLSError), error: + except gnutls.errors.GNUTLSError as error: logger.warning("gnutls send failed") return logger.debug("Sent: %d, remaining: %d", @@ -1312,7 +1331,7 @@ client.approvals_pending -= 1 try: session.bye() - except (gnutls.errors.GNUTLSError), error: + except gnutls.errors.GNUTLSError as error: logger.warning("GnuTLS bye failed") @staticmethod @@ -1442,7 +1461,7 @@ SO_BINDTODEVICE, str(self.interface + '\0')) - except socket.error, error: + except socket.error as error: if error[0] == errno.EPERM: logger.error("No permission to" " bind to interface %s", @@ -1613,7 +1632,7 @@ delta = datetime.timedelta(0, 0, 0, 0, 0, 0, value) else: raise ValueError("Unknown suffix %r" % suffix) - except (ValueError, IndexError), e: + except (ValueError, IndexError) as e: raise ValueError(*(e.args)) timevalue += delta return timevalue @@ -1816,7 +1835,7 @@ try: os.setgid(gid) os.setuid(uid) - except OSError, error: + except OSError as error: if error[0] != errno.EPERM: raise error @@ -1866,7 +1885,7 @@ try: bus_name = dbus.service.BusName("se.bsnet.fukt.Mandos", bus, do_not_queue=True) - except dbus.exceptions.NameExistsException, e: + except dbus.exceptions.NameExistsException as e: logger.error(unicode(e) + ", disabling D-Bus") use_dbus = False server_settings["use_dbus"] = False @@ -2022,7 +2041,7 @@ # From the Avahi example code try: service.activate() - except dbus.exceptions.DBusException, error: + except dbus.exceptions.DBusException as error: logger.critical("DBusException: %s", error) cleanup() sys.exit(1) @@ -2035,7 +2054,7 @@ logger.debug("Starting main loop") main_loop.run() - except AvahiError, error: + except AvahiError as error: logger.critical("AvahiError: %s", error) cleanup() sys.exit(1) === modified file 'mandos-monitor' --- mandos-monitor 2011-03-08 19:41:59 +0000 +++ mandos-monitor 2011-04-02 06:37:18 +0000 @@ -358,24 +358,32 @@ """Handle keys. This overrides the method from urwid.FlowWidget""" if key == "+": - self.proxy.Enable(dbus_interface = client_interface) + self.proxy.Enable(dbus_interface = client_interface, + ignore_reply=True) elif key == "-": - self.proxy.Disable(dbus_interface = client_interface) + self.proxy.Disable(dbus_interface = client_interface, + ignore_reply=True) elif key == "a": self.proxy.Approve(dbus.Boolean(True, variant_level=1), - dbus_interface = client_interface) + dbus_interface = client_interface, + ignore_reply=True) elif key == "d": self.proxy.Approve(dbus.Boolean(False, variant_level=1), - dbus_interface = client_interface) + dbus_interface = client_interface, + ignore_reply=True) elif key == "R" or key == "_" or key == "ctrl k": self.server_proxy_object.RemoveClient(self.proxy - .object_path) + .object_path, + ignore_reply=True) elif key == "s": - self.proxy.StartChecker(dbus_interface = client_interface) + self.proxy.StartChecker(dbus_interface = client_interface, + ignore_reply=True) elif key == "S": - self.proxy.StopChecker(dbus_interface = client_interface) + self.proxy.StopChecker(dbus_interface = client_interface, + ignore_reply=True) elif key == "C": - self.proxy.CheckedOK(dbus_interface = client_interface) + self.proxy.CheckedOK(dbus_interface = client_interface, + ignore_reply=True) # xxx # elif key == "p" or key == "=": # self.proxy.pause()