]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/actions/session_manager.py
Remove unused python imports
[waydroid.git] / tools / actions / session_manager.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import signal
6 import sys
7 import tools.config
8 import tools.helpers.ipc
9 from tools import services
10 import dbus
11 import dbus.service
12 import dbus.exceptions
13 from gi.repository import GLib
14 import copy
15
16 class DbusSessionManager(dbus.service.Object):
17 def __init__(self, looper, bus, object_path, args):
18 self.args = args
19 self.looper = looper
20 dbus.service.Object.__init__(self, bus, object_path)
21
22 @dbus.service.method("id.waydro.SessionManager", in_signature='', out_signature='')
23 def Stop(self):
24 do_stop(self.args, self.looper)
25 stop_container(quit_session=False)
26
27 def service(args, looper):
28 dbus_obj = DbusSessionManager(looper, dbus.SessionBus(), '/SessionManager', args)
29 looper.run()
30
31 def start(args, unlocked_cb=None, background=True):
32 try:
33 name = dbus.service.BusName("id.waydro.Session", dbus.SessionBus(), do_not_queue=True)
34 except dbus.exceptions.NameExistsException:
35 logging.error("Session is already running")
36 if unlocked_cb:
37 unlocked_cb()
38 return
39
40 session = copy.copy(tools.config.session_defaults)
41
42 # TODO: also support WAYLAND_SOCKET?
43 wayland_display = session["wayland_display"]
44 if wayland_display == "None" or not wayland_display:
45 logging.warning('WAYLAND_DISPLAY is not set, defaulting to "wayland-0"')
46 wayland_display = session["wayland_display"] = "wayland-0"
47
48 if os.path.isabs(wayland_display):
49 wayland_socket_path = wayland_display
50 else:
51 xdg_runtime_dir = session["xdg_runtime_dir"]
52 if xdg_runtime_dir == "None" or not xdg_runtime_dir:
53 logging.error(f"XDG_RUNTIME_DIR is not set; please don't start a Waydroid session with 'sudo'!")
54 sys.exit(1)
55 wayland_socket_path = os.path.join(xdg_runtime_dir, wayland_display)
56 if not os.path.exists(wayland_socket_path):
57 logging.error(f"Wayland socket '{wayland_socket_path}' doesn't exist; are you running a Wayland compositor?")
58 sys.exit(1)
59
60 waydroid_data = session["waydroid_data"]
61 if not os.path.isdir(waydroid_data):
62 os.makedirs(waydroid_data)
63
64 dpi = tools.helpers.props.host_get(args, "ro.sf.lcd_density")
65 if dpi == "":
66 dpi = os.getenv("GRID_UNIT_PX")
67 if dpi is not None:
68 dpi = str(int(dpi) * 20)
69 else:
70 dpi = "0"
71 session["lcd_density"] = dpi
72
73 session["background_start"] = "true" if background else "false"
74
75 mainloop = GLib.MainLoop()
76
77 def sigint_handler(data):
78 do_stop(args, mainloop)
79 stop_container(quit_session=False)
80
81 def sigusr_handler(data):
82 do_stop(args, mainloop)
83
84 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGINT, sigint_handler, None)
85 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, sigint_handler, None)
86 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGUSR1, sigusr_handler, None)
87 try:
88 tools.helpers.ipc.DBusContainerService().Start(session)
89 except dbus.DBusException as e:
90 logging.debug(e)
91 if e.get_dbus_name().startswith("org.freedesktop.DBus.Python"):
92 logging.error(e.get_dbus_message().splitlines()[-1])
93 else:
94 logging.error("WayDroid container is not listening")
95 sys.exit(0)
96
97 services.user_manager.start(args, session, unlocked_cb)
98 services.clipboard_manager.start(args)
99 service(args, mainloop)
100
101 def do_stop(args, looper):
102 services.user_manager.stop(args)
103 services.clipboard_manager.stop(args)
104 looper.quit()
105
106 def stop(args):
107 try:
108 tools.helpers.ipc.DBusSessionService().Stop()
109 except dbus.DBusException:
110 stop_container(quit_session=True)
111
112 def stop_container(quit_session):
113 try:
114 tools.helpers.ipc.DBusContainerService().Stop(quit_session)
115 except dbus.DBusException:
116 pass