Naut/tests/integration/run_phase7.sh
ookami125 8dde48c05a webui: replace nautctl web server with a loadable plugin
Drop the web UI that was compiled into nautctl and serve the
torrent-ui front end (../torrent-ui/public) from a native plugin
(plugins/webui) loaded via `nautd --plugin`. The plugin talks to the
engine only through the host call_rpc ABI and adapts the daemon's RPC
surface to the qBittorrent-style contract the UI expects (snapshot/SSE,
torrent detail tabs, add/delete, cookie auth).

Also folds in the daemon refactor that owns per-torrent worker threads
and the swarm engine (naut_swarm) used by the plugin's data source.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 00:21:48 -04:00

112 lines
3 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
daemon=$1
ctl=$2
plugin=$3
script=$4
tmp=$(mktemp -d)
socket="$tmp/nautd.sock"
daemon_log="$tmp/nautd.log"
events_log="$tmp/events.log"
seeder_log="$tmp/seeder.log"
root_dir=$(cd "$(dirname "$script")/../.." && pwd)
seeder="$root_dir/tests/integration/seeder.py"
torrent="$(dirname "$script")/single_v1.torrent"
seed_data="$(dirname "$script")/data"
cleanup() {
result=$?
if [[ -n "${daemon_pid:-}" ]]; then
kill "$daemon_pid" 2>/dev/null || true
wait "$daemon_pid" 2>/dev/null || true
fi
if [[ -n "${events_pid:-}" ]]; then
kill "$events_pid" 2>/dev/null || true
wait "$events_pid" 2>/dev/null || true
fi
if [[ -n "${seeder_pid:-}" ]]; then
kill "$seeder_pid" 2>/dev/null || true
wait "$seeder_pid" 2>/dev/null || true
fi
if [[ "$result" -ne 0 ]]; then
cat "$daemon_log" >&2 2>/dev/null || true
cat "$events_log" >&2 2>/dev/null || true
cat "$seeder_log" >&2 2>/dev/null || true
fi
rm -rf "$tmp"
return "$result"
}
trap cleanup EXIT
python3 -c 'import libtorrent' 2>/dev/null || {
echo "SKIP: python libtorrent not available"
exit 77
}
python3 "$seeder" "$torrent" "$seed_data" >"$seeder_log" 2>&1 &
seeder_pid=$!
port=
for _ in $(seq 1 100); do
port=$(grep -oP 'PORT \K[0-9]+' "$seeder_log" 2>/dev/null || true)
[[ -n "$port" && "$port" != 0 ]] && break
sleep 0.05
done
[[ -n "$port" && "$port" != 0 ]]
"$daemon" --socket "$socket" --plugin "$plugin" \
>"$daemon_log" 2>&1 &
daemon_pid=$!
for _ in $(seq 1 100); do
[[ -S "$socket" ]] && break
sleep 0.02
done
[[ -S "$socket" ]]
"$ctl" --socket "$socket" ping | grep -q '"service": "nautd"'
"$ctl" --socket "$socket" plugins | grep -q '"memory"'
"$ctl" --socket "$socket" script "$script" | grep -q '"ok": true'
timeout 5 "$ctl" --socket "$socket" events >"$events_log" &
events_pid=$!
sleep 0.1
root="$tmp/torrent-data"
"$ctl" --socket "$socket" add "$torrent" "$root" "127.0.0.1:$port" \
| grep -q '"ok": true'
listing=
for _ in $(seq 1 200); do
listing=$("$ctl" --socket "$socket" list)
grep -q '"state": "complete"' <<<"$listing" &&
[[ -f "$root/single.bin.moved" ]] && break
sleep 0.05
done
grep -q '"state": "complete"' <<<"$listing"
cmp "$root/single.bin.moved" "$seed_data/single.bin"
status=$("$ctl" --socket "$socket" status)
grep -q '"move_commands": 1' <<<"$status"
grep -q '"handled": 2' <<<"$status"
grep -q '"errors": 0' <<<"$status"
plugin_status=$("$ctl" --socket "$socket" example.events)
grep -q '"finished": 1' <<<"$plugin_status"
for _ in $(seq 1 100); do
grep -q '"event": "torrent_finished"' "$events_log" && break
sleep 0.02
done
grep -q '"event": "torrent_finished"' "$events_log"
"$ctl" --socket "$socket" remove 1 >/dev/null
for _ in $(seq 1 100); do
listing=$("$ctl" --socket "$socket" list)
grep -q '"result": \[\]' <<<"$listing" && break
sleep 0.02
done
grep -q '"result": \[\]' <<<"$listing"
"$ctl" --socket "$socket" shutdown >/dev/null
wait "$daemon_pid"
daemon_pid=