57 lines
2.8 KiB
Python
57 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
||
"""Целостность конфигов awg по всему парку: склейки, финальный перевод строки,
|
||
проходит ли awg-quick strip и совпадает ли число пиров с живым интерфейсом."""
|
||
import json, sys
|
||
sys.path.insert(0, "/app")
|
||
from managers.ssh_manager import SSHManager
|
||
|
||
PROBE = r"""
|
||
for c in amnezia-awg2 amnezia-awg amnezia-awg31 amnezia-awg3 amnezia-awg-legacy; do
|
||
docker ps --format '{{.Names}}' 2>/dev/null | grep -qx $c || continue
|
||
for f in awg0.conf wg0.conf; do
|
||
p=/opt/amnezia/awg/$f
|
||
docker exec $c test -f $p 2>/dev/null || continue
|
||
glue=$(docker exec $c grep -c '/32\[Peer\]' $p 2>/dev/null | tr -d '\n')
|
||
end=$(docker exec $c sh -c "tail -c 1 $p | od -An -c | tr -d ' \n'")
|
||
peers=$(docker exec $c grep -c '^\[Peer\]' $p 2>/dev/null | tr -d '\n')
|
||
mode=$(docker exec $c stat -c %a $p 2>/dev/null | tr -d '\n')
|
||
bin=wg; iface=wg0
|
||
case $f in awg0.conf) bin=awg; iface=awg0;; esac
|
||
if docker exec $c sh -c "$bin-quick strip $p > /dev/null 2>&1"; then strip=ok; else strip=СБОЙ; fi
|
||
live=$(docker exec $c sh -c "$bin show $iface peers 2>/dev/null | grep -c ." | tr -d '\n')
|
||
echo "$c/$f peers=$peers live=$live glue=$glue end=$end mode=$mode strip=$strip"
|
||
done
|
||
done
|
||
"""
|
||
|
||
d = json.load(open("/app/data/data.json"))
|
||
беда = 0
|
||
for s in d["servers"]:
|
||
try:
|
||
with SSHManager(s["host"], s.get("ssh_port", 22), s["username"],
|
||
password=s.get("password") or None,
|
||
private_key=s.get("private_key") or None,
|
||
connect_timeout=8) as ssh:
|
||
out, err, _ = ssh.run_command(PROBE, timeout=60)
|
||
строки = [x.strip() for x in (out or "").splitlines() if x.strip()]
|
||
if not строки:
|
||
print(" ? %-26s нет контейнеров awg (%s)" % (s["name"][:26], (err or "")[:40]))
|
||
continue
|
||
for стр in строки:
|
||
плохо = ("glue=0" not in стр) or ("strip=ok" not in стр) or ("end=\\n" not in стр)
|
||
if "peers=" in стр and "live=" in стр:
|
||
try:
|
||
p = int(стр.split("peers=")[1].split()[0])
|
||
l = int(стр.split("live=")[1].split()[0])
|
||
if p != l:
|
||
плохо = True
|
||
стр += " ← файл и интерфейс расходятся"
|
||
except Exception:
|
||
pass
|
||
беда += 1 if плохо else 0
|
||
print(" %s %-26s %s" % ("!!" if плохо else "ok", s["name"][:26], стр))
|
||
except Exception as e:
|
||
беда += 1
|
||
print(" !! %-26s НЕ ДОСТУЧАЛСЯ: %s" % (s["name"][:26], str(e)[:60]))
|
||
print("\nпроблемных строк:", беда)
|