2190dad2ad
Layering is a last resort per the Bazzite docs (slows every OS update, can block upgrades until removed); a sysext never enters an rpm-ostree transaction, survives OS updates, and installs/updates with no reboot — the mechanism Fedora Atomic ships via fedora-sysexts. - build-sysext.sh wraps the built host+web RPMs into punktfunk-<V-R>-x86-64.raw: /etc payload relocated to /usr/share/punktfunk/etc (a sysext carries only /usr), the punktfunk-sysext helper embedded, ID=fedora + VERSION_ID pinned (merges on Bazzite via ID_LIKE; REFUSED after a major rebase instead of running soname-broken binaries — both behaviors validated live on Bazzite 43). SELinux labels are baked in as squashfs pseudo-xattrs from matchpathcon: unlabeled files run fine for user units but system daemons are DENIED (udev couldn't read the gamepad rule under enforcing) — validated on-glass. Refuses duplicate input package names (a stale noarch punktfunk-web next to the x86_64 one built a chimera image with the dead node launcher once). - punktfunk-sysext.sh: install/update/status/remove against per-Fedora-major feeds (…/generic/punktfunk-sysext/f43[-canary]), SHA-256-verified, applies the udev/sysctl scriptlet work + /etc copies, prints the layering-migration hint. Live-validated on the .41 Bazzite box incl. service restart + web console. - publish-sysext-feed.sh + rpm.yml: build + publish the image per matrix leg (fedver 43/44), canary feeds pruned to 6, stable release assets attached. - update-punktfunk.sh warns when the sysext shadows a layered install. Co-Authored-By: Claude Fable 5 <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 packaging/bazzite/README.md)" >&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
|