92
92
if sys.version_info.major == 2:
93
93
__metaclass__ = type
95
# Show warnings by default
96
if not sys.warnoptions:
98
warnings.simplefilter("default")
100
95
# Try to find the value of SO_BINDTODEVICE:
102
97
# This is where SO_BINDTODEVICE is in Python 3.3 (or 3.4?) and
128
123
if sys.version_info < (3, 2):
129
124
configparser.Configparser = configparser.SafeConfigParser
132
127
stored_state_file = "clients.pickle"
134
129
logger = logging.getLogger()
135
logging.captureWarnings(True) # Show warnings via the logging system
1151
1144
kwargs=popen_args)
1152
1145
self.checker.start()
1153
1146
self.checker_callback_tag = GLib.io_add_watch(
1154
GLib.IOChannel.unix_new(pipe[0].fileno()),
1155
GLib.PRIORITY_DEFAULT, GLib.IO_IN,
1147
pipe[0].fileno(), GLib.IO_IN,
1156
1148
self.checker_callback, pipe[0], command)
1157
1149
# Re-run this periodically if run by GLib.timeout_add
2682
2674
def add_pipe(self, parent_pipe, proc):
2683
2675
# Call "handle_ipc" for both data and EOF events
2684
2676
GLib.io_add_watch(
2685
GLib.IOChannel.unix_new(parent_pipe.fileno()),
2686
GLib.PRIORITY_DEFAULT, GLib.IO_IN | GLib.IO_HUP,
2677
parent_pipe.fileno(),
2678
GLib.IO_IN | GLib.IO_HUP,
2687
2679
functools.partial(self.handle_ipc,
2688
2680
parent_pipe=parent_pipe,
2729
2721
GLib.io_add_watch(
2730
GLib.IOChannel.unix_new(parent_pipe.fileno()),
2731
GLib.PRIORITY_DEFAULT, GLib.IO_IN | GLib.IO_HUP,
2722
parent_pipe.fileno(),
2723
GLib.IO_IN | GLib.IO_HUP,
2732
2724
functools.partial(self.handle_ipc,
2733
2725
parent_pipe=parent_pipe,
2766
2758
def rfc3339_duration_to_delta(duration):
2767
2759
"""Parse an RFC 3339 "duration" and return a datetime.timedelta
2769
>>> rfc3339_duration_to_delta("P7D") == datetime.timedelta(7)
2771
>>> rfc3339_duration_to_delta("PT60S") == datetime.timedelta(0, 60)
2773
>>> rfc3339_duration_to_delta("PT60M") == datetime.timedelta(0, 3600)
2775
>>> rfc3339_duration_to_delta("PT24H") == datetime.timedelta(1)
2777
>>> rfc3339_duration_to_delta("P1W") == datetime.timedelta(7)
2779
>>> rfc3339_duration_to_delta("PT5M30S") == datetime.timedelta(0, 330)
2781
>>> rfc3339_duration_to_delta("P1DT3M20S") == datetime.timedelta(1, 200)
2761
>>> rfc3339_duration_to_delta("P7D")
2762
datetime.timedelta(7)
2763
>>> rfc3339_duration_to_delta("PT60S")
2764
datetime.timedelta(0, 60)
2765
>>> rfc3339_duration_to_delta("PT60M")
2766
datetime.timedelta(0, 3600)
2767
>>> rfc3339_duration_to_delta("PT24H")
2768
datetime.timedelta(1)
2769
>>> rfc3339_duration_to_delta("P1W")
2770
datetime.timedelta(7)
2771
>>> rfc3339_duration_to_delta("PT5M30S")
2772
datetime.timedelta(0, 330)
2773
>>> rfc3339_duration_to_delta("P1DT3M20S")
2774
datetime.timedelta(1, 200)
2785
2777
# Parsing an RFC 3339 duration with regular expressions is not
2865
2857
def string_to_delta(interval):
2866
2858
"""Parse a string and return a datetime.timedelta
2868
>>> string_to_delta('7d') == datetime.timedelta(7)
2870
>>> string_to_delta('60s') == datetime.timedelta(0, 60)
2872
>>> string_to_delta('60m') == datetime.timedelta(0, 3600)
2874
>>> string_to_delta('24h') == datetime.timedelta(1)
2876
>>> string_to_delta('1w') == datetime.timedelta(7)
2878
>>> string_to_delta('5m 30s') == datetime.timedelta(0, 330)
2860
>>> string_to_delta('7d')
2861
datetime.timedelta(7)
2862
>>> string_to_delta('60s')
2863
datetime.timedelta(0, 60)
2864
>>> string_to_delta('60m')
2865
datetime.timedelta(0, 3600)
2866
>>> string_to_delta('24h')
2867
datetime.timedelta(1)
2868
>>> string_to_delta('1w')
2869
datetime.timedelta(7)
2870
>>> string_to_delta('5m 30s')
2871
datetime.timedelta(0, 330)
3252
3244
if isinstance(s, bytes)
3253
3245
else s) for s in
3254
3246
value["client_structure"]]
3255
# .name, .host, and .checker_command
3256
for k in ("name", "host", "checker_command"):
3248
for k in ("name", "host"):
3257
3249
if isinstance(value[k], bytes):
3258
3250
value[k] = value[k].decode("utf-8")
3259
3251
if "key_id" not in value:
3269
3261
for key, value in
3270
3262
bytes_old_client_settings.items()}
3271
3263
del bytes_old_client_settings
3272
# .host and .checker_command
3273
3265
for value in old_client_settings.values():
3274
for attribute in ("host", "checker_command"):
3275
if isinstance(value[attribute], bytes):
3276
value[attribute] = (value[attribute]
3266
if isinstance(value["host"], bytes):
3267
value["host"] = (value["host"]
3278
3269
os.remove(stored_state_path)
3279
3270
except IOError as e:
3280
3271
if e.errno == errno.ENOENT:
3606
3597
# End of Avahi example code
3609
GLib.IOChannel.unix_new(tcp_server.fileno()),
3610
GLib.PRIORITY_DEFAULT, GLib.IO_IN,
3611
lambda *args, **kwargs: (tcp_server.handle_request
3612
(*args[2:], **kwargs) or True))
3599
GLib.io_add_watch(tcp_server.fileno(), GLib.IO_IN,
3600
lambda *args, **kwargs:
3601
(tcp_server.handle_request
3602
(*args[2:], **kwargs) or True))
3614
3604
logger.debug("Starting main loop")
3615
3605
main_loop.run()