97 lines
3.8 KiB
Bash
Executable File
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'
|