1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
#!/usr/bin/python
# -*- mode: python; coding: utf-8 -*-
from __future__ import division
import sys
import dbus
from optparse import OptionParser
import locale
import datetime
import re
locale.setlocale(locale.LC_ALL, u'')
tablewords = {
'name': u'Name',
'enabled': u'Enabled',
'timeout': u'Timeout',
'last_checked_ok': u'Last Successful Check',
'created': u'Created',
'interval': u'Interval',
'host': u'Host',
'fingerprint': u'Fingerprint',
'checker_running': u'Check Is Running',
'last_enabled': u'Last Enabled',
'checker': u'Checker',
}
defaultkeywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
'checker')
domain = 'se.bsnet.fukt'
busname = domain + '.Mandos'
server_path = '/'
server_interface = domain + '.Mandos'
client_interface = domain + '.Mandos.Client'
version = "1.0.14"
bus = dbus.SystemBus()
mandos_dbus_objc = bus.get_object(busname, server_path)
mandos_serv = dbus.Interface(mandos_dbus_objc,
dbus_interface = server_interface)
mandos_clients = mandos_serv.GetAllClientsWithProperties()
def datetime_to_milliseconds(dt):
"Return the 'timeout' attribute in milliseconds"
return ((dt.days * 24 * 60 * 60 * 1000)
+ (dt.seconds * 1000)
+ (dt.microseconds // 1000))
def milliseconds_to_string(ms):
td = datetime.timedelta(0, 0, 0, ms)
return "%s%02d:%02d:%02d" % (("%dT" % td.days) if td.days else "", # days
td.seconds // 3600, # hours
(td.seconds % 3600) // 60, # minutes
(td.seconds % 60)) # seconds
def string_to_delta(interval):
"""Parse a string and return a datetime.timedelta
>>> string_to_delta('7d')
datetime.timedelta(7)
>>> string_to_delta('60s')
datetime.timedelta(0, 60)
>>> string_to_delta('60m')
datetime.timedelta(0, 3600)
>>> string_to_delta('24h')
datetime.timedelta(1)
>>> string_to_delta(u'1w')
datetime.timedelta(7)
>>> string_to_delta('5m 30s')
datetime.timedelta(0, 330)
"""
timevalue = datetime.timedelta(0)
regexp = re.compile("\d+[dsmhw]")
for s in regexp.findall(interval):
try:
suffix = unicode(s[-1])
value = int(s[:-1])
if suffix == u"d":
delta = datetime.timedelta(value)
elif suffix == u"s":
delta = datetime.timedelta(0, value)
elif suffix == u"m":
delta = datetime.timedelta(0, 0, 0, 0, value)
elif suffix == u"h":
delta = datetime.timedelta(0, 0, 0, 0, 0, value)
elif suffix == u"w":
delta = datetime.timedelta(0, 0, 0, 0, 0, 0, value)
else:
raise ValueError
except (ValueError, IndexError):
raise ValueError
timevalue += delta
return timevalue
def print_clients(clients):
def valuetostring(value, keyword):
if type(value) is dbus.Boolean:
return u"Yes" if value else u"No"
if keyword in ("timeout", "interval"):
return milliseconds_to_string(value)
return unicode(value)
format_string = u' '.join(u'%%-%ds' %
max(len(tablewords[key]),
max(len(valuetostring(client[key], key))
for client in
clients))
for key in keywords)
print format_string % tuple(tablewords[key] for key in keywords)
for client in clients:
print format_string % tuple(valuetostring(client[key], key)
for key in keywords)
parser = OptionParser(version = "%%prog %s" % version)
parser.add_option("-a", "--all", action="store_true",
help="Print all fields")
parser.add_option("-e", "--enable", action="store_true",
help="Enable client")
parser.add_option("-d", "--disable", action="store_true",
help="disable client")
parser.add_option("-b", "--bump-timeout", action="store_true",
help="Bump timeout for client")
parser.add_option("--start-checker", action="store_true",
help="Start checker for client")
parser.add_option("--stop-checker", action="store_true",
help="Stop checker for client")
parser.add_option("-V", "--is-valid", action="store_true",
help="Check if client is still valid")
parser.add_option("-r", "--remove", action="store_true",
help="Remove client")
parser.add_option("-c", "--checker", type="string",
help="Set checker command for client")
parser.add_option("-t", "--timeout", type="string",
help="Set timeout for client")
parser.add_option("-i", "--interval", type="string",
help="Set checker interval for client")
parser.add_option("-H", "--host", type="string",
help="Set host for client")
parser.add_option("-s", "--secret", type="string",
help="Set password blob (file) for client")
options, client_names = parser.parse_args()
# Compile list of clients to process
clients=[]
for name in client_names:
for path, client in mandos_clients.iteritems():
if client['name'] == name:
client_objc = bus.get_object(busname, path)
clients.append(dbus.Interface(client_objc,
dbus_interface
= client_interface))
break
else:
print >> sys.stderr, "Client not found on server: %r" % name
sys.exit(1)
if not clients and mandos_clients.values():
keywords = defaultkeywords
if options.all:
keywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
'created', 'interval', 'host', 'fingerprint',
'checker_running', 'last_enabled', 'checker')
print_clients(mandos_clients.values())
# Process each client in the list by all selected options
for client in clients:
if options.remove:
mandos_serv.RemoveClient(client.__dbus_object_path__)
if options.enable:
client.Enable()
if options.disable:
client.Disable()
if options.bump_timeout:
client.BumpTimeout()
if options.start_checker:
client.StartChecker()
if options.stop_checker:
client.StopChecker()
if options.is_valid:
sys.exit(0 if client.IsStillValid() else 1)
if options.checker:
client.SetChecker(options.checker)
if options.host:
client.SetHost(options.host)
if options.interval:
client.SetInterval(datetime_to_milliseconds
(string_to_delta(options.interval)))
if options.timeout:
client.SetTimeout(datetime_to_milliseconds
(string_to_delta(options.timeout)))
if options.secret:
client.SetSecret(dbus.ByteArray(open(options.secret, 'rb').read()))
|