4
4
# Mandos Monitor - Control and monitor the Mandos server
6
# Copyright © 2009-2012 Teddy Hogeborn
7
# Copyright © 2009-2012 Björn Påhlsson
6
# Copyright © 2009-2011 Teddy Hogeborn
7
# Copyright © 2009-2011 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@recompile.se>.
22
# Contact the authors at <mandos@fukt.bsnet.se>.
25
25
from __future__ import (division, absolute_import, print_function,
132
132
self._update_timer_callback_tag = None
133
133
self._update_timer_callback_lock = 0
134
self.last_checker_failed = False
135
136
# The widget shown normally
136
137
self._text_widget = urwid.Text("")
145
146
last_checked_ok = isoformat_to_datetime(self.properties
146
147
["LastCheckedOK"])
148
if last_checked_ok is None:
149
self.last_checker_failed = True
151
self.last_checker_failed = ((datetime.datetime.utcnow()
148
if self.properties ["LastCheckerStatus"] != 0:
158
if self.last_checker_failed:
149
159
self.using_timer(True)
151
161
if self.need_approval:
180
190
if property == "ApprovalPending":
181
191
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))
188
193
def using_timer(self, flag):
189
194
"""Call this method with True or False when timer should be
190
195
activated or deactivated.
206
211
def checker_completed(self, exitstatus, condition, command):
207
212
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)
211
225
if os.WIFEXITED(condition):
212
226
self.logger('Checker for client %s (command "%s")'
213
227
' failed with exit code %s'
230
244
def checker_started(self, command):
231
"""Server signals that a checker started. This could be useful
232
to log in the future. """
233
245
#self.logger('Client %s started checker "%s"'
234
246
# % (self.properties["Name"], unicode(command)))
237
249
def got_secret(self):
250
self.last_checker_failed = False
238
251
self.logger('Client %s received its secret'
239
252
% self.properties["Name"])
302
315
message = "Denial in %s. (a)pprove?"
303
316
message = message % unicode(timer).rsplit(".", 1)[0]
304
elif self.properties["LastCheckerStatus"] != 0:
317
elif self.last_checker_failed:
305
318
# When checker has failed, print a timer until client expires
306
319
expires = self.properties["Expires"]
307
320
if expires == "":
485
498
self.busname = domain + '.Mandos'
486
499
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,
488
543
def client_not_found(self, fingerprint, address):
489
544
self.log_message(("Client with address %s and fingerprint %s"
595
651
"""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,
640
653
self._input_callback_tag = (gobject.io_add_watch
641
654
(sys.stdin.fileno(),