/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: 2017-08-20 13:50:57 UTC
  • Revision ID: teddy@recompile.se-20170820135057-u069yh7hhk2ha1a2
Don't import doctest module in mandos-ctl unless running tests.

* mandos-ctl: Don't import doctest module unless running tests.

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
8
 
#
9
 
# This file is part of Mandos.
10
 
#
11
 
# Mandos is free software: you can redistribute it and/or modify it
12
 
# under the terms of the GNU General Public License as published by
 
6
# Copyright © 2008-2017 Teddy Hogeborn
 
7
# Copyright © 2008-2017 Björn Påhlsson
 
8
#
 
9
# This program is free software: you can redistribute it and/or modify
 
10
# it under the terms of the GNU General Public License as published by
13
11
# the Free Software Foundation, either version 3 of the License, or
14
12
# (at your option) any later version.
15
13
#
16
 
#     Mandos is distributed in the hope that it will be useful, but
17
 
#     WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
#     This program is distributed in the hope that it will be useful,
 
15
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
18
16
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
17
#     GNU General Public License for more details.
20
18
#
21
19
# You should have received a copy of the GNU General Public License
22
 
# along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
 
20
# along with this program.  If not, see
 
21
# <http://www.gnu.org/licenses/>.
23
22
#
24
23
# Contact the authors at <mandos@recompile.se>.
25
24
#
40
39
import os
41
40
import collections
42
41
import json
43
 
import unittest
44
 
import logging
45
42
 
46
43
import dbus
47
44
 
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
 
 
52
45
if sys.version_info.major == 2:
53
46
    str = unicode
54
47
 
64
57
    "Interval": "Interval",
65
58
    "Host": "Host",
66
59
    "Fingerprint": "Fingerprint",
67
 
    "KeyID": "Key ID",
68
60
    "CheckerRunning": "Check Is Running",
69
61
    "LastEnabled": "Last Enabled",
70
62
    "ApprovalPending": "Approval Is Pending",
82
74
server_path = "/"
83
75
server_interface = domain + ".Mandos"
84
76
client_interface = domain + ".Mandos.Client"
85
 
version = "1.8.3"
 
77
version = "1.7.15"
86
78
 
87
79
 
88
80
try:
351
343
    if options.all and not has_actions(options):
352
344
        parser.error("--all requires an action.")
353
345
 
 
346
    if options.check:
 
347
        import doctest
 
348
        fail_count, test_count = doctest.testmod()
 
349
        sys.exit(os.EX_OK if fail_count == 0 else 1)
 
350
 
354
351
    try:
355
352
        bus = dbus.SystemBus()
356
353
        mandos_dbus_objc = bus.get_object(busname, server_path)
357
354
    except dbus.exceptions.DBusException:
358
 
        log.critical("Could not connect to Mandos server")
 
355
        print("Could not connect to Mandos server", file=sys.stderr)
359
356
        sys.exit(1)
360
357
 
361
358
    mandos_serv = dbus.Interface(mandos_dbus_objc,
380
377
            os.dup2(stderrcopy, sys.stderr.fileno())
381
378
            os.close(stderrcopy)
382
379
    except dbus.exceptions.DBusException as e:
383
 
        log.critical("Failed to access Mandos server through D-Bus:"
384
 
                     "\n%s", e)
 
380
        print("Access denied: "
 
381
              "Accessing mandos server through D-Bus: {}".format(e),
 
382
              file=sys.stderr)
385
383
        sys.exit(1)
386
384
 
387
385
    # Compile dict of (clients: properties) to process
398
396
                    clients[client_objc] = client
399
397
                    break
400
398
            else:
401
 
                log.critical("Client not found on server: %r", name)
 
399
                print("Client not found on server: {!r}"
 
400
                      .format(name), file=sys.stderr)
402
401
                sys.exit(1)
403
402
 
404
403
    if not has_actions(options) and clients:
405
404
        if options.verbose or options.dump_json:
406
405
            keywords = ("Name", "Enabled", "Timeout", "LastCheckedOK",
407
 
                        "Created", "Interval", "Host", "KeyID",
408
 
                        "Fingerprint", "CheckerRunning",
409
 
                        "LastEnabled", "ApprovalPending",
410
 
                        "ApprovedByDefault", "LastApprovalRequest",
411
 
                        "ApprovalDelay", "ApprovalDuration",
412
 
                        "Checker", "ExtendedTimeout", "Expires",
 
406
                        "Created", "Interval", "Host", "Fingerprint",
 
407
                        "CheckerRunning", "LastEnabled",
 
408
                        "ApprovalPending", "ApprovedByDefault",
 
409
                        "LastApprovalRequest", "ApprovalDelay",
 
410
                        "ApprovalDuration", "Checker",
 
411
                        "ExtendedTimeout", "Expires",
413
412
                        "LastCheckerStatus")
414
413
        else:
415
414
            keywords = defaultkeywords
492
491
                client.Approve(dbus.Boolean(False),
493
492
                               dbus_interface=client_interface)
494
493
 
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
525
494
 
526
495
if __name__ == "__main__":
527
 
    if should_only_run_tests():
528
 
        # Call using ./tdd-python-script --check [--verbose]
529
 
        unittest.main()
530
 
    else:
531
 
        main()
 
496
    main()