/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: 2012-06-22 23:33:56 UTC
  • Revision ID: teddy@recompile.se-20120622233356-odoqqt2ki2gssn37
* Makefile (check): Also check mandos-ctl.
* mandos-ctl: All options taking a time interval argument can now take
              an RFC 3339 duration.
  (rfc3339_duration_to_delta): New function.
  (string_to_delta): Try rfc3339_duration_to_delta first.
  (main): New "--check" option.
* mandos-ctl.xml (SYNOPSIS, OPTIONS): Document new "--check" option.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
4
4
# Mandos Monitor - Control and monitor the Mandos server
5
5
6
 
# Copyright © 2009-2013 Teddy Hogeborn
7
 
# Copyright © 2009-2013 Björn Påhlsson
 
6
# Copyright © 2009-2012 Teddy Hogeborn
 
7
# Copyright © 2009-2012 Björn Påhlsson
8
8
9
9
# This program is free software: you can redistribute it and/or modify
10
10
# it under the terms of the GNU General Public License as published by
25
25
 
26
26
from __future__ import (division, absolute_import, print_function,
27
27
                        unicode_literals)
28
 
try:
29
 
    from future_builtins import *
30
 
except ImportError:
31
 
    pass
 
28
 
 
29
from future_builtins import *
32
30
 
33
31
import sys
34
32
import os
40
38
import urwid
41
39
 
42
40
from dbus.mainloop.glib import DBusGMainLoop
43
 
try:
44
 
    import gobject
45
 
except ImportError:
46
 
    from gi.repository import GObject as gobject
 
41
import gobject
47
42
 
48
43
import dbus
49
44
 
 
45
import UserList
 
46
 
50
47
import locale
51
48
 
52
 
if sys.version_info[0] == 2:
53
 
    str = unicode
54
 
 
55
49
locale.setlocale(locale.LC_ALL, '')
56
50
 
57
51
import logging
61
55
domain = 'se.recompile'
62
56
server_interface = domain + '.Mandos'
63
57
client_interface = domain + '.Mandos.Client'
64
 
version = "1.6.2"
 
58
version = "1.6.0"
 
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)
65
67
 
66
68
def isoformat_to_datetime(iso):
67
69
    "Parse an ISO 8601 date string to a datetime.datetime()"
208
210
           to log in the future. """
209
211
        #self.logger('Client {0} started checker "{1}"'
210
212
        #            .format(self.properties["Name"],
211
 
        #                    str(command)))
 
213
        #                    unicode(command)))
212
214
        pass
213
215
    
214
216
    def got_secret(self):
277
279
                message = "Approval in {0}. (d)eny?"
278
280
            else:
279
281
                message = "Denial in {0}. (a)pprove?"
280
 
            message = message.format(str(timer).rsplit(".", 1)[0])
 
282
            message = message.format(unicode(timer).rsplit(".", 1)[0])
281
283
            self.using_timer(True)
282
284
        elif self.properties["LastCheckerStatus"] != 0:
283
285
            # When checker has failed, show timer until client expires
291
293
                            datetime.timedelta())
292
294
            message = ('A checker has failed! Time until client'
293
295
                       ' gets disabled: {0}'
294
 
                       .format(str(timer).rsplit(".", 1)[0]))
 
296
                       .format(unicode(timer).rsplit(".", 1)[0]))
295
297
            self.using_timer(True)
296
298
        else:
297
299
            message = "enabled"
380
382
    def property_changed(self, property=None, **kwargs):
381
383
        """Call self.update() if old value is not new value.
382
384
        This overrides the method from MandosClientPropertyCache"""
383
 
        property_name = str(property)
 
385
        property_name = unicode(property)
384
386
        old_value = self.properties.get(property_name)
385
387
        super(MandosClientWidget, self).property_changed(
386
388
            property=property, **kwargs)
413
415
                ("normal",
414
416
                 "default", "default", None),
415
417
                ("bold",
416
 
                 "bold", "default", "bold"),
 
418
                 "default", "default", "bold"),
417
419
                ("underline-blink",
418
 
                 "underline,blink", "default", "underline,blink"),
 
420
                 "default", "default", "underline"),
419
421
                ("standout",
420
 
                 "standout", "default", "standout"),
 
422
                 "default", "default", "standout"),
421
423
                ("bold-underline-blink",
422
 
                 "bold,underline,blink", "default", "bold,underline,blink"),
 
424
                 "default", "default", ("bold", "underline")),
423
425
                ("bold-standout",
424
 
                 "bold,standout", "default", "bold,standout"),
 
426
                 "default", "default", ("bold", "standout")),
425
427
                ("underline-blink-standout",
426
 
                 "underline,blink,standout", "default",
427
 
                 "underline,blink,standout"),
 
428
                 "default", "default", ("underline", "standout")),
428
429
                ("bold-underline-blink-standout",
429
 
                 "bold,underline,blink,standout", "default",
430
 
                 "bold,underline,blink,standout"),
 
430
                 "default", "default", ("bold", "underline",
 
431
                                          "standout")),
431
432
                ))
432
433
        
433
434
        if urwid.supports_unicode():
488
489
        self.topwidget = urwid.Pile(self.uilist)
489
490
    
490
491
    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
 
        #                 + str(self.log_visible))
 
510
        #                 + unicode(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(key=lambda c: c.properties["Name"])
 
556
        self.clients.sort(None, 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()
564
569
        self.refresh()
565
570
    
566
571
    def refresh(self):
579
584
        try:
580
585
            mandos_clients = (self.mandos_serv
581
586
                              .GetAllClientsWithProperties())
582
 
            if not mandos_clients:
583
 
                self.log_message_raw(("bold", "Note: Server has no clients."))
584
587
        except dbus.exceptions.DBusException:
585
 
            self.log_message_raw(("bold", "Note: No Mandos server running."))
586
588
            mandos_clients = dbus.Dictionary()
587
589
        
588
590
        (self.mandos_serv
600
602
                            self.client_not_found,
601
603
                            dbus_interface=server_interface,
602
604
                            byte_arrays=True))
603
 
        for path, client in mandos_clients.items():
 
605
        for path, client in mandos_clients.iteritems():
604
606
            client_proxy_object = self.bus.get_object(self.busname,
605
607
                                                      path)
606
608
            self.add_client(MandosClientWidget(server_proxy_object
718
720
    ui.run()
719
721
except KeyboardInterrupt:
720
722
    ui.screen.stop()
721
 
except Exception as e:
722
 
    ui.log_message(str(e))
 
723
except Exception, e:
 
724
    ui.log_message(unicode(e))
723
725
    ui.screen.stop()
724
726
    raise