+import dbus
+import dbus.service
+import dbus.exceptions
+from gi.repository import GLib
+
+class DbusContainerManager(dbus.service.Object):
+ def __init__(self, looper, bus, object_path, args):
+ self.args = args
+ self.looper = looper
+ dbus.service.Object.__init__(self, bus, object_path)
+
+ @dbus.service.method("id.waydro.ContainerManager", in_signature='a{ss}', out_signature='', sender_keyword="sender", connection_keyword="conn")
+ def Start(self, session, sender, conn):
+ dbus_info = dbus.Interface(conn.get_object("org.freedesktop.DBus", "/org/freedesktop/DBus/Bus", False), "org.freedesktop.DBus")
+ uid = dbus_info.GetConnectionUnixUser(sender)
+ if str(uid) not in ["0", session["user_id"]]:
+ raise RuntimeError("Cannot start a session on behalf of another user")
+ pid = dbus_info.GetConnectionUnixProcessID(sender)
+ if str(uid) != "0" and str(pid) != session["pid"]:
+ raise RuntimeError("Invalid session pid")
+ do_start(self.args, session)
+
+ @dbus.service.method("id.waydro.ContainerManager", in_signature='b', out_signature='')
+ def Stop(self, quit_session):
+ stop(self.args, quit_session)
+
+ @dbus.service.method("id.waydro.ContainerManager", in_signature='', out_signature='')
+ def Freeze(self):
+ freeze(self.args)
+
+ @dbus.service.method("id.waydro.ContainerManager", in_signature='', out_signature='')
+ def Unfreeze(self):
+ unfreeze(self.args)
+
+ @dbus.service.method("id.waydro.ContainerManager", in_signature='', out_signature='a{ss}')
+ def GetSession(self):
+ try:
+ session = self.args.session
+ session["state"] = helpers.lxc.status(self.args)
+ return session
+ except AttributeError:
+ return {}
+
+def service(args, looper):
+ dbus_obj = DbusContainerManager(looper, dbus.SystemBus(), '/ContainerManager', args)
+ looper.run()
+
+def set_permissions(args, perm_list=None, mode="777"):
+ def chmod(path, mode):
+ if os.path.exists(path):
+ command = ["chmod", mode, "-R", path]
+ tools.helpers.run.user(args, command, check=False)
+
+ # Nodes list
+ if not perm_list:
+ perm_list = [
+ "/dev/ashmem",
+
+ # sw_sync for HWC
+ "/dev/sw_sync",
+ "/sys/kernel/debug/sync/sw_sync",
+
+ # Media
+ "/dev/Vcodec",
+ "/dev/MTK_SMI",
+ "/dev/mdp_sync",
+ "/dev/mtk_cmdq",
+
+ # Graphics
+ "/dev/dri",
+ "/dev/graphics",
+ "/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)