diff options
Diffstat (limited to 'service.py')
-rwxr-xr-x | service.py | 44 |
1 files changed, 40 insertions, 4 deletions
@@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse import json +import signal import time from threading import Thread from typing import Union @@ -9,15 +10,22 @@ import dbus import dbus.service from session import Session +from trigger import TriggerServerThread + +ONE_TIME_SERVICE = False class RWAService(dbus.service.Object): - def __init__(self, mockup_mode: bool): + def __init__(self, loop, mockup_mode: bool = False): + self.loop = loop self.mockup_mode = mockup_mode self.bus = dbus.SessionBus() name = dbus.service.BusName("org.ArcticaProject.RWA", bus=self.bus) + self.trigger_service = TriggerServerThread(self._trigger) + self.trigger_service.start() + self.update_service_running = False self.sessions = {} super().__init__(name, "/RWA") @@ -26,7 +34,7 @@ class RWAService(dbus.service.Object): def start(self): """Start a new remote session.""" # Start session - session = Session(mockup_mode) + session = Session(self.trigger_service.port, mockup_mode) # Add session to sessions list self.sessions[session.pid] = session @@ -102,7 +110,28 @@ class RWAService(dbus.service.Object): time.sleep(2) self.update_service_running = False - # TODO Probably kill daemon here (quit main loop) + if ONE_TIME_SERVICE: + self._stop_all() + + def _trigger(self, token: str) -> bool: + """Trigger a specific session via trigger token.""" + print("Triggered with token", token) + + for session in self.sessions.values(): + if token == session.trigger_token: + print("Trigger session", session) + session.trigger() + return True + + return False + + def _stop_all(self): + """Stop all sessions and this daemon.""" + for session in list(self.sessions.values()): + session.stop() + del self.sessions[session.pid] + self.trigger_service.shutdown() + self.loop.quit() def str2bool(v: Union[str, bool, int]) -> bool: @@ -144,5 +173,12 @@ if __name__ == "__main__": dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) loop = GLib.MainLoop() - object = RWAService(mockup_mode) + object = RWAService(loop, mockup_mode) + + def signal_handler(sig, frame): + print("You pressed Ctrl+C!") + object._stop_all() + + signal.signal(signal.SIGINT, signal_handler) + loop.run() |