montana/Node/External-Audit/scripts/e2e-auto-prune.sh

60 lines
1.7 KiB
Bash
Raw Normal View History

2026-05-21 03:44:38 +03:00
#!/usr/bin/env bash
# E2E проверка auto-prune: останавливает xray на узле, ждёт выпадения из multi-A,
# затем восстанавливает и ждёт возврата.
#
# Требует SSH к указанному узлу. Запуск:
# bash e2e-auto-prune.sh <ssh-target> # например montana-us
set -u
TARGET="${1:?'usage: bash e2e-auto-prune.sh <ssh-target>'}"
TIMEOUT=180
POOL_URL=https://montana.quest/vpn/node/pool
IP=$(ssh -o ConnectTimeout=5 "$TARGET" 'curl -s --max-time 5 https://api.ipify.org')
[ -n "$IP" ] || { echo "не удалось получить IP $TARGET"; exit 1; }
echo "Target: $TARGET ($IP)"
get_pool() {
curl -s --max-time 5 "$POOL_URL" | python3 -c '
import sys,json
d=json.load(sys.stdin)
print(" ".join(sorted([r["ip"] for r in d["records"]])))' 2>/dev/null
}
echo "=== DOWN test ==="
ssh "$TARGET" 'systemctl stop xray' || exit 2
start=$(date +%s)
while true; do
pool=$(get_pool)
elapsed=$(($(date +%s)-start))
if ! echo "$pool" | grep -qw "$IP"; then
echo " $IP выпал из pool за ${elapsed}s. Pool: $pool"
break
fi
if [ "$elapsed" -gt "$TIMEOUT" ]; then
echo " FAIL: за ${TIMEOUT}s не выпал. Pool: $pool"
ssh "$TARGET" 'systemctl start xray'
exit 3
fi
sleep 5
done
echo "=== UP test ==="
ssh "$TARGET" 'systemctl start xray'
start=$(date +%s)
while true; do
pool=$(get_pool)
elapsed=$(($(date +%s)-start))
if echo "$pool" | grep -qw "$IP"; then
echo " $IP вернулся в pool за ${elapsed}s. Pool: $pool"
break
fi
if [ "$elapsed" -gt "$TIMEOUT" ]; then
echo " FAIL: за ${TIMEOUT}s не вернулся. Pool: $pool"
exit 4
fi
sleep 5
done
echo "=== PASS ==="