#!/usr/bin/env bash # E2E проверка auto-prune: останавливает xray на узле, ждёт выпадения из multi-A, # затем восстанавливает и ждёт возврата. # # Требует SSH к указанному узлу. Запуск: # bash e2e-auto-prune.sh # например montana-us set -u TARGET="${1:?'usage: bash e2e-auto-prune.sh '}" 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 ==="