]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/actions/container_manager.py
Rebuild waydroid.prop after live upgrade
[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 if helpers.drivers.probeAshmemDriver(args) != 0:
66 logging.error("Failed to load Ashmem driver")
67 helpers.drivers.loadBinderNodes(args)
68 set_permissions([
69 "/dev/" + args.BINDER_DRIVER,
70 "/dev/" + args.VNDBINDER_DRIVER,
71 "/dev/" + args.HWBINDER_DRIVER
72 ], "666")
73
74 if os.path.exists(tools.config.session_defaults["config_path"]):
75 session_cfg = tools.config.load_session()
76 if session_cfg["session"]["state"] != "STOPPED":
77 logging.warning("Found session config on state: {}, restart session".format(
78 session_cfg["session"]["state"]))
79 os.remove(tools.config.session_defaults["config_path"])
80 logging.debug("Container manager is waiting for session to load")
81 while not os.path.exists(tools.config.session_defaults["config_path"]):
82 time.sleep(1)
83
84 # Load session configs
85 session_cfg = tools.config.load_session()
86
87 # Networking
88 command = [tools.config.tools_src +
89 "/data/scripts/waydroid-net.sh", "start"]
90 tools.helpers.run.user(args, command, check=False)
91
92 # Sensors
93 if which("waydroid-sensord"):
94 tools.helpers.run.user(
95 args, ["waydroid-sensord", "/dev/" + args.HWBINDER_DRIVER], output="background")
96
97 # Mount rootfs
98 helpers.images.mount_rootfs(args, cfg["waydroid"]["images_path"])
99
100 helpers.protocol.set_aidl_version(args)
101
102 # Mount data
103 helpers.mount.bind(args, session_cfg["session"]["waydroid_data"],
104 tools.config.defaults["data"])
105
106 # Cgroup hacks
107 if which("start"):
108 command = ["start", "cgroup-lite"]
109 tools.helpers.run.user(args, command, check=False)
110 if os.path.ismount("/sys/fs/cgroup/schedtune"):
111 command = ["umount", "-l", "/sys/fs/cgroup/schedtune"]
112 tools.helpers.run.user(args, command, check=False)
113
114 #TODO: remove NFC hacks
115 if which("stop"):
116 command = ["stop", "nfcd"]
117 tools.helpers.run.user(args, command, check=False)
118
119 # Set permissions
120 set_permissions()
121
122 helpers.lxc.start(args)
123 session_cfg["session"]["state"] = helpers.lxc.status(args)
124 timeout = 10
125 while session_cfg["session"]["state"] != "RUNNING" and timeout > 0:
126 session_cfg["session"]["state"] = helpers.lxc.status(args)
127 logging.info(
128 "waiting {} seconds for container to start...".format(timeout))
129 timeout = timeout - 1
130 time.sleep(1)
131 if session_cfg["session"]["state"] != "RUNNING":
132 raise OSError("container failed to start")
133 tools.config.save_session(session_cfg)
134
135 services.hardware_manager.start(args)
136
137 signal.signal(signal.SIGINT, signal_handler)
138 while os.path.exists(tools.config.session_defaults["config_path"]):
139 session_cfg = tools.config.load_session()
140 if session_cfg["session"]["state"] == "STOPPED":
141 services.hardware_manager.stop(args)
142 sys.exit(0)
143 elif session_cfg["session"]["state"] == "UNFREEZE":
144 session_cfg["session"]["state"] = helpers.lxc.status(args)
145 tools.config.save_session(session_cfg)
146 unfreeze(args)
147 time.sleep(1)
148
149 logging.warning("session manager stopped, stopping container and waiting...")
150 stop(args)
151 services.hardware_manager.stop(args)
152 start(args)
153 else:
154 logging.error("WayDroid container is {}".format(status))
155
156 def stop(args):
157 status = helpers.lxc.status(args)
158 if status != "STOPPED":
159 helpers.lxc.stop(args)
160 if os.path.exists(tools.config.session_defaults["config_path"]):
161 session_cfg = tools.config.load_session()
162 session_cfg["session"]["state"] = helpers.lxc.status(args)
163 tools.config.save_session(session_cfg)
164
165 # Networking
166 command = [tools.config.tools_src +
167 "/data/scripts/waydroid-net.sh", "stop"]
168 tools.helpers.run.user(args, command, check=False)
169
170 #TODO: remove NFC hacks
171 if which("start"):
172 command = ["start", "nfcd"]
173 tools.helpers.run.user(args, command, check=False)
174
175 # Sensors
176 if which("waydroid-sensord"):
177 command = ["pidof", "waydroid-sensord"]
178 pid = tools.helpers.run.user(args, command, check=False, output_return=True).strip()
179 if pid:
180 command = ["kill", "-9", pid]
181 tools.helpers.run.user(args, command, check=False)
182
183 # Umount rootfs
184 helpers.images.umount_rootfs(args)
185
186 # Umount data
187 helpers.mount.umount_all(args, tools.config.defaults["data"])
188
189 else:
190 logging.error("WayDroid container is {}".format(status))
191
192 def restart(args):
193 status = helpers.lxc.status(args)
194 if status == "RUNNING":
195 helpers.lxc.stop(args)
196 helpers.lxc.start(args)
197 else:
198 logging.error("WayDroid container is {}".format(status))
199
200 def freeze(args):
201 status = helpers.lxc.status(args)
202 if status == "RUNNING":
203 helpers.lxc.freeze(args)
204 if os.path.exists(tools.config.session_defaults["config_path"]):
205 session_cfg = tools.config.load_session()
206 session_cfg["session"]["state"] = helpers.lxc.status(args)
207 tools.config.save_session(session_cfg)
208 else:
209 logging.error("WayDroid container is {}".format(status))
210
211 def unfreeze(args):
212 status = helpers.lxc.status(args)
213 if status == "FROZEN":
214 helpers.lxc.unfreeze(args)
215 if os.path.exists(tools.config.session_defaults["config_path"]):
216 session_cfg = tools.config.load_session()
217 session_cfg["session"]["state"] = helpers.lxc.status(args)
218 tools.config.save_session(session_cfg)
219 else:
220 logging.error("WayDroid container is {}".format(status))