/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: 2009-01-18 06:41:57 UTC
  • Revision ID: teddy@fukt.bsnet.se-20090118064157-8o4oia1y0t8di0xj
* debian/mandos-client.lintian-overrides: Remove override for
                                          unbreakable line in
                                          plugin-runner manual page.
* plugin-runner.xml (EXAMPLES): Make long command line more breakable.

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
12
11
 
13
12
locale.setlocale(locale.LC_ALL, u'')
14
13
 
25
24
    'last_enabled': u'Last Enabled',
26
25
    'checker': u'Checker',
27
26
    }
28
 
defaultkeywords = ('name', 'enabled', 'timeout', 'last_checked_ok')
29
 
domain = 'se.bsnet.fukt'
30
 
busname = domain + '.Mandos'
31
 
server_path = '/'
32
 
server_interface = domain + '.Mandos'
33
 
client_interface = domain + '.Mandos.Client'
34
 
version = "1.0.14"
35
 
 
36
 
def timedelta_to_milliseconds(td):
37
 
    "Convert a datetime.timedelta object to milliseconds"
38
 
    return ((td.days * 24 * 60 * 60 * 1000)
39
 
            + (td.seconds * 1000)
40
 
            + (td.microseconds // 1000))
 
27
defaultkeywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
 
28
                   'checker')
 
29
busname = 'org.mandos-system.Mandos'
 
30
server_path = '/Mandos'
 
31
server_interface = 'org.mandos_system.Mandos'
 
32
client_interface = 'org.mandos_system.Mandos.Client'
 
33
version = "1.0.5"
 
34
 
 
35
bus = dbus.SystemBus()
 
36
mandos_dbus_objc = bus.get_object(busname, server_path)
 
37
mandos_serv = dbus.Interface(mandos_dbus_objc,
 
38
                             dbus_interface = server_interface)
 
39
mandos_clients = mandos_serv.GetAllClientsWithProperties()
 
40
 
 
41
def datetime_to_milliseconds(dt):
 
42
    "Return the 'timeout' attribute in milliseconds"
 
43
    return ((dt.days * 24 * 60 * 60 * 1000)
 
44
            + (dt.seconds * 1000)
 
45
            + (dt.microseconds // 1000))
41
46
 
42
47
def milliseconds_to_string(ms):
43
48
    td = datetime.timedelta(0, 0, 0, ms)
44
 
    return (u"%(days)s%(hours)02d:%(minutes)02d:%(seconds)02d"
45
 
            % { "days": "%dT" % td.days if td.days else "",
46
 
                "hours": td.seconds // 3600,
47
 
                "minutes": (td.seconds % 3600) // 60,
48
 
                "seconds": td.seconds % 60,
49
 
                })
 
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
50
53
 
51
54
 
52
55
def string_to_delta(interval):
89
92
        timevalue += delta
90
93
    return timevalue
91
94
 
92
 
def print_clients(clients, keywords):
 
95
def print_clients(clients):
93
96
    def valuetostring(value, keyword):
94
97
        if type(value) is dbus.Boolean:
95
98
            return u"Yes" if value else u"No"
96
 
        if keyword in (u"timeout", u"interval"):
 
99
        if keyword in ("timeout", "interval"):
97
100
            return milliseconds_to_string(value)
98
101
        return unicode(value)
99
102
    
100
 
    # Create format string to print table rows
101
103
    format_string = u' '.join(u'%%-%ds' %
102
104
                              max(len(tablewords[key]),
103
105
                                  max(len(valuetostring(client[key], key))
104
106
                                      for client in
105
107
                                      clients))
106
108
                              for key in keywords)
107
 
    # Print header line
108
 
    print format_string % tuple(tablewords[key] for key in keywords)
 
109
    print format_string % tuple(tablewords[key] for key in keywords) 
109
110
    for client in clients:
110
111
        print format_string % tuple(valuetostring(client[key], key)
111
112
                                    for key in keywords)
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()
 
113
 
 
114
parser = OptionParser(version = "%%prog %s" % version)
 
115
parser.add_option("-a", "--all", action="store_true",
 
116
                  help="Print all fields")
 
117
parser.add_option("-e", "--enable", action="store_true",
 
118
                  help="Enable specified client")
 
119
parser.add_option("-d", "--disable", action="store_true",
 
120
                  help="disable specified client")
 
121
parser.add_option("-b", "--bump-timeout", action="store_true",
 
122
                  help="Bump timeout of specified client")
 
123
parser.add_option("--start-checker", action="store_true",
 
124
                  help="Start checker for specified client")
 
125
parser.add_option("--stop-checker", action="store_true",
 
126
                  help="Stop checker for specified client")
 
127
parser.add_option("-v", "--is-valid", action="store_true",
 
128
                  help="Stop checker for specified client")
 
129
parser.add_option("-c", "--checker", type="string",
 
130
                  help="Set checker command for specified client")
 
131
parser.add_option("-t", "--timeout", type="string",
 
132
                  help="Set timeout for specified client")
 
133
parser.add_option("-i", "--interval", type="string",
 
134
                  help="Set checker interval for specified client")
 
135
parser.add_option("-H", "--host", type="string",
 
136
                  help="Set host for specified client")
 
137
parser.add_option("-s", "--secret", type="string",
 
138
                  help="Set password blob (file) for specified client")
 
139
options, client_names = parser.parse_args()
 
140
 
 
141
clients=[]
 
142
for name in client_names:
 
143
    for path, client in mandos_clients.iteritems():
 
144
        if client['name'] == name:
 
145
            client_objc = bus.get_object(busname, path)
 
146
            clients.append(dbus.Interface(client_objc,
 
147
                                          dbus_interface
 
148
                                          = client_interface))
 
149
            break
 
150
    else:
 
151
        print >> sys.stderr, "Client not found on server: %r" % name
 
152
        sys.exit(1)
 
153
 
 
154
if not clients:
 
155
    keywords = defaultkeywords
 
156
    if options.all:
 
157
        keywords = ('name', 'enabled', 'timeout', 'last_checked_ok',
 
158
                    'created', 'interval', 'host', 'fingerprint',
 
159
                    'checker_running', 'last_enabled', 'checker')
 
160
    print_clients(mandos_clients.values())
 
161
    
 
162
for client in clients:
 
163
    if options.enable:
 
164
        client.Enable()
 
165
    if options.disable:
 
166
        client.Disable()
 
167
    if options.bump_timeout:
 
168
        client.BumpTimeout()
 
169
    if options.start_checker:
 
170
        client.StartChecker()
 
171
    if options.stop_checker:
 
172
        client.StopChecker()
 
173
    if options.is_valid:
 
174
        sys.exit(0 if client.IsStillValid() else 1)
 
175
    if options.checker:
 
176
        client.SetChecker(options.checker)
 
177
    if options.host:
 
178
        client.SetHost(options.host)
 
179
    if options.interval:
 
180
        client.SetInterval(datetime_to_milliseconds
 
181
                           (string_to_delta(options.interval)))
 
182
    if options.timeout:
 
183
        client.SetTimeout(datetime_to_milliseconds
 
184
                          (string_to_delta(options.timeout)))
 
185
    if options.secret:
 
186
        client.SetSecret(dbus.ByteArray(open(options.secret, 'rb').read()))
 
187