101 lines
5.5 KiB
Bash
101 lines
5.5 KiB
Bash
#!/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
|