94 lines
2.1 KiB
Python
94 lines
2.1 KiB
Python
|
#!/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()
|