Session checkpoint on webui-plugin: - engine dump (nautctl dump) + engine endgame integration - per-file move locations persistence; torrent-level "Set location" with reset/keep-relative/leave-separate handling + residual prune - Lua: naut.get_labels, define_settings/get_setting (script_host struct) - daemon-owned labels (category+tags) + taxonomy persistence; webui write-through - fix: pausing a completed/seeding torrent now sticks (stop wins over result) - automation tab responsive layout; anime_sort label gating + settings Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
112 lines
3 KiB
Bash
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" --state-dir "$tmp/state" \
|
|
>"$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=
|