summaryrefslogtreecommitdiff
path: root/backend/plugin.py
diff options
context:
space:
mode:
authorAAGaming <aa@mail.catvibers.me>2022-09-18 14:51:17 -0400
committerAAGaming <aa@mail.catvibers.me>2022-09-18 14:51:17 -0400
commitc774451ff47a453486796585c7f3decfd8b1ee65 (patch)
treea1c9a87f110deb8ca35bf5e816a8ca0d7629d181 /backend/plugin.py
parent62a5bdbbb07746f129e52a3fd8c840f60893859b (diff)
downloaddecky-loader-c774451ff47a453486796585c7f3decfd8b1ee65.tar.gz
decky-loader-c774451ff47a453486796585c7f3decfd8b1ee65.zip
don't crash when plugin backends do
Diffstat (limited to 'backend/plugin.py')
-rw-r--r--backend/plugin.py38
1 files changed, 23 insertions, 15 deletions
diff --git a/backend/plugin.py b/backend/plugin.py
index b16d40d8..9d9a22c6 100644
--- a/backend/plugin.py
+++ b/backend/plugin.py
@@ -5,6 +5,8 @@ from asyncio import (Lock, get_event_loop, new_event_loop,
from concurrent.futures import ProcessPoolExecutor
from importlib.util import module_from_spec, spec_from_file_location
from json import dumps, load, loads
+from logging import getLogger
+from traceback import format_exc
from os import path, setgid, setuid
from signal import SIGINT, signal
from sys import exit
@@ -40,28 +42,34 @@ class PluginWrapper:
self.author = json["author"]
self.flags = json["flags"]
+ self.log = getLogger("plugin")
+
self.passive = not path.isfile(self.file)
def __str__(self) -> str:
return self.name
def _init(self):
- signal(SIGINT, lambda s, f: exit(0))
+ try:
+ signal(SIGINT, lambda s, f: exit(0))
- set_event_loop(new_event_loop())
- if self.passive:
- return
- setgid(0 if "root" in self.flags else 1000)
- setuid(0 if "root" in self.flags else 1000)
- spec = spec_from_file_location("_", self.file)
- module = module_from_spec(spec)
- spec.loader.exec_module(module)
- self.Plugin = module.Plugin
-
- if hasattr(self.Plugin, "_main"):
- get_event_loop().create_task(self.Plugin._main(self.Plugin))
- get_event_loop().create_task(self._setup_socket())
- get_event_loop().run_forever()
+ set_event_loop(new_event_loop())
+ if self.passive:
+ return
+ setgid(0 if "root" in self.flags else 1000)
+ setuid(0 if "root" in self.flags else 1000)
+ spec = spec_from_file_location("_", self.file)
+ module = module_from_spec(spec)
+ spec.loader.exec_module(module)
+ self.Plugin = module.Plugin
+
+ if hasattr(self.Plugin, "_main"):
+ get_event_loop().create_task(self.Plugin._main(self.Plugin))
+ get_event_loop().create_task(self._setup_socket())
+ get_event_loop().run_forever()
+ except:
+ self.log.error("Failed to start " + self.name + "!\n" + format_exc())
+ exit(0)
async def _setup_socket(self):
self.socket = await start_unix_server(self._listen_for_method_call, path=self.socket_addr, limit=BUFFER_LIMIT)