diff options
| author | suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> | 2023-03-22 01:37:23 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-21 17:37:23 -0700 |
| commit | fd325ef1cc1d3e78b5e7686819e05606cc79d963 (patch) | |
| tree | 1372e0efa0ca47b0045b4d29c40bb3a8caeadfc1 /backend/main.py | |
| parent | faf46ba53354b6dcfbfae25e605bf567acd19376 (diff) | |
| download | decky-loader-fd325ef1cc1d3e78b5e7686819e05606cc79d963.tar.gz decky-loader-fd325ef1cc1d3e78b5e7686819e05606cc79d963.zip | |
Add cross-platform support to decky (#387)
* Import generic watchdog observer over platform specific import
* Use os.path rather than genericpath
* Split off socket management in plugin.py
* Don't specify multiprocessing start type
Default on linux is already fork
* Move all platform-specific functions to seperate files
TODO: make plugin.py platform agnostic
* fix import
* add backwards compat to helpers.py
* add backwards compatibility to helpers.py harder
* Testing autobuild for win
* Testing autobuild for win, try 2
* Testing autobuild for win, try 3
* Testing autobuild for win, try 4
* Create the plugins folder before attempting to use it
* Implement win get_username()
* Create win install script
* Fix branch guess from version
* Create .loader.version in install script
* Add .cmd shim to facilitate auto-restarts
* Properly fix branch guess from version
* Fix updater on windows
* Try 2 of fixing updates for windows
* Test
* pain
* Update install script
* Powershell doesn't believe in utf8
* Powershell good
* add ON_LINUX variable to localplatform
* Fix more merge issues
* test
* Move custom imports to main.py
* Move custom imports to after __main__ check
Due to windows' default behaviour being spawn, it will spawn a new process and thus import into sys.path multiple times
* Log errors in get_system_pythonpaths() and get_loader_version() +
split get_system_pythonpaths() on newline
* Remove whitespace in result of get_system_pythonpaths()
* use python3 on linux and python on windows in get_system_pythonpaths()
* Remove fork-specific urls
* Fix MIME types not working on Windows
Diffstat (limited to 'backend/main.py')
| -rw-r--r-- | backend/main.py | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/backend/main.py b/backend/main.py index a2ac008a..de06e633 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,14 +1,15 @@ # Change PyInstaller files permissions import sys -from subprocess import call +from localplatform import chmod, chown, service_stop, service_start, ON_WINDOWS if hasattr(sys, '_MEIPASS'): - call(['chmod', '-R', '755', sys._MEIPASS]) + chmod(sys._MEIPASS, 755) # Full imports from asyncio import new_event_loop, set_event_loop, sleep from json import dumps, loads from logging import DEBUG, INFO, basicConfig, getLogger -from os import getenv, chmod, path +from os import getenv, path from traceback import format_exc +import multiprocessing import aiohttp_cors # Partial imports @@ -19,16 +20,15 @@ from aiohttp_jinja2 import setup as jinja_setup # local modules from browser import PluginBrowser from helpers import (REMOTE_DEBUGGER_UNIT, csrf_middleware, get_csrf_token, - get_home_path, get_homebrew_path, get_user, get_user_group, - stop_systemd_unit, start_systemd_unit) + get_homebrew_path, mkdir_as_user, get_system_pythonpaths) + from injector import get_gamepadui_tab, Tab, get_tabs, close_old_tabs from loader import Loader from settings import SettingsManager from updater import Updater from utilities import Utilities +from customtypes import UserType -USER = get_user() -GROUP = get_user_group() HOMEBREW_PATH = get_homebrew_path() CONFIG = { "plugin_path": getenv("PLUGIN_PATH", path.join(HOMEBREW_PATH, "plugins")), @@ -49,10 +49,11 @@ basicConfig( logger = getLogger("Main") def chown_plugin_dir(): - code_chown = call(["chown", "-R", USER+":"+GROUP, CONFIG["plugin_path"]]) - code_chmod = call(["chmod", "-R", "555", CONFIG["plugin_path"]]) - if code_chown != 0 or code_chmod != 0: - logger.error(f"chown/chmod exited with a non-zero exit code (chown: {code_chown}, chmod: {code_chmod})") + if not path.exists(CONFIG["plugin_path"]): # For safety, create the folder before attempting to do anything with it + mkdir_as_user(CONFIG["plugin_path"]) + + if not chown(CONFIG["plugin_path"], UserType.HOST_USER) or not chmod(CONFIG["plugin_path"], 555): + logger.error(f"chown/chmod exited with a non-zero exit code") if CONFIG["chown_plugin_path"] == True: chown_plugin_dir() @@ -79,9 +80,9 @@ class PluginManager: async def startup(_): if self.settings.getSetting("cef_forward", False): - self.loop.create_task(start_systemd_unit(REMOTE_DEBUGGER_UNIT)) + self.loop.create_task(service_start(REMOTE_DEBUGGER_UNIT)) else: - self.loop.create_task(stop_systemd_unit(REMOTE_DEBUGGER_UNIT)) + self.loop.create_task(service_stop(REMOTE_DEBUGGER_UNIT)) self.loop.create_task(self.loader_reinjector()) self.loop.create_task(self.load_plugins()) @@ -173,6 +174,20 @@ class PluginManager: return run_app(self.web_app, host=CONFIG["server_host"], port=CONFIG["server_port"], loop=self.loop, access_log=None) if __name__ == "__main__": + if ON_WINDOWS: + # Fix windows/flask not recognising that .js means 'application/javascript' + import mimetypes + mimetypes.add_type('application/javascript', '.js') + + # Required for multiprocessing support in frozen files + multiprocessing.freeze_support() + + # Append the loader's plugin path to the recognized python paths + sys.path.append(path.join(path.dirname(__file__), "plugin")) + + # Append the system and user python paths + sys.path.extend(get_system_pythonpaths()) + loop = new_event_loop() set_event_loop(loop) PluginManager(loop).run() |
