/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: 2016-06-27 20:21:50 UTC
  • Revision ID: teddy@recompile.se-20160627202150-ml201ilxwjf1g29w
mandos-ctl: Implement --dump-json option

* mandos-ctl (main): Implement --dump-json option
* mandos-ctl.xml (NAME, DESCRIPTION): Change description to the more
                                      accurate "control or query".
  (SYNOPSIS): Add required group around action options and add new
              "--dump-json" option.
  (OPTIONS): Document new "--dump-json" option.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
4
4
# Mandos Monitor - Control and monitor the Mandos server
5
5
6
 
# Copyright © 2008-2015 Teddy Hogeborn
7
 
# Copyright © 2008-2015 Björn Påhlsson
 
6
# Copyright © 2008-2016 Teddy Hogeborn
 
7
# Copyright © 2008-2016 Björn Påhlsson
8
8
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
39
39
import os
40
40
import collections
41
41
import doctest
 
42
import json
42
43
 
43
44
import dbus
44
45
 
72
73
server_path = "/"
73
74
server_interface = domain + ".Mandos"
74
75
client_interface = domain + ".Mandos.Client"
75
 
version = "1.6.9"
76
 
 
 
76
version = "1.7.10"
 
77
 
 
78
 
 
79
try:
 
80
    dbus.OBJECT_MANAGER_IFACE
 
81
except AttributeError:
 
82
    dbus.OBJECT_MANAGER_IFACE = "org.freedesktop.DBus.ObjectManager"
77
83
 
78
84
def milliseconds_to_string(ms):
79
85
    td = datetime.timedelta(0, 0, 0, ms)
275
281
                        help="Select all clients")
276
282
    parser.add_argument("-v", "--verbose", action="store_true",
277
283
                        help="Print all fields")
 
284
    parser.add_argument("-j", "--dump-json", action="store_true",
 
285
                        help="Dump client data in JSON format")
278
286
    parser.add_argument("-e", "--enable", action="store_true",
279
287
                        help="Enable client")
280
288
    parser.add_argument("-d", "--disable", action="store_true",
323
331
    if has_actions(options) and not (options.client or options.all):
324
332
        parser.error("Options require clients names or --all.")
325
333
    if options.verbose and has_actions(options):
326
 
        parser.error("--verbose can only be used alone or with"
327
 
                     " --all.")
 
334
        parser.error("--verbose can only be used alone.")
 
335
    if options.dump_json and (options.verbose or has_actions(options)):
 
336
        parser.error("--dump-json can only be used alone.")
328
337
    if options.all and not has_actions(options):
329
338
        parser.error("--all requires an action.")
330
 
 
 
339
    
331
340
    if options.check:
332
341
        fail_count, test_count = doctest.testmod()
333
342
        sys.exit(os.EX_OK if fail_count == 0 else 1)
341
350
    
342
351
    mandos_serv = dbus.Interface(mandos_dbus_objc,
343
352
                                 dbus_interface = server_interface)
 
353
    mandos_serv_object_manager = dbus.Interface(
 
354
        mandos_dbus_objc, dbus_interface = dbus.OBJECT_MANAGER_IFACE)
344
355
    
345
356
    #block stderr since dbus library prints to stderr
346
357
    null = os.open(os.path.devnull, os.O_RDWR)
349
360
    os.close(null)
350
361
    try:
351
362
        try:
352
 
            mandos_clients = mandos_serv.GetAllClientsWithProperties()
 
363
            mandos_clients = { path: ifs_and_props[client_interface]
 
364
                               for path, ifs_and_props in
 
365
                               mandos_serv_object_manager
 
366
                               .GetManagedObjects().items()
 
367
                               if client_interface in ifs_and_props }
353
368
        finally:
354
369
            #restore stderr
355
370
            os.dup2(stderrcopy, sys.stderr.fileno())
356
371
            os.close(stderrcopy)
357
 
    except dbus.exceptions.DBusException:
358
 
        print("Access denied: Accessing mandos server through dbus.",
359
 
              file=sys.stderr)
 
372
    except dbus.exceptions.DBusException as e:
 
373
        print("Access denied: Accessing mandos server through D-Bus: {}"
 
374
              .format(e), file=sys.stderr)
360
375
        sys.exit(1)
361
376
    
362
377
    # Compile dict of (clients: properties) to process
378
393
                sys.exit(1)
379
394
    
380
395
    if not has_actions(options) and clients:
381
 
        if options.verbose:
 
396
        if options.verbose or options.dump_json:
382
397
            keywords = ("Name", "Enabled", "Timeout", "LastCheckedOK",
383
398
                        "Created", "Interval", "Host", "Fingerprint",
384
399
                        "CheckerRunning", "LastEnabled",
389
404
        else:
390
405
            keywords = defaultkeywords
391
406
        
392
 
        print_clients(clients.values(), keywords)
 
407
        if options.dump_json:
 
408
            json.dump({client["Name"]: {key: client[key]
 
409
                                        for key in keywords }
 
410
                       for client in clients.values() },
 
411
                      fp = sys.stdout, indent = 4,
 
412
                      separators = (',', ': '))
 
413
            print()
 
414
        else:
 
415
            print_clients(clients.values(), keywords)
393
416
    else:
394
417
        # Process each client in the list by all selected options
395
418
        for client in clients: