/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: Björn Påhlsson
  • Date: 2010-09-12 18:12:11 UTC
  • mto: (237.4.3 mandos-release)
  • mto: This revision was merged to the branch mainline in revision 428.
  • Revision ID: belorn@fukt.bsnet.se-20100912181211-wvkt0sk37zhx7tws
mandos-client: Added never ending loop for --connect
mandos-ctl: Better option parsing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
import locale
9
9
import datetime
10
10
import re
 
11
import os
11
12
 
12
13
locale.setlocale(locale.LC_ALL, u'')
13
14
 
31
32
server_interface = domain + '.Mandos'
32
33
client_interface = domain + '.Mandos.Client'
33
34
version = "1.0.14"
34
 
try:
35
 
    bus = dbus.SystemBus()
36
 
    mandos_dbus_objc = bus.get_object(busname, server_path)
37
 
except dbus.exceptions.DBusException:
38
 
    sys.exit(1)
39
 
    
40
 
mandos_serv = dbus.Interface(mandos_dbus_objc,
41
 
                             dbus_interface = server_interface)
42
 
mandos_clients = mandos_serv.GetAllClientsWithProperties()
43
35
 
44
36
def timedelta_to_milliseconds(td):
45
37
    "Convert a datetime.timedelta object to milliseconds"
97
89
        timevalue += delta
98
90
    return timevalue
99
91
 
100
 
def print_clients(clients):
 
92
def print_clients(clients, keywords):
101
93
    def valuetostring(value, keyword):
102
94
        if type(value) is dbus.Boolean:
103
95
            return u"Yes" if value else u"No"
117
109
    for client in clients:
118
110
        print format_string % tuple(valuetostring(client[key], key)
119
111
                                    for key in keywords)
120
 
 
121
 
parser = OptionParser(version = "%%prog %s" % version)
122
 
parser.add_option("-a", "--all", action="store_true",
123
 
                  help="Print all fields")
124
 
parser.add_option("-e", "--enable", action="store_true",
125
 
                  help="Enable client")
126
 
parser.add_option("-d", "--disable", action="store_true",
127
 
                  help="disable client")
128
 
parser.add_option("-b", "--bump-timeout", action="store_true",
129
 
                  help="Bump timeout for client")
130
 
parser.add_option("--start-checker", action="store_true",
131
 
                  help="Start checker for client")
132
 
parser.add_option("--stop-checker", action="store_true",
133
 
                  help="Stop checker for client")
134
 
parser.add_option("-V", "--is-enabled", action="store_true",
135
 
                  help="Check if client is enabled")
136
 
parser.add_option("-r", "--remove", action="store_true",
137
 
                  help="Remove client")
138
 
parser.add_option("-c", "--checker", type="string",
139
 
                  help="Set checker command for client")
140
 
parser.add_option("-t", "--timeout", type="string",
141
 
                  help="Set timeout for client")
142
 
parser.add_option("-i", "--interval", type="string",
143
 
                  help="Set checker interval for client")
144
 
parser.add_option("-H", "--host", type="string",
145
 
                  help="Set host for client")
146
 
parser.add_option("-s", "--secret", type="string",
147
 
                  help="Set password blob (file) for client")
148
 
parser.add_option("-A", "--approve", action="store_true",
149
 
                  help="Approve any current client request")
150
 
parser.add_option("-D", "--deny", action="store_true",
151
 
                  help="Deny any current client request")
152
 
options, client_names = parser.parse_args()
153
 
 
154
 
# Compile list of clients to process
155
 
clients=[]
156
 
for name in client_names:
157
 
    for path, client in mandos_clients.iteritems():
158
 
        if client['name'] == name:
159
 
            client_objc = bus.get_object(busname, path)
160
 
            clients.append(client_objc)
161
 
            break
162
 
    else:
163
 
        print >> sys.stderr, "Client not found on server: %r" % name
164
 
        sys.exit(1)
165
 
 
166
 
if not clients and mandos_clients.values():
167
 
    keywords = defaultkeywords
168
 
    if options.all:
169
 
        keywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
170
 
                    'created', 'interval', 'host', 'fingerprint',
171
 
                    'checker_running', 'last_enabled', 'checker')
172
 
    print_clients(mandos_clients.values())
173
 
 
174
 
# Process each client in the list by all selected options
175
 
for client in clients:
176
 
    if options.remove:
177
 
        mandos_serv.RemoveClient(client.__dbus_object_path__)
178
 
    if options.enable:
179
 
        client.Enable(dbus_interface=client_interface)
180
 
    if options.disable:
181
 
        client.Disable(dbus_interface=client_interface)
182
 
    if options.bump_timeout:
183
 
        client.CheckedOK(dbus_interface=client_interface)
184
 
    if options.start_checker:
185
 
        client.StartChecker(dbus_interface=client_interface)
186
 
    if options.stop_checker:
187
 
        client.StopChecker(dbus_interface=client_interface)
188
 
    if options.is_enabled:
189
 
        sys.exit(0 if client.Get(client_interface,
190
 
                                 u"enabled",
191
 
                                 dbus_interface=dbus.PROPERTIES_IFACE)
192
 
                 else 1)
193
 
    if options.checker:
194
 
        client.Set(client_interface, u"checker", options.checker,
195
 
                   dbus_interface=dbus.PROPERTIES_IFACE)
196
 
    if options.host:
197
 
        client.Set(client_interface, u"host", options.host,
198
 
                   dbus_interface=dbus.PROPERTIES_IFACE)
199
 
    if options.interval:
200
 
        client.Set(client_interface, u"interval",
201
 
                   timedelta_to_milliseconds
202
 
                   (string_to_delta(options.interval)),
203
 
                   dbus_interface=dbus.PROPERTIES_IFACE)
204
 
    if options.timeout:
205
 
        client.Set(client_interface, u"timeout",
206
 
                   timedelta_to_milliseconds(string_to_delta
207
 
                                             (options.timeout)),
208
 
                   dbus_interface=dbus.PROPERTIES_IFACE)
209
 
    if options.secret:
210
 
        client.Set(client_interface, u"secret",
211
 
                   dbus.ByteArray(open(options.secret, u'rb').read()),
212
 
                   dbus_interface=dbus.PROPERTIES_IFACE)
213
 
    if options.approve:
214
 
        client.Approve(dbus.Boolean(True), dbus_interface=client_interface)
215
 
    if options.deny:
216
 
        client.Approve(dbus.Boolean(False), dbus_interface=client_interface)
 
112
def has_actions(options):
 
113
    return any((options.enable,
 
114
                options.disable,
 
115
                options.bump_timeout,
 
116
                options.start_checker,
 
117
                options.stop_checker,
 
118
                options.is_enabled,
 
119
                options.remove,
 
120
                options.checker is not None,
 
121
                options.timeout is not None,
 
122
                options.interval is not None,
 
123
                options.host is not None,
 
124
                options.secret is not None,
 
125
                options.approve,
 
126
                options.deny))
 
127
        
 
128
def main():
 
129
        parser = OptionParser(version = "%%prog %s" % version)
 
130
        parser.add_option("-a", "--all", action="store_true",
 
131
                          help="Select all clients")
 
132
        parser.add_option("-v", "--verbose", action="store_true",
 
133
                          help="Print all fields")
 
134
        parser.add_option("-e", "--enable", action="store_true",
 
135
                          help="Enable client")
 
136
        parser.add_option("-d", "--disable", action="store_true",
 
137
                          help="disable client")
 
138
        parser.add_option("-b", "--bump-timeout", action="store_true",
 
139
                          help="Bump timeout for client")
 
140
        parser.add_option("--start-checker", action="store_true",
 
141
                          help="Start checker for client")
 
142
        parser.add_option("--stop-checker", action="store_true",
 
143
                          help="Stop checker for client")
 
144
        parser.add_option("-V", "--is-enabled", action="store_true",
 
145
                          help="Check if client is enabled")
 
146
        parser.add_option("-r", "--remove", action="store_true",
 
147
                          help="Remove client")
 
148
        parser.add_option("-c", "--checker", type="string",
 
149
                          help="Set checker command for client")
 
150
        parser.add_option("-t", "--timeout", type="string",
 
151
                          help="Set timeout for client")
 
152
        parser.add_option("-i", "--interval", type="string",
 
153
                          help="Set checker interval for client")
 
154
        parser.add_option("-H", "--host", type="string",
 
155
                          help="Set host for client")
 
156
        parser.add_option("-s", "--secret", type="string",
 
157
                          help="Set password blob (file) for client")
 
158
        parser.add_option("-A", "--approve", action="store_true",
 
159
                          help="Approve any current client request")
 
160
        parser.add_option("-D", "--deny", action="store_true",
 
161
                          help="Deny any current client request")
 
162
        options, client_names = parser.parse_args()
 
163
 
 
164
        if has_actions(options) and not client_names and not options.all:
 
165
            parser.error('Options requires clients names or --all.')
 
166
        if options.verbose and has_actions(options):
 
167
            parser.error('Verbose option can only be used alone or with --all.')
 
168
        if options.all and not has_actions(options):
 
169
            parser.error('--all requires an action')
 
170
            
 
171
        try:
 
