diff options
Diffstat (limited to 'backend/updater.py')
| -rw-r--r-- | backend/updater.py | 107 |
1 files changed, 81 insertions, 26 deletions
diff --git a/backend/updater.py b/backend/updater.py index 14fd2070..c85df338 100644 --- a/backend/updater.py +++ b/backend/updater.py @@ -16,6 +16,7 @@ from settings import SettingsManager logger = getLogger("Updater") + class Updater: def __init__(self, context) -> None: self.context = context @@ -26,7 +27,7 @@ class Updater: "get_version": self.get_version, "do_update": self.do_update, "do_restart": self.do_restart, - "check_for_updates": self.check_for_updates + "check_for_updates": self.check_for_updates, } self.remoteVer = None self.allRemoteVers = None @@ -39,12 +40,14 @@ class Updater: self.currentBranch = self.get_branch(self.context.settings) except: self.currentBranch = 0 - logger.error("Current branch could not be determined, defaulting to \"Stable\"") + logger.error( + 'Current branch could not be determined, defaulting to "Stable"' + ) if context: - context.web_app.add_routes([ - web.post("/updater/{method_name}", self._handle_server_method_call) - ]) + context.web_app.add_routes( + [web.post("/updater/{method_name}", self._handle_server_method_call)] + ) context.loop.create_task(self.version_reloader()) async def _handle_server_method_call(self, request): @@ -89,7 +92,10 @@ class Updater: case 1 | 2: url = "https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/main/dist/plugin_loader-prerelease.service" case _: - logger.error("You have an invalid branch set... Defaulting to prerelease service, please send the logs to the devs!") + logger.error( + "You have an invalid branch set... Defaulting to prerelease" + " service, please send the logs to the devs!" + ) url = "https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/main/dist/plugin_loader-prerelease.service" return str(url) @@ -99,31 +105,58 @@ class Updater: "current": self.localVer, "remote": self.remoteVer, "all": self.allRemoteVers, - "updatable": self.localVer != None + "updatable": self.localVer != None, } else: - return {"current": "unknown", "remote": self.remoteVer, "all": self.allRemoteVers, "updatable": False} + return { + "current": "unknown", + "remote": self.remoteVer, + "all": self.allRemoteVers, + "updatable": False, + } async def check_for_updates(self): logger.debug("checking for updates") selectedBranch = self.get_branch(self.context.settings) async with ClientSession() as web: - async with web.request("GET", "https://api.github.com/repos/SteamDeckHomebrew/decky-loader/releases", ssl=helpers.get_ssl_context()) as res: + async with web.request( + "GET", + "https://api.github.com/repos/SteamDeckHomebrew/decky-loader/releases", + ssl=helpers.get_ssl_context(), + ) as res: remoteVersions = await res.json() self.allRemoteVers = remoteVersions logger.debug("determining release type to find, branch is %i" % selectedBranch) if selectedBranch == 0: logger.debug("release type: release") - self.remoteVer = next(filter(lambda ver: ver["tag_name"].startswith("v") and not ver["prerelease"] and ver["tag_name"], remoteVersions), None) + self.remoteVer = next( + filter( + lambda ver: ver["tag_name"].startswith("v") + and not ver["prerelease"] + and ver["tag_name"], + remoteVersions, + ), + None, + ) elif selectedBranch == 1: logger.debug("release type: pre-release") - self.remoteVer = next(filter(lambda ver: ver["prerelease"] and ver["tag_name"].startswith("v") and ver["tag_name"].find("-pre"), remoteVersions), None) + self.remoteVer = next( + filter( + lambda ver: ver["prerelease"] + and ver["tag_name"].startswith("v") + and ver["tag_name"].find("-pre"), + remoteVersions, + ), + None, + ) else: logger.error("release type: NOT FOUND") raise ValueError("no valid branch found") logger.info("Updated remote version information") tab = await get_gamepadui_tab() - await tab.evaluate_js(f"window.DeckyPluginLoader.notifyUpdates()", False, True, False) + await tab.evaluate_js( + f"window.DeckyPluginLoader.notifyUpdates()", False, True, False + ) return await self.get_version() async def version_reloader(self): @@ -133,7 +166,7 @@ class Updater: await self.check_for_updates() except: pass - await sleep(60 * 60 * 6) # 6 hours + await sleep(60 * 60 * 6) # 6 hours async def do_update(self): logger.debug("Starting update.") @@ -147,7 +180,9 @@ class Updater: async with ClientSession() as web: logger.debug("Downloading systemd service") # download the relevant systemd service depending upon branch - async with web.request("GET", service_url, ssl=helpers.get_ssl_context(), allow_redirects=True) as res: + async with web.request( + "GET", service_url, ssl=helpers.get_ssl_context(), allow_redirects=True + ) as res: logger.debug("Downloading service file") data = await res.content.read() logger.debug(str(data)) @@ -157,22 +192,33 @@ class Updater: out.write(data) except Exception as e: logger.error(f"Error at %s", exc_info=e) - with open(path.join(getcwd(), "plugin_loader.service"), "r", encoding="utf-8") as service_file: + with open( + path.join(getcwd(), "plugin_loader.service"), "r", encoding="utf-8" + ) as service_file: service_data = service_file.read() - service_data = service_data.replace("${HOMEBREW_FOLDER}", helpers.get_homebrew_path()) - with open(path.join(getcwd(), "plugin_loader.service"), "w", encoding="utf-8") as service_file: - service_file.write(service_data) - + service_data = service_data.replace( + "${HOMEBREW_FOLDER}", helpers.get_homebrew_path() + ) + with open( + path.join(getcwd(), "plugin_loader.service"), "w", encoding="utf-8" + ) as service_file: + service_file.write(service_data) + logger.debug("Saved service file") logger.debug("Copying service file over current file.") shutil.copy(service_file_path, "/etc/systemd/system/plugin_loader.service") if not os.path.exists(path.join(getcwd(), ".systemd")): os.mkdir(path.join(getcwd(), ".systemd")) - shutil.move(service_file_path, path.join(getcwd(), ".systemd")+"/plugin_loader.service") - + shutil.move( + service_file_path, + path.join(getcwd(), ".systemd") + "/plugin_loader.service", + ) + logger.debug("Downloading binary") - async with web.request("GET", download_url, ssl=helpers.get_ssl_context(), allow_redirects=True) as res: - total = int(res.headers.get('content-length', 0)) + async with web.request( + "GET", download_url, ssl=helpers.get_ssl_context(), allow_redirects=True + ) as res: + total = int(res.headers.get("content-length", 0)) # we need to not delete the binary until we have downloaded the new binary! try: remove(path.join(getcwd(), "PluginLoader")) @@ -186,13 +232,22 @@ class Updater: raw += len(c) new_progress = round((raw / total) * 100) if progress != new_progress: - self.context.loop.create_task(tab.evaluate_js(f"window.DeckyUpdater.updateProgress({new_progress})", False, False, False)) + self.context.loop.create_task( + tab.evaluate_js( + f"window.DeckyUpdater.updateProgress({new_progress})", + False, + False, + False, + ) + ) progress = new_progress - with open(path.join(getcwd(), ".loader.version"), "w", encoding="utf-8") as out: + with open( + path.join(getcwd(), ".loader.version"), "w", encoding="utf-8" + ) as out: out.write(version) - call(['chmod', '+x', path.join(getcwd(), "PluginLoader")]) + call(["chmod", "+x", path.join(getcwd(), "PluginLoader")]) logger.info("Updated loader installation.") await tab.evaluate_js("window.DeckyUpdater.finish()", False, False) await self.do_restart() |
