94
92
if sys.version_info.major == 2:
95
93
__metaclass__ = type
98
# Add collections.abc.Callable if it does not exist
100
collections.abc.Callable
101
except AttributeError:
103
Callable = collections.Callable
104
collections.abc = abc
107
# Add shlex.quote if it does not exist
110
except AttributeError:
111
shlex.quote = re.escape
113
95
# Show warnings by default
114
96
if not sys.warnoptions:
141
123
SO_BINDTODEVICE = None
125
if sys.version_info.major == 2:
143
128
if sys.version_info < (3, 2):
144
129
configparser.Configparser = configparser.SafeConfigParser
147
132
stored_state_file = "clients.pickle"
149
134
logger = logging.getLogger()
1052
1037
if self.checker_initiator_tag is not None:
1053
1038
GLib.source_remove(self.checker_initiator_tag)
1054
1039
self.checker_initiator_tag = GLib.timeout_add(
1055
random.randrange(int(self.interval.total_seconds() * 1000
1040
int(self.interval.total_seconds() * 1000),
1057
1041
self.start_checker)
1058
1042
# Schedule a disable() when 'timeout' has passed
1059
1043
if self.disable_initiator_tag is not None:
1134
1117
if self.checker is None:
1135
1118
# Escape attributes for the shell
1136
1119
escaped_attrs = {
1137
attr: shlex.quote(str(getattr(self, attr)))
1120
attr: re.escape(str(getattr(self, attr)))
1138
1121
for attr in self.runtime_expansions}
1140
1123
command = self.checker_command % escaped_attrs
1429
1412
raise ValueError("Byte arrays not supported for non-"
1430
1413
"'ay' signature {!r}"
1431
1414
.format(prop._dbus_signature))
1432
value = dbus.ByteArray(bytes(value))
1415
value = dbus.ByteArray(b''.join(chr(byte)
1435
1419
@dbus.service.method(dbus.PROPERTIES_IFACE,
2781
2765
def rfc3339_duration_to_delta(duration):
2782
2766
"""Parse an RFC 3339 "duration" and return a datetime.timedelta
2784
>>> rfc3339_duration_to_delta("P7D") == datetime.timedelta(7)
2786
>>> rfc3339_duration_to_delta("PT60S") == datetime.timedelta(0, 60)
2788
>>> rfc3339_duration_to_delta("PT60M") == datetime.timedelta(0, 3600)
2790
>>> rfc3339_duration_to_delta("PT24H") == datetime.timedelta(1)
2792
>>> rfc3339_duration_to_delta("P1W") == datetime.timedelta(7)
2794
>>> rfc3339_duration_to_delta("PT5M30S") == datetime.timedelta(0, 330)
2796
>>> rfc3339_duration_to_delta("P1DT3M20S") == datetime.timedelta(1, 200)
2768
>>> rfc3339_duration_to_delta("P7D")
2769
datetime.timedelta(7)
2770
>>> rfc3339_duration_to_delta("PT60S")
2771
datetime.timedelta(0, 60)
2772
>>> rfc3339_duration_to_delta("PT60M")
2773
datetime.timedelta(0, 3600)
2774
>>> rfc3339_duration_to_delta("PT24H")
2775
datetime.timedelta(1)
2776
>>> rfc3339_duration_to_delta("P1W")
2777
datetime.timedelta(7)
2778
>>> rfc3339_duration_to_delta("PT5M30S")
2779
datetime.timedelta(0, 330)
2780
>>> rfc3339_duration_to_delta("P1DT3M20S")
2781
datetime.timedelta(1, 200)
2800
2784
# Parsing an RFC 3339 duration with regular expressions is not
2880
2864
def string_to_delta(interval):
2881
2865
"""Parse a string and return a datetime.timedelta
2883
>>> string_to_delta('7d') == datetime.timedelta(7)
2885
>>> string_to_delta('60s') == datetime.timedelta(0, 60)
2887
>>> string_to_delta('60m') == datetime.timedelta(0, 3600)
2889
>>> string_to_delta('24h') == datetime.timedelta(1)
2891
>>> string_to_delta('1w') == datetime.timedelta(7)
2893
>>> string_to_delta('5m 30s') == datetime.timedelta(0, 330)
2867
>>> string_to_delta('7d')
2868
datetime.timedelta(7)
2869
>>> string_to_delta('60s')
2870
datetime.timedelta(0, 60)
2871
>>> string_to_delta('60m')
2872
datetime.timedelta(0, 3600)
2873
>>> string_to_delta('24h')
2874
datetime.timedelta(1)
2875
>>> string_to_delta('1w')
2876
datetime.timedelta(7)
2877
>>> string_to_delta('5m 30s')
2878
datetime.timedelta(0, 330)
3267
3251
if isinstance(s, bytes)
3268
3252
else s) for s in
3269
3253
value["client_structure"]]
3270
# .name, .host, and .checker_command
3271
for k in ("name", "host", "checker_command"):
3255
for k in ("name", "host"):
3272
3256
if isinstance(value[k], bytes):
3273
3257
value[k] = value[k].decode("utf-8")
3274
3258
if "key_id" not in value:
3284
3268
for key, value in
3285
3269
bytes_old_client_settings.items()}
3286
3270
del bytes_old_client_settings
3287
# .host and .checker_command
3288
3272
for value in old_client_settings.values():
3289
for attribute in ("host", "checker_command"):
3290
if isinstance(value[attribute], bytes):
3291
value[attribute] = (value[attribute]
3273
if isinstance(value["host"], bytes):
3274
value["host"] = (value["host"]
3293
3276
os.remove(stored_state_path)
3294
3277
except IOError as e:
3295
3278
if e.errno == errno.ENOENT: