aboutsummaryrefslogtreecommitdiff
path: root/service.py
diff options
context:
space:
mode:
Diffstat (limited to 'service.py')
-rwxr-xr-xservice.py44
1 files changed, 40 insertions, 4 deletions
diff --git a/service.py b/service.py
index 4c4e927..47ebfcb 100755
--- a/service.py
+++ b/service.py
@@ -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()