net/check/zadanie2/hq-cli.sh

101 lines
5.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЕ 2 — HQ-CLI: automount NFS, chrony, домен, sudo
# для группы hq (только cat/grep/id), Яндекс Браузер
# ЕДИНСТВЕННЫЕ попытка записи — временный файл в NFS (см. пункт 2,
# создаётся и сразу удаляется).
# ============================================================
NAME="hq-cli"
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; }
expect_eq() { if [[ "$3" == "$2" ]]; then ok "$1"; else fail "$1" "ожидалось '$2', получено '$3'"; fi; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
NFS_MOUNT="/mnt/nfs" # точка автомонтирования по заданию
NFS_SERVER="" # адрес HQ-SRV (проверка записи в auto.nfs)
HQ_USER_TEST="hquser1" # пользователь домена для проверки входа
SUDO_CMDS="/usr/bin/cat /usr/bin/grep /usr/bin/id" # разрешённый список
NTP_ADDR="" # адрес ISP (источник NTP)
BROWSER_PATTERN="yandex" # ищемся через dnf list installed
main () {
echo "=== Проверка задания 2: HQ-CLI ==="
# --- 1. Автомонтирование NFS в /mnt/nfs ---
if root_or_skip "конфиг autofs"; then
if grep -Eq "[[:space:]]*/mnt[[:space:]]+" /etc/auto.master 2>/dev/null; then
ok "auto.master: карта для /mnt присутствует"
else fail "auto.master" "нет записи для /mnt"; fi
if grep -Eq "^[[:space:]]*[a-zA-Z0-9_-]+[[:space:]]+-rw[[:space:]]+.*$NFS_SERVER" /etc/auto.nfs 2>/dev/null; then
echo "[ИНФО] $(cat /etc/auto.nfs 2>/dev/null)"
SKIP=$((SKIP+1))
fi
fi
# смонтированную директорию NFS проверяем её содержимым
# (cat вызывает automount триггер — чистое чтение)
# доступный каталог NFS проверяем чтением (оно же триггерит automount)
if [[ -d "$NFS_MOUNT" ]]; then
ok "каталог $NFS_MOUNT доступен (autofs активен)"
else fail "каталог $NFS_MOUNT" "не открылся (autofs/сервер недоступен)"; fi
# --- 2. ЕДИНСТВЕННЫЙ временный файл в NFS (создаём и сразу удаляем) ---
if [[ -d "$NFS_MOUNT" && -w "$NFS_MOUNT" ]]; then
printf 'tmp %s\n' "$(date +%s)" > "$NFS_MOUNT/.delete-nfs-write-test"
if [[ -f "$NFS_MOUNT/.delete-nfs-write-test" ]]; then
ok "запись в NFS работает (временный файл создан)"
fi
rm -f "$NFS_MOUNT/.delete-nfs-write-test" && ok "временный файл удалён"
else
skip "запись в NFS (не смонтирован $NFS_MOUNT)"
fi
# --- 3. chrony-клиент: источник = ISP ---
check_var "источник NTP" NTP_ADDR &&
if command -v chronyc &>/dev/null; then
if chronyc sources 2>/dev/null | grep -qF "$NTP_ADDR"; then ok "NTP источник = $NTP_ADDR"
else fail "NTP источник" "нет $NTP_ADDR в chronyc sources"; fi
else skip "NTP источник — chronyc не найден"; fi
# --- 4. Пользователь домена доступен (getent) ---
if getent passwd "$HQ_USER_TEST" &>/dev/null; then
ok "пользователь домена $HQ_USER_TEST доступен на машине (getent)"
else fail "пользователь домена $HQ_USER_TEST" "getent не вернул запись (ввод в домен вручную — MANUAL.md)"; fi
# --- 5. Sudo для группы hq (только cat/grep/id) ---
if root_or_skip "sudo -l -U $HQ_USER_TEST"; then
SUDO_OUT=$(sudo -l -U "$HQ_USER_TEST" 2>/dev/null)
CMDS_OK=1
for c in $SUDO_CMDS; do
grep -qw "$(basename "$c")" <<<"$SUDO_OUT" || CMDS_OK=0
done
if [[ $CMDS_OK -eq 1 ]] && ! grep -q "NOPASSWD: ALL" <<<"$SUDO_OUT"; then
ok "sudo для $HQ_USER_TEST: только $(echo "$SUDO_CMDS" | tr ' ' ',')"
else fail "sudo для $HQ_USER_TEST" "список не совпал (есть ALL или нет всех команд): $(echo "$SUDO_OUT" | grep NOPASSWD)"; fi
fi
# --- 6. Яндекс Браузер ---
if dnf list installed 2>/dev/null | grep -qiF "$BROWSER_PATTERN"; then
ok "Яндекс Браузер установлен ($(dnf list installed 2>/dev/null | grep -iF "$BROWSER_PATTERN"))"
else fail "Яндекс Браузер" "пакет не найден в dnf list installed"; fi
echo ""
echo "=== Проверить вручную ==="
echo " — запуск Яндекс Браузера с рабочего стола (если GUI есть)"
echo " — реальные входы доменных пользователей в систему (экран входа/GUI или su -)"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS