/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos-monitor

  • Committer: Teddy Hogeborn
  • Date: 2013-05-22 20:00:18 UTC
  • Revision ID: teddy@recompile.se-20130522200018-xtbddz21pl7c69kw
* mandos: Bug fix: Don't print output from checkers when running in
          foreground.
          Bug fix: Do not fail when client is removed from
          clients.conf but saved settings remain.
  (Client.server_settings): New attribute.
  (Client.__init__): Take new "server_settings" keyword argument.  All
                     callers changed.
  (Client.start_checker): Redirect stdout and stderr for checkers when
                          running in foreground.
  (main): New "wnull" global variable for a writable /dev/null file.
          Do not restore settings for clients no longer in config file.
  (main/cleanup): Close wnull file object.  Do not save client
                  attribute "server_settings"
* mandos-monitor: Update to work in Urwid 1.0.1.
                  Adapt to work in both Python 3 and Python 2.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
from __future__ import (division, absolute_import, print_function,
27
27
                        unicode_literals)
28
 
 
29
 
from future_builtins import *
 
28
try:
 
29
    from future_builtins import *
 
30
except ImportError:
 
31
    pass
30
32
 
31
33
import sys
32
34
import os
38
40
import urwid
39
41
 
40
42
from dbus.mainloop.glib import DBusGMainLoop
41
 
import gobject
 
43
try:
 
44
    import gobject
 
45
except ImportError:
 
46
    from gi.repository import GObject as gobject
42
47
 
43
48
import dbus
44
49
 
45
 
import UserList
46
 
 
47
50
import locale
48
51
 
 
52
if sys.version_info[0] == 2:
 
53
    str = unicode
 
54
 
49
55
locale.setlocale(locale.LC_ALL, '')
50
56
 
51
57
import logging
55
61
domain = 'se.recompile'
56
62
server_interface = domain + '.Mandos'
57
63
client_interface = domain + '.Mandos.Client'
58
 
version = "1.5.4"
59
 
 
60
 
# Always run in monochrome mode
61
 
urwid.curses_display.curses.has_colors = lambda : False
62
 
 
63
 
# Urwid doesn't support blinking, but we want it.  Since we have no
64
 
# use for underline on its own, we make underline also always blink.
65
 
urwid.curses_display.curses.A_UNDERLINE |= (
66
 
    urwid.curses_display.curses.A_BLINK)
 
64
version = "1.6.0"
67
65
 
68
66
def isoformat_to_datetime(iso):
69
67
    "Parse an ISO 8601 date string to a datetime.datetime()"
210
208
           to log in the future. """
211
209
        #self.logger('Client {0} started checker "{1}"'
212
210
        #            .format(self.properties["Name"],
213
 
        #                    unicode(command)))
 
211
        #                    str(command)))
214
212
        pass
215
213
    
216
214
    def got_secret(self):
279
277
                message = "Approval in {0}. (d)eny?"
280
278
            else:
281
279
                message = "Denial in {0}. (a)pprove?"
282
 
            message = message.format(unicode(timer).rsplit(".", 1)[0])
 
280
            message = message.format(str(timer).rsplit(".", 1)[0])
283
281
            self.using_timer(True)
284
282
        elif self.properties["LastCheckerStatus"] != 0:
285
283
            # When checker has failed, show timer until client expires
293
291
                            datetime.timedelta())
294
292
            message = ('A checker has failed! Time until client'
295
293
                       ' gets disabled: {0}'
296
 
                       .format(unicode(timer).rsplit(".", 1)[0]))
 
294
                       .format(str(timer).rsplit(".", 1)[0]))
297
295
            self.using_timer(True)
298
296
        else:
299
297
            message = "enabled"
382
380
    def property_changed(self, property=None, **kwargs):
383
381
        """Call self.update() if old value is not new value.
