summaryrefslogtreecommitdiff
path: root/backend/updater.py
diff options
context:
space:
mode:
Diffstat (limited to 'backend/updater.py')
-rw-r--r--backend/updater.py107
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()