diff options
| author | Luke <luke@lukesmith.xyz> | 2018-02-20 14:29:53 -0700 |
|---|---|---|
| committer | Luke <luke@lukesmith.xyz> | 2018-02-20 14:29:53 -0700 |
| commit | 838eeec9acdc320bbab24b69db3041e436cdc996 (patch) | |
| tree | e220c4843b25626a9733ee39cb45fcf1dadc1394 /.scripts/offlineimap-daemon.py | |
| parent | f1366ff22b4f6f97b27edecda9ecf434c38ae426 (diff) | |
| download | eibhear-838eeec9acdc320bbab24b69db3041e436cdc996.tar.gz eibhear-838eeec9acdc320bbab24b69db3041e436cdc996.tar.zst eibhear-838eeec9acdc320bbab24b69db3041e436cdc996.zip | |
scripts folder moved to ~/.scripts
Diffstat (limited to '.scripts/offlineimap-daemon.py')
| -rwxr-xr-x | .scripts/offlineimap-daemon.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/.scripts/offlineimap-daemon.py b/.scripts/offlineimap-daemon.py new file mode 100755 index 0000000..fea76fc --- /dev/null +++ b/.scripts/offlineimap-daemon.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import subprocess +import signal +import threading +import sys + +import dbus +from dbus.mainloop.glib import DBusGMainLoop +from gi.repository import GLib + + +class OfflineimapCtl(object): + def __init__(self): + self.daemon_proc = None + self.run_ev = threading.Event() + self.run_daemon = False + + def run(self): + t = threading.Thread(target=self._watch_daemon, daemon=True) + t.start() + + def _watch_daemon(self): + while True: + self.run_ev.wait() + self.run_ev.clear() + if self.run_daemon: + self.is_running = True + print('offlineimap is being started') + self._spawn_daemon() + print('offlineimap has stopped') + self.run_ev.set() # check state and restart if needed + + def _spawn_daemon(self): + self.daemon_proc = subprocess.Popen(['offlineimap', '-u', 'basic'], shell=False) + self.daemon_proc.wait() + self.daemon_proc = None + + def start(self): + print('starting offlineimap') + self.run_daemon = True + self.run_ev.set() + + def stop(self): + print('stopping offlineimap') + self.run_daemon = False + if self.daemon_proc: + try: + self.daemon_proc.send_signal(signal.SIGUSR2) + except OSError: + print('Unable to stop offlineimap') + + def restart(self): + print('restarting offlineimap') + if self.run_daemon: + self.stop() + self.start() + + def onConnectivityChanged(self, state): + # 70 means fully connected + if state == 70: + self.start() + else: + self.stop() + +def main(): + oi_ctl = OfflineimapCtl() + oi_ctl.run() + + try: + bus = dbus.SystemBus(mainloop=DBusGMainLoop()) + network_manager = bus.get_object( + 'org.freedesktop.NetworkManager', + '/org/freedesktop/NetworkManager') + network = dbus.Interface(network_manager, + dbus_interface='org.freedesktop.NetworkManager') + + network.connect_to_signal('StateChanged', oi_ctl.onConnectivityChanged) + + # send current state as first event + state = network.state() + oi_ctl.onConnectivityChanged(state) + + except dbus.exceptions.DBusException: + print('Unable to connect to dbus') + sys.exit(3) + + # start receiving events from dbus + loop = GLib.MainLoop() + loop.run() + +if __name__ == '__main__': + main() |
