summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-win.yml4
-rw-r--r--.github/workflows/build.yml2
-rw-r--r--backend/browser.py2
-rw-r--r--backend/helpers.py4
-rw-r--r--backend/loader.py6
-rw-r--r--backend/localplatform.py8
-rw-r--r--backend/localplatformlinux.py2
-rw-r--r--backend/localplatformwin.py2
-rw-r--r--backend/localsocket.py2
-rw-r--r--backend/main.py20
-rw-r--r--backend/plugin.py8
-rw-r--r--backend/settings.py6
-rw-r--r--backend/updater.py22
-rw-r--r--backend/utilities.py20
-rw-r--r--main.py4
15 files changed, 63 insertions, 49 deletions
diff --git a/.github/workflows/build-win.yml b/.github/workflows/build-win.yml
index 4b54bc12..16577da3 100644
--- a/.github/workflows/build-win.yml
+++ b/.github/workflows/build-win.yml
@@ -43,10 +43,10 @@ jobs:
run: pnpm run build
- name: Build Python Backend 🛠️
- run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data "./backend/static;/static" --add-data "./backend/locales;/locales" --add-data "./backend/legacy;/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./backend/main.py
+ run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data "./backend/static;/backend/static" --add-data "./backend/locales;/backend/locales" --add-data "./backend/legacy;/backend/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./main.py
- name: Build Python Backend (noconsole) 🛠️
- run: pyinstaller --noconfirm --noconsole --onefile --name "PluginLoader_noconsole" --add-data "./backend/static;/static" --add-data "./backend/locales;/locales" --add-data "./backend/legacy;/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./backend/main.py
+ run: pyinstaller --noconfirm --noconsole --onefile --name "PluginLoader_noconsole" --add-data "./backend/static;/backend/static" --add-data "./backend/locales;/backend/locales" --add-data "./backend/legacy;/backend/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./main.py
- name: Upload package artifact ⬆️
uses: actions/upload-artifact@v3
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fe58eecb..04e932cd 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -86,7 +86,7 @@ jobs:
run: pnpm run build
- name: Build Python Backend 🛠️
- run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data ./backend/static:/static --add-data ./backend/locales:/locales --add-data ./backend/legacy:/legacy --add-data ./plugin:/plugin --hidden-import=sqlite3 ./backend/*.py
+ run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data ./backend/static:/backend/static --add-data ./backend/locales:/backend/locales --add-data ./backend/legacy:/backend/legacy --add-data ./plugin:/plugin --hidden-import=sqlite3 ./main.py
- name: Upload package artifact ⬆️
if: ${{ !env.ACT }}
diff --git a/backend/browser.py b/backend/browser.py
index 358c05f9..08560749 100644
--- a/backend/browser.py
+++ b/backend/browser.py
@@ -13,11 +13,11 @@ from os import R_OK, W_OK, path, listdir, access, mkdir
from shutil import rmtree
from time import time
from zipfile import ZipFile
-from localplatform import chown, chmod
from enum import IntEnum
from typing import Dict, List, TypedDict
# Local modules
+from .localplatform import chown, chmod
from .loader import Loader, Plugins
from .helpers import get_ssl_context, download_remote_binary_to_path
from .settings import SettingsManager
diff --git a/backend/helpers.py b/backend/helpers.py
index 4036db85..f8796bd8 100644
--- a/backend/helpers.py
+++ b/backend/helpers.py
@@ -10,8 +10,8 @@ import certifi
from aiohttp.web import Request, Response, middleware
from aiohttp.typedefs import Handler
from aiohttp import ClientSession
-import localplatform
-from customtypes import UserType
+from . import localplatform
+from .customtypes import UserType
from logging import getLogger
REMOTE_DEBUGGER_UNIT = "steam-web-debug-portforward.service"
diff --git a/backend/loader.py b/backend/loader.py
index 89bb0457..dc7a5633 100644
--- a/backend/loader.py
+++ b/backend/loader.py
@@ -11,7 +11,9 @@ from os.path import exists
from watchdog.events import RegexMatchingEventHandler, DirCreatedEvent, DirModifiedEvent, FileCreatedEvent, FileModifiedEvent # type: ignore
from watchdog.observers import Observer # type: ignore
-from backend.main import PluginManager # type: ignore
+from typing import TYPE_CHECKING
+if TYPE_CHECKING:
+ from .main import PluginManager
from .injector import get_tab, get_gamepadui_tab
from .plugin import PluginWrapper
@@ -63,7 +65,7 @@ class FileChangeHandler(RegexMatchingEventHandler):
self.maybe_reload(src_path)
class Loader:
- def __init__(self, server_instance: PluginManager, plugin_path: str, loop: AbstractEventLoop, live_reload: bool =False) -> None:
+ def __init__(self, server_instance: 'PluginManager', plugin_path: str, loop: AbstractEventLoop, live_reload: bool = False) -> None:
self.loop = loop
self.logger = getLogger("Loader")
self.plugin_path = plugin_path
diff --git a/backend/localplatform.py b/backend/localplatform.py
index 43043ad0..028eff8f 100644
--- a/backend/localplatform.py
+++ b/backend/localplatform.py
@@ -4,11 +4,11 @@ ON_WINDOWS = platform.system() == "Windows"
ON_LINUX = not ON_WINDOWS
if ON_WINDOWS:
- from localplatformwin import *
- import localplatformwin as localplatform
+ from .localplatformwin import *
+ from . import localplatformwin as localplatform
else:
- from localplatformlinux import *
- import localplatformlinux as localplatform
+ from .localplatformlinux import *
+ from . import localplatformlinux as localplatform
def get_privileged_path() -> str:
'''Get path accessible by elevated user. Holds plugins, decky loader and decky loader configs'''
diff --git a/backend/localplatformlinux.py b/backend/localplatformlinux.py
index 58b9dbc2..bde2caac 100644
--- a/backend/localplatformlinux.py
+++ b/backend/localplatformlinux.py
@@ -1,6 +1,6 @@
import os, pwd, grp, sys, logging
from subprocess import call, run, DEVNULL, PIPE, STDOUT
-from customtypes import UserType
+from .customtypes import UserType
logger = logging.getLogger("localplatform")
diff --git a/backend/localplatformwin.py b/backend/localplatformwin.py
index b6bee330..4c4e9439 100644
--- a/backend/localplatformwin.py
+++ b/backend/localplatformwin.py
@@ -1,4 +1,4 @@
-from customtypes import UserType
+from .customtypes import UserType
import os, sys
def chown(path : str, user : UserType = UserType.HOST_USER, recursive : bool = True) -> bool:
diff --git a/backend/localsocket.py b/backend/localsocket.py
index 3659da03..f38fe5e7 100644
--- a/backend/localsocket.py
+++ b/backend/localsocket.py
@@ -2,7 +2,7 @@ import asyncio, time
from typing import Awaitable, Callable
import random
-from localplatform import ON_WINDOWS
+from .localplatform import ON_WINDOWS
BUFFER_LIMIT = 2 ** 20 # 1 MiB
diff --git a/backend/main.py b/backend/main.py
index 8857fb22..793d000c 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -1,7 +1,7 @@
# Change PyInstaller files permissions
import sys
from typing import Dict
-from localplatform import (chmod, chown, service_stop, service_start,
+from .localplatform import (chmod, chown, service_stop, service_start,
ON_WINDOWS, get_log_level, get_live_reload,
get_server_port, get_server_host, get_chown_plugin_path,
get_privileged_path)
@@ -21,16 +21,16 @@ from aiohttp.web import Application, Response, Request, get, run_app, static # t
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,
+from .browser import PluginBrowser
+from .helpers import (REMOTE_DEBUGGER_UNIT, csrf_middleware, get_csrf_token,
mkdir_as_user, get_system_pythonpaths, get_effective_user_id)
-from injector import get_gamepadui_tab, Tab, close_old_tabs
-from loader import Loader
-from settings import SettingsManager
-from updater import Updater
-from utilities import Utilities
-from customtypes import UserType
+from .injector import get_gamepadui_tab, Tab, close_old_tabs
+from .loader import Loader
+from .settings import SettingsManager
+from .updater import Updater
+from .utilities import Utilities
+from .customtypes import UserType
basicConfig(
@@ -169,7 +169,7 @@ class PluginManager:
def run(self):
return run_app(self.web_app, host=get_server_host(), port=get_server_port(), loop=self.loop, access_log=None)
-if __name__ == "__main__":
+def main():
if ON_WINDOWS:
# Fix windows/flask not recognising that .js means 'application/javascript'
import mimetypes
diff --git a/backend/plugin.py b/backend/plugin.py
index 5c1e099f..163bb9b6 100644
--- a/backend/plugin.py
+++ b/backend/plugin.py
@@ -9,10 +9,10 @@ from os import path, environ
from signal import SIGINT, signal
from sys import exit, path as syspath
from typing import Any, Dict
-from localsocket import LocalSocket
-from localplatform import setgid, setuid, get_username, get_home_path
-from customtypes import UserType
-import helpers
+from .localsocket import LocalSocket
+from .localplatform import setgid, setuid, get_username, get_home_path
+from .customtypes import UserType
+from . import helpers
class PluginWrapper:
def __init__(self, file: str, plugin_directory: str, plugin_path: str) -> None:
diff --git a/backend/settings.py b/backend/settings.py
index 26dfc97f..a9ab3daa 100644
--- a/backend/settings.py
+++ b/backend/settings.py
@@ -1,10 +1,10 @@
from json import dump, load
from os import mkdir, path, listdir, rename
from typing import Any, Dict
-from localplatform import chown, folder_owner, get_chown_plugin_path
-from customtypes import UserType
+from .localplatform import chown, folder_owner, get_chown_plugin_path
+from .customtypes import UserType
-from helpers import get_homebrew_path
+from .helpers import get_homebrew_path
class SettingsManager:
diff --git a/backend/updater.py b/backend/updater.py
index d7a3d712..0bd7218a 100644
--- a/backend/updater.py
+++ b/backend/updater.py
@@ -4,15 +4,16 @@ from asyncio import sleep
from json.decoder import JSONDecodeError
from logging import getLogger
from os import getcwd, path, remove
-from typing import List, TypedDict
-from backend.main import PluginManager
-from localplatform import chmod, service_restart, ON_LINUX, get_keep_systemd_service, get_selinux
+from typing import TYPE_CHECKING, List, TypedDict
+if TYPE_CHECKING:
+ from .main import PluginManager
+from .localplatform import chmod, service_restart, ON_LINUX, get_keep_systemd_service, get_selinux
from aiohttp import ClientSession, web
-import helpers
-from injector import get_gamepadui_tab
-from settings import SettingsManager
+from .import helpers
+from .injector import get_gamepadui_tab
+from .settings import SettingsManager
logger = getLogger("Updater")
@@ -25,7 +26,7 @@ class RemoteVer(TypedDict):
assets: List[RemoteVerAsset]
class Updater:
- def __init__(self, context: PluginManager) -> None:
+ def __init__(self, context: 'PluginManager') -> None:
self.context = context
self.settings = self.context.settings
# Exposes updater methods to frontend
@@ -150,7 +151,12 @@ class Updater:
async def do_update(self):
logger.debug("Starting update.")
- assert self.remoteVer
+ try:
+ assert self.remoteVer
+ except AssertionError:
+ logger.error("Unable to update as remoteVer is missing")
+ return
+
version = self.remoteVer["tag_name"]
download_url = None
download_filename = "PluginLoader" if ON_LINUX else "PluginLoader.exe"
diff --git a/backend/utilities.py b/backend/utilities.py
index d45bec9b..1e4110cf 100644
--- a/backend/utilities.py
+++ b/backend/utilities.py
@@ -8,16 +8,18 @@ from stat import FILE_ATTRIBUTE_HIDDEN # type: ignore
from asyncio import StreamReader, StreamWriter, start_server, gather, open_connection
from aiohttp import ClientSession, web
-from typing import Callable, Coroutine, Dict, Any, List, TypedDict
+from typing import TYPE_CHECKING, Callable, Coroutine, Dict, Any, List, TypedDict
from logging import getLogger
-from backend.browser import PluginInstallRequest, PluginInstallType
-from backend.main import PluginManager
-from injector import inject_to_tab, get_gamepadui_tab, close_old_tabs, get_tab
from pathlib import Path
-from localplatform import ON_WINDOWS
-import helpers
-from localplatform import service_stop, service_start, get_home_path, get_username
+
+from .browser import PluginInstallRequest, PluginInstallType
+if TYPE_CHECKING:
+ from .main import PluginManager
+from .injector import inject_to_tab, get_gamepadui_tab, close_old_tabs, get_tab
+from .localplatform import ON_WINDOWS
+from .import helpers
+from .localplatform import service_stop, service_start, get_home_path, get_username
class FilePickerObj(TypedDict):
file: Path
@@ -25,7 +27,7 @@ class FilePickerObj(TypedDict):
is_dir: bool
class Utilities:
- def __init__(self, context: PluginManager) -> None:
+ def __init__(self, context: 'PluginManager') -> None:
self.context = context
self.util_methods: Dict[str, Callable[..., Coroutine[Any, Any, Any]]] = {
"ping": self.ping,
@@ -307,7 +309,7 @@ class Utilities:
self.rdt_proxy_task = self.context.loop.create_task(self.rdt_proxy_server)
def stop_rdt_proxy(self):
- if self.rdt_proxy_server:
+ if self.rdt_proxy_server != None:
self.rdt_proxy_server.close()
if self.rdt_proxy_task:
self.rdt_proxy_task.cancel()
diff --git a/main.py b/main.py
new file mode 100644
index 00000000..c2b99089
--- /dev/null
+++ b/main.py
@@ -0,0 +1,4 @@
+# This file is needed to make the relative imports in backend/ work properly.
+if __name__ == "__main__":
+ from backend.main import main
+ main()