=== modified file 'mandos' --- mandos 2009-11-05 02:12:57 +0000 +++ mandos 2009-11-15 10:12:09 +0000 @@ -1280,11 +1280,12 @@ cmd, args = cmdline.rstrip(u"\r\n").split(None, 1) if cmd == u"NOTFOUND": - logger.warning(u"Client not found for fingerprint: %s", - args) + fpr, address = args.split(None, 1) + logger.warning(u"Client not found for fingerprint: %s, ad" + u"dress: %s", fpr, address) if self.use_dbus: # Emit D-Bus signal - mandos_dbus_service.ClientNotFound(args) + mandos_dbus_service.ClientNotFound(fpr, address) elif cmd == u"INVALID": for client in self.clients: if client.name == args: @@ -1635,8 +1636,8 @@ "D-Bus signal" pass - @dbus.service.signal(_interface, signature=u"s") - def ClientNotFound(self, fingerprint): + @dbus.service.signal(_interface, signature=u"ss") + def ClientNotFound(self, fingerprint, address): "D-Bus signal" pass === modified file 'mandos-monitor' --- mandos-monitor 2009-11-11 00:25:22 +0000 +++ mandos-monitor 2009-11-15 10:12:09 +0000 @@ -4,8 +4,11 @@ from __future__ import division, absolute_import, with_statement import sys +import os import signal +import datetime + import urwid.curses_display import urwid @@ -43,7 +46,7 @@ self.properties = dict() else: self.properties = properties - self.proxy.connect_to_signal("PropertyChanged", + self.proxy.connect_to_signal(u"PropertyChanged", self.property_changed, client_interface, byte_arrays=True) @@ -69,23 +72,77 @@ """ def __init__(self, server_proxy_object=None, update_hook=None, - delete_hook=None, *args, **kwargs): + delete_hook=None, logger=None, *args, **kwargs): # Called on update self.update_hook = update_hook # Called on delete self.delete_hook = delete_hook # Mandos Server proxy object self.server_proxy_object = server_proxy_object + # Logger + self.logger = logger # The widget shown normally - self._text_widget = urwid.Text("") + self._text_widget = urwid.Text(u"") # The widget shown when we have focus - self._focus_text_widget = urwid.Text("") + self._focus_text_widget = urwid.Text(u"") super(MandosClientWidget, self).__init__( update_hook=update_hook, delete_hook=delete_hook, *args, **kwargs) self.update() self.opened = False + self.proxy.connect_to_signal(u"CheckerCompleted", + self.checker_completed, + client_interface, + byte_arrays=True) + self.proxy.connect_to_signal(u"CheckerStarted", + self.checker_started, + client_interface, + byte_arrays=True) + self.proxy.connect_to_signal(u"GotSecret", + self.got_secret, + client_interface, + byte_arrays=True) + self.proxy.connect_to_signal(u"Rejected", + self.rejected, + client_interface, + byte_arrays=True) + + def checker_completed(self, exitstatus, condition, command): + if exitstatus == 0: + self.logger(u'Checker for client %s (command "%s")' + u' was successful' + % (self.properties[u"name"], command)) + return + if os.WIFEXITED(condition): + self.logger(u'Checker for client %s (command "%s")' + u' failed with exit code %s' + % (self.properties[u"name"], command, + os.WEXITSTATUS(condition))) + return + if os.WIFSIGNALED(condition): + self.logger(u'Checker for client %s (command "%s")' + u' was killed by signal %s' + % (self.properties[u"name"], command, + os.WTERMSIG(condition))) + return + if os.WCOREDUMP(condition): + self.logger(u'Checker for client %s (command "%s")' + u' dumped core' + % (self.properties[u"name"], command)) + self.logger(u'Checker for client %s completed mysteriously') + + def checker_started(self, command): + self.logger(u'Client %s started checker "%s"' + % (self.properties[u"name"], unicode(command))) + + def got_secret(self): + self.logger(u'Client %s received its secret' + % self.properties[u"name"]) + + def rejected(self): + self.logger(u'Client %s was rejected' + % self.properties[u"name"]) def selectable(self): """Make this a "selectable" widget. @@ -115,11 +172,15 @@ } # Rebuild focus and non-focus widgets using current properties - self._text = (u'name="%(name)s", enabled=%(enabled)s' - % self.properties) + self._text = (u'%(name)s: %(enabled)s' + % { u"name": self.properties[u"name"], + u"enabled": + (u"enabled" + if self.properties[u"enabled"] + else u"DISABLED")}) if not urwid.supports_unicode(): self._text = self._text.encode("ascii", "replace") - textlist = [(u"normal", u"BLARGH: "), (u"bold", self._text)] + textlist = [(u"normal", self._text)] self._text_widget.set_text(textlist) self._focus_text_widget.set_text([(with_standout[text[0]], text[1]) @@ -250,10 +311,10 @@ self.log_wrap = u"any" self.rebuild() - self.log_message((u"bold", - u"Mandos Monitor version " + version)) - self.log_message((u"bold", - u"q: Quit ?: Help")) + self.log_message_raw((u"bold", + u"Mandos Monitor version " + version)) + self.log_message_raw((u"bold", + u"q: Quit ?: Help")) self.busname = domain + '.Mandos' self.main_loop = gobject.MainLoop() @@ -270,15 +331,20 @@ mandos_clients = dbus.Dictionary() (self.mandos_serv - .connect_to_signal("ClientRemoved", + .connect_to_signal(u"ClientRemoved", self.find_and_remove_client, dbus_interface=server_interface, byte_arrays=True)) (self.mandos_serv - .connect_to_signal("ClientAdded", + .connect_to_signal(u"ClientAdded", self.add_new_client, dbus_interface=server_interface, byte_arrays=True)) + (self.mandos_serv + .connect_to_signal(u"ClientNotFound", + self.client_not_found, + dbus_interface=server_interface, + byte_arrays=True)) for path, client in mandos_clients.iteritems(): client_proxy_object = self.bus.get_object(self.busname, path) @@ -290,9 +356,16 @@ update_hook =self.refresh, delete_hook - =self.remove_client), + =self.remove_client, + logger + =self.log_message), path=path) + def client_not_found(self, fingerprint, address): + self.log_message((u"Client with address %s and fingerprint %s" + u" could not be found" % (address, + fingerprint))) + def rebuild(self): """This rebuilds the User Interface. Call this when the widget layout needs to change""" @@ -307,7 +380,11 @@ pass self.topwidget = urwid.Pile(self.uilist) - def log_message(self, markup): + def log_message(self, message): + timestamp = datetime.datetime.now().isoformat() + self.log_message_raw(timestamp + u": " + message) + + def log_message_raw(self, markup): """Add a log message to the log buffer.""" self.log.append(urwid.Text(markup, wrap=self.log_wrap)) if (self.max_log_length @@ -315,6 +392,7 @@ del self.log[0:len(self.log)-self.max_log_length-1] self.logbox.set_focus(len(self.logbox.body.contents), coming_from=u"above") + self.refresh() def toggle_log_display(self): """Toggle visibility of the log buffer.""" @@ -435,20 +513,22 @@ if not self.log_visible: self.log_visible = True self.rebuild() - self.log_message((u"bold", - u" ".join((u"q: Quit", - u"?: Help", - u"l: Log window toggle", - u"TAB: Switch window", - u"w: Wrap (log)")))) - self.log_message((u"bold", - u" ".join((u"Clients:", - u"e: Enable", - u"d: Disable", - u"r: Remove", - u"s: Start new checker", - u"S: Stop checker", - u"C: Checker OK")))) + self.log_message_raw((u"bold", + u" ". + join((u"q: Quit", + u"?: Help", + u"l: Log window toggle", + u"TAB: Switch window", + u"w: Wrap (log)")))) + self.log_message_raw((u"bold", + u" " + .join((u"Clients:", + u"e: Enable", + u"d: Disable", + u"r: Remove", + u"s: Start new checker", + u"S: Stop checker", + u"C: Checker OK")))) self.refresh() elif key == u"tab": if self.topwidget.get_focus() is self.logbox: