#!/usr/bin/python
# ganked from https://github.com/davidn/av/
# via https://unix.stackexchange.com/questions/337853/how-can-i-trigger-a-systemd-unit-on-suspend-before-networking-is-shut-down
# https://unix.stackexchange.com/questions/64151/networkmanager-disabled-network-when-sending-system-to-sleep/139664
# 
import os, atexit, dbus, gobject
import subprocess
from dbus.mainloop import glib

class SSHStop(object):
    def shutdown(self):
        subprocess.call(["/home/cks/lib/dmenu/aux/dropkeys",])
        subprocess.call(["/home/cks/bin/clean-sessions",])
	#subprocess.call(["/home/cks/bin/X11/yubi", "drop",])

    def start(self):
        pass

class LoginController(object):
    def __init__(self, bus, controller):
      self.fd = None
      self.controller = controller
      self.proxy = bus.get_object( 'org.freedesktop.login1',
                                  '/org/freedesktop/login1' )
      self.login1 = dbus.Interface(self.proxy, 'org.freedesktop.login1.Manager')
      for signal in ['PrepareForSleep', 'PrepareForShutdown']:
        self.login1.connect_to_signal(signal, self.signal_handler(),
                                      member_keyword='member')
      atexit.register(lambda: self.uninhibit())
      self.inhibit()

    def inhibit(self):
      self.fd = self.login1.Inhibit( 'shutdown:sleep', 'sshdrop',
                         'dropping SSH keys before/shutdown ...',
                         'delay' )

    def uninhibit(self):
      if self.fd:
        os.close( self.fd.take() )
        self.fd = None

    def signal_handler(self):
        def fun(boolean, member=None):
            if boolean:  ## going to suspend/hibernate or shutdown
                self.controller.shutdown()
                self.uninhibit()
            else:  ## resume/thaw
                if member == 'PrepareForSleep':
                    self.controller.start()
                    self.inhibit()
        return fun


if __name__ == '__main__':
    sshc = SSHStop()
    glib.DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()
    controller = LoginController(bus, sshc)
    gobject.MainLoop().run()
