#!/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(' "$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'