60 lines
1.7 KiB
Bash
Executable File
60 lines
1.7 KiB
Bash
Executable File
#!/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 ==="
|