4
4
# Mandos Monitor - Control and monitor the Mandos server
6
# Copyright © 2009-2011 Teddy Hogeborn
7
# Copyright © 2009-2011 Björn Påhlsson
6
# Copyright © 2009-2012 Teddy Hogeborn
7
# Copyright © 2009-2012 Björn Påhlsson
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
19
19
# You should have received a copy of the GNU General Public License
20
20
# along with this program. If not, see <http://www.gnu.org/licenses/>.
22
# Contact the authors at <mandos@fukt.bsnet.se>.
22
# Contact the authors at <mandos@recompile.se>.
25
25
from __future__ import (division, absolute_import, print_function,
49
49
logging.getLogger('dbus.proxies').setLevel(logging.CRITICAL)
51
51
# Some useful constants
52
domain = 'se.bsnet.fukt'
52
domain = 'se.recompile'
53
53
server_interface = domain + '.Mandos'
54
54
client_interface = domain + '.Mandos.Client'
57
57
# Always run in monochrome mode
58
58
urwid.curses_display.curses.has_colors = lambda : False
132
132
self._update_timer_callback_tag = None
133
133
self._update_timer_callback_lock = 0
134
self.last_checker_failed = False
136
135
# The widget shown normally
137
136
self._text_widget = urwid.Text("")
146
145
last_checked_ok = isoformat_to_datetime(self.properties
147
146
["LastCheckedOK"])
148
if last_checked_ok is None:
149
self.last_checker_failed = True
151
self.last_checker_failed = ((datetime.datetime.utcnow()
158
if self.last_checker_failed:
148
if self.properties ["LastCheckerStatus"] != 0:
159
149
self.using_timer(True)
161
151
if self.need_approval:
190
180
if property == "ApprovalPending":
191
181
using_timer(bool(value))
182
if property == "LastCheckerStatus":
183
using_timer(value != 0)
184
#self.logger('Checker for client %s (command "%s")'
186
# % (self.properties["Name"], command))
193
188
def using_timer(self, flag):
194
189
"""Call this method with True or False when timer should be
195
190
activated or deactivated.
211
206
def checker_completed(self, exitstatus, condition, command):
212
207
if exitstatus == 0:
213
if self.last_checker_failed:
214
self.last_checker_failed = False
215
self.using_timer(False)
216
#self.logger('Checker for client %s (command "%s")'
218
# % (self.properties["Name"], command))
222
if not self.last_checker_failed:
223
self.last_checker_failed = True
224
self.using_timer(True)
225
211
if os.WIFEXITED(condition):
226
212
self.logger('Checker for client %s (command "%s")'
227
213
' failed with exit code %s'
244
230
def checker_started(self, command):
231
"""Server signals that a checker started. This could be useful
232
to log in the future. """
245
233
#self.logger('Client %s started checker "%s"'
246
234
# % (self.properties["Name"], unicode(command)))
249
237
def got_secret(self):
250
self.last_checker_failed = False
251
238
self.logger('Client %s received its secret'
252
239
% self.properties["Name"])
315
302
message = "Denial in %s. (a)pprove?"
316
303
message = message % unicode(timer).rsplit(".", 1)[0]
317
elif self.last_checker_failed:
304
elif self.properties["LastCheckerStatus"] != 0:
318
305
# When checker has failed, print a timer until client expires
319
306
expires = self.properties["Expires"]
320
307
if expires == "":
498
485
self.busname = domain + '.Mandos'
499
486
self.main_loop = gobject.MainLoop()
500
self.bus = dbus.SystemBus()
501
mandos_dbus_objc = self.bus.get_object(
502
self.busname, "/", follow_name_owner_changes=True)
503
self.mandos_serv = dbus.Interface(mandos_dbus_objc,
507
mandos_clients = (self.mandos_serv
508
.GetAllClientsWithProperties())
509
except dbus.exceptions.DBusException:
510
mandos_clients = dbus.Dictionary()
513
.connect_to_signal("ClientRemoved",
514
self.find_and_remove_client,
515
dbus_interface=server_interface,
518
.connect_to_signal("ClientAdded",
520
dbus_interface=server_interface,
523
.connect_to_signal("ClientNotFound",
524
self.client_not_found,
525
dbus_interface=server_interface,
527
for path, client in mandos_clients.iteritems():
528
client_proxy_object = self.bus.get_object(self.busname,
530
self.add_client(MandosClientWidget(server_proxy_object
533
=client_proxy_object,
543
488
def client_not_found(self, fingerprint, address):
544
489
self.log_message(("Client with address %s and fingerprint %s"
651
595
"""Start the main loop and exit when it's done."""
596
self.bus = dbus.SystemBus()
597
mandos_dbus_objc = self.bus.get_object(
598
self.busname, "/", follow_name_owner_changes=True)
599
self.mandos_serv = dbus.Interface(mandos_dbus_objc,
603
mandos_clients = (self.mandos_serv
604
.GetAllClientsWithProperties())
605
except dbus.exceptions.DBusException:
606
mandos_clients = dbus.Dictionary()
609
.connect_to_signal("ClientRemoved",
610
self.find_and_remove_client,
611
dbus_interface=server_interface,
614
.connect_to_signal("ClientAdded",
616
dbus_interface=server_interface,
619
.connect_to_signal("ClientNotFound",
620
self.client_not_found,
621
dbus_interface=server_interface,
623
for path, client in mandos_clients.iteritems():
624
client_proxy_object = self.bus.get_object(self.busname,
626
self.add_client(MandosClientWidget(server_proxy_object
629
=client_proxy_object,
653
640
self._input_callback_tag = (gobject.io_add_watch
654
641
(sys.stdin.fileno(),