aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-07-13 12:00:40 +0200
committerDanilo M. <danix@danix.xyz>2026-07-13 12:00:40 +0200
commitb8441351311181eeb76f620abed2d2c26a92e963 (patch)
tree2452b28481479fd6817cbcaa37114e699798f0d3
parent4db7f465a048d5a52f7410005b81f3435e678a3d (diff)
downloadsbo-slackbuilds-b8441351311181eeb76f620abed2d2c26a92e963.tar.gz
sbo-slackbuilds-b8441351311181eeb76f620abed2d2c26a92e963.zip
image-builder: config + lib.sh helpers
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-rw-r--r--.extras/image-builder/config8
-rw-r--r--.extras/image-builder/lib.sh71
2 files changed, 79 insertions, 0 deletions
diff --git a/.extras/image-builder/config b/.extras/image-builder/config
new file mode 100644
index 0000000..e05b681
--- /dev/null
+++ b/.extras/image-builder/config
@@ -0,0 +1,8 @@
+# Shared configuration for the sbo-testbuild image builder.
+# Sourced by bootstrap.sh, build-full-image.sh, build-sbo-testbuild.sh, tests.
+
+REGISTRY="docker.noland.dnx:5000"
+MIRROR="file:///mnt/nas"
+VARIANTS=(current 15.0) # x86_64 only for now
+PKGDIR="/opt/sbo-testbuild/pkgs" # sbopkg + sbo-maintainer-tools .txz
+HASH_DIR="/var/cache/sbo-testbuild" # ChangeLog hashes for rebuild gating
diff --git a/.extras/image-builder/lib.sh b/.extras/image-builder/lib.sh
new file mode 100644
index 0000000..50dda16
--- /dev/null
+++ b/.extras/image-builder/lib.sh
@@ -0,0 +1,71 @@
+# Shared helpers for the image builder. Source, do not execute.
+# Sourcing must have no side effects beyond defining functions.
+
+_log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${LOG_TAG:-image-builder}] $*"; }
+_warn() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${LOG_TAG:-image-builder}] WARNING: $*" >&2; }
+_err() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${LOG_TAG:-image-builder}] ERROR: $*" >&2; exit 1; }
+
+# mirror_path MIRROR RELPATH
+# Join a MIRROR (file:///... or http(s)://...) with a relative path.
+mirror_path() {
+ local mirror="$1" rel="$2"
+ printf '%s/%s' "${mirror%/}" "${rel#/}"
+}
+
+# is_local_mirror MIRROR -> 0 if file:// or bare absolute path, else 1
+is_local_mirror() {
+ case "$1" in
+ file://*) return 0 ;;
+ http://*|https://*) return 1 ;;
+ /*) return 0 ;;
+ *) return 1 ;;
+ esac
+}
+
+# strip_scheme URL -> filesystem path for a file:// or bare-local URL
+strip_scheme() {
+ local u="$1"
+ case "$u" in
+ file://*) printf '%s' "${u#file://}" ;;
+ *) printf '%s' "$u" ;;
+ esac
+}
+
+# fetch SRC DEST
+# Copy SRC (a full mirror URL) to DEST. Local mirror -> cp, http -> curl.
+# Returns non-zero on failure; caller decides whether that is fatal.
+fetch() {
+ local src="$1" dest="$2"
+ if is_local_mirror "$src"; then
+ local path; path="$(strip_scheme "$src")"
+ [[ -f "$path" ]] || return 1
+ cp "$path" "$dest"
+ else
+ curl -sfL --connect-timeout 60 "$src" -o "$dest"
+ fi
+}
+
+# txz_hash DIR
+# Stable hash of the set of .txz files in DIR (names + contents), order
+# independent. Empty/absent dir -> empty string.
+txz_hash() {
+ local dir="$1"
+ [[ -d "$dir" ]] || { printf ''; return 0; }
+ local files; files=$(find "$dir" -maxdepth 1 -name '*.txz' -type f | sort)
+ [[ -n "$files" ]] || { printf ''; return 0; }
+ # Hash sorted "name sha256" lines so reordering does not change output.
+ while IFS= read -r f; do
+ printf '%s %s\n' "$(basename "$f")" "$(sha256sum "$f" | cut -d' ' -f1)"
+ done <<< "$files" | sha256sum | cut -d' ' -f1
+}
+
+# require_mount VERSION
+# Assert the NAS tree for VERSION is mounted (file:// mirror only).
+# x86_64 tree dir is slackware64-${VERSION}.
+require_mount() {
+ local version="$1"
+ is_local_mirror "$MIRROR" || return 0 # http mirror: nothing to check
+ local base; base="$(strip_scheme "$MIRROR")"
+ local dir="${base}/slackware64-${version}"
+ [[ -d "$dir" ]] || _err "NAS tree not mounted: ${dir}"
+}