/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: 2018-02-08 10:02:51 UTC
  • Revision ID: teddy@recompile.se-20180208100251-x7qq39sjsgk4r2sq
Update Debian watch file to version 4

* debian/watch (version): Change to "4".
  (opts/pgpsigurlmangle): Remove.
  (opts/pgpmode): New; set to "auto".
  (URL): Change to "https://ftp.recompile.se/pub/@PACKAGE@/@PACKAGE@@ANY_VERSION@(?:\.orig)?@ARCHIVE_EXT@".

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python
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*")))); -*-
 
2
# -*- mode: python; coding: utf-8 -*-
3
3
#
4
4
# Mandos Monitor - Control and monitor the Mandos server
5
5
#
6
 
# Copyright © 2008-2019 Teddy Hogeborn
7
 
# Copyright © 2008-2019 Björn Påhlsson
 
6
# Copyright © 2008-2017 Teddy Hogeborn
 
7
# Copyright © 2008-2017 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
45
43
 
46
44
import dbus
47
45
 
48
 
# Show warnings by default
49
 
if not sys.warnoptions:
50
 
    import warnings
51
 
    warnings.simplefilter("default")
52
 
 
53
 
log = logging.getLogger(sys.argv[0])
54
 
logging.basicConfig(level="INFO", # Show info level messages
55
 
                    format="%(message)s") # Show basic log messages
56
 
 
57
 
logging.captureWarnings(True)   # Show warnings via the logging system
58
 
 
59
46
if sys.version_info.major == 2:
60
47
    str = unicode
61
48
 
71
58
    "Interval": "Interval",
72
59
    "Host": "Host",
73
60
    "Fingerprint": "Fingerprint",
74
 
    "KeyID": "Key ID",
75
61
    "CheckerRunning": "Check Is Running",
76
62
    "LastEnabled": "Last Enabled",
77
63
    "ApprovalPending": "Approval Is Pending",
89
75
server_path = "/"
90
76
server_interface = domain + ".Mandos"
91
77
client_interface = domain + ".Mandos.Client"
92
 
version = "1.8.3"
 
78
version = "1.7.16"
93
79
 
94
80
 
95
81
try:
358
344
    if options.all and not has_actions(options):
359
345
        parser.error("--all requires an action.")
360
346
 
 
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
 
361
352
    try:
362
353
        bus = dbus.SystemBus()
363
354
        mandos_dbus_objc = bus.get_object(busname, server_path)
364
355
    except dbus.exceptions.DBusException:
365
 
        log.critical("Could not connect to Mandos server")
 
356
        print("Could not connect to Mandos server", file=sys.stderr)
366
357
        sys.exit(1)
367
358
 
368
359
    mandos_serv = dbus.Interface(mandos_dbus_objc,
387
378
            os.dup2(stderrcopy, sys.stderr.fileno())
388
379
            os.close(stderrcopy)
389
380
    except dbus.exceptions.DBusException as e:
390
 
        log.critical("Failed to access Mandos server through D-Bus:"
391
 
                     "\n%s", e)
 
381
        print("Access denied: "
 
382
              "Accessing mandos server through D-Bus: {}".format(e),
 
383
              file=sys.stderr)
392
384
        sys.exit(1)
393
385
 
394
386
    # Compile dict of (clients: properties) to process
405
397
                    clients[client_objc] = client
406
398
                    break
407
399
            else:
408
 
                log.critical("Client not found on server: %r", name)
 
400
                print("Client not found on server: {!r}"
 
401
                      .format(name), file=sys.stderr)
409
402
                sys.exit(1)
410
403
 
411
404
    if not has_actions(options) and clients:
412
405
        if options.verbose or options.dump_json:
413
406
            keywords = ("Name", "Enabled", "Timeout", "LastCheckedOK",
414
 
                        "Created", "Interval", "Host", "KeyID",
415
 
                        "Fingerprint", "CheckerRunning",
416
 
                        "LastEnabled", "ApprovalPending",
417
 
                        "ApprovedByDefault", "LastApprovalRequest",
418
 
                        "ApprovalDelay", "ApprovalDuration",
419
 
                        "Checker", "ExtendedTimeout", "Expires",
 
407
                        "Created", "Interval", "Host", "Fingerprint",
 
408
                        "CheckerRunning", "LastEnabled",
 
409
                        "ApprovalPending", "ApprovedByDefault",
 
410
                        "LastApprovalRequest", "ApprovalDelay",
 
411
                        "ApprovalDuration", "Checker",
 
412
                        "ExtendedTimeout", "Expires",
420
413
                        "LastCheckerStatus")
421
414
        else:
422
415
            keywords = defaultkeywords
499
492
                client.Approve(dbus.Boolean(False),
500
493
                               dbus_interface=client_interface)
501
494
 
502
 
 
503
 
class Test_milliseconds_to_string(unittest.TestCase):
504
 
    def test_all(self):
505
 
        self.assertEqual(milliseconds_to_string(93785000),
506
 
                         "1T02:03:05")
507
 
    def test_no_days(self):
508
 
        self.assertEqual(milliseconds_to_string(7385000), "02:03:05")
509
 
    def test_all_zero(self):
510
 
        self.assertEqual(milliseconds_to_string(0), "00:00:00")
511
 
    def test_no_fractional_seconds(self):
512
 
        self.assertEqual(milliseconds_to_string(400), "00:00:00")
513
 
        self.assertEqual(milliseconds_to_string(900), "00:00:00")
514
 
        self.assertEqual(milliseconds_to_string(1900), "00:00:01")
515
 
 
516
 
 
517
 
def should_only_run_tests():
518
 
    parser = argparse.ArgumentParser(add_help=False)
519
 
    parser.add_argument("--check", action='store_true')
520
 
    args, unknown_args = parser.parse_known_args()
521
 
    run_tests = args.check
522
 
    if run_tests:
523
 
        # Remove --check argument from sys.argv
524
 
        sys.argv[1:] = unknown_args
525
 
    return run_tests
526
 
 
527
 
# Add all tests from doctest strings
528
 
def load_tests(loader, tests, none):
529
 
    import doctest
530
 
    tests.addTests(doctest.DocTestSuite())
531
 
    return tests
532
495
 
533
496
if __name__ == "__main__":
534
 
    if should_only_run_tests():
535
 
        # Call using ./tdd-python-script --check [--verbose]
536
 
        unittest.main()
537
 
    else:
538
 
        main()
 
497
    main()