#!/usr/bin/env bash # Krótki test funkcji pomocniczych pagbuild (bez uruchamiania chroot) set -euo pipefail export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH:+:$PATH}" # ── kopie funkcji z pagbuild ── is_valid_archive() { local f="$1" ext magic [[ -f "$f" ]] || return 1 ext="${f##*.}" case "$ext" in gz|tgz|xz|txz|bz2|tbz2|zip) ;; *) return 0 ;; esac magic=$(head -c 8 "$f" | od -An -tx1 | tr -d ' \n') case "$ext" in gz|tgz) [[ "$magic" == 1f8b* ]] ;; xz|txz) [[ "$magic" == fd377a585a00* ]] ;; bz2|tbz2) [[ "$magic" == 425a68* ]] ;; zip) [[ "$magic" == 504b0304* ]] ;; esac } fetch_source() { local url="$1" dest="$2" tmp tmp="${dest}.tmp" rm -f "$tmp" echo "Pobieranie: $url" if curl -fsSL --retry 3 --connect-timeout 20 --max-time 900 "$url" -o "$tmp" && mv -f "$tmp" "$dest"; then return 0 fi rm -f "$tmp" return 1 } declare -A MIRRORS=( ["ftp.gnu.org"]="https://mirrors.kernel.org/gnu https://ftp.nluug.nl/pub/gnu https://mirror.ibcp.fr/pub/gnu" ["www.openssl.org"]="https://github.com/openssl/openssl/releases" ["sourceware.org"]="https://mirrors.kernel.org/sourceware" ["www.kernel.org"]="https://mirrors.edge.kernel.org" ) T="$(mktemp -d)" trap 'rm -rf "$T"' EXIT # 1. is_valid_archive echo "hello gzip" | gzip > "$T/real.tar.gz" echo "404 Not Found" > "$T/fake.tar.gz" printf 'ustar-archive-content' > "$T/plain.tar" head -c 100 /dev/urandom > "$T/trunc.xz" is_valid_archive "$T/real.tar.gz" && echo "PASS: prawdziwy .tar.gz rozpoznany" if is_valid_archive "$T/fake.tar.gz"; then echo "FAIL: HTML przyjęty jako gzip"; exit 1; else echo "PASS: HTML odrzucony"; fi is_valid_archive "$T/plain.tar" && echo "PASS: plain .tar bez walidacji" if is_valid_archive "$T/trunc.xz"; then echo "FAIL: śmieci przyjęte jako xz"; exit 1; else echo "PASS: śmieci .xz odrzucone"; fi if is_valid_archive "$T/nieistnieje.gz"; then echo "FAIL: brak pliku przyjęty"; exit 1; else echo "PASS: brak pliku odrzucony"; fi # 2. fetch_source przez file:// (staging + mv) cp "$T/real.tar.gz" "$T/src.tar.gz" fetch_source "file://$T/src.tar.gz" "$T/dl.tar.gz" cmp -s "$T/real.tar.gz" "$T/dl.tar.gz" && echo "PASS: fetch_source pobrał poprawnie" if [[ -e "$T/dl.tar.gz.tmp" ]]; then echo "FAIL: .tmp nie posprzątany"; exit 1; else echo "PASS: .tmp posprzątany"; fi # 3. nieudane pobranie nie zostawia śmieci if fetch_source "file://$T/nie-ma-tego-pliku.gz" "$T/bad.gz"; then echo "FAIL: fetch_source miał zwrócić błąd"; exit 1; else echo "PASS: fetch_source zwraca błąd"; fi if [[ -e "$T/bad.gz" || -e "$T/bad.gz.tmp" ]]; then echo "FAIL: śmieci po nieudanym pobraniu"; exit 1; else echo "PASS: brak śmieci po nieudanym pobraniu"; fi # 4. mirror URL construction SRC_URL="https://ftp.gnu.org/gnu/bash/bash-5.2.37.tar.gz" MIRROR_URLS=() for _host in "${!MIRRORS[@]}"; do [[ "$SRC_URL" == *"$_host"* ]] || continue _orig_path="${SRC_URL#*"$_host"}" for _m in ${MIRRORS[$_host]}; do _m_no_scheme="${_m#*://}" if [[ "$_m_no_scheme" == */* ]]; then _m_path="/${_m_no_scheme#*/}" else _m_path="" fi if [[ -z "$_m_path" ]]; then MIRROR_URLS+=("$_m$_orig_path") elif [[ "$_orig_path" == "$_m_path"* ]]; then MIRROR_URLS+=("$_m${_orig_path#"$_m_path"}") fi done done echo " mirror: ${MIRROR_URLS[0]}" [[ "${MIRROR_URLS[0]}" == "https://mirrors.kernel.org/gnu/bash/bash-5.2.37.tar.gz" ]] && echo "PASS: mirror gnu OK" || { echo "FAIL: zły mirror gnu: ${MIRROR_URLS[0]}"; exit 1; } SRC_URL="https://github.com/systemd/systemd/archive/v256.4.tar.gz" MIRROR_URLS=() for _host in "${!MIRRORS[@]}"; do if [[ "$SRC_URL" == *"$_host"* ]]; then _rel="${SRC_URL#*"$_host"}" for _m in ${MIRRORS[$_host]}; do MIRROR_URLS+=("$_m$_rel") done fi done if [[ ${#MIRROR_URLS[@]} -eq 0 ]]; then echo "PASS: github bez mirrora (brak pasującego hosta)"; else echo "FAIL: github dostał mirror: ${MIRROR_URLS[*]}"; exit 1; fi # 5. CHROOT_BIN detection CHROOT_BIN="" for _cand in /usr/sbin/chroot /sbin/chroot /bin/chroot /usr/bin/chroot; do [[ -x "$_cand" ]] && CHROOT_BIN="$_cand" && break done [[ -z "$CHROOT_BIN" ]] && CHROOT_BIN="$(command -v chroot 2>/dev/null || true)" echo " chroot: ${CHROOT_BIN:-BRAK}" [[ -n "$CHROOT_BIN" ]] && echo "PASS: chroot znaleziony" || { echo "FAIL: chroot nie znaleziony (brak coreutils?)"; exit 1; } echo "" echo "✅ WSZYSTKIE TESTY POMOCNICZE PRZESZŁY"