X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/523fd4d21655361439ffe6f1f57417ceec6f1290..047414fc01f4db01d8fd0be7f4c6f9032d4819d5:/tools/actions/container_manager.py diff --git a/tools/actions/container_manager.py b/tools/actions/container_manager.py index f4ad128..dd316c7 100644 --- a/tools/actions/container_manager.py +++ b/tools/actions/container_manager.py @@ -7,48 +7,18 @@ import time import glob import signal import sys +import uuid import tools.config from tools import helpers from tools import services def start(args): - def make_prop(full_props_path): - def add_prop(key, cfg_key): - value = session_cfg["session"][cfg_key] - if value != "None": - props.append(key + "=" + session_cfg["session"][cfg_key]) - - if not os.path.isfile(args.work + "/waydroid_base.prop"): - raise RuntimeError("waydroid_base.prop Not found") - with open(args.work + "/waydroid_base.prop") as f: - props = f.read().splitlines() - if not props: - raise RuntimeError("waydroid_base.prop is broken!!?") - - add_prop("waydroid.host.user", "user_name") - add_prop("waydroid.host.uid", "user_id") - add_prop("waydroid.host.gid", "group_id") - add_prop("waydroid.xdg_runtime_dir", "xdg_runtime_dir") - add_prop("waydroid.pulse_runtime_path", "pulse_runtime_path") - add_prop("waydroid.wayland_display", "wayland_display") - if which("waydroid-sensord") is None: - props.append("waydroid.stub_sensors_hal=1") - dpi = session_cfg["session"]["lcd_density"] - if dpi != "0": - props.append("ro.sf.lcd_density=" + dpi) - - final_props = open(full_props_path, "w") - for prop in props: - final_props.write(prop + "\n") - final_props.close() - os.chmod(full_props_path, 0o644) - def set_permissions(perm_list=None, mode="777"): def chmod(path, mode): if os.path.exists(path): command = ["chmod", mode, "-R", path] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) # Nodes list if not perm_list: @@ -64,20 +34,18 @@ def start(args): "/dev/MTK_SMI", "/dev/mdp_sync", "/dev/mtk_cmdq", - "/dev/video32", - "/dev/video33", # Graphics "/dev/dri", "/dev/graphics", - - # Wayland and pulse socket permissions - session_cfg["session"]["pulse_runtime_path"], - session_cfg["session"]["xdg_runtime_dir"] + "/dev/pvr_sync", + "/dev/ion", ] # Framebuffers perm_list.extend(glob.glob("/dev/fb*")) + # Videos + perm_list.extend(glob.glob("/dev/video*")) for path in perm_list: chmod(path, mode) @@ -94,8 +62,7 @@ def start(args): if cfg["waydroid"]["vendor_type"] == "MAINLINE": if helpers.drivers.probeBinderDriver(args) != 0: logging.error("Failed to load Binder driver") - if helpers.drivers.probeAshmemDriver(args) != 0: - logging.error("Failed to load Ashmem driver") + helpers.drivers.probeAshmemDriver(args) helpers.drivers.loadBinderNodes(args) set_permissions([ "/dev/" + args.BINDER_DRIVER, @@ -115,22 +82,22 @@ def start(args): # Load session configs session_cfg = tools.config.load_session() - - # Generate props - make_prop(args.work + "/waydroid.prop") # Networking command = [tools.config.tools_src + "/data/scripts/waydroid-net.sh", "start"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) # Sensors - tools.helpers.run.root( - args, ["waydroid-sensord", "/dev/" + args.HWBINDER_DRIVER], output="background") + if which("waydroid-sensord"): + tools.helpers.run.user( + args, ["waydroid-sensord", "/dev/" + args.HWBINDER_DRIVER], output="background") # Mount rootfs helpers.images.mount_rootfs(args, cfg["waydroid"]["images_path"]) + helpers.protocol.set_aidl_version(args) + # Mount data helpers.mount.bind(args, session_cfg["session"]["waydroid_data"], tools.config.defaults["data"]) @@ -138,23 +105,33 @@ def start(args): # Cgroup hacks if which("start"): command = ["start", "cgroup-lite"] - tools.helpers.run.root(args, command, check=False) - helpers.mount.umount_all(args, "/sys/fs/cgroup/schedtune") + tools.helpers.run.user(args, command, check=False) + if os.path.ismount("/sys/fs/cgroup/schedtune"): + command = ["umount", "-l", "/sys/fs/cgroup/schedtune"] + tools.helpers.run.user(args, command, check=False) #TODO: remove NFC hacks if which("stop"): command = ["stop", "nfcd"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) # Set permissions set_permissions() helpers.lxc.start(args) session_cfg["session"]["state"] = helpers.lxc.status(args) + timeout = 10 + while session_cfg["session"]["state"] != "RUNNING" and timeout > 0: + session_cfg["session"]["state"] = helpers.lxc.status(args) + logging.info( + "waiting {} seconds for container to start...".format(timeout)) + timeout = timeout - 1 + time.sleep(1) + if session_cfg["session"]["state"] != "RUNNING": + raise OSError("container failed to start") tools.config.save_session(session_cfg) - if not hasattr(args, 'hardwareLoop'): - services.hardware_manager.start(args) + services.hardware_manager.start(args) signal.signal(signal.SIGINT, signal_handler) while os.path.exists(tools.config.session_defaults["config_path"]): @@ -170,6 +147,7 @@ def start(args): logging.warning("session manager stopped, stopping container and waiting...") stop(args) + services.hardware_manager.stop(args) start(args) else: logging.error("WayDroid container is {}".format(status)) @@ -186,21 +164,35 @@ def stop(args): # Networking command = [tools.config.tools_src + "/data/scripts/waydroid-net.sh", "stop"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) #TODO: remove NFC hacks if which("start"): command = ["start", "nfcd"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) # Sensors if which("waydroid-sensord"): command = ["pidof", "waydroid-sensord"] - pid = tools.helpers.run.root(args, command, check=False, output_return=True) + pid = tools.helpers.run.user(args, command, check=False, output_return=True).strip() if pid: command = ["kill", "-9", pid] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) + + # Umount rootfs + helpers.images.umount_rootfs(args) + # Umount data + helpers.mount.umount_all(args, tools.config.defaults["data"]) + + else: + logging.error("WayDroid container is {}".format(status)) + +def restart(args): + status = helpers.lxc.status(args) + if status == "RUNNING": + helpers.lxc.stop(args) + helpers.lxc.start(args) else: logging.error("WayDroid container is {}".format(status))