ci / web (push) Successful in 1m3s
ci / docs-site (push) Successful in 2m11s
ci / rust-arm64 (push) Successful in 2m41s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Successful in 11s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Successful in 11s
docker / builders (ci/arch-ci.Dockerfile, punktfunk-arch-ci) (push) Successful in 24s
deb / build-publish-client-arm64 (push) Successful in 2m28s
docker / builders (ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 8s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 7s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 7s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Successful in 13s
apple / swift (push) Successful in 4m48s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m36s
arch / build-publish (push) Successful in 7m20s
ci / rust (push) Successful in 7m21s
deb / build-publish-host (push) Successful in 7m4s
docker / builders-arm64cross (push) Successful in 8s
deb / build-publish (push) Successful in 5m31s
docker / deploy-docs (push) Successful in 34s
android / android (push) Successful in 8m17s
windows-host / package (push) Successful in 10m43s
windows-host / winget-source (push) Skipped
windows-host / canary-manifest (push) Successful in 18s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 16m40s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Failing after 17m31s
apple / screenshots (push) Successful in 20m57s
Fallout from the documentation sweep: verifying doc claims against the code
turned up defects in the code and the shipped templates. Mostly comments that
describe behaviour we no longer have — which is how the docs went wrong in the
first place, since someone reads the comment and writes the page.
The one that mattered: a fresh deb/RPM/Arch install could not start the host at
all. The unit's `EnvironmentFile=` had no `-`, making host.env mandatory, and no
package creates it — all three ship only the templates under /usr/share and the
postinst merely prints the copy command. So `systemctl --user enable --now
punktfunk-host` died on "Failed to load environment files". Every field in
HostConfig::from_env resolves through unwrap_or/filter/None, so absent means all
defaults, exactly like a hand-run `serve`; the Nix module already wrote it as
`-${environmentFile}`. The Deck installer's own generated unit gets the same
prefix for the case where an operator later removes the file.
Shipped templates: PUNKTFUNK_SECURE_DDA is read by nothing (DDA/WGC are gone;
IDD-push is the sole Windows capture path and the secure desktop is
unconditional), so it stops being written into a fresh host.env;
PUNKTFUNK_INPUT_BACKEND offered a `uinput` value that does not exist and omitted
`kwin`, which is what a KDE session actually resolves to; PUNKTFUNK_RENDER_ADAPTER
no longer claims to pick a "Desktop-Duplication" GPU.
Comments corrected rather than deleted, since each explains a real why:
PUNKTFUNK_10BIT is default-on with explicit-off grammar, not an operator opt-in;
GNOME reaches EIS through Mutter's direct RemoteDesktop API, so it needs no portal
approval and is headless-capable; and the host does not run in session 0 — the
service is the session-0 supervisor and the host runs as SYSTEM in the interactive
console session, which is why game_term has to bind the input desktop at all.
packaging/bazzite/update-punktfunk.sh is now installed to /usr/share/punktfunk/,
so the command the docs promised exists.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
66 lines
3.1 KiB
Bash
Executable File
66 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Update the layered punktfunk packages on a Bazzite / Fedora-Atomic host.
|
|
#
|
|
# Why this exists: `rpm-ostree upgrade` upgrades the *base image* and only re-resolves
|
|
# layered packages WHEN THE BASE CHANGES. Bazzite bases can sit frozen for months (a pinned
|
|
# `:stable` tag, a paused rebase), so `rpm-ostree upgrade` keeps reporting "No updates
|
|
# available" and your layered punktfunk never moves even though newer RPMs are in the repo.
|
|
# The fix is to force rpm-ostree to re-resolve just the punktfunk layer against the latest
|
|
# repo metadata — an `--uninstall … --install …` of the same package names in one
|
|
# transaction. This script does that for whichever of punktfunk / punktfunk-web are layered.
|
|
#
|
|
# Usage: sudo bash update-punktfunk.sh # stage the newest; you reboot when ready
|
|
# sudo bash update-punktfunk.sh --reboot # stage, then reboot immediately
|
|
#
|
|
# Channel note: it re-resolves against every ENABLED punktfunk repo. If both
|
|
# `punktfunk.repo` (stable) and `punktfunk-canary.repo` are enabled, canary's version sorts
|
|
# higher and WINS — the box silently tracks canary. Enable exactly the channel you want
|
|
# (set `enabled=0` in the other `/etc/yum.repos.d/punktfunk*.repo`).
|
|
set -euo pipefail
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "run as root: sudo bash $0 ${*:-}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# The sysext path (packaging/bazzite/punktfunk-sysext.sh) supersedes layering entirely — if the
|
|
# box runs the sysext, it shadows any layered copy and THIS script won't change what executes.
|
|
if [[ -f /var/lib/extensions/punktfunk.raw ]]; then
|
|
echo "NOTE: the punktfunk sysext is installed — update with 'punktfunk-sysext update' instead." >&2
|
|
echo " (a layered punktfunk is shadowed by the sysext; consider removing the layer:" >&2
|
|
echo " rpm-ostree uninstall punktfunk punktfunk-web)" >&2
|
|
fi
|
|
|
|
# Which punktfunk packages are actually layered right now (host, web, or both).
|
|
mapfile -t layered < <(rpm-ostree status --json 2>/dev/null \
|
|
| grep -oE '"punktfunk(-web)?"' | tr -d '"' | sort -u)
|
|
if [[ ${#layered[@]} -eq 0 ]]; then
|
|
# Fall back to the rpm db if the JSON shape ever changes.
|
|
mapfile -t layered < <(rpm -qa --qf '%{NAME}\n' 'punktfunk' 'punktfunk-web' 2>/dev/null | sort -u)
|
|
fi
|
|
if [[ ${#layered[@]} -eq 0 ]]; then
|
|
echo "no punktfunk packages are layered — install first (see https://docs.punktfunk.unom.io/docs/bazzite)" >&2
|
|
exit 1
|
|
fi
|
|
echo "layered punktfunk packages: ${layered[*]}"
|
|
|
|
# Fresh repo metadata, else the re-resolve can pick a stale 'newest'.
|
|
rpm-ostree refresh-md --force >/dev/null
|
|
|
|
# Force the re-resolve: remove + re-add the same names in ONE transaction so the box is never
|
|
# left without the host, and rpm-ostree picks the newest available version.
|
|
args=()
|
|
for p in "${layered[@]}"; do args+=(--uninstall "$p"); done
|
|
for p in "${layered[@]}"; do args+=(--install "$p"); done
|
|
echo "+ rpm-ostree update ${args[*]}"
|
|
rpm-ostree update "${args[@]}"
|
|
|
|
echo
|
|
echo "Staged. The new version activates on the next boot."
|
|
if [[ "${1:-}" == "--reboot" ]]; then
|
|
echo "rebooting now…"
|
|
systemctl reboot
|
|
else
|
|
echo "Reboot when ready: systemctl reboot"
|
|
fi
|