24
27
defaultkeywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
26
busname = 'org.mandos-system.Mandos'
27
server_path = '/Mandos'
28
server_interface = 'org.mandos_system.Mandos'
29
client_interface = 'org.mandos_system.Mandos.Client'
29
domain = 'se.bsnet.fukt'
30
busname = domain + '.Mandos'
32
server_interface = domain + '.Mandos'
33
client_interface = domain + '.Mandos.Client'
32
35
bus = dbus.SystemBus()
33
36
mandos_dbus_objc = bus.get_object(busname, server_path)
34
37
mandos_serv = dbus.Interface(mandos_dbus_objc,
35
38
dbus_interface = server_interface)
36
39
mandos_clients = mandos_serv.GetAllClientsWithProperties()
40
if type(x) is dbus.Boolean:
41
return u"Yes" if x else u"No"
41
def datetime_to_milliseconds(dt):
42
"Return the 'timeout' attribute in milliseconds"
43
return ((dt.days * 24 * 60 * 60 * 1000)
45
+ (dt.microseconds // 1000))
47
def milliseconds_to_string(ms):
48
td = datetime.timedelta(0, 0, 0, ms)
49
return "%s%02d:%02d:%02d" % (("%dT" % td.days) if td.days else "", # days
50
td.seconds // 3600, # hours
51
(td.seconds % 3600) // 60, # minutes
52
(td.seconds % 60)) # seconds
55
def string_to_delta(interval):
56
"""Parse a string and return a datetime.timedelta
58
>>> string_to_delta('7d')
60
>>> string_to_delta('60s')
61
datetime.timedelta(0, 60)
62
>>> string_to_delta('60m')
63
datetime.timedelta(0, 3600)
64
>>> string_to_delta('24h')
66
>>> string_to_delta(u'1w')
68
>>> string_to_delta('5m 30s')
69
datetime.timedelta(0, 330)
71
timevalue = datetime.timedelta(0)
72
regexp = re.compile("\d+[dsmhw]")
74
for s in regexp.findall(interval):
76
suffix = unicode(s[-1])
79
delta = datetime.timedelta(value)
81
delta = datetime.timedelta(0, value)
83
delta = datetime.timedelta(0, 0, 0, 0, value)
85
delta = datetime.timedelta(0, 0, 0, 0, 0, value)
87
delta = datetime.timedelta(0, 0, 0, 0, 0, 0, value)
90
except (ValueError, IndexError):
95
def print_clients(clients):
96
def valuetostring(value, keyword):
97
if type(value) is dbus.Boolean:
98
return u"Yes" if value else u"No"
99
if keyword in ("timeout", "interval"):
100
return milliseconds_to_string(value)
101
return unicode(value)
44
103
format_string = u' '.join(u'%%-%ds' %
45
104
max(len(tablewords[key]),
46
max(len(valuetostring(client[key]))
105
max(len(valuetostring(client[key], key))
48
mandos_clients.itervalues()))
49
108
for key in keywords)
50
print format_string % tuple(tablewords[key] for key in keywords)
51
for client in mandos_clients.itervalues():
52
print format_string % tuple(valuetostring(client[key])
109
print format_string % tuple(tablewords[key] for key in keywords)
110
for client in clients:
111
print format_string % tuple(valuetostring(client[key], key)
53
112
for key in keywords)
55
114
parser = OptionParser(version = "%%prog %s" % version)
56
115
parser.add_option("-a", "--all", action="store_true",
57
116
help="Print all fields")
58
117
parser.add_option("-e", "--enable", action="store_true",
59
help="Enable specified client")
118
help="Enable client")
60
119
parser.add_option("-d", "--disable", action="store_true",
61
help="disable specified client")
62
parser.add_option("-b", "--bumptimeout", action="store_true",
63
help="Bump timeout of specified client")
64
parser.add_option("-s", "--startchecker", action="store_true",
65
help="Start checker for specified client")
66
parser.add_option("-S", "--stopchecker", action="store_true",
67
help="Stop checker for specified client")
120
help="disable client")
121
parser.add_option("-b", "--bump-timeout", action="store_true",
122
help="Bump timeout for client")
123
parser.add_option("--start-checker", action="store_true",
124
help="Start checker for client")
125
parser.add_option("--stop-checker", action="store_true",
126
help="Stop checker for client")
127
parser.add_option("-V", "--is-valid", action="store_true",
128
help="Check if client is still valid")
129
parser.add_option("-r", "--remove", action="store_true",
130
help="Remove client")
131
parser.add_option("-c", "--checker", type="string",
132
help="Set checker command for client")
133
parser.add_option("-t", "--timeout", type="string",
134
help="Set timeout for client")
135
parser.add_option("-i", "--interval", type="string",
136
help="Set checker interval for client")
137
parser.add_option("-H", "--host", type="string",
138
help="Set host for client")
139
parser.add_option("-s", "--secret", type="string",
140
help="Set password blob (file) for client")
68
141
options, client_names = parser.parse_args()
143
# Compile list of clients to process
71
145
for name in client_names:
72
146
for path, client in mandos_clients.iteritems():
80
154
print >> sys.stderr, "Client not found on server: %r" % name
157
if not clients and mandos_clients.values():
84
158
keywords = defaultkeywords
86
160
keywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
87
161
'created', 'interval', 'host', 'fingerprint',
88
162
'checker_running', 'last_enabled', 'checker')
163
print_clients(mandos_clients.values())
165
# Process each client in the list by all selected options
91
166
for client in clients:
168
mandos_serv.RemoveClient(client.__dbus_object_path__)
92
169
if options.enable:
94
171
if options.disable:
96
if options.bumptimeout:
173
if options.bump_timeout:
97
174
client.BumpTimeout()
98
if options.startchecker:
175
if options.start_checker:
99
176
client.StartChecker()
100
if options.stopchecker:
177
if options.stop_checker:
101
178
client.StopChecker()
180
sys.exit(0 if client.IsStillValid() else 1)
182
client.SetChecker(options.checker)
184
client.SetHost(options.host)
186
client.SetInterval(datetime_to_milliseconds
187
(string_to_delta(options.interval)))
189
client.SetTimeout(datetime_to_milliseconds
190
(string_to_delta(options.timeout)))
192
client.SetSecret(dbus.ByteArray(open(options.secret, 'rb').read()))