mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-17 00:37:49 +00:00
Systemd service updating (#240)
* Add services and updated installer files * Loader updates service file during update! * Testing update branch doesn't exist lol * Update to dfl 3.7.12 * Fix services and add working service updater * Revert services but replace their aliases * Fix install scripts as well * Move leftover service files to .systemd dir * No wonder it's not trimming the file... * fix whitespace * Remove unused imports * Remove another un-used import Co-authored-by: AAGaming <aa@mail.catvibers.me>
This commit is contained in:
+47
-1
@@ -1,3 +1,5 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
import uuid
|
import uuid
|
||||||
from asyncio import sleep
|
from asyncio import sleep
|
||||||
from ensurepip import version
|
from ensurepip import version
|
||||||
@@ -79,6 +81,20 @@ class Updater:
|
|||||||
async def _get_branch(self, manager: SettingsManager):
|
async def _get_branch(self, manager: SettingsManager):
|
||||||
return self.get_branch(manager)
|
return self.get_branch(manager)
|
||||||
|
|
||||||
|
# retrieve relevant service file's url for each branch
|
||||||
|
def get_service_url(self):
|
||||||
|
logger.debug("Getting service URL")
|
||||||
|
branch = self.get_branch(self.context.settings)
|
||||||
|
match branch:
|
||||||
|
case 0:
|
||||||
|
url = "https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/service-updater/dist/plugin_loader-release.service"
|
||||||
|
case 1 | 2:
|
||||||
|
url = "https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/service-updater/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!")
|
||||||
|
url = "https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/service-updater/dist/plugin_loader-prerelease.service"
|
||||||
|
return str(url)
|
||||||
|
|
||||||
async def get_version(self):
|
async def get_version(self):
|
||||||
if self.localVer:
|
if self.localVer:
|
||||||
return {
|
return {
|
||||||
@@ -122,14 +138,44 @@ class Updater:
|
|||||||
await sleep(60 * 60 * 6) # 6 hours
|
await sleep(60 * 60 * 6) # 6 hours
|
||||||
|
|
||||||
async def do_update(self):
|
async def do_update(self):
|
||||||
|
logger.debug("Starting update.")
|
||||||
version = self.remoteVer["tag_name"]
|
version = self.remoteVer["tag_name"]
|
||||||
download_url = self.remoteVer["assets"][0]["browser_download_url"]
|
download_url = self.remoteVer["assets"][0]["browser_download_url"]
|
||||||
|
service_url = self.get_service_url()
|
||||||
|
logger.debug("Retrieved service URL")
|
||||||
|
|
||||||
tab = await get_gamepadui_tab()
|
tab = await get_gamepadui_tab()
|
||||||
await tab.open_websocket()
|
await tab.open_websocket()
|
||||||
async with ClientSession() as web:
|
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:
|
||||||
|
logger.debug("Downloading service file")
|
||||||
|
data = await res.content.read()
|
||||||
|
logger.debug(str(data))
|
||||||
|
service_file_path = path.join(getcwd(), "plugin_loader.service")
|
||||||
|
try:
|
||||||
|
with open(path.join(getcwd(), "plugin_loader.service"), "wb") as out:
|
||||||
|
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') as service_file:
|
||||||
|
service_data = service_file.read()
|
||||||
|
service_data = service_data.replace("${HOMEBREW_FOLDER}", "/home/"+helpers.get_user()+"/homebrew")
|
||||||
|
with open(path.join(getcwd(), "plugin_loader.service"), 'w') 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")
|
||||||
|
|
||||||
|
logger.debug("Downloading binary")
|
||||||
async with web.request("GET", download_url, ssl=helpers.get_ssl_context(), allow_redirects=True) as res:
|
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))
|
total = int(res.headers.get('content-length', 0))
|
||||||
|
# we need to not delete the binary until we have downloaded the new binary!
|
||||||
try:
|
try:
|
||||||
remove(path.join(getcwd(), "PluginLoader"))
|
remove(path.join(getcwd(), "PluginLoader"))
|
||||||
except:
|
except:
|
||||||
@@ -149,9 +195,9 @@ class Updater:
|
|||||||
out.write(version)
|
out.write(version)
|
||||||
|
|
||||||
call(['chmod', '+x', path.join(getcwd(), "PluginLoader")])
|
call(['chmod', '+x', path.join(getcwd(), "PluginLoader")])
|
||||||
|
|
||||||
logger.info("Updated loader installation.")
|
logger.info("Updated loader installation.")
|
||||||
await tab.evaluate_js("window.DeckyUpdater.finish()", False, False)
|
await tab.evaluate_js("window.DeckyUpdater.finish()", False, False)
|
||||||
|
await self.do_restart()
|
||||||
await tab.client.close()
|
await tab.client.close()
|
||||||
|
|
||||||
async def do_restart(self):
|
async def do_restart(self):
|
||||||
|
|||||||
Vendored
+22
-4
@@ -7,8 +7,8 @@ echo "Installing Steam Deck Plugin Loader pre-release..."
|
|||||||
USER_DIR="$(getent passwd $SUDO_USER | cut -d: -f6)"
|
USER_DIR="$(getent passwd $SUDO_USER | cut -d: -f6)"
|
||||||
HOMEBREW_FOLDER="${USER_DIR}/homebrew"
|
HOMEBREW_FOLDER="${USER_DIR}/homebrew"
|
||||||
|
|
||||||
# # Create folder structure
|
# Create folder structure
|
||||||
rm -rf ${HOMEBREW_FOLDER}/services
|
rm -rf "${HOMEBREW_FOLDER}/services"
|
||||||
sudo -u $SUDO_USER mkdir -p "${HOMEBREW_FOLDER}/services"
|
sudo -u $SUDO_USER mkdir -p "${HOMEBREW_FOLDER}/services"
|
||||||
sudo -u $SUDO_USER mkdir -p "${HOMEBREW_FOLDER}/plugins"
|
sudo -u $SUDO_USER mkdir -p "${HOMEBREW_FOLDER}/plugins"
|
||||||
|
|
||||||
@@ -26,8 +26,10 @@ systemctl --user disable plugin_loader 2> /dev/null
|
|||||||
|
|
||||||
systemctl stop plugin_loader 2> /dev/null
|
systemctl stop plugin_loader 2> /dev/null
|
||||||
systemctl disable plugin_loader 2> /dev/null
|
systemctl disable plugin_loader 2> /dev/null
|
||||||
rm -f "/etc/systemd/system/plugin_loader.service"
|
|
||||||
cat > "/etc/systemd/system/plugin_loader.service" <<- EOM
|
curl -L https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/service-updater/dist/plugin_loader-prerelease.service --output ${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service
|
||||||
|
|
||||||
|
cat > "${HOMEBREW_FOLDER}/services/plugin_loader-backup.service" <<- EOM
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=SteamDeck Plugin Loader
|
Description=SteamDeck Plugin Loader
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
@@ -43,6 +45,22 @@ Environment=LOG_LEVEL=DEBUG
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOM
|
EOM
|
||||||
|
|
||||||
|
if [[ -f "${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service" ]]; then
|
||||||
|
printf "Grabbed latest prerelease service.\n"
|
||||||
|
sed -i -e "s|\${HOMEBREW_FOLDER}|${HOMEBREW_FOLDER}|" "${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service"
|
||||||
|
cp -f "${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service" "/etc/systemd/system/plugin_loader.service"
|
||||||
|
else
|
||||||
|
printf "Could not curl latest prerelease systemd service, using built-in service as a backup!\n"
|
||||||
|
rm -f "/etc/systemd/system/plugin_loader.service"
|
||||||
|
cp "${HOMEBREW_FOLDER}/services/plugin_loader-backup.service" "/etc/systemd/system/plugin_loader.service"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p ${HOMEBREW_FOLDER}/services/.systemd
|
||||||
|
cp ${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service ${HOMEBREW_FOLDER}/services/.systemd/plugin_loader-prerelease.service
|
||||||
|
cp ${HOMEBREW_FOLDER}/services/plugin_loader-backup.service ${HOMEBREW_FOLDER}/services/.systemd/plugin_loader-backup.service
|
||||||
|
rm ${HOMEBREW_FOLDER}/services/plugin_loader-backup.service ${HOMEBREW_FOLDER}/services/plugin_loader-prerelease.service
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl start plugin_loader
|
systemctl start plugin_loader
|
||||||
systemctl enable plugin_loader
|
systemctl enable plugin_loader
|
||||||
|
|||||||
Vendored
+21
-2
@@ -26,8 +26,10 @@ systemctl --user disable plugin_loader 2> /dev/null
|
|||||||
|
|
||||||
systemctl stop plugin_loader 2> /dev/null
|
systemctl stop plugin_loader 2> /dev/null
|
||||||
systemctl disable plugin_loader 2> /dev/null
|
systemctl disable plugin_loader 2> /dev/null
|
||||||
rm -f "/etc/systemd/system/plugin_loader.service"
|
|
||||||
cat > "/etc/systemd/system/plugin_loader.service" <<- EOM
|
curl -L https://raw.githubusercontent.com/SteamDeckHomebrew/decky-loader/service-updater/dist/plugin_loader-release.service --output ${HOMEBREW_FOLDER}/services/plugin_loader-release.service
|
||||||
|
|
||||||
|
cat > "${HOMEBREW_FOLDER}/services/plugin_loader-backup.service" <<- EOM
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=SteamDeck Plugin Loader
|
Description=SteamDeck Plugin Loader
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
@@ -39,9 +41,26 @@ Restart=always
|
|||||||
ExecStart=${HOMEBREW_FOLDER}/services/PluginLoader
|
ExecStart=${HOMEBREW_FOLDER}/services/PluginLoader
|
||||||
WorkingDirectory=${HOMEBREW_FOLDER}/services
|
WorkingDirectory=${HOMEBREW_FOLDER}/services
|
||||||
Environment=PLUGIN_PATH=${HOMEBREW_FOLDER}/plugins
|
Environment=PLUGIN_PATH=${HOMEBREW_FOLDER}/plugins
|
||||||
|
Environment=LOG_LEVEL=INFO
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOM
|
EOM
|
||||||
|
|
||||||
|
if [[ -f "${HOMEBREW_FOLDER}/services/plugin_loader-release.service" ]]; then
|
||||||
|
printf "Grabbed latest release service.\n"
|
||||||
|
sed -i -e "s|\${HOMEBREW_FOLDER}|${HOMEBREW_FOLDER}|" "${HOMEBREW_FOLDER}/services/plugin_loader-release.service"
|
||||||
|
cp -f "${HOMEBREW_FOLDER}/services/plugin_loader-release.service" "/etc/systemd/system/plugin_loader.service"
|
||||||
|
else
|
||||||
|
printf "Could not curl latest release systemd service, using built-in service as a backup!\n"
|
||||||
|
rm -f "/etc/systemd/system/plugin_loader.service"
|
||||||
|
cp "${HOMEBREW_FOLDER}/services/plugin_loader-backup.service" "/etc/systemd/system/plugin_loader.service"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p ${HOMEBREW_FOLDER}/services/.systemd
|
||||||
|
cp ${HOMEBREW_FOLDER}/services/plugin_loader-release.service ${HOMEBREW_FOLDER}/services/.systemd/plugin_loader-release.service
|
||||||
|
cp ${HOMEBREW_FOLDER}/services/plugin_loader-backup.service ${HOMEBREW_FOLDER}/services/.systemd/plugin_loader-backup.service
|
||||||
|
rm ${HOMEBREW_FOLDER}/services/plugin_loader-backup.service ${HOMEBREW_FOLDER}/services/plugin_loader-release.service
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl start plugin_loader
|
systemctl start plugin_loader
|
||||||
systemctl enable plugin_loader
|
systemctl enable plugin_loader
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SteamDeck Plugin Loader
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
Restart=always
|
||||||
|
ExecStart=${HOMEBREW_FOLDER}/services/PluginLoader
|
||||||
|
WorkingDirectory=${HOMEBREW_FOLDER}/services
|
||||||
|
Environment=PLUGIN_PATH=${HOMEBREW_FOLDER}/plugins
|
||||||
|
Environment=LOG_LEVEL=DEBUG
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SteamDeck Plugin Loader
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
Restart=always
|
||||||
|
ExecStart=${HOMEBREW_FOLDER}/services/PluginLoader
|
||||||
|
WorkingDirectory=${HOMEBREW_FOLDER}/services
|
||||||
|
Environment=PLUGIN_PATH=${HOMEBREW_FOLDER}/plugins
|
||||||
|
Environment=LOG_LEVEL=INFO
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"decky-frontend-lib": "^3.7.11",
|
"decky-frontend-lib": "^3.7.12",
|
||||||
"react-file-icon": "^1.2.0",
|
"react-file-icon": "^1.2.0",
|
||||||
"react-icons": "^4.4.0",
|
"react-icons": "^4.4.0",
|
||||||
"react-markdown": "^8.0.3",
|
"react-markdown": "^8.0.3",
|
||||||
|
|||||||
Generated
+4
-4
@@ -10,7 +10,7 @@ specifiers:
|
|||||||
'@types/react-file-icon': ^1.0.1
|
'@types/react-file-icon': ^1.0.1
|
||||||
'@types/react-router': 5.1.18
|
'@types/react-router': 5.1.18
|
||||||
'@types/webpack': ^5.28.0
|
'@types/webpack': ^5.28.0
|
||||||
decky-frontend-lib: ^3.7.11
|
decky-frontend-lib: ^3.7.12
|
||||||
husky: ^8.0.1
|
husky: ^8.0.1
|
||||||
import-sort-style-module: ^6.0.0
|
import-sort-style-module: ^6.0.0
|
||||||
inquirer: ^8.2.4
|
inquirer: ^8.2.4
|
||||||
@@ -30,7 +30,7 @@ specifiers:
|
|||||||
typescript: ^4.7.4
|
typescript: ^4.7.4
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decky-frontend-lib: 3.7.11
|
decky-frontend-lib: 3.7.12
|
||||||
react-file-icon: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty
|
react-file-icon: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty
|
||||||
react-icons: 4.4.0_react@16.14.0
|
react-icons: 4.4.0_react@16.14.0
|
||||||
react-markdown: 8.0.3_vshvapmxg47tngu7tvrsqpq55u
|
react-markdown: 8.0.3_vshvapmxg47tngu7tvrsqpq55u
|
||||||
@@ -944,8 +944,8 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.2
|
ms: 2.1.2
|
||||||
|
|
||||||
/decky-frontend-lib/3.7.11:
|
/decky-frontend-lib/3.7.12:
|
||||||
resolution: {integrity: sha512-c5/kXqCLYhCl0zC+kPJ2gTUjTp6N0zUFKzTQKVKTuQ3U+01fHAU6sUsDqudbdTNdjXiofGujMmeJqKaU2vQoXQ==}
|
resolution: {integrity: sha512-whDV9zHuEBFj17zKoT51aRcUxLvSzBNu2lc242/EO9aFFP064FVCrJu+r7CxWe0hlQ7sA4FKX1qgCwsZ6H+PZg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/decode-named-character-reference/1.0.2:
|
/decode-named-character-reference/1.0.2:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const logger = new Logger('BranchSelect');
|
|||||||
enum UpdateBranch {
|
enum UpdateBranch {
|
||||||
Stable,
|
Stable,
|
||||||
Prerelease,
|
Prerelease,
|
||||||
Testing,
|
// Testing,
|
||||||
}
|
}
|
||||||
|
|
||||||
const BranchSelect: FunctionComponent<{}> = () => {
|
const BranchSelect: FunctionComponent<{}> = () => {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Plugin } from './plugin';
|
import { Plugin } from './plugin';
|
||||||
import { getSetting, setSetting } from './utils/settings';
|
|
||||||
|
|
||||||
export enum Store {
|
export enum Store {
|
||||||
Default,
|
Default,
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
// TabsHook for versions after the Desktop merge
|
// TabsHook for versions after the Desktop merge
|
||||||
import { Patch, QuickAccessTab, afterPatch, findInReactTree, findModule, sleep } from 'decky-frontend-lib';
|
import { Patch, QuickAccessTab, afterPatch, findInReactTree, sleep } from 'decky-frontend-lib';
|
||||||
import { memo } from 'react';
|
|
||||||
|
|
||||||
import { QuickAccessVisibleStateProvider } from './components/QuickAccessVisibleState';
|
import { QuickAccessVisibleStateProvider } from './components/QuickAccessVisibleState';
|
||||||
import Logger from './logger';
|
import Logger from './logger';
|
||||||
import { findSP } from './utils/windows';
|
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
export enum Branches {
|
export enum Branches {
|
||||||
Release,
|
Release,
|
||||||
Prerelease,
|
Prerelease,
|
||||||
Testing,
|
// Testing,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DeckyUpdater {
|
export interface DeckyUpdater {
|
||||||
|
|||||||
Reference in New Issue
Block a user