48
# Show warnings by default
49
if not sys.warnoptions:
51
warnings.simplefilter("default")
53
log = logging.getLogger(sys.argv[0])
54
logging.basicConfig(level="INFO", # Show info level messages
55
format="%(message)s") # Show basic log messages
57
logging.captureWarnings(True) # Show warnings via the logging system
46
59
if sys.version_info.major == 2:
103
116
datetime.timedelta(0, 60)
104
117
>>> rfc3339_duration_to_delta("PT60M")
105
118
datetime.timedelta(0, 3600)
119
>>> rfc3339_duration_to_delta("P60M")
120
datetime.timedelta(1680)
106
121
>>> rfc3339_duration_to_delta("PT24H")
107
122
datetime.timedelta(1)
108
123
>>> rfc3339_duration_to_delta("P1W")
111
126
datetime.timedelta(0, 330)
112
127
>>> rfc3339_duration_to_delta("P1DT3M20S")
113
128
datetime.timedelta(1, 200)
129
>>> # Can not be empty:
130
>>> rfc3339_duration_to_delta("")
131
Traceback (most recent call last):
133
ValueError: Invalid RFC 3339 duration: u''
134
>>> # Must start with "P":
135
>>> rfc3339_duration_to_delta("1D")
136
Traceback (most recent call last):
138
ValueError: Invalid RFC 3339 duration: u'1D'
139
>>> # Must use correct order
140
>>> rfc3339_duration_to_delta("PT1S2M")
141
Traceback (most recent call last):
143
ValueError: Invalid RFC 3339 duration: u'PT1S2M'
144
>>> # Time needs time marker
145
>>> rfc3339_duration_to_delta("P1H2S")
146
Traceback (most recent call last):
148
ValueError: Invalid RFC 3339 duration: u'P1H2S'
149
>>> # Weeks can not be combined with anything else
150
>>> rfc3339_duration_to_delta("P1D2W")
151
Traceback (most recent call last):
153
ValueError: Invalid RFC 3339 duration: u'P1D2W'
154
>>> rfc3339_duration_to_delta("P2W2H")
155
Traceback (most recent call last):
157
ValueError: Invalid RFC 3339 duration: u'P2W2H'
116
160
# Parsing an RFC 3339 duration with regular expressions is not
237
281
def print_clients(clients, keywords):
238
282
def valuetostring(value, keyword):
239
if type(value) is dbus.Boolean:
283
if isinstance(value, dbus.Boolean):
240
284
return "Yes" if value else "No"
241
285
if keyword in ("Timeout", "Interval", "ApprovalDelay",
242
286
"ApprovalDuration", "ExtendedTimeout"):
345
389
if options.all and not has_actions(options):
346
390
parser.error("--all requires an action.")
350
fail_count, test_count = doctest.testmod()
351
sys.exit(os.EX_OK if fail_count == 0 else 1)
354
393
bus = dbus.SystemBus()
355
394
mandos_dbus_objc = bus.get_object(busname, server_path)
356
395
except dbus.exceptions.DBusException:
357
print("Could not connect to Mandos server", file=sys.stderr)
396
log.critical("Could not connect to Mandos server")
360
399
mandos_serv = dbus.Interface(mandos_dbus_objc,
379
418
os.dup2(stderrcopy, sys.stderr.fileno())
380
419
os.close(stderrcopy)
381
420
except dbus.exceptions.DBusException as e:
382
print("Access denied: "
383
"Accessing mandos server through D-Bus: {}".format(e),
421
log.critical("Failed to access Mandos server through D-Bus:"
387
425
# Compile dict of (clients: properties) to process
398
436
clients[client_objc] = client
401
print("Client not found on server: {!r}"
402
.format(name), file=sys.stderr)
439
log.critical("Client not found on server: %r", name)
405
442
if not has_actions(options) and clients:
493
530
client.Approve(dbus.Boolean(False),
494
531
dbus_interface=client_interface)
534
class Test_milliseconds_to_string(unittest.TestCase):
536
self.assertEqual(milliseconds_to_string(93785000),
538
def test_no_days(self):
539
self.assertEqual(milliseconds_to_string(7385000), "02:03:05")
540
def test_all_zero(self):
541
self.assertEqual(milliseconds_to_string(0), "00:00:00")
542
def test_no_fractional_seconds(self):
543
self.assertEqual(milliseconds_to_string(400), "00:00:00")
544
self.assertEqual(milliseconds_to_string(900), "00:00:00")
545
self.assertEqual(milliseconds_to_string(1900), "00:00:01")
548
def should_only_run_tests():
549
parser = argparse.ArgumentParser(add_help=False)
550
parser.add_argument("--check", action='store_true')
551
args, unknown_args = parser.parse_known_args()
552
run_tests = args.check
554
# Remove --check argument from sys.argv
555
sys.argv[1:] = unknown_args
558
# Add all tests from doctest strings
559
def load_tests(loader, tests, none):
561
tests.addTests(doctest.DocTestSuite())
497
564
if __name__ == "__main__":
565
if should_only_run_tests():
566
# Call using ./tdd-python-script --check [--verbose]