68 lines
3 KiB
Bash
68 lines
3 KiB
Bash
#!/bin/bash
|
||
# ============================================================
|
||
# ПРОВЕРКА ЗАДАНИЯ 2 — ISP: chrony-сервер, стратум 5
|
||
# (только читает состояние)
|
||
# ============================================================
|
||
|
||
NAME="isp"
|
||
LOG="check_${NAME}_z2.txt"
|
||
|
||
OK=0; FAIL=0; SKIP=0
|
||
ok() { echo "[OK] $1"; OK=$((OK+1)); }
|
||
fail() { echo "[FAIL] $1 — $2"; FAIL=$((FAIL+1)); }
|
||
skip() { echo "[ПРОПУЩЕНО] $1"; SKIP=$((SKIP+1)); }
|
||
root_or_skip() { if [[ $EUID -ne 0 ]]; then skip "$1 (нужен root)"; return 1; fi; return 0; }
|
||
check_var() { if [[ -z "${!2}" ]]; then skip "$1 — не задано $2"; return 1; fi; return 0; }
|
||
|
||
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
|
||
CHRONY_CONF="/etc/chrony.conf" # ПРОВЕРИТЬ путь на РЕД ОС 8
|
||
STRATUM_EXPECTED="5" # по заданию 2 п. 4
|
||
ALLOW_NETS="" # сети клиентов, через пробел (как в isp.sh настройки)
|
||
|
||
main () {
|
||
echo "=== Проверка задания 2: ISP (chrony) ==="
|
||
|
||
# --- 1. Стратум 5 ---
|
||
if command -v chronyc &>/dev/null; then
|
||
GOT_STRATUM=$(chronyc tracking 2>/dev/null | awk '/^Stratum/ {print $2}')
|
||
if [[ "$GOT_STRATUM" == "$STRATUM_EXPECTED" ]]; then ok "стратум = $GOT_STRATUM"
|
||
else fail "стратум" "ожидалось $STRATUM_EXPECTED, получено '$GOT_STRATUM'"; fi
|
||
# служба активна
|
||
if systemctl is-active chronyd &>/dev/null; then ok "служба chronyd активна"
|
||
else fail "служба chronyd" "не активна (ПРОВЕРИТЬ имя службы на РЕД ОС 8)"; fi
|
||
else
|
||
skip "chronyc — не найден (ПРОВЕРИТЬ пакет chrony)"
|
||
fi
|
||
|
||
# --- 2. Разрешено доступ для клиентских сетей (allow) ---
|
||
NETS_OK=0; NETS_TOTAL=0
|
||
for NET in $ALLOW_NETS; do
|
||
NETS_TOTAL=$((NETS_TOTAL+1))
|
||
if grep -qE "^allow[[:space:]]+$NET" "$CHRONY_CONF" 2>/dev/null; then
|
||
NETS_OK=$((NETS_OK+1))
|
||
else fail "allow $NET" "нет строки в $CHRONY_CONF"; fi
|
||
done
|
||
if [[ $NETS_TOTAL -eq 0 ]]; then skip "allow-сети — не задано ALLOW_NETS"
|
||
elif [[ $NETS_OK -eq $NETS_TOTAL ]]; then ok "allow для всех $NETS_TOTAL сетей клиентов"
|
||
fi
|
||
|
||
# --- 3. Сервер NTP слушает 123/udp ---
|
||
if root_or_skip "порт NTP (ss)"; then
|
||
if ss -uln 2>/dev/null | grep -q ":123 "; then ok "NTP слушает udp/123"
|
||
else fail "NTP порт 123" "не слушает (chronyd: allow без локального статуса?)"; fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "=== Проверить вручную ==="
|
||
echo " — chronyc clients (кто реально опрашивает)"
|
||
echo " — chronyc sources точно сообщает о вышестоящем сервере"
|
||
|
||
echo ""
|
||
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
|
||
[[ $FAIL -eq 0 ]]
|
||
}
|
||
main 2>&1 | tee "$LOG"
|
||
STATUS=${PIPESTATUS[0]}
|
||
echo "Лог сохранён: $LOG"
|
||
exit $STATUS
|