From 4887abc5773b33ab1e213ed5f528dfebd242e2cd Mon Sep 17 00:00:00 2001 From: salmonik Date: Sun, 1 Nov 2026 22:23:00 +0100 Subject: v4.4.0: stable installers that follow the newest published build Adds web/latest.php: a plain-text feed of the newest version with each artifact's filename and SHA-256. The per-release generated installers are replaced by stable web/install.sh and web/install.ps1; both read the feed, pick the newest build, verify it, install per-user and add a launcher. Publishing a new app version no longer regenerates or versions the installers. publish.sh drops the installer renderer and Python dependency. deploy.sh now also verifies latest.php against the local artifacts and that the served installer scripts match the repository. --- web/install.sh | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 web/install.sh (limited to 'web/install.sh') diff --git a/web/install.sh b/web/install.sh new file mode 100644 index 0000000..998b262 --- /dev/null +++ b/web/install.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# Zagan-Bet installer for Linux. +# +# Asks the site which build is newest, verifies its SHA-256, installs it for +# the current user and adds a launcher. Point it at a staging site with +# ZAGAN_SITE=http://127.0.0.1:8899. +set -euo pipefail + +SITE=${ZAGAN_SITE:-https://zagan.2137697.xyz} +PLATFORM=linux +ARCH=x86_64 + +say() { printf '%s\n' "$*"; } +die() { printf 'install: %s\n' "$*" >&2; exit 1; } + +command -v curl >/dev/null 2>&1 || die "curl is required" +command -v sha256sum >/dev/null 2>&1 || die "sha256sum is required" + +latest=$(curl -fsSL --max-time 30 "$SITE/latest.php") \ + || die "could not read $SITE/latest.php" +line=$(printf '%s\n' "$latest" \ + | awk -v p="$PLATFORM" -v a="$ARCH" '$1 == "gui" && $2 == p && $3 == a { print; exit }') +[ -n "$line" ] || die "no Linux build is published yet" + +version=$(printf '%s\n' "$line" | awk '{print $4}') +binary=$(printf '%s\n' "$line" | awk '{print $5}') +sha=$(printf '%s\n' "$line" | awk '{print $6}') +[ -n "$version" ] && [ -n "$binary" ] && [ -n "$sha" ] \ + || die "the latest-build file is malformed" + +say "Newest Zagan-Bet is $version." + +here=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +source_file="" +for candidate in "$here/$binary" "./$binary" "$HOME/Downloads/$binary"; do + if [ -f "$candidate" ]; then + source_file=$candidate + break + fi +done + +cleanup="" +if [ -z "$source_file" ]; then + cleanup=$(mktemp) || die "cannot create a temporary file" + say "Downloading $binary..." + curl -fsSL --max-time 300 "$SITE/bin/gui/$binary" -o "$cleanup" \ + || die "download failed" + source_file=$cleanup +fi +trap 'if [ -n "$cleanup" ]; then rm -f "$cleanup"; fi' EXIT + +actual=$(sha256sum "$source_file" | awk '{print $1}') +[ "$actual" = "$sha" ] \ + || die "checksum mismatch: expected $sha, got $actual" + +bin_dir="${XDG_BIN_HOME:-$HOME/.local/bin}" +data_dir="${XDG_DATA_HOME:-$HOME/.local/share}" +app="$bin_dir/zagan-bet-gui" +desktop_dir="$data_dir/applications" +icon_dir="$data_dir/icons/hicolor/scalable/apps" + +mkdir -p "$bin_dir" "$desktop_dir" "$icon_dir" +install -m 0755 "$source_file" "$app" + +cat > "$icon_dir/zagan-bet.svg" <<'ICON' + + + + + +ICON + +cat > "$desktop_dir/zagan-bet.desktop" </dev/null 2>&1; then + update-desktop-database "$desktop_dir" >/dev/null 2>&1 || true +fi +if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -q "$data_dir/icons/hicolor" >/dev/null 2>&1 || true +fi + +say "Installed Zagan-Bet $version to $app" +say "A launcher was added to your applications menu." +case ":$PATH:" in + *":$bin_dir:"*) ;; + *) say "Add $bin_dir to PATH to start it as 'zagan-bet-gui'." ;; +esac -- cgit v1.2.3