net/check/zadanie1/hq-cli.sh

81 lines
3.9 KiB
Bash

#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЯ 1 — HQ-CLI (только читает состояние!)
# Клиент получает адрес по DHCP от HQ-RTR (VLAN 200): проверяем
# что адрес есть, шлюз и DNS правильные, суффикс домена — в resolv.
# ============================================================
NAME="hq-cli"
LOG="check_${NAME}_z1.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; }
expect_eq() { if [[ "$3" == "$2" ]]; then ok "$1"; else fail "$1" "ожидалось '$2', получено '$3'"; fi; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
HOSTNAME_EXPECTED="hq-cli.au-team.irpo" # таблица 3
CLI_IF="" # интерфейс, подключённый к VLAN 200
HQ_RTR_ADDR="" # адрес HQ-RTR в VLAN 200 (ожидаемый шлюз)
HQ_SRV_ADDR="" # адрес HQ-SRV (ожидаемый DNS)
DNS_DOMAIN="au-team.irpo" # суффикс по заданию
EXAM_TZ=""
main () {
echo "=== Проверка задания 1: HQ-CLI ==="
# --- 1. Имя хоста ---
check_var "имя хоста" HOSTNAME_EXPECTED &&
expect_eq "имя хоста" "$HOSTNAME_EXPECTED" "$(hostname)"
# --- 2. Адрес по DHCP ---
if [[ -n "$CLI_IF" ]]; then
METHOD=$(nmcli -g ipv4.method con show "$CLI_IF" 2>/dev/null)
expect_eq "IPv4 ($CLI_IF) по DHCP" "auto" "$METHOD"
IP4=$(ip -4 -o addr show dev "$CLI_IF" 2>/dev/null | awk '{print $4}')
if [[ -n "$IP4" ]]; then ok "адрес получен по DHCP: $IP4"
else fail "адрес по DHCP" "адреса на $CLI_IF нет (DHCP-сервер на HQ-RTR работает?)"; fi
# DHCP-лизинг фактически выдан NetworkManager
if root_or_skip "файл DHCP-лизинга"; then
LEASE=$(grep -rls "ip_address=" /var/lib/NetworkManager/*.lease 2>/dev/null | head -1)
if [[ -n "$LEASE" ]]; then ok "лизинг DHCP сохранён в $LEASE"
else fail "DHCP-лизинг" "файл лизинга не найден в /var/lib/NetworkManager"; fi
fi
else
skip "адрес по DHCP — не задано CLI_IF"
fi
# --- 3. Шлюз и DNS из DHCP ---
check_var "шлюз = HQ-RTR" HQ_RTR_ADDR &&
expect_eq "шлюз по умолчанию" "$HQ_RTR_ADDR" "$(ip route show default 2>/dev/null | awk '{print $3}')"
check_var "DNS = HQ-SRV" HQ_SRV_ADDR &&
expect_eq "DNS-сервер в resolv.conf" "$HQ_SRV_ADDR" "$(grep -m1 nameserver /etc/resolv.conf | awk '{print $2}')"
# --- 4. Суффикс домена в resolv.conf ---
check_var "суффикс домена" DNS_DOMAIN &&
if grep -qE "(search|domain) .*$DNS_DOMAIN" /etc/resolv.conf 2>/dev/null; then
ok "суффикс $DNS_DOMAIN в resolv.conf"
else fail "суффикс домена" "нет $DNS_DOMAIN: $(cat /etc/resolv.conf 2>/dev/null)"; fi
# --- 5. Часовой пояс ---
check_var "часовой пояс" EXAM_TZ &&
expect_eq "часовой пояс" "$EXAM_TZ" "$(timedatectl show -p Timezone --value)"
echo ""
echo "=== Проверить вручную ==="
echo " — ping <адрес HQ-SRV> (маршрутизация VLAN 100/200)"
echo " — разрешение имён через новый DNS: dig hq-srv.$DNS_DOMAIN"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS