/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: 2014-07-25 22:44:20 UTC
  • mto: This revision was merged to the branch mainline in revision 724.
  • Revision ID: teddy@recompile.se-20140725224420-4a5ct2ptt0hsc92z
Require Python 2.7.

This is in preparation for the eventual move to Python 3, which will
happen as soon as all Python modules required by Mandos are available.
The mandos-ctl and mandos-monitor programs are already portable
between Python 2.6 and Python 3 without changes; this change will
bring the requirement up to Python 2.7.

* INSTALL (Prerequisites/Libraries/Mandos Server): Document
                                                   requirement of
                                                   Python 2.7; remove
                                                   Python-argparse
                                                   which is in the
                                                   Python 2.7 standard
                                                   library.
* debian/control (Source: mandos/Build-Depends-Indep): Depend on
                                                       exactly the
                                                       python2.7
                                                       package and all
                                                       the Python 2.7
                                                       versions of the
                                                       python modules.
  (Package: mandos/Depends): - '' - but still depend on python (<=2.7)
                            and the generic versions of the Python
                            modules; this is for mandos-ctl and
                            mandos-monitor, both of which are
                            compatible with Python 3, and use
                            #!/usr/bin/python.
* mandos: Use #!/usr/bin/python2.7 instead of #!/usr/bin/python.

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-2012 Teddy Hogeborn
7
 
# Copyright © 2008-2012 Björn Påhlsson
 
6
# Copyright © 2008-2014 Teddy Hogeborn
 
7
# Copyright © 2008-2014 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
26
26
from __future__ import (division, absolute_import, print_function,
27
27
                        unicode_literals)
28
28
 
29
 
from future_builtins import *
 
29
try:
 
30
    from future_builtins import *
 
31
except ImportError:
 
32
    pass
30
33
 
31
34
import sys
32
35
import argparse
39
42
 
40
43
import dbus
41
44
 
 
45
if sys.version_info[0] == 2:
 
46
    str = unicode
 
47
 
42
48
locale.setlocale(locale.LC_ALL, "")
43
49
 
44
50
tablewords = {
66
72
server_path = "/"
67
73
server_interface = domain + ".Mandos"
68
74
client_interface = domain + ".Mandos.Client"
69
 
version = "1.6.0"
 
75
version = "1.6.7"
70
76
 
71
77
def timedelta_to_milliseconds(td):
72
78
    """Convert a datetime.timedelta object to milliseconds"""
85
91
 
86
92
 
87
93
def rfc3339_duration_to_delta(duration):
88
 
    """Parse a RFC 3339 "duration" and return a datetime.timedelta
 
94
    """Parse an RFC 3339 "duration" and return a datetime.timedelta
89
95
    
90
96
    >>> rfc3339_duration_to_delta("P7D")
91
97
    datetime.timedelta(7)
103
109
    datetime.timedelta(1, 200)
104
110
    """
105
111
    
106
 
    # Parsing a RFC 3339 duration with regular expressions is not
 
112
    # Parsing an RFC 3339 duration with regular expressions is not
107
113
    # possible - there would have to be multiple places for the same
108
 
    # values, like seconds.  This, while more esoteric, is cleaner
109
 
    # without depending on a parsing library.  If Python had a
 
114
    # values, like seconds.  The current code, while more esoteric, is
 
115
    # cleaner without depending on a parsing library.  If Python had a
110
116
    # built-in library for parsing we would use it, but we'd like to
111
117
    # avoid excessive use of external libraries.
112
118
    
151
157
    token_duration = Token(re.compile(r"P"), None,
152
158
                           frozenset((token_year, token_month,
153
159
                                      token_day, token_time,
154
 
                                      token_week))),
 
160
                                      token_week)))
155
161
    # Define starting values
156
162
    value = datetime.timedelta() # Value so far
157
163
    found_token = None
158
 
    followers = frozenset(token_duration,) # Following valid tokens
 
164
    followers = frozenset((token_duration,)) # Following valid tokens
159
165
    s = duration                # String left to parse
160
166
    # Loop until end token is found
161
167
    while found_token is not token_end:
199
205
    >>> string_to_delta("5m 30s")
200
206
    datetime.timedelta(0, 330)
201
207
    """
202
 
    value = datetime.timedelta(0)
203
 
    regexp = re.compile(r"(\d+)([dsmhw]?)")
204
208
    
205
209
    try:
206
210
        return rfc3339_duration_to_delta(interval)
207
211
    except ValueError:
208
212
        pass
209
213
    
 
214
    value = datetime.timedelta(0)
 
215
    regexp = re.compile(r"(\d+)([dsmhw]?)")
 
216
    
210
217
    for num, suffix in regexp.findall(interval):
211
218
        if suffix == "d":
212
219
            value += datetime.timedelta(int(num))
229
236
        if keyword in ("Timeout", "Interval", "ApprovalDelay",
230
237
                       "ApprovalDuration", "ExtendedTimeout"):
231
238
            return milliseconds_to_string(value)
232
 
        return unicode(value)
 
239
        return str(value)
233
240
    
234
241
    # Create format string to print table rows
235
242
    format_string = " ".join("{{{key}:{width}}}".format(
309
316
    parser.add_argument("--approval-duration",
310
317
                        help="Set duration of one client approval")
311
318
    parser.add_argument("-H", "--host", help="Set host for client")
312
 
    parser.add_argument("-s", "--secret", type=file,
 
319
    parser.add_argument("-s", "--secret",
 
320
                        type=argparse.FileType(mode="rb"),
313
321
                        help="Set password blob (file) for client")
314
322
    parser.add_argument("-A", "--approve", action="store_true",
315
323
                        help="Approve any current client request")
330
338
 
331
339
    if options.check:
332
340
        fail_count, test_count = doctest.testmod()
333
 
        sys.exit(0 if fail_count == 0 else 1)
 
341
        sys.exit(os.EX_OK if fail_count == 0 else 1)
334
342
    
335
343
    try:
336
344
        bus = dbus.SystemBus()
366
374
    if options.all or not options.client:
367
375
        clients = dict((bus.get_object(busname, path), properties)
368
376
                       for path, properties in
369
 
                       mandos_clients.iteritems())
 
377
                       mandos_clients.items())
370
378
    else:
371
379
        for name in options.client:
372
380
            for path, client in mandos_clients.iteritems():