]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/actions/session_manager.py
tools/helpers/http.py: also handle urllib.error.URLError exceptions instead of showin...
[waydroid.git] / tools / actions / session_manager.py
index cfcd267988eafaf699c5f4c12e5728d7113f7490..e02665efe5ed8a1358d86fb26fd64e780bbab475 100644 (file)
@@ -2,10 +2,8 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 import logging
 import os
-import time
 import signal
 import sys
-import shutil
 import tools.config
 import tools.helpers.ipc
 from tools import services
@@ -24,13 +22,22 @@ class DbusSessionManager(dbus.service.Object):
     @dbus.service.method("id.waydro.SessionManager", in_signature='', out_signature='')
     def Stop(self):
         do_stop(self.args, self.looper)
-        stop_container()
+        stop_container(quit_session=False)
+
+def handle_disconnect(args, looper):
+    do_stop(args, looper)
+    stop_container(quit_session=False)
 
 def service(args, looper):
+    bus = dbus.SessionBus()
+    bus.set_exit_on_disconnect(False)
+    bus.add_signal_receiver(lambda: handle_disconnect(args, looper),
+                            signal_name='Disconnected',
+                            dbus_interface='org.freedesktop.DBus.Local')
     dbus_obj = DbusSessionManager(looper, dbus.SessionBus(), '/SessionManager', args)
     looper.run()
 
-def start(args, unlocked_cb=None):
+def start(args, unlocked_cb=None, background=True):
     try:
         name = dbus.service.BusName("id.waydro.Session", dbus.SessionBus(), do_not_queue=True)
     except dbus.exceptions.NameExistsException:
@@ -39,13 +46,30 @@ def start(args, unlocked_cb=None):
             unlocked_cb()
         return
 
-    session = copy.copy(tools.config.session_defaults);
+    session = copy.copy(tools.config.session_defaults)
+
+    # TODO: also support WAYLAND_SOCKET?
     wayland_display = session["wayland_display"]
     if wayland_display == "None" or not wayland_display:
         logging.warning('WAYLAND_DISPLAY is not set, defaulting to "wayland-0"')
+        wayland_display = session["wayland_display"] = "wayland-0"
+
+    if os.path.isabs(wayland_display):
+        wayland_socket_path = wayland_display
+    else:
+        xdg_runtime_dir = session["xdg_runtime_dir"]
+        if xdg_runtime_dir == "None" or not xdg_runtime_dir:
+            logging.error(f"XDG_RUNTIME_DIR is not set; please don't start a Waydroid session with 'sudo'!")
+            sys.exit(1)
+        wayland_socket_path = os.path.join(xdg_runtime_dir, wayland_display)
+    if not os.path.exists(wayland_socket_path):
+        logging.error(f"Wayland socket '{wayland_socket_path}' doesn't exist; are you running a Wayland compositor?")
+        sys.exit(1)
+
     waydroid_data = session["waydroid_data"]
     if not os.path.isdir(waydroid_data):
         os.makedirs(waydroid_data)
+
     dpi = tools.helpers.props.host_get(args, "ro.sf.lcd_density")
     if dpi == "":
         dpi = os.getenv("GRID_UNIT_PX")
@@ -55,25 +79,31 @@ def start(args, unlocked_cb=None):
             dpi = "0"
     session["lcd_density"] = dpi
 
+    session["background_start"] = "true" if background else "false"
+
     mainloop = GLib.MainLoop()
 
     def sigint_handler(data):
         do_stop(args, mainloop)
-        stop_container()
+        stop_container(quit_session=False)
 
     def sigusr_handler(data):
         do_stop(args, mainloop)
 
+    GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGHUP, sigint_handler, None)
     GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGINT, sigint_handler, None)
     GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, sigint_handler, None)
     GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGUSR1, sigusr_handler, None)
     try:
         tools.helpers.ipc.DBusContainerService().Start(session)
-    except dbus.DBusException:
-        logging.error("WayDroid container is not listening")
+    except dbus.DBusException as e:
+        logging.debug(e)
+        if e.get_dbus_name().startswith("org.freedesktop.DBus.Python"):
+            logging.error(e.get_dbus_message().splitlines()[-1])
+        else:
+            logging.error("WayDroid container is not listening")
         sys.exit(0)
 
-
     services.user_manager.start(args, session, unlocked_cb)
     services.clipboard_manager.start(args)
     service(args, mainloop)
@@ -87,10 +117,10 @@ def stop(args):
     try:
         tools.helpers.ipc.DBusSessionService().Stop()
     except dbus.DBusException:
-        stop_container()
+        stop_container(quit_session=True)
 
-def stop_container():
+def stop_container(quit_session):
     try:
-        tools.helpers.ipc.DBusContainerService().Stop()
+        tools.helpers.ipc.DBusContainerService().Stop(quit_session)
     except dbus.DBusException:
         pass