/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
57
63
client_interface = domain + '.Mandos.Client'
58
64
version = "1.6.0"
59
65
 
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)
67
 
 
68
66
def isoformat_to_datetime(iso):
69
67
    "Parse an ISO 8601 date string to a datetime.datetime()"
70
68
    if not iso:
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():
508
507
        self.log_visible = not self.log_visible
509
508
        self.rebuild()
510
509
        #self.log_message("Log visibility changed to: "
511
 
        #                 + unicode(self.log_visible))
 
510
        #                 + str(self.log_visible))
512
511
    
513
512
    def change_log_display(self):
514
513
        """Change type of log display.
554
553
        if path is None:
555
554
            path = client.proxy.object_path
556
555
        self.clients_dict[path] = client
557
 
        self.clients.sort(None, lambda c: c.properties["Name"])
 
556
        self.clients.sort(key=lambda c: c.properties["Name"])
558
557
        self.refresh()
559
558
    
560
559
    def remove_client(self, client, path=None):
562
561
        if path is None:
563
562
            path = client.proxy.object_path
564
563
        del self.clients_dict[path]
565
 
        if not self.clients_dict:
566
 
            # Work around bug in Urwid 0.9.8.3 - if a SimpleListWalker
567
 
            # is completely emptied, we need to recreate it.
568
 
            self.clients = urwid.SimpleListWalker([])
569
 
            self.rebuild()
570
564
        self.refresh()
571
565
    
572
566
    def refresh(self):
606
600
                            self.client_not_found,
607
601
                            dbus_interface=server_interface,
608
602
                            byte_arrays=True))
609
 
        for path, client in mandos_clients.iteritems():
 
603
        for path, client in mandos_clients.items():
610
604
            client_proxy_object = self.bus.get_object(self.busname,
611
605
                                                      path)
612
606
            self.add_client(MandosClientWidget(server_proxy_object
724
718
    ui.run()
725
719
except KeyboardInterrupt:
726
720
    ui.screen.stop()
727
 
except Exception, e:
728
 
    ui.log_message(unicode(e))
 
721
except Exception as e:
 
722
    ui.log_message(str(e))
729
723
    ui.screen.stop()
730
724
    raise