124
130
def __init__(self, server_proxy_object=None, update_hook=None,
125
delete_hook=None, logger=None, **kwargs):
131
delete_hook=None, **kwargs):
126
132
# Called on update
127
133
self.update_hook = update_hook
128
134
# Called on delete
129
135
self.delete_hook = delete_hook
130
136
# Mandos Server proxy object
131
137
self.server_proxy_object = server_proxy_object
135
139
self._update_timer_callback_tag = None
173
176
if flag and self._update_timer_callback_tag is None:
174
177
# Will update the shown timer value every second
175
self._update_timer_callback_tag = (GLib.timeout_add
178
self._update_timer_callback_tag = (
179
GLib.timeout_add(1000,
180
glib_safely(self.update_timer)))
178
181
elif not (flag or self._update_timer_callback_tag is None):
179
182
GLib.source_remove(self._update_timer_callback_tag)
180
183
self._update_timer_callback_tag = None
182
185
def checker_completed(self, exitstatus, condition, command):
183
186
if exitstatus == 0:
184
self.logger('Checker for client {} (command "{}")'
185
' succeeded'.format(self.properties["Name"],
187
log.debug('Checker for client %s (command "%s")'
188
' succeeded', self.properties["Name"], command)
190
192
if os.WIFEXITED(condition):
191
self.logger('Checker for client {} (command "{}") failed'
193
.format(self.properties["Name"], command,
194
os.WEXITSTATUS(condition)))
193
log.info('Checker for client %s (command "%s") failed'
194
' with exit code %d', self.properties["Name"],
195
command, os.WEXITSTATUS(condition))
195
196
elif os.WIFSIGNALED(condition):
196
self.logger('Checker for client {} (command "{}") was'
197
' killed by signal {}'
198
.format(self.properties["Name"], command,
199
os.WTERMSIG(condition)))
197
log.info('Checker for client %s (command "%s") was'
198
' killed by signal %d', self.properties["Name"],
199
command, os.WTERMSIG(condition))
202
202
def checker_started(self, command):
203
203
"""Server signals that a checker started."""
204
self.logger('Client {} started checker "{}"'
205
.format(self.properties["Name"],
204
log.debug('Client %s started checker "%s"',
205
self.properties["Name"], command)
208
207
def got_secret(self):
209
self.logger('Client {} received its secret'
210
.format(self.properties["Name"]))
208
log.info("Client %s received its secret",
209
self.properties["Name"])
212
211
def need_approval(self, timeout, default):
214
message = 'Client {} needs approval within {} seconds'
213
message = "Client %s needs approval within %f seconds"
216
message = 'Client {} will get its secret in {} seconds'
217
self.logger(message.format(self.properties["Name"],
215
message = "Client %s will get its secret in %f seconds"
216
log.info(message, self.properties["Name"], timeout/1000)
220
218
def rejected(self, reason):
221
self.logger('Client {} was rejected; reason: {}'
222
.format(self.properties["Name"], reason))
219
log.info("Client %s was rejected; reason: %s",
220
self.properties["Name"], reason)
224
222
def selectable(self):
225
223
"""Make this a "selectable" widget.
458
464
self.log_visible = True
459
465
self.log_wrap = "any"
467
self.loghandler = UILogHandler(self)
462
self.log_message_raw(("bold",
463
"Mandos Monitor version " + version))
464
self.log_message_raw(("bold",
470
self.add_log_line(("bold",
471
"Mandos Monitor version " + version))
472
self.add_log_line(("bold", "q: Quit ?: Help"))
467
474
self.busname = domain + '.Mandos'
468
475
self.main_loop = GLib.MainLoop()
470
477
def client_not_found(self, key_id, address):
471
self.log_message("Client with address {} and key ID {} could"
472
" not be found".format(address, key_id))
478
log.info("Client with address %s and key ID %s could"
479
" not be found", address, key_id)
474
481
def rebuild(self):
475
482
"""This rebuilds the User Interface.
486
493
self.uilist.append(self.logbox)
487
494
self.topwidget = urwid.Pile(self.uilist)
489
def log_message(self, message, level=1):
490
"""Log message formatted with timestamp"""
491
if level < self.log_level:
493
timestamp = datetime.datetime.now().isoformat()
494
self.log_message_raw("{}: {}".format(timestamp, message),
497
def log_message_raw(self, markup, level=1):
498
"""Add a log message to the log buffer."""
499
if level < self.log_level:
496
def add_log_line(self, markup):
501
497
self.log.append(urwid.Text(markup, wrap=self.log_wrap))
502
498
if self.max_log_length:
503
499
if len(self.log) > self.max_log_length:
504
del self.log[0:len(self.log)-self.max_log_length-1]
500
del self.log[0:(len(self.log) - self.max_log_length)]
505
501
self.logbox.set_focus(len(self.logbox.body.contents)-1,
506
502
coming_from="above")
592
589
mandos_clients = (self.mandos_serv
593
590
.GetAllClientsWithProperties())
594
591
if not mandos_clients:
595
self.log_message_raw(("bold",
596
"Note: Server has no clients."))
592
log.warning("Note: Server has no clients.")
597
593
except dbus.exceptions.DBusException:
598
self.log_message_raw(("bold",
599
"Note: No Mandos server running."))
594
log.warning("Note: No Mandos server running.")
600
595
mandos_clients = dbus.Dictionary()
602
597
(self.mandos_serv
707
702
self.topwidget.set_focus(self.logbox)
710
if self.log_level == 0:
712
self.log_message("Verbose mode: Off")
705
if log.level < logging.INFO:
706
log.setLevel(logging.INFO)
707
log.info("Verbose mode: Off")
715
self.log_message("Verbose mode: On")
709
log.setLevel(logging.NOTSET)
710
log.info("Verbose mode: On")
716
711
# elif (key == "end" or key == "meta >" or key == "G"
717
712
# or key == ">"):
718
713
# pass # xxx end-of-buffer
735
class UILogHandler(logging.Handler):
736
def __init__(self, ui, *args, **kwargs):
738
super(UILogHandler, self).__init__(*args, **kwargs)
740
logging.Formatter("%(asctime)s: %(message)s"))
741
def emit(self, record):
742
msg = self.format(record)
743
if record.levelno > logging.INFO:
745
self.ui.add_log_line(msg)
740
748
ui = UserInterface()
743
751
except KeyboardInterrupt:
745
except Exception as e:
746
ui.log_message(str(e))
752
with warnings.catch_warnings():
753
warnings.filterwarnings("ignore", "", BytesWarning)
756
with warnings.catch_warnings():
757
warnings.filterwarnings("ignore", "", BytesWarning)