From 5f9bb7c5e5ce3eaf76da246c32a7c6e025dcaa1a Mon Sep 17 00:00:00 2001 From: Christian-Manuel Butzke Date: Sun, 4 Oct 2026 06:01:20 +0900 Subject: [PATCH 1/2] feat(v4.5): harden Linux package configuration --- .github/workflows/conformance.yml | 3 +++ gnome-desktop-headless/eve-plugin.yaml | 4 +--- rdp/eve-plugin.yaml | 4 +++- rdp/provision/ubuntu/rdp.sh | 11 ++++++++-- rustdesk/eve-plugin.yaml | 14 +++++++++---- sunshine/eve-plugin.yaml | 29 +++++++++++++++----------- tests/test-manifest-env-contract | 26 +++++++++++++++++++++++ thinlinc/eve-plugin.yaml | 2 +- 8 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 tests/test-manifest-env-contract diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index 02dcd49..bb2a93b 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -27,6 +27,9 @@ jobs: - run: pip install jsonschema pyyaml + - name: Validate manifest environment contracts + run: python tests/test-manifest-env-contract + - name: Run plugin-test against every package run: | set -e diff --git a/gnome-desktop-headless/eve-plugin.yaml b/gnome-desktop-headless/eve-plugin.yaml index 340b29f..86b0546 100644 --- a/gnome-desktop-headless/eve-plugin.yaml +++ b/gnome-desktop-headless/eve-plugin.yaml @@ -36,9 +36,7 @@ compatibility: setup. down: destructive: true -env: -- VIRTUAL_MONITOR_WIDTH -- VIRTUAL_MONITOR_HEIGHT +env: [] desktop: name: GNOME Headless session: Wayland diff --git a/rdp/eve-plugin.yaml b/rdp/eve-plugin.yaml index 0375604..c0130f3 100644 --- a/rdp/eve-plugin.yaml +++ b/rdp/eve-plugin.yaml @@ -13,8 +13,10 @@ config_schema: type: string env_var: RDP_GATE_USER description: "Username for the RDP gateway login on GNOME desktops." + secrets: gate_password: type: string + env_var: RDP_GATE_PASSWORD description: "Password for the RDP gateway login on GNOME desktops." compatibility_enforced: true compatibility: @@ -54,7 +56,7 @@ compatibility: status: supported notes: Uses krdp with lock and power management disabled for unattended sessions. down: {destructive: true} -env: [RDP_GATE_USER, RDP_GATE_PASSWORD] +env: [EPHEMERAL_DISPLAY_RESOLUTION, RDP_GATE_PASSWORD, RDP_GATE_USER] actions: - id: rdp label: RDP diff --git a/rdp/provision/ubuntu/rdp.sh b/rdp/provision/ubuntu/rdp.sh index 8585ba6..59a4625 100755 --- a/rdp/provision/ubuntu/rdp.sh +++ b/rdp/provision/ubuntu/rdp.sh @@ -71,8 +71,15 @@ configure_gnome_rdp() { human_run grdctl rdp enable if [ "$headless" = "headless" ]; then - local width="${VIRTUAL_MONITOR_WIDTH:-1920}" - local height="${VIRTUAL_MONITOR_HEIGHT:-1080}" + local resolution="$EPHEMERAL_DISPLAY_RESOLUTION" + local width="${resolution%x*}" + local height="${resolution#*x}" + case "$width:$height" in + *[!0-9:]*|:*|*:) + log "ERROR: display resolution must use the WxH format: $resolution" + return 1 + ;; + esac if grdctl_supports "set-virtual-monitor"; then log "### rdp: configuring GNOME virtual monitor ${width}x${height}" human_run grdctl rdp set-virtual-monitor "${width}x${height}" || true diff --git a/rustdesk/eve-plugin.yaml b/rustdesk/eve-plugin.yaml index c739548..44f655b 100644 --- a/rustdesk/eve-plugin.yaml +++ b/rustdesk/eve-plugin.yaml @@ -9,13 +9,19 @@ commands: supports: {os_families: [ubuntu]} config_schema: config: - password: - type: string - description: "RustDesk autonomic/one-time password." server: type: host env_var: RUSTDESK_SERVER description: "RustDesk relay/ID server address. Leave unset to use the public servers." + secrets: + key: + type: string + env_var: RUSTDESK_KEY + description: "RustDesk server public key." + password: + type: string + env_var: RUSTDESK_PASSWORD + description: "RustDesk permanent unattended-access password." compatibility_enforced: true compatibility: - platform: windows @@ -54,7 +60,7 @@ compatibility: status: unsupported notes: RustDesk unattended Wayland sharing is not a supported KDE path. down: {destructive: true} -env: [RUSTDESK_SERVER, RUSTDESK_KEY, RUSTDESK_PASSWORD] +env: [RUSTDESK_KEY, RUSTDESK_PASSWORD, RUSTDESK_SERVER] actions: - id: rustdesk label: RustDesk diff --git a/sunshine/eve-plugin.yaml b/sunshine/eve-plugin.yaml index fd711de..72181ea 100644 --- a/sunshine/eve-plugin.yaml +++ b/sunshine/eve-plugin.yaml @@ -27,14 +27,6 @@ config_schema: type: integer env_var: SUNSHINE_MAX_BITRATE_KBPS description: Maximum Sunshine host streaming bitrate, in kilobits per second. - password: - type: string - env_var: EPHEMERAL_SUNSHINE_PASSWORD - description: Password for the Sunshine web UI / Moonlight pairing flow. - version: - type: string - env_var: SUNSHINE_VERSION - description: Sunshine version to install (pinned). moonlight_bitrate_kbps: type: integer env_var: EPHEMERAL_MOONLIGHT_BITRATE_KBPS @@ -42,18 +34,18 @@ config_schema: moonlight_display_mode: type: enum enum: - - fullscreen - borderless + - fullscreen - windowed env_var: EPHEMERAL_MOONLIGHT_DISPLAY_MODE description: Moonlight client window mode. moonlight_video_codec: type: enum enum: - - auto + - AV1 - H.264 - HEVC - - AV1 + - auto env_var: EPHEMERAL_MOONLIGHT_VIDEO_CODEC description: Preferred Moonlight client video codec. moonlight_video_decoder: @@ -64,6 +56,15 @@ config_schema: - software env_var: EPHEMERAL_MOONLIGHT_VIDEO_DECODER description: Moonlight client video decoder selection. + version: + type: string + env_var: SUNSHINE_VERSION + description: Sunshine version to install (pinned). + secrets: + password: + type: string + env_var: EPHEMERAL_SUNSHINE_PASSWORD + description: Password for the Sunshine web UI / Moonlight pairing flow. compatibility_enforced: true compatibility: - platform: windows @@ -93,9 +94,13 @@ down: env: - EPHEMERAL_DISPLAY_FPS - EPHEMERAL_DISPLAY_RESOLUTION +- EPHEMERAL_MOONLIGHT_BITRATE_KBPS +- EPHEMERAL_MOONLIGHT_DISPLAY_MODE +- EPHEMERAL_MOONLIGHT_VIDEO_CODEC +- EPHEMERAL_MOONLIGHT_VIDEO_DECODER - EPHEMERAL_SUNSHINE_PASSWORD -- SUNSHINE_VERSION - SUNSHINE_MAX_BITRATE_KBPS +- SUNSHINE_VERSION actions: - id: sunshine label: Sunshine diff --git a/tests/test-manifest-env-contract b/tests/test-manifest-env-contract new file mode 100644 index 0000000..2d6b371 --- /dev/null +++ b/tests/test-manifest-env-contract @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +"""Validate package config/secret mappings against the declared env surface.""" + +from pathlib import Path + +import yaml + +ROOT = Path(__file__).resolve().parents[1] + +for path in sorted(ROOT.glob("*/eve-plugin.yaml")): + plugin = yaml.safe_load(path.read_text(encoding="utf-8")) + declared = plugin.get("env") or [] + assert declared == sorted(set(declared)), f"{path}: env must be sorted and unique" + mapped = { + str(name) + for section in ("config", "secrets") + for spec in ((plugin.get("config_schema") or {}).get(section) or {}).values() + if isinstance(spec, dict) and spec.get("env_var") + for name in ( + spec["env_var"] if isinstance(spec["env_var"], list) else [spec["env_var"]] + ) + } + missing = sorted(mapped - set(declared)) + assert not missing, f"{path}: env omits config_schema mappings: {missing}" + +print("manifest environment contracts passed") diff --git a/thinlinc/eve-plugin.yaml b/thinlinc/eve-plugin.yaml index 7dd7eb6..e873ff3 100644 --- a/thinlinc/eve-plugin.yaml +++ b/thinlinc/eve-plugin.yaml @@ -54,7 +54,7 @@ compatibility: status: unsupported notes: ThinLinc serves X11 sessions, not the local GNOME Wayland compositor. down: {destructive: true} -env: [THINLINC_ACCEPT_EULA, THINLINC_SERVER_BUNDLE_PATH, THINLINC_SERVER_BUNDLE_URL, THINLINC_WEBACCESS_PORT] +env: [THINLINC_ACCEPT_EULA, THINLINC_AGENT_HOSTNAME, THINLINC_SERVER_BUNDLE_PATH, THINLINC_SERVER_BUNDLE_URL, THINLINC_WEBACCESS_PORT] actions: - id: web label: ThinLinc Web From d6203c8274fd50449b777b0e230ec3cc5bb79e2d Mon Sep 17 00:00:00 2001 From: Christian-Manuel Butzke Date: Sat, 3 Oct 2026 21:31:02 +0000 Subject: [PATCH 2/2] fix(validation): cover v4.5 manifests and clean package artifacts --- .github/workflows/conformance.yml | 18 +++++++++++------- .gitignore | 3 +++ macos-desktop-theme/commands/ubuntu/down | 2 ++ macos-desktop-theme/commands/ubuntu/status | 2 ++ nomachine/commands/nomachine-info | 2 +- .../__pycache__/_client.cpython-314.pyc | Bin 2313 -> 0 bytes rdp/commands/ubuntu/status | 2 ++ rdp/commands/verify | 1 - .../__pycache__/_client.cpython-314.pyc | Bin 2139 -> 0 bytes rustdesk/commands/ubuntu/status | 2 ++ rustdesk/commands/verify | 1 - steam/commands/ubuntu/status | 2 ++ .../__pycache__/_client.cpython-314.pyc | Bin 5575 -> 0 bytes sunshine/commands/ubuntu/status | 2 ++ sunshine/commands/verify | 1 - .../conftest.cpython-314-pytest-9.0.3.pyc | Bin 2753 -> 0 bytes ..._rdp_launcher.cpython-314-pytest-9.0.3.pyc | Bin 6912 -> 0 bytes ...desk_launcher.cpython-314-pytest-9.0.3.pyc | Bin 5780 -> 0 bytes ...hine_launcher.cpython-314-pytest-9.0.3.pyc | Bin 11649 -> 0 bytes ...linc_launcher.cpython-314-pytest-9.0.3.pyc | Bin 8618 -> 0 bytes ..._vnc_launcher.cpython-314-pytest-9.0.3.pyc | Bin 11075 -> 0 bytes ...pipe_launcher.cpython-314-pytest-9.0.3.pyc | Bin 5622 -> 0 bytes ...xpra_launcher.cpython-314-pytest-9.0.3.pyc | Bin 8562 -> 0 bytes tests/test_rustdesk_launcher.py | 1 - tests/test_thinlinc_launcher.py | 1 - tests/test_vnc_launcher.py | 1 - .../__pycache__/_client.cpython-314.pyc | Bin 2526 -> 0 bytes thinlinc/commands/thinlinc-client | 1 - thinlinc/commands/verify | 1 - thinlinc/provision/ubuntu/thinlinc.sh | 2 +- .../__pycache__/_client.cpython-314.pyc | Bin 5132 -> 0 bytes vnc/commands/verify | 1 - .../__pycache__/_client.cpython-314.pyc | Bin 1632 -> 0 bytes .../__pycache__/_client.cpython-314.pyc | Bin 3466 -> 0 bytes xpra/commands/xpra-launch | 2 +- 35 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 .gitignore delete mode 100644 rdp/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 rustdesk/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 sunshine/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_rdp_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_rustdesk_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_sunshine_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_thinlinc_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_vnc_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_waypipe_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_xpra_launcher.cpython-314-pytest-9.0.3.pyc delete mode 100644 thinlinc/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 vnc/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 waypipe/commands/__pycache__/_client.cpython-314.pyc delete mode 100644 xpra/commands/__pycache__/_client.cpython-314.pyc diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index bb2a93b..70afd8f 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -2,9 +2,10 @@ name: Conformance on: push: - branches: [main] + branches: [main, v4.5] pull_request: - branches: [main] + types: [opened, ready_for_review, reopened, synchronize] + branches: [main, v4.5] jobs: plugin-test: @@ -19,13 +20,14 @@ jobs: - uses: actions/checkout@v5 with: repository: fruwehq/eve + ref: ${{ (github.base_ref == 'v4.5' || github.head_ref == 'v4.5' || github.ref_name == 'v4.5') && 'v4.5' || 'main' }} path: eve - uses: actions/setup-python@v6 with: python-version: "3.12" - - run: pip install jsonschema pyyaml + - run: pip install ./eve pytest==9.0.3 - name: Validate manifest environment contracts run: python tests/test-manifest-env-contract @@ -33,9 +35,11 @@ jobs: - name: Run plugin-test against every package run: | set -e - for manifest in */eve-plugin.yaml; do - plugin="$(dirname "$manifest")" - echo "::group::plugin-test $plugin" - eve/scripts/plugin-test "$plugin" + git ls-files '*eve-plugin.yaml' | while IFS= read -r manifest; do + echo "::group::plugin-test $manifest" + eve/scripts/plugin-test "$manifest" echo "::endgroup::" done + + - name: Launcher parity tests + run: python -m pytest -q tests diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ee1885 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +.pytest_cache/ +__pycache__/ diff --git a/macos-desktop-theme/commands/ubuntu/down b/macos-desktop-theme/commands/ubuntu/down index f90025b..508d957 100755 --- a/macos-desktop-theme/commands/ubuntu/down +++ b/macos-desktop-theme/commands/ubuntu/down @@ -1,4 +1,6 @@ #!/usr/bin/env sh set -eu +# Variables in the command payload expand on the guest. +# shellcheck disable=SC2016 exec ./scripts/package-down-command macos-desktop-theme 'sudo rm -f "$EVE_HUMAN_HOME/.config/autostart/eve-gnome-macos-theme.desktop" "$EVE_HUMAN_HOME/.local/bin/eve-gnome-macos-theme"; sudo DEBIAN_FRONTEND=noninteractive apt-get remove -y gnome-shell-extension-ubuntu-dock papirus-icon-theme || true' diff --git a/macos-desktop-theme/commands/ubuntu/status b/macos-desktop-theme/commands/ubuntu/status index e7872a1..0dd7fbf 100755 --- a/macos-desktop-theme/commands/ubuntu/status +++ b/macos-desktop-theme/commands/ubuntu/status @@ -1,4 +1,6 @@ #!/usr/bin/env sh set -eu +# Variables in the command payload expand on the guest. +# shellcheck disable=SC2016 exec ./scripts/package-status-command macos-desktop-theme 'if [ -f "$HOME/.local/bin/eve-gnome-macos-theme" ]; then echo installed; else echo missing; fi' diff --git a/nomachine/commands/nomachine-info b/nomachine/commands/nomachine-info index 4986a14..6847ae9 100755 --- a/nomachine/commands/nomachine-info +++ b/nomachine/commands/nomachine-info @@ -9,7 +9,7 @@ def main() -> int: ip = os.environ.get("EVE_REMOTE_IP", "(no IP)") user = os.environ.get("VM_USER_NAME", "") or "the instance user" print(f"Host: {ip}") - print(f"Port: 4000 (NX)") + print("Port: 4000 (NX)") print(f"User: {user}") print("Auth: the instance user's system password") return 0 diff --git a/rdp/commands/__pycache__/_client.cpython-314.pyc b/rdp/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index 5b079288d9be6b5f1ec68d0df32f717ec02b082c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2313 zcma)7&2QX96d!-a*-g@rwxo@!cGwh}sLi@fqf$ae`3R_hN~sYmQA91ro=r@4ZEME6 zZGGAUe?X2o?u~HEkt6UI>~UoYsTC(~TdFEjPrNtY-2$RjNAi1bJmcs0-tRYW&d*Gj z2#g#3_3wYx3HbvjqoEdt^5hdRI>aFwlfR^)FpPCdTWrkky>5il<3QWEo&1+>oNCiP>^ zXg%h%y;fbLzx{Z1xw@?6WiN{2)JwxS621cN@WC+!j|S5x7s2R|8o8@p{eh4G-kl=1 zm2JgQ9M#d_(H+Av;hBKPawcsPLM#1=3Fm5<a#J#l%V@j9T|?9wfFOH=AA*2;21=A&b&#@*tmb-C+@!>+;vY zvk8y52BJd_$&6w?M$xy*0}b{3LZRPWD)idhg}(8*)DMlB#|G?s0^bwgKsg-94q4Kx zU?2x-P~}zCQEH0RP|lhvExo2mZPawBO(-suwu-2ivLp3Yqd~nO;83h}v7VJj)y2u# z1kg@W2{qOlvJAb3pm9WtoY%wkOW8b&yv+t1f+1Q7QUzAB)8LDaPyr+;RJaYyLhx|? zq{In8;Xs-;gJlUAF3kyW$0FK{14hFDUae-c!*#luB=F+$YIc0&9HL1!V~^v;OWCy7 z3c?sah3Q2;10`BEIF^r3ps-M21$h~Sz=gMP@L90(835Oos}`L7v$ewdRA0+ngDCdMms&8@@} z;$F;y++g>i(0m$~@I)4MQTP$Ci$fsum#mdy9v6xudq{MoE{MIO162E(R0l$;U*3_b zcl(aqQ)GqFj0VOd>AD04(iMnW5LO)$c1%~tsG2qHmI4`>xplt|Gyp&{&2F!QXrV~f zv(ou7vz^d;!+w#w#+)ht}M#k4W!+ z)?MswcklG*#eW6*n*lsj1v?=r9xeHPci1vSg;!kDjR62bjpt`L>%7z3H zdfAYJTp}sqlE6tWzXY?>@DqUo+l`{UuRNBr3#j32|70r{;DydJAg@+r9Gjo__s#bfX&tZva_D^!}n7#753&#VL68idDd)I4a#95(8Nd zV(%NNia=m(JjQ|GIqi@t5Lr@H%_n2wLDLG86hK6$&(sx`ZKMqQYmziVU*3$g^3?;8 zvL^kw4c$~!Xd2TU2CsO$!)T>lp)CpuA7%!x88!=6t6d|h3t;< z;BW+$qpSb^)4B$&xYc0q@pG_>kO~T7pec&-h/dev/null || command -v xrdp >/dev/null 2>&1 || dpkg-query -W -f="${Status}" xrdp 2>/dev/null | grep -q "install ok installed"; then echo installed; else echo missing; fi' diff --git a/rdp/commands/verify b/rdp/commands/verify index 1f7c8aa..6286e57 100755 --- a/rdp/commands/verify +++ b/rdp/commands/verify @@ -4,7 +4,6 @@ from __future__ import annotations import os import subprocess -import sys ROOT = os.environ.get("EVE_REMOTE_ROOT", ".") INST = os.environ.get("EVE_REMOTE_INSTANCE", "") diff --git a/rustdesk/commands/__pycache__/_client.cpython-314.pyc b/rustdesk/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index 20411e6f5e387e72a785d2a58ddcd95a421358d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2139 zcma)7U2GIp6uvXFyR+MAyKS&grIhJUST?jfu{O0O{*_j`l_={}R+Pdx%uc%_voq_x zGe!0RHpWEo!Is3tK4LUMjfp(^sxk4kp%9v(L=8{A(GbF`=iZ%J>OVJ`d(Qnm-#zC$ zXAZQtwIFC;Y#e;|69J*SbPzSZp>X%#2BnTv_Hj%PX^QC`)JqjL%d5G4R%aDa$@v{65RZ@BwC zpwv+jo#MwoM5qLFJ?M3=%&DBpD;&H;_?_+z64>;7>;wYw@Ye`{Bminf_XxeQKbTdH z5qObel(9t=f(@k#L)X!5#auFntGaPUUo^?EZ8`q?O-PF2Rw}wvB8q0%7GTa*&jqcT z7QWfkG%UgOt?-c@(ACjHBy#Orv|A-i+=ppo&@O6mP}tLQ0IiPZqj^*agWsG0r4NmU zLluo52M3H%2h7K!J%vQ1J(7KBJ{gU+?PR2j<{NS}w3rE}OCr0yd3pfo)`1Sch)@;H zw?$`*XfzDdLhf1qj$VZ+>5OyC(KY&uG7m|PmJ4j6H_^jmwD9Z=Qh&r`S z#V1%fZ8^=*WyK&_wRMlOAV`pN#4{@a?~)*)8-__p(59)!=H8fodG3fdSttatR)}F06+WG8O0=2edYUxjzLJ7d=G|0^VbEc?*%BwLot_a}7 z1f~=W1fVpAfTKWaKFlg%dS5MNTf{p7sdN%kGGsZN0@27N<_yMr*6pMVeb7mqvF~W6W`CW$p-fAB&RfH*q7M(BGkJgmlLY|eS#l1Uy)W%thHq8Q=93|<=Um%^7%{W*Lt76HnN@`tLJ|a(;G=?rFFHumd@NvW-bbF zr2fj^8PfE!%r5?ShA7M*4R*wrblW!>KNuzcmj}IYIiXIVJm9!zwrICP?omN&A&5uN zU>j@AT6hSC^mkW8g|N1SJD5-*`=j6vZCg;$_7Mb=54cP%mYL6FAd5w8LIp5PVDBIt zV(i`5NM(tXP21Mq^Igxx`(crx-vdg+@m-(oxx8nUT$x$#9J(nDeMN3cBWtk{_JFJu zh?-V%4NVJLG;P6${|@~VP+~J`;7-t>=9GQUvRO&NU385W3KnH%kvWuI*npILuHu$_ y+k64jH&G`L3hbW1aolg{@Ez2D7o~2a^c~dwYsYlG?Lh*5G7p}BEPL1y`SuS(%dl+# diff --git a/rustdesk/commands/ubuntu/status b/rustdesk/commands/ubuntu/status index 05e01de..1d7bb62 100755 --- a/rustdesk/commands/ubuntu/status +++ b/rustdesk/commands/ubuntu/status @@ -1,4 +1,6 @@ #!/usr/bin/env sh set -eu +# Variables in the command payload expand on the guest. +# shellcheck disable=SC2016 exec ./scripts/package-status-command rustdesk 'if command -v rustdesk >/dev/null 2>&1 || dpkg-query -W -f="${Status}" rustdesk 2>/dev/null | grep -q "install ok installed"; then echo installed; else echo missing; fi' diff --git a/rustdesk/commands/verify b/rustdesk/commands/verify index 7934478..6605676 100755 --- a/rustdesk/commands/verify +++ b/rustdesk/commands/verify @@ -5,7 +5,6 @@ from __future__ import annotations import os import re import subprocess -import sys ROOT = os.environ.get("EVE_REMOTE_ROOT", ".") INST = os.environ.get("EVE_REMOTE_INSTANCE", "") diff --git a/steam/commands/ubuntu/status b/steam/commands/ubuntu/status index 3bd0b2c..b46f1a2 100755 --- a/steam/commands/ubuntu/status +++ b/steam/commands/ubuntu/status @@ -1,4 +1,6 @@ #!/usr/bin/env sh set -eu +# Variables in the command payload expand on the guest. +# shellcheck disable=SC2016 exec ./scripts/package-status-command steam 'if command -v steam >/dev/null 2>&1 || dpkg-query -W -f="${Status}" steam steam-installer 2>/dev/null | grep -q "install ok installed"; then echo installed; else echo missing; fi' diff --git a/sunshine/commands/__pycache__/_client.cpython-314.pyc b/sunshine/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index 621f347d3c4b04c14455cda190d9def0149789f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5575 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/dev/null 2>&1 || dpkg-query -W -f="${Status}" sunshine 2>/dev/null | grep -q "install ok installed"; then echo installed; else echo missing; fi' diff --git a/sunshine/commands/verify b/sunshine/commands/verify index 91ae288..74c9771 100755 --- a/sunshine/commands/verify +++ b/sunshine/commands/verify @@ -4,7 +4,6 @@ from __future__ import annotations import os import subprocess -import sys ROOT = os.environ.get("EVE_REMOTE_ROOT", ".") INST = os.environ.get("EVE_REMOTE_INSTANCE", "") diff --git a/tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index 727cf6a7d94c3460b9382e92c8ca8e9325190203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 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 diff --git a/tests/__pycache__/test_rustdesk_launcher.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/test_rustdesk_launcher.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index 928bcf690abd578c153e49f0b71e5d798a543718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5780 zcmeHLO>7(25q`T|E`OG!B&W5V)P*T4k;K>{O^T5vt8!$>D&)42nYBX|D4WHGTuF?n zCG~b`M=SyeXbvq9pgsDiTdSUQDthiMmq50RI9;@dq9}@->eO`&xR=hn-M33AR2j6r z6v#rHH*a=k-t5!c`DXTfDj6qmef;U=cdZa1Rh;k(=6DHDwt;RFmDuEMq6*iACD9ho zA}?MK*%BMWOL7}zOA$Nj-HF*Tb|-GfVGLbYmJ)X2Ecsz#n5a@wK+lBONi}?msPZY& z7_?Jr1o$Z92hEHfhI+M)^j-s1p)7I^J)3lax-e~GIt=gy?rtL(zn<~cU z#YZIIVIPDiX<)WVnY=Ade?UkLWM{~m!n&Xes;GukDF-p`hCdTQ%~3X*=51rErQ6l@ z&WYBRZCG~p4JIq0%#o>Kx2fq!%T3eRB@l`X53`}$7Os2F`CjfV3&PJ;*J<6#S+tsK z!L(`Wjhu1Em}u$M+xnVeO*HCe`@I~xw;0v~ob zjEKU!!sm?c&#RAJX5|O2#AW@uCODInx#ab&$(ez^w=2~*M^U*l;V29INbGo{9yA~ zYu`9xKN#3?u9y8Af-0+#t|#niR~GnsYP7Ge=V|yXcwb%rWmc8Gx?%1&CtvXY zdxW$iYC=txBRS!aG+KFq?@^cMuW?y04wG_}d*&m&nyFc#CBRRFUkHBEtUwJl1bc{y5qfGu8!WK9#XD@%Phn zuCsg|rivrijD}&}p}2+4>Em2E@p(6AX*zX=w5r}{Xw+y?SP3$(;UwU;hAGyro0cOt znxJ7hr!{N6*>2RBszN0rZQ{OP0m}cp#26}K(SJ@sx0$!xFNu3uoH}7f2d##3U zvedjAqY;cx!DZY%&38{GyC<)8PcFHkc{UfjZ_T*3+|}}hL$jh4gY`z!-bFDfI9bf9 zK|VdQ+uGf_4Nq%pEm-Vslh)`Y7_qea5ir~2Q)%Flbn?D*a{tt;dyD(h$%oSA-z&*S z%IJM%bYH6Pbb##50@+tacRB~k>%cx(sH0$^eqX6SlDxl%sPei$^_dR~KKnqb^VuiN zp?e1`cRD`1H|w*$KlHs2Eaf|N8E{K6-Tmi)NW)-GG2Lbas=(ml8{1(9M2z6;V4VSi zXe0^p=ScSFZaik=t?#pW5D6%<%SWPL_dz0#C|?4HM8Kg?4;)JUS2#4laA@!l4oPbG z{{)8+G5uU!>W4%9F)P5K{+JcuP=Cw{aHv0K9gjnbn)sjNP_icuB>{(qDDI~dS#O)R zK?@8i7(7r!K9;BH*O5DknY$ zxbzuH|G{UEarR+>sW5_u-9q1v2_Xii1*^GhFzHUGhj4GUhmc2e*xr2trhbI52gHzA z)WOXlCGrv+OJ`P`yVJ`67DEak&w_T5_KUk?}pAbA1uQ_?7UezDi_wE|}<+(jn z{m@EQ`q-5T*9Q#gr|a)2WbuBwL1vEh)%7!TE_|qF535l%Rt_JjN|pN@}E$;Tmsk|2xHg<$WGIZ?_NPE_Kn69pY_&y)DoiJ}W?9Ma+dU}Jrw)i65I zF_#%T7KyR2V(7fD{>h_q`iH*Tf85^_482)C2&YRezL2u@Ed%*nrZqHgb zp!wQtH*F(m@VffC8SL`hc24Qi{jzwTiO}=#0@4deCV+IeOw%-r64vc`ebYsn2a$#C z*`a1>kima<0P~>2Amb9lc!2buUHR#ieJOu$9LP_u+#5eoMu5XU2*`aU|48!w4y63P zGU88t23s6Y<$;vvvro{Qd*dN`_gUWuh_MX{7Vvqn?FtOqG7N0=KpDoEDvW#~uwmcY zXLu+eI6kmZR~>@cS3DmWSjG2pgn`u=tY(Ish^Ez=RZVl^nzq`84~O^}4s>`;wT2UUwBaidgN|pxE6~ ztlQ{35(H2do!cu%zqQepbAs>(*$Nof;eGW0O0@t diff --git a/tests/__pycache__/test_sunshine_launcher.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/test_sunshine_launcher.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index f42e4684cb8666fbbd9b7ded2b87de8b93244fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11649 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 SZyO;J`8EO$>ASra_WdVk2P=gD diff --git a/tests/__pycache__/test_thinlinc_launcher.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/test_thinlinc_launcher.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index 9b1f74f9ef09c7e98baf8cd51066763108de9d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8618 zcmeGiO>Y$0@pVs6&qt3xFdyDcSQwkdVHSJF9|PDX1Y-x>^9wpn z-l{Abb2>GXr8H>c%|MZIX*QLZMBwz>8Z zm=gl?AUsI|vPx#ihvML;gvWsv%X%ppD@#L}0U(LaF$XzFf{(`Gu9X z^0K9yR{DKLn?jl`Q{Af2qAg99iu!#5rpWLxg`8#LxSjU3%ncLF&*T^AqM0#iK2wHf zshBe|`jXyL&gDPK&Ff|lJay%62GyGkYWx{AJ{9TmvYpU0_rY~dqX`(H3I5FE09MH} zA_vn(&UZRTUa4z6FPG((< zkSUO=y~=_by3^4?W<>54Wth)9muIBGaYF9g_>LrmQ_Vf%*YvG7d0|_kk3Fs z^C3?2@8AUyZUw)?H`a7sC=2i>!e8jTK&Qd)+I=aGf!{S}-^A-$_Pq|ikA1HLhpOjw zY7?ySZFc+g_{8M3iOI{_&9Tu-moJZf@PRgUU7fxP>v)9b7R|-t{PSpEZyNudSvj;| zS!HuLli`%%f!P$ru)Q}K_J7aX}E zXeDfUPB--862;HhP6UPQ_=vN?X*p^i(DFIM(5POf`BDM4Y28jhw}$(%wOBN5*(d>r zX}_hJ3#E!N$5^#_qjW20XvJJXw_}=_yRD-JyZI8E1=y{}C@oR@pyq6nntr!zUTd*^(lFy}<9qGu1bfnte`|xB{In|!-iQM?l#w0D{cQnV>GGN$@>#!!Zb~D(^$7Jj9Wc_`u!nj&fDGe!vOxrdgZ4f+ zxh)O;&l(Gc!(>sM>s=umZU8JqISR;LAzMZ`LGFiW7+7co0lr%r1CSCZh6+w3#@;du znHazw%RB-A<0e@sLfnM#f#lpBTcF#!S^#6VR6+GBne{rRypYHvkurqX5DW=-k{#q` z8{f#vp)^rjt_v@2O=H6R0TyUTT*p*kE9SI4LLvxSXT1Pw$_tLT6b3kTLLz^pxJdxTF32%AW42<5-4m-u3=))!Th-uFZ{;Zt=zc;6EpZ+uNp ztdkOy39Nr@u>Q4zPVd_-i$FaH)St~nS(-S&R~k1>^jD0%*2EB`iHB~U3Z#kqYa*0l z0xL{?5BJx^riQ#xzAo3Ki7~ZVjn2es(nNXo)z>+hYvy+d*lX4~Iv7~vaM!N6UgBAY z-`KN`?0Xi*5dIhY|K(X~0#dosSq8+F>&655I21cG-FoJ7zCz<#Gzde_sx*uBfNRGgkdO(_KLA?QY(EbVsl;ND<{J4Dl7 zznkV}>1mYf0bpVxkn}Dm$?e*mdH_*cixgoM?sclNXH=MStXD-?kJrbN@rD4 z*CEeU?^OU)mCkj@cFzF1Iiw9m)M|Bg+}D=^>ckx-6TL%3F_^LZ=5L*CE|S zCP431Jk-;Nx`$jPPHzx`Edi59(d5y46o6}TKcEj*9vFBtHk8pF$^C633z+9q92|{w zX`9k0Z#`lPogR=xlaUF~d(=ZceL#L-IOG>0Si&qmy`h|bOvJFf*?ooGtIFwW_mwSW zjJ5tr#P16-LjeH#B@q+yGZc7=;2+W#s0AEA^=E$h&zRYyI(jj6Dnv&n#qgHuzJSB${^=oRF$ifaw6}O$JgX z3P_nKY$$~t$^C61&zRTr5PV}U%cfM|tw&6w)3XhD_Z1)KT97{B58$bB5U}74sur{l zKh{Q-ig)m1=9LOTxB-<4glm>_e@Ug{H&B^)-AV->{G`Pc`)^(uNO=~ zQCGtVh;MX$II?FT6?ejd)>_e54GEx{U1w9L7x7U>5a1q8F9BdRX}(`O+x20#UB58& zRp4f;!tVfacjsdp%CV|6y|x5k{SyFH<=EQNmU0fzhgW}py?TBciRY&`l<6JG{cR)L zIj`ve(1^s|_U;?%MgnOWz&h3Iz+rMZfse~(Tu+s^kFJVe$#@|DRWlZrpS9tl&9wdp(x|$W diff --git a/tests/__pycache__/test_vnc_launcher.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/test_vnc_launcher.cpython-314-pytest-9.0.3.pyc deleted file mode 100644 index 4e83d57bd12878d2293760b7c85cd9ca562b9b0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11075 zcmeGiTWlN0@$UE(Pj5eDJGMkSezA`D(8H4K$c z76F7bK=YB00{zLS{wkv=;IG2ym(i~R?FUu4adK!siXbTR6*+cdKn0r4%solbpp*yD z0zQeeyR);qv$J!%GqZQ1wI#&CbLi7kKN|^fTm}o)<25q;<9m=<;v`Pv-r*$vB0nx@ zLJ#JJiyqBOsc+n00^E2&3z{`eS`*cTv=F48i{f~**4)Fr-F%RfyaT+^x7PA@XmYcg+eBrPnQarIhlp8mvZ?TnW^F93j@)C@E?CO9EnDFT}&4W zMJ=u6iUoB7%lTq@CY8zO-_&5xiB`(RmBMiUK zaWjD1&t2i?c!`$;$s>7Vz~vp^7Xpy!;(W1iLta$UT4t`?sVr);szqNX+$7?3Ka;f* zE9l;dVnM#c!Qg(F&U{)^aoj`tYq2*~m_;lz$8u^+Wto@)#bP0ykI4&iuaeH(NM~iW zH=iq%ZpW~Dm0${{lCp#mRTlN;RLY#XoJz4)=p29Q3jmh5r<}mY9wDggkFH~ScYunI zp_(HxU%%&r6$)iW&dY^`h`@q?&^;hi75h9I zW-W*arPK^7T~7fG18z7(syzUfxX;=Sf8hBfxZ`1P-)eB*NBt|lN^sxD!RTWT*M5Yx z0Zr91W3Mzn)Z%9?bBu>2_Aq$CIM##!UpgiN0G68}F;i9KW26`rGzp+Y2dXTf; z>k&X?57vx?0;+iqy5?u?B^IwUprcisqT<#(_1eGAOJ2$6nql2`NzNKi@;9XAZQ4LX zTEV6bHl+2~v`r0Z?Y%bUf629GieD0?=A=KyS78I!@C~BJ)pMtXbJBxcGGK9GrLd>9 zoaPk{emwjH_<2tA?5ax_cRD>-InYJ^W;^s}OG^tFv(2wLkN^Hu3klLV)8vZ+S1{M*nhztyvqZq_U| z+)%4Rb+oGcxmMwOGFg8`fBe1e|4FORFsON8uWE;LvqKT2PQ?TE+m5Jka}v+c=|Stf zQ$nzN^?;uJAt}=C^%raRf>U&Ki~CnI>|f#O-#*{JzVrUIol|sY!@bUD?L^Y9hO{A@ zc6UQs(V~q7tME=BYPiMskzYv_#f0kOn#6GBd`{3E| z#csrMGaEv0PWLE_aa~|}%=94`KyVVlu-^d$yI;&I&zFtO2Ex?U=1rB@QszG#1RU_*%Apw>_ief1F>tnOpT9AGFC1Qv@M zd!{s&%V^_8Rl6iFo|}_1H^3hlEfiTCUf_-W=o4Kk6mJ!fLcNg7%cHRwc_CIP<@05s zS7G~rjG+b3(80OGZwRBK5x$(o=?q8I(9g|Gc$8+?XQ3ctqT&%XiawN9Diq{=s;Fpc zY9XCv>4Fw|_c%5mh^Q}7>yr^R5_&g0YV?%=fkcADC`%v*$TI7*avQs+WVRr)v-#YD ze6gTGA)Oyh#2s#d&lL6#-5PvCW_x@>r!0+bq{FF;!4crk|4jZEde@Pl?orh_5alfV zCg69uypz`WRHAPv8i&8cDO_xW>k~M+pI|$_d<$7m*aF4emYL5K=jYRf8Ha0IzD5RC z&d4NSbzCz_3_`J)bpr=_*E1GP54~cz->EdyJ5rf+KA&Q;!eC4YBglF)RHra#pydjx z?#~y2Le=-A)VX3QKSQLcY`%Csolh0g^RnKQQq!|C_Mo?(rFR8F3S*2FnZ6@sxbP|Y zwvta5DA=Iyt>w#JB)!vBWr`ruri;js@fIfBg?@Ko&|MfZCSkUTyQ@ZwDuXY02Whru zX~0c5TvZjX>M>DO8mKDuSG7A?RT@^&%MMpRhTk5>hy}$e-0vCaK*|&Zy8=zgasC~+ zpG(}|#g>QSkyY^sL@9j!-WfmOktw5(3!JjkMbl5;!0#7|j@iu*Njszv z&nW?^SrWk~Kb90oi$1W{CcC&rEee7b?VM&VEoyPiv+jyIkDYy5Y&17Un zJD1NX*NbU3Q*P~@k_$6Vxvf`{=Zl&w$tv_Z8ZWo?p3UD%FRJHCaDl}}6XnicBYSmG zkw>Q%RZX5}{WuO^o-iFO!vO+MtFaHUkdtr846OUC3J!$JI{@eMi~oH4?YGcvCpjnB zo8hZL$KW@ht{cun8(QM7j@U3(;Uxw;h2S)Tmk~hRhhumJ#(oMw_p7po_fsO>PqA0A z;v81EtoW1cyp1tT?_qYy#u#fD#9gEtqrgz%bw0jO|Af;ns z5$@-fxKF%o552ory}K)2k-LKx@9qcQ5wfZetcnNBbN|4a*kc{}hwT&pulMl}|=JiOJTnOd&*u6V~* zy6?SEIX(tCfUDxzL$CS21{m?MQT&@L|9~iMGIs{5oC6qEfgU_I=m5qz#j~sdylG@` zXWG~jcnOG93~}P^q8IL?9}!$RZ={NVo&WwxzsLofSK{@WK*@Vy5)=VU1Y9y zO^-a+-Kr4(kEOev4fV0f(w3Tw@(`GoVlq^tkKgyAypBGyi&85XX?xf-Y;RyXDR9Q$ zf*5>EVaEYe&tM}viygvR+|Suj0M(z9b3U?=o|8IIPyMMW-@yTNuj6^orRv9CCR zS_<4UGy&KV0PxvO6VMta0`bOXuucY0Zg-lUGTNCIS)NQMh`Sml8Af0m+GM5`vW2j& z%Ur|T1~ApWL#SRQ6B0u8a={88)(IuMhr&?3XqbK-wn(hDTQ>eEMWwD-J*n6f9_CCZEH$~SfqQT=P6B6b{>}RL$CS&0O>~TqMiA$&(8kUo3%ixG)(oNbq7KokG?l$eza)# zCve9RW%4cf>=JH3Y!rO4XW;0S(S;&hpcu{cR{A6{nkg1$F~`v8HD0*DZ0>a31HpB^ZcjW>3?vC{>5?cbH8Z%jBELv zJNi#w`>%Gb`MQ<_u=a)EFT3CC{>b})Kk!6=FB{>zKcRaab6H;Xm7qG+vl zSF=mWR1rXj^wvYslX}yw?ak<4VDvALAp}7d?V+b4Co7g>0m>zB-tLe~g{fo|0ebKP zJM-Re-kW*v&2K;78t6|FI27;a54R(PRGGpL(AgpE-h+0XD8wZn6GfO6W<*zfgURA- z#EoJfn~|D;&BWaVjznhrW|D654f5M$hA7dJfKw4yR$}LfBAp|~pqo;}ACqjnc@4&H z(E3W+)@Z|RrROc0b{F*Ys@Ad_ww^Y$rdeIkY5GC4VbpZ$q{miD`BM5He<^44S;3Pv z)3jX8ZCIvro9Tw7)zqrd&`sBi2eVXJ1VI!;1R1gub}xajPAcSMvHU3^HNY;B4}=9l z5frf?Ky;BWnXM;L-EC6Si{7?O{ci*oks!(?&2`w6!`^#^yAA|as4mckQ*datV1sIz zno-bK^qj3#7qz1p2>@o7fW2KO_n846cUUfm4jcB>hJ5qFaymoiPL%>1JCY~L+4qIz zo0VvJhLGjEqk-o;LLFAPMD9oVRCgpUb$ZzKbCuYnpq!s8O^T(!R*5Ll`w4D!2f4>J zzt50T05DqAGly16bz3tn6UvbDjK^BLc*uX?c>cc;l&BI5W!TfNLil=$bfm4&wv8WY zE4FPDN7_c(wtYw1wy(p2bUCzVwxq~Psv;GHE;N3hF$s^*%%?ck=`*Af=TYz;uA%-Z z!6tADaEfq7rUd#?h>fpxX5bRAQB(%5(x2CbJF>Ox`|-+?#G43^X4!O}BZyn4ic`=1Vv>-tBTFaJh02 zD=ZcoH8%UTZj)lx$tEa!#(NRRS)hX;9bEX(rMk9s%c^R|uNr3Ut_knYi_b zQnue-yr$1fS z^S)`c*cQPqR9NazG(U3?j-R+?yH2P4p&YM4iU~iCpYY}BNLzZdEwLz}80>Y`JNG>s z>?N<;E%r60YScTa0?iDS>NbV_hi_5cOTn3EXCi0F9dRcFC!8Z|Uk>xT6} zGgMPs(!D;_(dKnFgEw#kuNn9zeTPzudZ$(YgHhEV*@kA~*Q$4##}(RZZ!iq9I%NAj znFZosg~hNk8CI@@m7n>+2R`HBp=KXLyApNZ?_pK|}_^2k$pWQT|`Y4ag=kFP!+Lt#rE*?hPy zPoeUhh}Q)PMQA|$iijy`pZR^wnrG23$zBYEEqMyjU5@TE^aa;;nD&PWG{J^BhQYQU zf)E2*!D{{*h;BaY0X`n<0rF_N{rwEk{7{1lvXC%p9K`hYB$68VT+Td|Gib6|`szo)z+hywLnmgB9qmCt3vc9C|7b?T~0p+E~SIOCH)--IhmDc}}92fpIVj z&1EQClo1ZpJ=Q!+0O9&T*pf#P-R0;$Ltk)hhiQy(&|$+I!(iJFL5KjYU^RaYL^oD@ zfPCR@Q;fBMxgIlt{a5svv zc2?_1mv1HYn yhW<o=R5q8BHh09(wdqx60E?kD4BP%1nEZtLb!tX%D@$lT+N-j%UJ@IaQ*Y^^FRMM!dM9f{|b4G@Td&TDpQ!lK4*$>O_&lL@fh;r zwU860GBOpdfo`hHiP4?VweG376Fch^C=cGx}{kWoe}aZBDmS)rwKOn{jm8v5Bhan(B`(Z7sV!s#+h5uByBTTJMIR zy${GLd&;_m=)aNNyF$eyPzN7fA1G*ON8zEavKweX*9;D%?Xuv}S}@q9cvxLXqSB#7aO8;zrOw8A96;TP@ zi1}7ClzhJAl|w9FS4==TH`LY>#-i;SY8juOXuhxI!M6InZIwanRR1GE2`S;05q7Ls zWPX22WJg<}VH@4iR&3aI?Pwcn*v59WZM=w?=;@YcW<`~_A{C<zd^dD|Y!__$9nPJr@Lv!B2pn2*1z;f&X~NTBqK6QAdR~tX6L8*9->) zty;)sy_*BG8aHNjZQ(Lswj2{GrL3jYf_`^JOjS6}?Z8;PADH{Xwpb|0!pdjp%D8OD ze^FL3Wo0`}D~@f?tET1H@h?tcrMzsPraEV3TaJH`EO;&Cav(;@GyXPo z>2XIJ+%e$fILAlfCIaoc@%OA{T;^1byL;4UFZMwUPrmnfRwj!QA^e@E@3eC($E7D;bU-v zmhx#>W>?wYq{LsP!3WadLl%le?_H&0tw_bDG^eNVP zg5=xiH|%j2Fq_h8(mwLFPf`25FFi!*SEFP?1S_^G8}&#D9*`CE=Ji3^dsjOs*NPpK zzBj@8Gyt-0BQ!kph@7UIG`hzz*3;{UNrW(6ddQ$y3sZq%y0j&oB;h+IjzE~;E|3uj zlZasg@d=V|!w{wjFq_gz(mwLFPf`25FFiyF!vqBptk|k-)FUN@2~43kuMg7RyF^uk z%C&F@rSDD9lm^grp~=zk&?9oXspkpEtykONa@Zv@j(I5y9QS12hL+NpcArFW_u1Hj zCU6T1WGzpH*Etw8F0`gCr~wVW#uoIg*IM=mX$yK}cMFQ!+~WWD7PMQ5zws@ow8Iv3 ze=4gmik+xWr=VUdK>cam&F(zg~t5j#oT||ju$PPYQI4^2n`lPa1c5=dusO} z)EZaiWe!4#mLo{#4RFjqdSoJjV@$WwtHg@kZHJraOB`;Ze#?Fdhnu#{;^Qp`n}hzd zZ=_@Z zvEnf24MAr9z9`Y0_a}eO1Nf)#g0o%^%zDRXf4e*Dz4EO0GVsrV9cRdhKYu9)ceIT+ zY!B^dEBUsWSYYN&C09 zc{t3U&*jf#vxo*vtOQU1I3)*r&AAb>_0IGm=-N$8mKQ5V#df&nn0&h{mmW=zrSpUy zWQmRvJrivDTpeIICr3DJsR4-A97h9`8PW3X{!|J^S7?rKyDyaj(A&CcYP?)n)@_~y zJHQAkuYeJFJ*fm)t8j2%)Qs{A;02ze{1SA`&jDE(NTtfUz2KNu>Q=2^ z=bVPl0rKDh7{I&$fKhkuPQ@sjckE}~Ye6w40L18`=y^^dxXdr3XNNj^W|%Acnm24f zCJ?^K@w&GQuO7;J7@qa^x!_B;8-l0n;Vu`@WieId7d>VggdeROpiDcT8$FlK!e7qI zQV#PpKKHxmY_5R>A@>5ob!vv8SO15bp1*)Oc}xy)rIvu_&VZQkV4=eVf^1AcG;$w*7n?qfB!wi6B!eW2B!^@a zNGkv|9)NtZ0i-Awkn#a(EKu)kKpM9Z&+~z!0Dg41i67NNSAYL({t48f!92? z(m}Z?dENx;!-!x6WZp(-tU-u`0HDWFLXzYMlI+E1WYQ}od2?iPOY(pv2-4MNkbrFl z>9G&-)L|qK<9Sm-k~Vz)ASisx1SdiEuAmnr)AOP~MX9$GbxJbpOB(G<- zq$v^rf&2)g0#-nPeLe;`Mc7>fOMFcX5~2cq1~J6-Ob6x0#SY3%$@3;y-x~p$w-FlP z^Fhd=2htD)bFKcaUHRR~^#W-&Aa(!%elP9o&g&zd;}Y%{0Yp~>s? z#NJd+4Ry$#wT^FNp@ZcH#Q7Oy^Q(yt%1z1h`vpMX z*(|B58&}m^HTd?9U&HZRyBqUA8_=@h9#*{%4QUUzhtC3OuHS+GAb^hs4VBwf*U_Tm z_RyZLaHQeQdg+Z)n>h^7wlbY zb{%L=Myflv-6ll_Jz!wei9teghZuB;E=r-4L0ejqLm5VSNm-1Au?#Vk z5n{wfNI4zGjX2l?!X7XZU?+v0Fb2U^g`G4~U=Im<&^Q71NnxvoG)Z#l+WTs-wXhyZkL!F=mE3!DolOPD(lX+ zGhMapFRi;yFkN=N+ShsrcLmGVZNE~nykel6cG-2jFkijLQ>NLuhhv&-2)0kcFE|Tb zoxC6t&F*8@SbvT~b6w01;42X~MFU&!rUp#vVKtc5bxvn< zGMD^-4>;bo%Y2W^cbzaNu>m-UE2wLL=S*oVg)6BpJ!XxS*$6BN0^S0nPJU5`9?d?S zeKh}YzIFEUSp$(x&#E{KA^njoyFqvxBI9$0>6N2Qg&_(FaTg(<=nzgY0Uc@> zqv?I@nxG*JyV3CYQ?VE!?-vPBN5~^7^Q0;j=$o*Jtq7crk%DB90?kWrW4v@4cu8yB z!0#@?SRgZ<)eQU(?n!r~=^BQ#RjoQ+F(*e?9tB^nKo$l8BADvxGu+cB3R)9g*f_X| zOXk3+llJK|^=rQlq}z#9W4Ljzm7e%HG4ViYD~WHHzgccb_gCBM$@=okGAZzPA(JNd zd9_TKp?gXs(K+yCm?1)!W5qZPp1p*kbbg;ex0`&9!(&&>j(~x$XsCz)hPSMfJfz1e zEs#|T3`$(_fx4W+vhWe;w02JR3fh85?Vb4av>*y2Wsfq1EFxtpiu!YZXSHJ4eqeSg z1UnDz0yYXNc z(;6R^e3viE6Ja@u9&t3A1do4YLln*)8yCP`KuU|9+o{tnb-XzYT}v510@5Yq|E4~V zqpA*zvR}q>gn1uD+Ho0=3DL`VN=K2hQOtN4z7NE(drvGzfcrDP#~hZOI=Kaz4Z%)V zBAq0LwUAxJ1JHA-6GCYKXd>bsPkHz%a3EMn%G7HQAY{(G%+S9L8AZH{F_Cp#5tR@j z3R<|b>HFnlLn#aXeW5go6iha3BxJH#6tg3I;42yyAd!4yV8CnERkp8~8RTO~MK%o% z4Bep`UxJ}Os??Holu?)Aqrh?s418G9jp6UEHj6Da+fuRuLN3JzOta|QrpX6QbE^ig zKR(JxI(r>D9uG>j&@D6MPdrtk4vK7L7^DmpV0cs%=U6+Ud{4Yr@r$*xGtb_IHM~!t tL-$;!l>SCOdP=g-Nb)H;a~OwL{%{bUiNiFMr^5s!9(JQIpqmsh{{;5z;&T81 diff --git a/thinlinc/commands/thinlinc-client b/thinlinc/commands/thinlinc-client index 541f940..b479b91 100755 --- a/thinlinc/commands/thinlinc-client +++ b/thinlinc/commands/thinlinc-client @@ -4,7 +4,6 @@ from __future__ import annotations import os import platform -import subprocess import sys from pathlib import Path diff --git a/thinlinc/commands/verify b/thinlinc/commands/verify index 68442a5..0f7ad45 100755 --- a/thinlinc/commands/verify +++ b/thinlinc/commands/verify @@ -4,7 +4,6 @@ from __future__ import annotations import os import subprocess -import sys ROOT = os.environ.get("EVE_REMOTE_ROOT", ".") INST = os.environ.get("EVE_REMOTE_INSTANCE", "") diff --git a/thinlinc/provision/ubuntu/thinlinc.sh b/thinlinc/provision/ubuntu/thinlinc.sh index 9e5c965..0551639 100644 --- a/thinlinc/provision/ubuntu/thinlinc.sh +++ b/thinlinc/provision/ubuntu/thinlinc.sh @@ -239,7 +239,7 @@ setup-selinux=no EOF log "### thinlinc: running tl-setup non-interactively" -DISPLAY= sudo /opt/thinlinc/sbin/tl-setup -a "$answer_template" +DISPLAY='' sudo /opt/thinlinc/sbin/tl-setup -a "$answer_template" configure_agent_hostname diff --git a/vnc/commands/__pycache__/_client.cpython-314.pyc b/vnc/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index c1402eb65502b985b929e7c2f8ffa69b76f6cca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5132 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 E9|4*aP5=M^ diff --git a/vnc/commands/verify b/vnc/commands/verify index ea929b8..33fe955 100755 --- a/vnc/commands/verify +++ b/vnc/commands/verify @@ -4,7 +4,6 @@ from __future__ import annotations import os import subprocess -import sys ROOT = os.environ.get("EVE_REMOTE_ROOT", ".") INST = os.environ.get("EVE_REMOTE_INSTANCE", "") diff --git a/waypipe/commands/__pycache__/_client.cpython-314.pyc b/waypipe/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index 515431ad5952da59e64bdcf8a66a5bb7c1f19cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmah}O>7%Q6rS0&*PFyC?q5<+q%LWc)_}brl@g^12nr}sQKN3CBUF*qvL4%u*SpKi z*u*{gz=30qIp#*W<=A7zsmEN9qLq+9oVYneRivEy-mJ}!5HQltd$aTRecyX;UOzWI zNua%!E`K?#6Y?t##!br{da?}8fH*{wZQ{^%x~56(Dsi+~;^?y^EJ@wTfuC1?&N09* zC_nF**GPGy`yL#y<@J*wVOHpMBfrJCj^3-pScIKr((qa_OWHE!U5uM$k-kA$h8MNpdz320}iB;peHrne6iDdji)R0I1_h zfw#`5YxV;HxNX1117Qp9+X)Qg$O~=OW0l17+g_82N*F}l9sBEyyzR%Gju+L1?fPNB zB3VuPY0-5@#F*>yX*eDEh*zN-kW->l;~2Zg`Vh@QS(&F3>gNe8BK{~)=#v6`N{cJt zV9>_gYY?Dnp++|-@=psRNWfdP&a_H=_VT9W%0crs~GdkFspbifHNRJo9B1m-di}d zZa?|->GHGwP}hpa(Zg+JheXR8{2VO&TbNDwp{U(ZNBn1)HOFu?I|oz?JO|5D6GI&* zQgA#bH6)}TlN=!_7JLFd#f|bQ@Uu88Rw^i}LyjW5{*+Mq&M|iT5E3v4o60=tEA#9# zHJ7mf)PFQoOR<;%Cks$jtC0;_qxWb{Q{mBg2`2e@>=Y!O&!Uep%{0do7ssMs9E+Z% zb0+vJutLF|17|>vikEl0hf}xqcA$Ga1Kq(j=niwY{wXvHrXX5s>%R+aYanobByhrm zp4(>qOj9K%O8vi@B2|HCG208Ybd24e7^2zltI?kjVVP=}eG1|dI0I6JmuQ0~v_`IH z^P~>xGe>Gr`jGhWR#kIvU}=pStfT-v$1lJSNblg$h4nhrV;}=2HlnbPX#^^;>7?s6y70K+qk}oADwJa!I9{Mo vsa+WibEOm4yCHj*&%-RffhuN0ol^P>`RFGy|J;D*>3I<<;nalCsl6`%8jxvr diff --git a/xpra/commands/__pycache__/_client.cpython-314.pyc b/xpra/commands/__pycache__/_client.cpython-314.pyc deleted file mode 100644 index 829c5a0a9ea2d72d6fcc619179c9d90acdf6a859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3466 zcmb_ePiz}m8GrM~_9S*3XH(jAw`!(I2@S37B%88nmh1|;EJ?dc+o^CDSZb!@NjzjS zW8RF@BwT#pP_Yuq3L$(!%8is$k9**NIB_%*?1s@I6(J7X5~`?DPyD_&wv#qMLGY}3 z-#72i_+NI2|Z=>K<^d0W~8BKgx+KHLC*@k*XW0y6MEVh z7-i$H)ZfLQzhC2~?wWPas@hyP`SO~6ukN@Nn+N(uy=uEP(k|3|9@-UsiTkU%<#StK z^0~e?U6|H?^NX4B!nhQrP0#Z~Gjx0}cqm1Q`&GxPS`z+(9%?Ec1+PzZC=FI(cjcKM zGFHLZ8FovmN`_>}hGM8i8RjMaMj%D1XRg|j5`;WTayzVZFH-OMzWb2jKa;Rx)eHmr zhmq)O#cu>KwrEwk6BGk(70GtrGu@)SX6I|BwPG&YLEd$|`g(C42QOOw>Z<8gf@0Zn z9oq{FwT&oKF1L?jm&-hhPiuIBSJ5@tQzl8H`_ye&dnB3_@%99>Oq`Y!YB*JV+A~lZ z?1K&pIQMj0H`p}^CzTdCEgqM63PK!ajQ2r}(p57kw{7GD7!j6`(qNyZb6Y1qe6v|; zrAJ!o2=B+}b8sgyAmBbP*8fYmWkWUOqC${!+7l%$-&=B)IsI9bSaNK)!h4|eG&)$B zfrud&RtktjCnnBemT*c)*?sDoxA#cw3<~jRPz=V_w!Huwj*#P*Vt;fj{MK|46 zbL`!>7^}%8`6eOvLhG!mDIdV^;#N{Rpo4V3Vr&`v&amsBXRM^$WtZr3+pQ$cyx*O_ zEas)7^L6;=DC=Qo;jh3>x@AJyKlT8&~-tzRgddi&UD95;c>D zL7-w}Y)seV%gzNs6_-uWmt)Y0IRevnpfuQS?&PPrbHB@-`y@B|K;6xq_*w5qy+6r3 zNPL#gKB#{<+Z_1u+s*p+t)H*&T>fNuVs~(;Iq=h&AKlnbv4QjZ8p~w=Hog7DjL+V8xSGz3e~Ax)2z+h^#SSNBNlye`C}D`N0C zY3T9=#c^W*sDMCuLjo<>7w}H40{G6bl59vNR*)}|Q?(mbA==E`Ke9$CNypZRNc2q3 z`C35CMVi^@0i@XW1A~i`9>}Du_<5setyMXj{#HoS^NVZMi;4m4P>FSf-Est`Y3vp z33Hm`pfM9TUV+kJf0va^vhmJSjcK`EEwgoEYrU1z|Dfq$O{#xu`uC|*FAk^s8`u92 z?0DE_hf?QGOpKIZ^=dnU=&i2?3F%P(S>UqZJzl+Rb}U?ucx`K7w+1{Sw%PvBahHSLT-;2zC; zuN{T;zT;K=`-ge(bu1Q^e-26)*w*M=>+PGZ^sSb9>(Jm%4*73#p$K!FB1p$P5rgSd zBQGR8VRt8XsZw&Ep(FSp9)Ye9A0u`_949H|dU4BfVbQ^`LsBH=L?H#DCJ)i%dF|`jQEX|j$69tvYmRQ8+(~V3 zw1y{lwR5e}nbz#}y#!*-9#azSBN9v<)T#azM@?EF;Rs>!fr3<$Zopj@rINge+=54ejtp+7)KAeH9vm-$f;OlkmAH5o@w~U0o}HX} zqcDNr z<*R37sb7fY7Yjl@)-vKU9}k?~>TO=!u5N#;m7R!(rlw!G=f&|%lq#1izEv(qz2)*! z9i=(d%c5vc2Gx4#xSTK&bt|V*Mx-fD=yUR6P88#0tT?amkT|<(UtaYqb=Q82e-*RD xrhqo=DUu}pnZ5TXHu6_CbdW^#eW0PVJjkI`I2fXwaG+7ZI?!-|PqQ7j`v<{IxljNA diff --git a/xpra/commands/xpra-launch b/xpra/commands/xpra-launch index 62f1ab1..e3227f8 100755 --- a/xpra/commands/xpra-launch +++ b/xpra/commands/xpra-launch @@ -174,7 +174,7 @@ def main() -> int: print(f"xpra: remote 'xpra start :{display_num}' failed", file=sys.stderr) print(f" Is xpra installed? Run: eve instance provision --instance {instance}", file=sys.stderr) return 1 - print(f"[xpra] server running. Attach via the TUI package action.") + print("[xpra] server running. Attach via the TUI package action.") return 0 if action == "stop":