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