/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-ctl

  • Committer: Teddy Hogeborn
  • Date: 2019-02-28 19:22:08 UTC
  • Revision ID: teddy@recompile.se-20190228192208-1bkaewjx1vzar0sl
mandos-ctl: Use logging module instead of print() for errors

* mandos-ctl (log): New logging object.
  (main): Use log instead of print("<message>", file=sys.stderr).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python
2
 
# -*- mode: python; coding: utf-8 -*-
 
2
# -*- mode: python; coding: utf-8; after-save-hook: (lambda () (let ((command (if (and (boundp 'tramp-file-name-structure) (string-match (car tramp-file-name-structure) (buffer-file-name))) (tramp-file-name-localname (tramp-dissect-file-name (buffer-file-name))) (buffer-file-name)))) (if (= (shell-command (format "%s --check" (shell-quote-argument command)) "*Test*") 0) (let ((w (get-buffer-window "*Test*"))) (if w (delete-window w)) (kill-buffer "*Test*")) (display-buffer "*Test*")))); -*-
3
3
#
4
4
# Mandos Monitor - Control and monitor the Mandos server
5
5
#
6
 
# Copyright © 2008-2017 Teddy Hogeborn
7
 
# Copyright © 2008-2017 Björn Påhlsson
 
6
# Copyright © 2008-2019 Teddy Hogeborn
 
7
# Copyright © 2008-2019 Björn Påhlsson
8
8
#
9
9
# This file is part of Mandos.
10
10
#
40
40
import os
41
41
import collections
42
42
import json
 
43
import unittest
 
44
import logging
43
45
 
44
46
import dbus
45
47
 
 
48
log = logging.getLogger(sys.argv[0])
 
49
logging.basicConfig(level="INFO", # Show info level messages
 
50
                    format="%(message)s") # Show basic log messages
 
51
 
46
52
if sys.version_info.major == 2:
47
53
    str = unicode
48
54
 
58
64
    "Interval": "Interval",
59
65
    "Host": "Host",
60
66
    "Fingerprint": "Fingerprint",
 
67
    "KeyID": "Key ID",
61
68
    "CheckerRunning": "Check Is Running",
62
69
    "LastEnabled": "Last Enabled",
63
70
    "ApprovalPending": "Approval Is Pending",
75
82
server_path = "/"
76
83
server_interface = domain + ".Mandos"
77
84
client_interface = domain + ".Mandos.Client"
78
 
version = "1.7.16"
 
85
version = "1.8.3"
79
86
 
80
87
 
81
88
try:
344
351
    if options.all and not has_actions(options):
345
352
        parser.error("--all requires an action.")
346
353
 
347
 
    if options.check:
348
 
        import doctest
349
 
        fail_count, test_count = doctest.testmod()
350
 
        sys.exit(os.EX_OK if fail_count == 0 else 1)
351
 
 
352
354
    try:
353
355
        bus = dbus.SystemBus()
354
356
        mandos_dbus_objc = bus.get_object(busname, server_path)
355
357
    except dbus.exceptions.DBusException:
356
 
        print("Could not connect to Mandos server", file=sys.stderr)
 
358
        log.critical("Could not connect to Mandos server")
357
359
        sys.exit(1)
358
360
 
359
361
    mandos_serv = dbus.Interface(mandos_dbus_objc,
378
380
            os.dup2(stderrcopy, sys.stderr.fileno())
379
381
            os.close(stderrcopy)
380
382
    except dbus.exceptions.DBusException as e:
381
 
        print("Access denied: "
382
 
              "Accessing mandos server through D-Bus: {}".format(e),
383
 
              file=sys.stderr)
 
383
        log.critical("Failed to access Mandos server through D-Bus:"
 
384
                     "\n%s", e)
384
385
        sys.exit(1)
385
386
 
386
387
    # Compile dict of (clients: properties) to process
397
398
                    clients[client_objc] = client
398
399
                    break
399
400
            else:
400
 
                print("Client not found on server: {!r}"
401
 
                      .format(name), file=sys.stderr)
 
401
                log.critical("Client not found on server: %r", name)
402
402
                sys.exit(1)
403
403
 
404
404
    if not has_actions(options) and clients:
405
405
        if options.verbose or options.dump_json:
406
406
            keywords = ("Name", "Enabled", "Timeout", "LastCheckedOK",
407
 
                        "Created", "Interval", "Host", "Fingerprint",
408
 
                        "CheckerRunning", "LastEnabled",
409
 
                        "ApprovalPending", "ApprovedByDefault",
410
 
                        "LastApprovalRequest", "ApprovalDelay",
411
 
                        "ApprovalDuration", "Checker",
412
 
                        "ExtendedTimeout", "Expires",
 
407
                        "Created", "Interval", "Host", "KeyID",
 
408
                        "Fingerprint", "CheckerRunning",
 
409
                        "LastEnabled", "ApprovalPending",
 
410
                        "ApprovedByDefault", "LastApprovalRequest",
 
411
                        "ApprovalDelay", "ApprovalDuration",
 
412
                        "Checker", "ExtendedTimeout", "Expires",
413
413
                        "LastCheckerStatus")
414
414
        else:
415
415
            keywords = defaultkeywords
492
492
                client.Approve(dbus.Boolean(False),
493
493
                               dbus_interface=client_interface)
494
494
 
 
495
 
 
496
class Test_milliseconds_to_string(unittest.TestCase):
 
497
    def test_all(self):
 
498
        self.assertEqual(milliseconds_to_string(93785000),
 
499
                         "1T02:03:05")
 
500
    def test_no_days(self):
 
501
        self.assertEqual(milliseconds_to_string(7385000), "02:03:05")
 
502
    def test_all_zero(self):
 
503
        self.assertEqual(milliseconds_to_string(0), "00:00:00")
 
504
    def test_no_fractional_seconds(self):
 
505
        self.assertEqual(milliseconds_to_string(400), "00:00:00")
 
506
        self.assertEqual(milliseconds_to_string(900), "00:00:00")
 
507
        self.assertEqual(milliseconds_to_string(1900), "00:00:01")
 
508
 
 
509
 
 
510
def should_only_run_tests():
 
511
    parser = argparse.ArgumentParser(add_help=False)
 
512
    parser.add_argument("--check", action='store_true')
 
513
    args, unknown_args = parser.parse_known_args()
 
514
    run_tests = args.check
 
515
    if run_tests:
 
516
        # Remove --check argument from sys.argv
 
517
        sys.argv[1:] = unknown_args
 
518
    return run_tests
 
519
 
 
520
# Add all tests from doctest strings
 
521
def load_tests(loader, tests, none):
 
522
    import doctest
 
523
    tests.addTests(doctest.DocTestSuite())
 
524
    return tests
495
525
 
496
526
if __name__ == "__main__":
497
 
    main()
 
527
    if should_only_run_tests():
 
528
        # Call using ./tdd-python-script --check [--verbose]
 
529
        unittest.main()
 
530
    else:
 
531
        main()