47 lines
3.0 KiB
Bash
47 lines
3.0 KiB
Bash
#!/bin/bash
|
||
# Внешний сторож VPN-хаба НИИКН (AdminVPS 78.17.4.225) — на openclaw LXC 137, cron */5.
|
||
# Ловит "хаб лёг целиком": приостановка AdminVPS за неоплату / упавшая VM — сервисы не слушают порты.
|
||
# Самолечить нельзя (коробка провайдерская/выключена) → ТОЛЬКО алерт. TG (Олег) + email, дедуп + "отбой".
|
||
# Контейнерный self-heal живёт на самом хабе (restart:always + watchtower). Образец: antoshka-watch-self.sh.
|
||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||
HUB=78.17.4.225
|
||
CHAT=1292155421
|
||
CFG=/root/.openclaw/openclaw.json
|
||
STATE=/root/.finland-hub-watchdog.last
|
||
TOKEN=$(grep -oE '[0-9]{8,}:[A-Za-z0-9_-]{30,}' "$CFG" 2>/dev/null | head -1)
|
||
|
||
send(){
|
||
[ -n "$TOKEN" ] && curl -s --max-time 20 "https://api.telegram.org/bot${TOKEN}/sendMessage" \
|
||
--data-urlencode "chat_id=$CHAT" --data-urlencode "text=$1" >/dev/null 2>&1
|
||
[ -f /root/.wd-mail.env ] && . /root/.wd-mail.env
|
||
if [ -n "${MAILTO:-}" ]; then
|
||
printf 'From: dttb watchdog <%s>\nTo: %s\nSubject: %s\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nDate: %s\n\n%s\n' \
|
||
"$SMTPUSER" "$MAILTO" "[Finland-hub LXC137] watchdog" "$(date -R)" "$1" > /tmp/.fhwd.eml
|
||
curl -s --max-time 25 --url "smtp://${MAILHOST}:587" --ssl-reqd --resolve "${MAILHOST}:587:${MAILIP}" \
|
||
--mail-from "$SMTPUSER" --mail-rcpt "$MAILTO" --user "${SMTPUSER}:${SMTPPASS}" --upload-file /tmp/.fhwd.eml >/dev/null 2>&1
|
||
fi
|
||
}
|
||
|
||
tcp(){ timeout 5 bash -c "echo >/dev/tcp/$HUB/$1" 2>/dev/null && echo 1 || echo 0; }
|
||
|
||
icmp=$(ping -c2 -W2 "$HUB" >/dev/null 2>&1 && echo 1 || echo 0)
|
||
p443=$(tcp 443); p9443=$(tcp 9443)
|
||
|
||
# Хаб "лежит", если оба сервисных порта молчат (как было при приостановке AdminVPS)
|
||
if [ "$p443" = "0" ] && [ "$p9443" = "0" ]; then
|
||
if [ "$icmp" = "1" ]; then
|
||
msg="🚨 VPN-хаб НИИКН ($HUB) НЕ обслуживает: TCP 443/9443 молчат, ICMP есть. Похоже на приостановку AdminVPS (неоплата) или зависшую VM — лёг весь обход (Claude/TG/WA/VLESS у НИИКН и клиентов). Проверь биллинг AdminVPS / vps-панель."
|
||
else
|
||
msg="🚨 VPN-хаб НИИКН ($HUB) полностью недоступен (ни ICMP, ни TCP 443/9443). Лёг весь обход. Проверь AdminVPS."
|
||
fi
|
||
now=$(date +%s); last=$(cat "$STATE" 2>/dev/null || echo 0)
|
||
if [ $((now - last)) -gt 3600 ]; then send "$msg"; fi # повтор не чаще раза в час
|
||
[ -f "$STATE" ] || echo "$now" > "$STATE"
|
||
echo "ALERT: $msg"
|
||
exit 1
|
||
fi
|
||
|
||
# всё ок — если был в алерте, шлём отбой
|
||
if [ -f "$STATE" ]; then send "✅ VPN-хаб НИИКН ($HUB) снова в строю (TCP 443=$p443, 9443=$p9443)."; rm -f "$STATE"; fi
|
||
echo "OK: hub up (icmp=$icmp 443=$p443 9443=$p9443)"
|