]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/actions/container_manager.py
Configure multiple preinstalled images paths
[waydroid.git] / tools / actions / container_manager.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 from shutil import which
4 import logging
5 import os
6 import time
7 import glob
8 import signal
9 import sys
10 import uuid
11 import tools.config
12 from tools import helpers
13 from tools import services
14
15
16 def start(args):
17 def set_permissions(perm_list=None, mode="777"):
18 def chmod(path, mode):
19 if os.path.exists(path):
20 command = ["chmod", mode, "-R", path]
21 tools.helpers.run.user(args, command, check=False)
22
23 # Nodes list
24 if not perm_list:
25 perm_list = [
26 "/dev/ashmem",
27
28 # sw_sync for HWC
29 "/dev/sw_sync",
30 "/sys/kernel/debug/sync/sw_sync",
31
32 # Media
33 "/dev/Vcodec",
34 "/dev/MTK_SMI",
35 "/dev/mdp_sync",
36 "/dev/mtk_cmdq",
37
38 # Graphics
39 "/dev/dri",
40 "/dev/graphics",
41 "/dev/pvr_sync",
42 "/dev/ion",
43 ]
44
45 # Framebuffers
46 perm_list.extend(glob.glob("/dev/fb*"))
47 # Videos
48 perm_list.extend(glob.glob("/dev/video*"))
49
50 for path in perm_list:
51 chmod(path, mode)
52
53 def signal_handler(sig, frame):
54 services.hardware_manager.stop(args)
55 stop(args)
56 sys.exit(0)
57
58 status = helpers.lxc.status(args)
59 if status == "STOPPED":
60 # Load binder and ashmem drivers
61 cfg = tools.config.load(args)
62 if cfg["waydroid"]["vendor_type"] == "MAINLINE":
63 if helpers.drivers.probeBinderDriver(args) != 0:
64 logging.error("Failed to load Binder driver")
65 helpers.drivers.probeAshmemDriver(args)
66 helpers.drivers.loadBinderNodes(args)
67 set_permissions([
68 "/dev/" + args.BINDER_DRIVER,
69 "/dev/" + args.VNDBINDER_DRIVER,
70 "/dev/" + args.HWBINDER_DRIVER
71 ], "666")
72
73 if os.path.exists(tools.config.session_defaults["config_path"]):
74 session_cfg = tools.config.load_session()
75 if session_cfg["session"]["state"] != "STOPPED":
76 logging.warning("Found session config on state: {}, restart session".format(
77 session_cfg["session"]["state"]))
78 os.remove(tools.config.session_defaults["config_path"])
79 logging.debug("Container manager is waiting for session to load")
80 while not os.path.exists(tools.config.session_defaults["config_path"]):
81 time.sleep(1)
82
83 # Load session configs
84 session_cfg = tools.config.load_session()
85
86 # Networking
87 command = [tools.config.tools_src +
88 "/data/scripts/waydroid-net.sh", "start"]
89 tools.helpers.run.user(args, command, check=False)
90
91 # Sensors
92 if which("waydroid-sensord"):
93 tools.helpers.run.user(
94 args, ["waydroid-sensord", "/dev/" + args.HWBINDER_DRIVER], output="background")
95
96 # Mount rootfs
97 helpers.images.mount_rootfs(args, cfg["waydroid"]["images_path"])
98
99 helpers.protocol.set_aidl_version(args)
100
101 # Mount data
102 helpers.mount.bind(args, session_cfg["session"]["waydroid_data"],
103 tools.config.defaults["data"])
104
105 # Cgroup hacks
106 if which("start"):
107 command = ["start", "cgroup-lite"]
108 tools.helpers.run.user(args, command, check=False)
109 if os.path.ismount("/sys/fs/cgroup/schedtune"):
110 command = ["umount", "-l", "/sys/fs/cgroup/schedtune"]
111 tools.helpers.run.user(args, command, check=False)
112
113 #TODO: remove NFC hacks
114 if which("stop"):
115 command = ["stop", "nfcd"]
116 tools.helpers.run.user(args, command, check=False)
117
118 # Set permissions
119 set_permissions()
120
121 helpers.lxc.start(args)
122 session_cfg["session"]["state"] = helpers.lxc.status(args)
123 timeout = 10
124 while session_cfg["session"]["state"] != "RUNNING" and timeout > 0:
125 session_cfg["session"]["state"] = helpers.lxc.status(args)
126 logging.info(
127 "waiting {} seconds for container to start...".format(timeout))
128 timeout = timeout - 1
129 time.sleep(1)
130 if session_cfg["session"]["state"] != "RUNNING":
131 raise OSError("container failed to start")
132 tools.config.save_session(session_cfg)
133
134 services.hardware_manager.start(args)
135
136 signal.signal(signal.SIGINT, signal_handler)
137 while os.path.exists(tools.config.session_defaults["config_path"]):
138 session_cfg = tools.config.load_session()
139 if session_cfg["session"]["state"] == "STOPPED":
140 services.hardware_manager.stop(args)
141 sys.exit(0)
142 elif session_cfg["session"]["state"] == "UNFREEZE":
143 session_cfg["session"]["state"] = helpers.lxc.status(args)
144 tools.config.save_session(session_cfg)
145 unfreeze(args)
146 time.sleep(1)
147
148 logging.warning("session manager stopped, stopping container and waiting...")
149 stop(args)
150 services.hardware_manager.stop(args)
151 start(args)
152 else:
153 logging.error("WayDroid container is {}".format(status))
154
155 def stop(args):
156 status = helpers.lxc.status(args)
157 if status != "STOPPED":
158 helpers.lxc.stop(args)
159 if os.path.exists(tools.config.session_defaults["config_path"]):
160 session_cfg = tools.config.load_session()
161 session_cfg["session"]["state"] = helpers.lxc.status(args)
162 tools.config.save_session(session_cfg)
163
164 # Networking
165 command = [tools.config.tools_src +
166 "/data/scripts/waydroid-net.sh", "stop"]
167 tools.helpers.run.user(args, command, check=False)
168
169 #TODO: remove NFC hacks
170 if which("start"):
171 command = ["start", "nfcd"]
172 tools.helpers.run.user(args, command, check=False)
173
174 # Sensors
175 if which("waydroid-sensord"):
176 command = ["pidof", "waydroid-sensord"]
177 pid = tools.helpers.run.user(args, command, check=False, output_return=True).strip()
178 if pid:
179 command = ["kill", "-9", pid]
180 tools.helpers.run.user(args, command, check=False)
181
182 # Umount rootfs
183 helpers.images.umount_rootfs(args)
184
185 # Umount data
186 helpers.mount.umount_all(args, tools.config.defaults["data"])
187
188 else:
189 logging.error("WayDroid container is {}".format(status))
190
191 def restart(args):
192 status = helpers.lxc.status(args)
193 if status == "RUNNING":
194 helpers.lxc.stop(args)
195 helpers.lxc.start(args)
196 else:
197 logging.error("WayDroid container is {}".format(status))
198
199 def freeze(args):
200 status = helpers.lxc.status(args)
201 if status == "RUNNING":
202 helpers.lxc.freeze(args)
203 if os.path.exists(tools.config.session_defaults["config_path"]):
204 session_cfg = tools.config.load_session()
205 session_cfg["session"]["state"] = helpers.lxc.status(args)
206 tools.config.save_session(session_cfg)
207 else:
208 logging.error("WayDroid container is {}".format(status))
209
210 def unfreeze(args):
211 status = helpers.lxc.status(args)
212 if status == "FROZEN":
213 helpers.lxc.unfreeze(args)
214 if os.path.exists(tools.config.session_defaults["config_path"]):
215 session_cfg = tools.config.load_session()
216 session_cfg["session"]["state"] = helpers.lxc.status(args)
217 tools.config.save_session(session_cfg)
218 else:
219 logging.error("WayDroid container is {}".format(status))