From f41e1e178f7ce0f074306eea2d4c6083db76d419 Mon Sep 17 00:00:00 2001 From: thepra Date: Sun, 1 Nov 2026 17:10:32 +0100 Subject: [PATCH] packages.arasaka.software is published from its own repository; the release only signs the rpm thepra/packages.arasaka.software now reads this repository's releases and publishes them with every other joined app, so the daily packages and F-Droid jobs, their scripts and the repository's F-Droid settings leave this repository. The release still signs the rpm on its own page with the Arasaka key, as the README promises, and the F-Droid listing stays in packaging/fdroid/metadata, read at each tag. Co-Authored-By: Claude Opus 5.5 --- .gitea/scripts/fdroid.sh | 126 ---------------------------------- .gitea/scripts/packages.sh | 124 --------------------------------- .gitea/scripts/prepare.sh | 2 +- .gitea/scripts/sign-rpm.sh | 19 +++++ .gitea/workflows/fdroid.yml | 22 ------ .gitea/workflows/packages.yml | 24 ------- .gitea/workflows/release.yml | 11 +-- .gitignore | 1 - CLAUDE.md | 77 ++++++--------------- packaging/fdroid/config.yml | 11 --- packaging/fdroid/icon.png | Bin 63166 -> 0 bytes tools/setup.json | 12 ---- 12 files changed, 44 insertions(+), 385 deletions(-) delete mode 100755 .gitea/scripts/fdroid.sh delete mode 100755 .gitea/scripts/packages.sh create mode 100755 .gitea/scripts/sign-rpm.sh delete mode 100644 .gitea/workflows/fdroid.yml delete mode 100644 .gitea/workflows/packages.yml delete mode 100644 packaging/fdroid/config.yml delete mode 100644 packaging/fdroid/icon.png diff --git a/.gitea/scripts/fdroid.sh b/.gitea/scripts/fdroid.sh deleted file mode 100755 index 5f9a71b..0000000 --- a/.gitea/scripts/fdroid.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh -set -eu -version=${1:-} -here=$(pwd) -root=${PACKAGES_ROOT:-/var/www/packages.arasaka.software} -keep=${FDROID_KEEP:-3} -url=https://packages.arasaka.software/fdroid/repo -fingerprint=5F52CFF4F52F4E0B6DA6CD044BFCEAF78D1D42DB24F2470602DB7F19CBFDF846 -id=software.arasaka.meweb -if [ -z "${MEWEB_KEYSTORE_B64:-}" ] || [ -z "${MEWEB_KEYSTORE_PASS:-}" ]; then - echo "::error::the repository secrets MEWEB_KEYSTORE_B64 and MEWEB_KEYSTORE_PASS are not set" - exit 1 -fi -if [ -n "$version" ]; then - apk=$here/releases/$version/MeWeb-$version-android.apk - test -f "$apk" - major=$(echo "$version" | cut -d. -f1) - minor=$(echo "$version" | cut -d. -f2) - patch=$(echo "$version" | cut -d. -f3) - code=$((major * 10000 + minor * 100 + patch)) -elif [ ! -e "$root/fdroid/repo" ]; then - echo "no repository at $root/fdroid/repo yet: the first release makes it" - exit 0 -fi - -tools/setup.sh --group fdroid -tools=$(cd "$here/tools/fdroid/linux-x64" && pwd -P) -uv=$tools/uv-x86_64-unknown-linux-gnu/uv -python=$(command -v python3) -JAVA_HOME=$(ls -d "$here"/tools/jdk/linux-x64/*/ | head -n 1) -ANDROID_HOME=$here/tools/android-sdk -PATH=$JAVA_HOME/bin:$PATH -export JAVA_HOME ANDROID_HOME PATH - -exec 9>>"$root/.lock" -flock -w 2700 9 -work=$(mktemp -d) -trap 'rm -rf "$work"' EXIT -keyless() { - env -u MEWEB_KEYSTORE_B64 -u MEWEB_KEYSTORE_PASS UV_CACHE_DIR="$tools/cache" "$@" -} - -if [ -n "$version" ] && "$tools/current/bin/fdroid" --version > /dev/null 2>&1; then - install=$(readlink -f "$tools/current") -else - settled=$(date -u -d '14 days ago' +%Y-%m-%dT%H:%M:%SZ) - echo fdroidserver | keyless "$uv" pip compile -q --python "$python" --exclude-newer "$settled" --generate-hashes \ - --no-header --no-annotate -o "$work/lock.txt" - - install=$tools/fdroidserver-$(sha256sum < "$work/lock.txt" | cut -c1-12) - if ! "$install/bin/fdroid" --version > /dev/null 2>&1; then - rm -rf "$install" - keyless "$uv" venv -q --python "$python" "$install" - keyless "$uv" pip sync -q --python "$install/bin/python" "$work/lock.txt" - cp "$work/lock.txt" "$install/lock.txt" - fi -fi -tool=$("$install/bin/fdroid" --version) -stamp=$( { cat "$install/lock.txt"; cd packaging/fdroid && find config.yml icon.png metadata -type f | LC_ALL=C sort | xargs sha256sum; } | sha256sum | cut -d' ' -f1) -if [ -z "$version" ] && [ "$(cat "$(readlink -f "$root/fdroid/repo")/../built-from" 2>/dev/null)" = "$stamp" ]; then - echo "nothing new: the repository is already built with fdroidserver $tool and this listing" - exit 0 -fi -echo "fdroidserver $tool, $(basename "$install")" - -(umask 077 && printf '%s' "$MEWEB_KEYSTORE_B64" | base64 -d > "$work/meweb.keystore") -MEWEB_KEYSTORE=$work/meweb.keystore -export MEWEB_KEYSTORE MEWEB_KEYSTORE_PASS -unset MEWEB_KEYSTORE_B64 -held=$(keytool -J-Duser.language=en -list -v -keystore "$MEWEB_KEYSTORE" -storepass:env MEWEB_KEYSTORE_PASS -alias meweb | sed -n 's/^.*SHA256: *//p' | tr -d ':') -test "$held" = "$fingerprint" - -state=$root/.fdroid -snap=$state/$(date -u +%Y%m%d%H%M%S)-${version:-tools} -mkdir -p "$snap/repo" "$snap/metadata" "$snap/tmp" -if [ -e "$root/fdroid/repo" ]; then - prior=$(readlink -f "$root/fdroid/repo")/.. - for file in "$prior"/repo/*.apk; do - [ -e "$file" ] && ln "$file" "$snap/repo/" - done - for icons in "$prior"/repo/icons*; do - [ -d "$icons" ] && cp -a "$icons" "$snap/repo/" - done - cp -a "$prior/metadata/." "$snap/metadata/" - cp "$prior/repo/index-v2.json" "$snap/repo/" - if [ -f "$prior/tmp/apkcache.json" ]; then cp "$prior/tmp/apkcache.json" "$snap/tmp/"; fi -fi -cp packaging/fdroid/config.yml "$snap/config.yml" -chmod 600 "$snap/config.yml" -cp packaging/fdroid/icon.png "$snap/icon.png" -cp -r packaging/fdroid/metadata/. "$snap/metadata/" -if [ -n "$version" ]; then - rm -f "$snap/repo/${id}_$code.apk" - cp "$apk" "$snap/repo/${id}_$code.apk" -fi -(cd "$snap/repo" && ls "$id"_*.apk | sed 's/.*_\([0-9]*\)\.apk$/\1/' | sort -n | head -n "-$keep" | while read -r old; do - rm -f "${id}_$old.apk" -done) -newest=$(cd "$snap/repo" && ls "$id"_*.apk | sed 's/.*_\([0-9]*\)\.apk$/\1/' | sort -n | tail -n 1) - -(cd "$snap" && "$install/bin/fdroid" update) -rm -rf "$snap/repo/status" -chmod -R u=rwX,go=rX "$snap/repo" -echo "$stamp" > "$snap/built-from" - -mkdir -p "$root/fdroid" -ln -sfn "../.fdroid/$(basename "$snap")/repo" "$root/fdroid/repo.new" -mv -T -f "$root/fdroid/repo.new" "$root/fdroid/repo" -ls -1d "$state"/*/ | sort | head -n -3 | while read -r old; do - find "$old" -maxdepth 0 -mmin +1440 -exec rm -rf {} + -done -echo "published $root/fdroid/repo, newest ${id}_$newest.apk, with fdroidserver $tool" - -if [ "$root" = /var/www/packages.arasaka.software ]; then - curl -fsS "$url/entry.jar" -o "$work/entry.jar" - signed=$(keytool -J-Duser.language=en -printcert -jarfile "$work/entry.jar" | sed -n 's/^.*SHA256: *//p' | head -n 1 | tr -d ':') - test "$signed" = "$fingerprint" - curl -fsS "$url/index-v2.json" | grep -Eq "\"versionCode\": ?$newest\b" - curl -fsSI "$url/${id}_$newest.apk" > /dev/null - echo "live at $url: newest $id $newest" -fi - -ln -sfn "$(basename "$install")" "$tools/current.new" -mv -T -f "$tools/current.new" "$tools/current" -for old in "$tools"/fdroidserver-*; do - [ "$old" = "$install" ] || rm -rf "$old" -done diff --git a/.gitea/scripts/packages.sh b/.gitea/scripts/packages.sh deleted file mode 100755 index 17c10a9..0000000 --- a/.gitea/scripts/packages.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh -set -eu -version=${1:-} -root=${PACKAGES_ROOT:-/var/www/packages.arasaka.software} -keep=${PACKAGES_KEEP:-5} -url=https://packages.arasaka.software -fingerprint=F92C166E9B1C13EDD1629E76888DCF969D133FB2 -if [ -n "$version" ]; then - releases=$(pwd)/releases/$version - deb=$releases/MeWeb-$version-linux-x64.deb - rpm=$releases/MeWeb-$version-linux-x64.rpm - test -f "$deb" - test -f "$rpm" -elif [ ! -e "$root/apt" ] || [ ! -e "$root/rpm" ]; then - echo "no repositories at $root yet: the first release makes them" - exit 0 -fi -tools=$(dpkg-query -W -f '${Package} ${Version}\n' apt-utils createrepo-c dpkg gnupg rpm) -named=$(echo "$tools" | paste -sd, - | sed 's/,/, /g') -stamp=$( { echo "$tools"; cat "$0"; } | sha256sum | cut -d' ' -f1) - -exec 9>>"$root/.lock" -flock -w 2700 9 -if [ -z "$version" ] && [ "$(cat "$(readlink -f "$root/apt")/../built-from" 2>/dev/null)" = "$stamp" ]; then - echo "nothing new: the repositories are already built with $named" - exit 0 -fi -echo "$named" - -keys=$(mktemp -d) -trap 'rm -rf "$keys"' EXIT -export GNUPGHOME="$keys" -printf '%s\n' "$PACKAGES_SIGNING_KEY" | gpg --batch --quiet --import -gpg --batch --with-colons --list-secret-keys | grep -q "^fpr:::::::::$fingerprint:$" -gpg --batch --armor --export "$fingerprint" > "$keys/public.asc" - -if [ -n "$version" ]; then - rpmsign --define "__gpg /usr/bin/gpg" --define "_gpg_name $fingerprint" --define "_gpg_path $keys" --addsign "$rpm" >/dev/null - rpmkeys --dbpath "$keys/rpmdb" --import "$keys/public.asc" - rpmkeys --dbpath "$keys/rpmdb" -K "$rpm" | grep -q 'digests signatures OK' - - full=$(dpkg-deb -f "$deb" Version) - test "$(dpkg-deb -f "$deb" Package)" = meweb - test "${full%-*}" = "$version" - debname=meweb_${full}_$(dpkg-deb -f "$deb" Architecture).deb - rpmname=$(rpm -qp --nosignature --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm' "$rpm") - test "$(rpm -qp --nosignature --qf '%{NAME} %{VERSION}' "$rpm")" = "meweb $version" -fi - -snap=$root/.snap/$(date -u +%Y%m%d%H%M%S)-${version:-tools} -mkdir -p "$snap/apt/pool/main" "$snap/rpm" -if [ -d "$root/apt/pool/main" ]; then cp -al "$root/apt/pool/main/." "$snap/apt/pool/main/"; fi -if [ -d "$root/rpm" ]; then - for folder in "$root"/rpm/*/; do - [ "$(basename "$folder")" = repodata ] || cp -al "$folder" "$snap/rpm/" - done -fi -mkdir -p "$snap/apt/pool/main/m/meweb" "$snap/rpm/meweb" -if [ -n "$version" ]; then - rm -f "$snap/apt/pool/main/m/meweb/$debname" "$snap/rpm/meweb/$rpmname" - cp "$deb" "$snap/apt/pool/main/m/meweb/$debname" - cp "$rpm" "$snap/rpm/meweb/$rpmname" -fi -for folder in "$snap/apt/pool/main/m/meweb" "$snap/rpm/meweb"; do - ls "$folder" | sed -E 's/^meweb[_-]([0-9.]+)-.*/\1/' | sort -uV | head -n "-$keep" | while read -r old; do - rm -f "$folder/meweb_$old-"* "$folder/meweb-$old-"* - done -done -if [ -z "$version" ]; then - debname=$(ls "$snap/apt/pool/main/m/meweb" | sort -V | tail -n 1) - rpmname=$(ls "$snap/rpm/meweb" | sort -V | tail -n 1) - full=$(dpkg-deb -f "$snap/apt/pool/main/m/meweb/$debname" Version) -fi - -binary=$snap/apt/dists/stable/main/binary-amd64 -mkdir -p "$binary" -(cd "$snap/apt" && apt-ftparchive packages pool) > "$binary/Packages" -gzip -9nc "$binary/Packages" > "$binary/Packages.gz" -(cd "$snap/apt/dists/stable" && apt-ftparchive \ - -o APT::FTPArchive::Release::Origin=Arasaka -o APT::FTPArchive::Release::Label=Arasaka \ - -o APT::FTPArchive::Release::Suite=stable -o APT::FTPArchive::Release::Codename=stable \ - -o APT::FTPArchive::Release::Architectures=amd64 -o APT::FTPArchive::Release::Components=main \ - -o APT::FTPArchive::Release::NotAutomatic=yes -o APT::FTPArchive::Release::ButAutomaticUpgrades=yes \ - -o "APT::FTPArchive::Release::Description=Arasaka packages" release .) > "$keys/Release" -mv "$keys/Release" "$snap/apt/dists/stable/Release" -gpg --batch --yes --local-user "$fingerprint" --clearsign -o "$snap/apt/dists/stable/InRelease" "$snap/apt/dists/stable/Release" -gpg --batch --yes --local-user "$fingerprint" --armor --detach-sign -o "$snap/apt/dists/stable/Release.gpg" "$snap/apt/dists/stable/Release" - -createrepo_c --quiet "$snap/rpm" -repodata=$snap/rpm/repodata -gpg --batch --yes --local-user "$fingerprint" --armor --detach-sign -o "$repodata/repomd.xml.asc" "$repodata/repomd.xml" -cp "$keys/public.asc" "$repodata/repomd.xml.key" -if [ -f "$root/rpm/repodata/repomd.xml" ]; then - grep -o 'repodata/[^"]*' "$root/rpm/repodata/repomd.xml" | while read -r href; do - [ -e "$snap/rpm/$href" ] || cp "$root/rpm/$href" "$snap/rpm/$href" - done -fi -chmod -R u=rwX,go=rX "$snap" -echo "$stamp" > "$snap/built-from" - -for part in apt rpm; do - ln -sfn ".snap/$(basename "$snap")/$part" "$root/$part.new" - mv -T -f "$root/$part.new" "$root/$part" -done -ls -1d "$root"/.snap/* | sort | head -n -3 | while read -r old; do - find "$old" -maxdepth 0 -mmin +1440 -exec rm -rf {} + -done -echo "published $root/apt and $root/rpm, newest $debname and $rpmname" - -if [ -n "$version" ]; then - (cd "$releases" && for file in $(ls | LC_ALL=C sort); do [ "$file" = SHA256SUMS.txt ] || sha256sum "$file"; done) > "$keys/sums" - mv "$keys/sums" "$releases/SHA256SUMS.txt" -fi - -if [ "$root" = /var/www/packages.arasaka.software ]; then - curl -fsS "$url/apt/dists/stable/main/binary-amd64/Packages" | grep -qx "Version: $full" - curl -fsS "$url/apt/dists/stable/InRelease" > "$keys/InRelease" - gpg --batch --quiet --verify "$keys/InRelease" - curl -fsS "$url/rpm/repodata/repomd.xml" > "$keys/repomd.xml" - curl -fsS "$url/rpm/repodata/repomd.xml.asc" > "$keys/repomd.xml.asc" - gpg --batch --quiet --verify "$keys/repomd.xml.asc" "$keys/repomd.xml" - curl -fsSI "$url/rpm/meweb/$rpmname" > /dev/null - echo "live at $url: meweb $full" -fi diff --git a/.gitea/scripts/prepare.sh b/.gitea/scripts/prepare.sh index c0abafd..138ca93 100755 --- a/.gitea/scripts/prepare.sh +++ b/.gitea/scripts/prepare.sh @@ -8,7 +8,7 @@ fi echo "VERSION=$version" >> "$GITHUB_ENV" echo "COMMIT=$(echo "$GITHUB_SHA" | cut -c1-8)" >> "$GITHUB_ENV" keep="$HOME/.cache/meweb" -for dir in tools/cache tools/jdk tools/packaging tools/android-sdk tools/fdroid; do +for dir in tools/cache tools/jdk tools/packaging tools/android-sdk; do mkdir -p "$keep/$dir" rm -rf "$dir" ln -s "$keep/$dir" "$dir" diff --git a/.gitea/scripts/sign-rpm.sh b/.gitea/scripts/sign-rpm.sh new file mode 100755 index 0000000..b0c009e --- /dev/null +++ b/.gitea/scripts/sign-rpm.sh @@ -0,0 +1,19 @@ +#!/bin/sh +set -eu +version=$1 +releases=$(pwd)/releases/$version +rpm=$releases/MeWeb-$version-linux-x64.rpm +fingerprint=F92C166E9B1C13EDD1629E76888DCF969D133FB2 +test -f "$rpm" +keys=$(mktemp -d) +trap 'rm -rf "$keys"' EXIT +export GNUPGHOME="$keys" +printf '%s\n' "$PACKAGES_SIGNING_KEY" | gpg --batch --quiet --import +gpg --batch --with-colons --list-secret-keys | grep -q "^fpr:::::::::$fingerprint:$" +gpg --batch --armor --export "$fingerprint" > "$keys/public.asc" +rpmsign --define "__gpg /usr/bin/gpg" --define "_gpg_name $fingerprint" --define "_gpg_path $keys" --addsign "$rpm" > /dev/null +rpmkeys --dbpath "$keys/rpmdb" --import "$keys/public.asc" +rpmkeys --dbpath "$keys/rpmdb" -K "$rpm" | grep -q 'digests signatures OK' +(cd "$releases" && for file in $(ls | LC_ALL=C sort); do [ "$file" = SHA256SUMS.txt ] || sha256sum "$file"; done) > "$keys/sums" +mv "$keys/sums" "$releases/SHA256SUMS.txt" +echo "signed $(basename "$rpm") with $fingerprint" diff --git a/.gitea/workflows/fdroid.yml b/.gitea/workflows/fdroid.yml deleted file mode 100644 index 957dd17..0000000 --- a/.gitea/workflows/fdroid.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: F-Droid tools - -on: - schedule: - - cron: '23 5 * * *' - workflow_dispatch: - -jobs: - refresh: - name: The newest F-Droid tools, tried on the repository - runs-on: nuvola - steps: - - uses: actions/checkout@v4 - - - name: Prepare - run: .gitea/scripts/prepare.sh - - - name: Rebuild the repository on packages.arasaka.software when the tools or the listing changed - env: - MEWEB_KEYSTORE_B64: ${{ secrets.MEWEB_KEYSTORE_B64 }} - MEWEB_KEYSTORE_PASS: ${{ secrets.MEWEB_KEYSTORE_PASS }} - run: .gitea/scripts/fdroid.sh diff --git a/.gitea/workflows/packages.yml b/.gitea/workflows/packages.yml deleted file mode 100644 index 6a00ece..0000000 --- a/.gitea/workflows/packages.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Package tools - -on: - schedule: - - cron: '43 5 * * *' - workflow_dispatch: - -jobs: - refresh: - name: The box's updated package tools, tried on the apt and rpm repositories - runs-on: nuvola - steps: - - uses: actions/checkout@v4 - - - name: Check that the box brought the tools up to date this morning - run: | - systemctl show packages-tools -p Result -p ExecMainExitTimestamp - systemctl is-active --quiet packages-tools.timer - test "$(systemctl show packages-tools -p Result --value)" = success - - - name: Rebuild the apt and rpm repositories on packages.arasaka.software when the tools changed - env: - PACKAGES_SIGNING_KEY: ${{ secrets.PACKAGES_SIGNING_KEY }} - run: .gitea/scripts/packages.sh diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 91a6119..b93acd0 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -43,21 +43,14 @@ jobs: MEWEB_KEYSTORE_PASS: ${{ secrets.MEWEB_KEYSTORE_PASS }} run: .gitea/scripts/android.sh - - name: The deb and rpm on packages.arasaka.software, the rpm signed + - name: The rpm signed with the Arasaka packages key if: ${{ github.ref_type == 'tag' }} env: PACKAGES_SIGNING_KEY: ${{ secrets.PACKAGES_SIGNING_KEY }} - run: .gitea/scripts/packages.sh "$VERSION" + run: .gitea/scripts/sign-rpm.sh "$VERSION" - name: Publish the release if: ${{ github.ref_type == 'tag' || inputs.publish == 'true' }} env: RELEASE_TOKEN: ${{ secrets.GITEA_TOKEN }} run: .gitea/scripts/release.sh "v$VERSION" releases/"$VERSION"/* - - - name: The APK in the F-Droid repository on packages.arasaka.software - if: ${{ github.ref_type == 'tag' }} - env: - MEWEB_KEYSTORE_B64: ${{ secrets.MEWEB_KEYSTORE_B64 }} - MEWEB_KEYSTORE_PASS: ${{ secrets.MEWEB_KEYSTORE_PASS }} - run: .gitea/scripts/fdroid.sh "$VERSION" diff --git a/.gitignore b/.gitignore index cb3af86..4ef3d9c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,6 @@ appsettings.*.local.json /tools/packaging/ /tools/android-sdk/ /tools/cache/ -/tools/fdroid/ /tools/logs/ /.claude/settings.local.json /artifacts/ diff --git a/CLAUDE.md b/CLAUDE.md index d3671ba..09ffe2a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,9 +44,8 @@ is root-owned, so CI uses the runner user's own `~/.dotnet` (passolo's `tools/re | `MEWEB_KEYSTORE` | release step | a temporary file in `$RUNNER_TEMP` decoded by `.gitea/scripts/android.sh`, removed on exit | `build.yml` runs on every push to `master`; `release.yml` on a `v*` tag (publishes the Gitea release) or by hand -(`publish: false` builds every platform and deploys the server only); `fdroid.yml` daily at 05:23 UTC or by hand -(the F-Droid tools, below); `packages.yml` daily at 05:43 UTC or by hand (the deb and rpm tools, below). All four -run on the Arasaka org runner `nuvola`, +(`publish: false` builds every platform and deploys the server only). Both run on `nuvola`, the instance-wide runner +on the box (since 1 Nov 2026 it also takes the jobs labelled `build`), user `gitea-runner`, home `/var/lib/gitea-runner`: `tools/sdk.sh` installs the SDK from `global.json` into its `~/.dotnet` (the system SDK in `/opt/dotnet` is older and root-owned), and the JDK, nfpm and the Android SDK are cached in `~/.cache/meweb`. There is deliberately no `pull_request` trigger: the runner is the production box. @@ -161,58 +160,26 @@ The Android release key: alias `meweb`, certificate SHA-256 the network and the block without the publisher's server. A change to any knowledge file's format bumps `KnowledgeFeeder.Format` and the `"format":N` that `wait-knowledge.sh` waits for: the feeder rebuilds only when a source changes or the format differs, and a release must not embed the previous build. -- **The deb and rpm reach packages.arasaka.software from this repository's own release job.** On tags, - `.gitea/scripts/packages.sh` runs on the `nuvola` runner (host mode, user `gitea-runner`, which owns - `/var/www/packages.arasaka.software`). It imports the org secret `PACKAGES_SIGNING_KEY` into a throwaway - `GNUPGHOME`, refuses any key but `F92C166E…3FB2`, signs the rpm in place, hard-links the current pool into a new - `.snap/` folder, adds this version, keeps the newest five, rebuilds and signs the apt (`InRelease`, `Release.gpg`) - and rpm (`repomd.xml.asc`) metadata, carries over the files the previous `repomd.xml` named so a client mid-refresh - still finds them, swaps the `apt` and `rpm` links, rewrites `SHA256SUMS.txt` for the signed rpm, and checks the live - site. Never copy a package over a pool file: the pools are hard links into older snapshots, so it is `rm` then `cp`. - `PACKAGES_ROOT` and `PACKAGES_KEEP` exist for a test against a copy. YoloCICD, which used to do this, was erased on - 23 Oct 2026. `packaging/arasaka-repository.sh` is written into both maintainer scripts by `tools/release.cs`; it is - now maintained here by hand, and any change to a file it writes needs the old content's SHA-256 kept in - `arasaka_repository_known`, or installed copies are treated as edited by hand and left alone. The package owns - `/usr/share/arasaka-repository/meweb`, the marker that keeps the repository configured while any Arasaka package - is installed. The signing key's only copies are that secret and the owner's Nextcloud backup. - **The tools that build these two repositories are the box's own Ubuntu packages** (`apt-utils` for - `apt-ftparchive`, `createrepo-c`, `dpkg`, `gnupg`, `rpm`), and **a daily job keeps them current** (owner, 31 Oct - 2026: the same daily update as the F-Droid tools). The runner cannot install packages, so the update is a root - timer on the box, `packages-tools.timer` at 05:13 UTC (source and setup in arasaka.software, - `deploy/packages.arasaka.software/`). It upgrades only those packages, from Ubuntu's updates and security - fixes, with package lists of its own, so it never brings the rest of the box forward. There is no two-week wait, - as there is for fdroidserver: Ubuntu reviews and signs these updates itself. `packages.yml` follows at 05:43 UTC. It fails if - the morning's update failed (it reads the result with `systemctl show`, which needs no rights), then runs this - script with no version. When the tools' versions or this script differ from what the live repositories were built - from (`built-from` beside each snapshot), it rebuilds and re-signs both from the current pools with no new package, - swaps the links and checks the live site; otherwise it says "nothing new" and names the versions. Unlike - fdroidserver, these tools cannot be kept beside an older copy, so a release uses whatever is installed; an update - that breaks them fails the next morning's job first. -- **The APK reaches an F-Droid repository on packages.arasaka.software from the same job** (31 Oct 2026), after the - release is published, so the repository can lag the release page but never lead it. `.gitea/scripts/fdroid.sh` - installs fdroidserver with uv from `setup.json` (its download cache in `tools/fdroid`, cached like the JDK), because - the box has no `ensurepip` and the apt package would bring 242 others. **Nothing pins fdroidserver; a daily job - keeps it current** (owner, 31 Oct 2026: a daily service, not patching it from time to time). `fdroid.yml` runs the - same script with no version at 05:23 UTC: it resolves the newest fdroidserver, and the newest of everything it - needs, published at least 14 days earlier (a bad upload has usually been pulled by then), against the box's own - `python3`, into a hash-locked list; a new list gets its own install, `fdroidserver-` in the cache's - real path (an install's scripts carry the absolute path they were made at; 0.15.1 failed with `fdroid: not found` on - one made from a deleted folder). When that list or the listing in `packaging/fdroid/` differs from what the live - repository was built from (`built-from` beside each snapshot), it rebuilds the repository with it, and only once - that is live and verified does the install become `current` and the older ones go. A release uses `current` and - downloads nothing, so a new fdroidserver that breaks fails the daily job, never a release; the job's log names the - version. Every install runs with the signing key out of its environment. - It signs the repository with the APK's own key (`MEWEB_KEYSTORE_B64` and `MEWEB_KEYSTORE_PASS`, alias `meweb`), so - the F-Droid fingerprint is the certificate's `5F52CFF4…FDF846` and there is no second key to lose; it refuses any - other. It builds a new snapshot in - `/var/www/packages.arasaka.software/.fdroid/` from the live one (the APKs as hard links, so `rm` then `cp` as above; - the metadata, the icons, `apkcache.json` and the previous `index-v2.json`, which is where fdroidserver reads each - APK's first date; without the icons a rebuild with no new APK fails, because the cache skips extracting them), adds - this version (a release) or nothing (the daily job), keeps the newest three, runs `fdroid update`, deletes `repo/status/` (it names the - build machine's paths and `/etc/issue.net`), swaps the `fdroid/repo` link and checks the live signature. The key - was already never to be regenerated; now everyone who added the repository trusts only its fingerprint too. `packaging/fdroid/` holds the - repository's settings, its icon (the Arasaka emblem) and the app's listing in English and Italian; the download - page links to it and to Obtainium (`Endpoints.FDroid`, source `FDroidRepo`). +- **packages.arasaka.software is fed from outside this repository** (since 1 Nov 2026). The private repository + `thepra/packages.arasaka.software` lists this app in `apps/meweb.yml`, reads every `v*` release from the Releases + tab every 15 minutes, and publishes the newest five debs and rpms, the newest three APKs in the F-Droid repository + and the newest Windows and macOS files under `/download/meweb/`, all signed with keys that live as `thepra`'s own + secrets. Its README is the reference. What this repository still owes it: + - **The release must carry every file named in that entry and list each in `SHA256SUMS.txt`**, or the publisher + leaves the version out and keeps serving the previous one. Renaming a release file means changing `apps/meweb.yml` + in the same hour. + - **The rpm is signed here, before the release is published**, by `.gitea/scripts/sign-rpm.sh` with the Arasaka org + secret `PACKAGES_SIGNING_KEY` (it refuses any key but `F92C166E…3FB2`), which then rewrites `SHA256SUMS.txt`, so + the README's promise holds for the file on the release page too; the publisher sees the signature and keeps it. + - **The F-Droid listing stays in `packaging/fdroid/metadata/`** (English and Italian); the publisher reads it at the + release's tag. The repository's own settings and icon moved there. + - **The APK's signing key also signs the F-Droid index**, so `MEWEB_KEYSTORE_B64` exists twice: here, to sign the + APK, and as `thepra`'s `FDROID_KEYSTORE_B64`. The publisher refuses an APK signed by anything but `5f52cff4…f846`. + - `packaging/arasaka-repository.sh` is written into both maintainer scripts by `tools/release.cs`; it is + maintained here by hand, and any change to a file it writes needs the old content's SHA-256 kept in + `arasaka_repository_known`, or installed copies are treated as edited by hand and left alone. The package owns + `/usr/share/arasaka-repository/meweb`, the marker that keeps the repository configured while any Arasaka package + is installed. The portal app (`arasaka.software`, `arasaka-portal`) carries a byte-identical copy; change both. - **The server cannot ping**: `NoNewPrivileges` drops `ping`'s file capability and `ping_group_range` is closed, so the trace back to a caller uses `tracepath` (UDP, unprivileged) and keeps only public hops outside `Probe:Refuse`, so the box's own network never reaches an app. diff --git a/packaging/fdroid/config.yml b/packaging/fdroid/config.yml deleted file mode 100644 index b34e364..0000000 --- a/packaging/fdroid/config.yml +++ /dev/null @@ -1,11 +0,0 @@ -repo_url: https://packages.arasaka.software/fdroid/repo -repo_name: Arasaka -repo_description: >- - Apps published by Arasaka di Hvozdikov Yevheniy, Busto Arsizio, Italy, such as “me-web?”. - Each app here is the same signed file as on its release page. -repo_icon: icon.png -archive_older: 0 -repo_keyalias: meweb -keystore: {env: MEWEB_KEYSTORE} -keystorepass: {env: MEWEB_KEYSTORE_PASS} -keypass: {env: MEWEB_KEYSTORE_PASS} diff --git a/packaging/fdroid/icon.png b/packaging/fdroid/icon.png deleted file mode 100644 index f8e333e45f88997cdbac895a95d04612373bbbda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63166 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⁡JQWO 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 LNkvXXu0mjf$fg(w diff --git a/tools/setup.json b/tools/setup.json index fddc5e6..f07a348 100644 --- a/tools/setup.json +++ b/tools/setup.json @@ -47,18 +47,6 @@ "kind": "tar", "dest": "tools/jdk/osx-arm64", "check": "tools/jdk/osx-arm64/jdk-21.0.12+8/Contents/Home/bin/java" - }, - { - "name": "uv", - "group": "fdroid", - "version": "0.13.1", - "license": "MIT or Apache-2.0 (build tool, not distributed)", - "rid": "linux-x64", - "url": "https://github.com/astral-sh/uv/releases/download/0.13.1/uv-x86_64-unknown-linux-gnu.tar.gz", - "sha256": "eadd9d27c134ab5ac1ffd4473b97a741407f3ea238288f03121fc4deddf90220", - "kind": "tar", - "dest": "tools/fdroid/linux-x64", - "check": "tools/fdroid/linux-x64/uv-x86_64-unknown-linux-gnu/uv" } ] }