172
            bus = dbus.SystemBus()
 
173
            mandos_dbus_objc = bus.get_object(busname, server_path)
 
174
        except dbus.exceptions.DBusException:
 
175
            print >> sys.stderr, "Could not connect to Mandos server"
 
176
            sys.exit(1)
 
177
    
 
178
        mandos_serv = dbus.Interface(mandos_dbus_objc,
 
179
                                     dbus_interface = server_interface)
 
180
 
 
181
        #block stderr since dbus library prints to stderr
 
182
        null = os.open(os.path.devnull, os.O_RDWR)
 
183
        stderrcopy = os.dup(sys.stderr.fileno())
 
184
        os.dup2(null, sys.stderr.fileno())
 
185
        os.close(null)
 
186
        try:
 
187
            try:
 
188
                mandos_clients = mandos_serv.GetAllClientsWithProperties()
 
189
            finally:
 
190
                #restore stderr
 
191
                os.dup2(stderrcopy, sys.stderr.fileno())
 
192
                os.close(stderrcopy)
 
193
        except dbus.exceptions.DBusException, e:
 
194
            print >> sys.stderr, "Access denied: Accessing mandos server through dbus."
 
195
            sys.exit(1)
 
196
            
 
197
        # Compile list of clients to process
 
198
        clients=[]
 
199
 
 
200
        if options.all or not client_names:
 
201
            clients = (bus.get_object(busname, path) for path in mandos_clients.iterkeys())
 
202
        else:
 
203
            for name in client_names:
 
204
                for path, client in mandos_clients.iteritems():
 
205
                    if client['name'] == name:
 
206
                        client_objc = bus.get_object(busname, path)
 
207
                        clients.append(client_objc)
 
208
                        break
 
209
                else:
 
210
                    print >> sys.stderr, "Client not found on server: %r" % name
 
211
                    sys.exit(1)
 
212
            
 
213
        if not has_actions(options) and clients:
 
214
            if options.verbose:
 
215
                keywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
 
216
                            'created', 'interval', 'host', 'fingerprint',
 
217
                            'checker_running', 'last_enabled', 'checker')
 
218
            else:
 
219
                keywords = defaultkeywords
 
220
                
 
221
            print_clients(mandos_clients.values(), keywords)
 
222
        else:
 
223
            # Process each client in the list by all selected options
 
224
            for client in clients:
 
225
                if options.remove:
 
226
                    mandos_serv.RemoveClient(client.__dbus_object_path__)
 
227
                if options.enable:
 
228
                    client.Enable(dbus_interface=client_interface)
 
229
                if options.disable:
 
230
                    client.Disable(dbus_interface=client_interface)
 
231
                if options.bump_timeout:
 
232
                    client.CheckedOK(dbus_interface=client_interface)
 
233
                if options.start_checker:
 
234
                    client.StartChecker(dbus_interface=client_interface)
 
235
                if options.stop_checker:
 
236
                    client.StopChecker(dbus_interface=client_interface)
 
237
                if options.is_enabled:
 
238
                    sys.exit(0 if client.Get(client_interface,
 
239
                                             u"enabled",
 
240
                                             dbus_interface=dbus.PROPERTIES_IFACE)
 
241
                             else 1)
 
242
                if options.checker:
 
243
                    client.Set(client_interface, u"checker", options.checker,
 
244
                               dbus_interface=dbus.PROPERTIES_IFACE)
 
245
                if options.host:
 
246
                    client.Set(client_interface, u"host", options.host,
 
247
                               dbus_interface=dbus.PROPERTIES_IFACE)
 
248
                if options.interval:
 
249
                    client.Set(client_interface, u"interval",
 
250
                               timedelta_to_milliseconds
 
251
                               (string_to_delta(options.interval)),
 
252
                               dbus_interface=dbus.PROPERTIES_IFACE)
 
253
                if options.timeout:
 
254
                    client.Set(client_interface, u"timeout",
 
255
                               timedelta_to_milliseconds(string_to_delta
 
256
                                                         (options.timeout)),
 
257
                               dbus_interface=dbus.PROPERTIES_IFACE)
 
258
                if options.secret:
 
259
                    client.Set(client_interface, u"secret",
 
260
                               dbus.ByteArray(open(options.secret, u'rb').read()),
 
261
                               dbus_interface=dbus.PROPERTIES_IFACE)
 
262
                if options.approve:
 
263
                    client.Approve(dbus.Boolean(True), dbus_interface=client_interface)
 
264
                if options.deny:
 
265
                    client.Approve(dbus.Boolean(False), dbus_interface=client_interface)
 
266
 
 
267
if __name__ == '__main__':
 
268
    main()