scripts - scripts - some useful shell scripts

git clone git://git.bcharge.de/scripts.git

About | Log | Files | Refs

offlineimap-daemon.py (2113B)


#!/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()