384
382
        This overrides the method from MandosClientPropertyCache"""
385
 
        property_name = unicode(property)
 
383
        property_name = str(property)
386
384
        old_value = self.properties.get(property_name)
387
385
        super(MandosClientWidget, self).property_changed(
388
386
            property=property, **kwargs)
415
413
                ("normal",
416
414
                 "default", "default", None),
417
415
                ("bold",
418
 
                 "default", "default", "bold"),
 
416
                 "bold", "default", "bold"),
419
417
                ("underline-blink",
420
 
                 "default", "default", "underline"),
 
418
                 "underline,blink", "default", "underline,blink"),
421
419
                ("standout",
422
 
                 "default", "default", "standout"),
 
420
                 "standout", "default", "standout"),
423
421
                ("bold-underline-blink",
424
 
                 "default", "default", ("bold", "underline")),
 
422
                 "bold,underline,blink", "default", "bold,underline,blink"),
425
423
                ("bold-standout",
426
 
                 "default", "default", ("bold", "standout")),
 
424
                 "bold,standout", "default", "bold,standout"),
427
425
                ("underline-blink-standout",
428
 
                 "default", "default", ("underline", "standout")),
 
426
                 "underline,blink,standout", "default",
 
427
                 "underline,blink,standout"),
429
428
                ("bold-underline-blink-standout",
430
 
                 "default", "default", ("bold", "underline",
431
 
                                          "standout")),
 
429
                 "bold,underline,blink,standout", "default",
 
430
                 "bold,underline,blink,standout"),
432
431
                ))
433
432
        
434
433
        if urwid.supports_unicode():
489
488
        self.topwidget = urwid.Pile(self.uilist)
490
489
    
491
490
    def log_message(self, message):
 
491
        """Log message formatted with timestamp"""
492
492
        timestamp = datetime.datetime.now().isoformat()
493
493
        self.log_message_raw(timestamp + ": " + message)
494
494
    
507
507
        self.log_visible = not self.log_visible
508
508
        self.rebuild()
509
509
        #self.log_message("Log visibility changed to: "
510
 
        #                 + unicode(self.log_visible))
 
510
        #                 + str(self.log_visible))
511
511
    
512
512
    def change_log_display(self):
513
513
        """Change type of log display.
553
553
        if path is None:
554
554
            path = client.proxy.object_path
555
555
        self.clients_dict[path] = client
556
 
        self.clients.sort(None, lambda c: c.properties["Name"])
 
556
        self.clients.sort(key=lambda c: c.properties["Name"])
557
557
        self.refresh()
558
558
    
559
559
    def remove_client(self, client, path=None):
561
561
        if path is None:
562
562
            path = client.proxy.object_path
563
563
        del self.clients_dict[path]
564
 
        if not self.clients_dict:
565
 
            # Work around bug in Urwid 0.9.8.3 - if a SimpleListWalker
566
 
            # is completely emptied, we need to recreate it.
567
 
            self.clients = urwid.SimpleListWalker([])
568
 
            self.rebuild()
569
564
        self.refresh()
570
565
    
571
566
    def refresh(self):
584
579
        try:
585
580
            mandos_clients = (self.mandos_serv
586
581
                              .GetAllClientsWithProperties())
 
582
            if not mandos_clients:
 
583
                self.log_message_raw(("bold", "Note: Server has no clients."))
587
584
        except dbus.exceptions.DBusException:
 
585
            self.log_message_raw(("bold", "Note: No Mandos server running."))
588
586
            mandos_clients = dbus.Dictionary()
589
587
        
590
588
        (self.mandos_serv
602
600
                            self.client_not_found,
603
601
                            dbus_interface=server_interface,
604
602
                            byte_arrays=True))
605
 
        for path, client in mandos_clients.iteritems():
 
603
        for path, client in mandos_clients.items():
606
604
            client_proxy_object = self.bus.get_object(self.busname,
607
605
                                                      path)
608
606
            self.add_client(MandosClientWidget(server_proxy_object
720
718
    ui.run()
721
719
except KeyboardInterrupt:
722
720
    ui.screen.stop()
723
 
except Exception, e:
724
 
    ui.log_message(unicode(e))
 
721
except Exception as e:
 
722
    ui.log_message(str(e))
725
723
    ui.screen.stop()
726
724
    raise