Files
rust-package-builder/tests/freebsd-native.sh
T
2026-10-19 11:09:13 +02:00

97 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
WORK=$(mktemp -d)
SLEEP_PID=""
cleanup() {
[[ -z "$SLEEP_PID" ]] || kill "$SLEEP_PID" 2>/dev/null || true
rm -rf "$WORK"
}
trap cleanup EXIT
for tool in file zstd tar python3; do
command -v "$tool" >/dev/null 2>&1 || { echo "SKIP FreeBSD native packaging: missing $tool"; exit 0; }
done
mkdir -p "$WORK/source" "$WORK/repo/FreeBSD:15:amd64" "$WORK/run"
printf '[package]\nname = "rust-proxy"\nversion = "0.34.1"\n' > "$WORK/source/Cargo.toml"
python3 - "$WORK/bin" <<'PY'
from pathlib import Path
import struct,sys
p=Path(sys.argv[1]); p.write_bytes(b'\x7fELF\x02\x01\x01\x09'+bytes(8)+struct.pack('<HHIQQQIHHHHHH',2,62,1,0,0,0,0,64,56,0,64,0,0));p.chmod(0o755)
PY
export BUILDER_ROOT="$ROOT" FREEBSD_ABI=FreeBSD:15:amd64 FREEBSD_ARCH=freebsd:15:x86:64
"$ROOT/scripts/package-freebsd.sh" "$WORK/source" "$WORK/bin" "$WORK/rustproxy-0.34.1_2.pkg" 0.34.1_2
zstd -dc "$WORK/rustproxy-0.34.1_2.pkg" | tar -xOf - +MANIFEST > "$WORK/manifest.json"
python3 - "$WORK/manifest.json" <<'PY'
import json,sys
m=json.load(open(sys.argv[1])); names=set(m['files'])
assert m['name']=='rustproxy'
assert m['origin']=='www/rustproxy'
assert m['version']=='0.34.1_2'
assert m['abi']=='FreeBSD:15:amd64'
assert '/usr/local/sbin/rust-proxy' in names
assert '/usr/local/etc/rc.d/rustproxy' in names
assert '/usr/local/etc/newsyslog.conf.d/rustproxy.conf' in names
assert len(names)==3
assert not any('/opnsense/' in n or 'syshook' in n for n in names)
assert 'post-install' in m['scripts'] and 'pre-deinstall' in m['scripts']
PY
# Test the actual rc.d reload command without a running FreeBSD machine.
cat > "$WORK/rc.subr" <<'SH'
load_rc_config() { :; }
checkyesno() { eval 'v=${'"$1"'-NO}'; [ "$v" = YES ]; }
run_rc_command() { case "$1" in reload) "$reload_cmd" ;; *) return 1 ;; esac; }
SH
cat > "$WORK/su" <<'SH'
#!/bin/sh
printf '%s\n' "$*" > "$TEST_ARGS"
SH
chmod +x "$WORK/su"
python3 - "$ROOT/packaging/freebsd/rustproxy.rc" "$WORK/rc" "$WORK" <<'PY'
from pathlib import Path
import sys
src=Path(sys.argv[1]).read_text();w=Path(sys.argv[3]);
src=src.replace('. /etc/rc.subr', f'. "{w}/rc.subr"')
src=src.replace('/usr/bin/su -m', f'"{w}/su" -m')
Path(sys.argv[2]).write_text(src)
PY
sleep 120 & SLEEP_PID=$!
printf '%s\n' "$SLEEP_PID" > "$WORK/run/rustproxy.pid"
export TEST_ARGS="$WORK/cli-args" rustproxy_run_dir="$WORK/run"
export rustproxy_config=/usr/local/etc/rustproxy/config.json rustproxy_enable=YES
sh "$WORK/rc" reload
rg_args=$(cat "$TEST_ARGS")
[[ "$rg_args" == *'--data-dir /var/db/rustproxy'* ]]
[[ "$rg_args" == *'--config /usr/local/etc/rustproxy/config.json'* ]]
[[ "$rg_args" == *'--admin-listen 127.0.0.1:9090 reload'* ]]
export rustproxy_config='/usr/local/etc/rustproxy/config.json;touch /tmp/bad'
if sh "$WORK/rc" reload >/dev/null 2>&1; then
echo 'unsafe config path was accepted' >&2; exit 1
fi
unset rustproxy_config
# Catalog generation: mock FreeBSD bsdtar on Linux using zstd + tar.
mkdir -p "$WORK/mockbin"
cat > "$WORK/mockbin/bsdtar" <<'SH'
#!/bin/sh
case "$1" in
-xOf) zstd -dc "$2" | tar -xOf - "$3" ;;
*) exit 2 ;;
esac
SH
chmod +x "$WORK/mockbin/bsdtar"
cp "$WORK/rustproxy-0.34.1_2.pkg" "$WORK/repo/FreeBSD:15:amd64/"
cp "$WORK/rustproxy-0.34.1_2.pkg" "$WORK/repo/rustproxy-latest.pkg"
PATH="$WORK/mockbin:$PATH" python3 "$ROOT/scripts/generate-opnsense-repo.py" "$WORK/repo" --retention 10
python3 - "$WORK/repo/packagesite.pkg" <<'PY'
import json,tarfile,sys
with tarfile.open(sys.argv[1]) as archive:
content=archive.extractfile('packagesite.yaml').read().decode().splitlines()
assert len(content)==1,content
pkg=json.loads(content[0]);assert pkg['name']=='rustproxy'
assert pkg['path']=='FreeBSD:15:amd64/rustproxy-0.34.1_2.pkg',pkg['path']
PY
echo 'FreeBSD native package, rc.d reload and repository catalog: OK'