#!/bin/bash # ============================================================ # ПРОВЕРКА ЗАДАНИЯ 2 — HQ-SRV: RAID0, NFS, chrony, apache+mariadb # (только читает состояние; exportfs/mdadm-детали требуют root) # ============================================================ NAME="hq-srv" 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; } # ================= ПЕРЕМЕННЫЕ (заполните для проверки) ================= RAID_NAME="md0" # имя массива по заданию RAID_MOUNT="/raid" # точка монтирования по заданию NFS_EXPORT="/raid/nfs" # директория экспорта по заданию NFS_NET="" # сеть HQ-CLI (как в exports) APACHE_PORT="80" # порт apache WEB_DB_NAME="webdb" # БД по заданию WEB_DB_USER="web" # пользователь БД по заданию WEB_DB_PASS="P@ssw0rd" # пароль пользователя БД по заданию ISO_WEB_DIR="/mnt/iso/web" # откуда копировались файлы (для справки) NTP_ADDR="" # адрес ISP (chrony) main () { echo "=== Проверка задания 2: HQ-SRV ===" # --- 1. RAID0 (md0) --- if [[ -e /dev/$RAID_NAME ]] || grep -q "$RAID_NAME" /proc/mdstat 2>/dev/null; then if grep -A1 "$RAID_NAME" /proc/mdstat 2>/dev/null | grep -q "raid0"; then ok "массив $RAID_NAME собран уровнем 0" else fail "уровень $RAID_NAME" "не raid0 в /proc/mdstat: $(grep -A1 "$RAID_NAME" /proc/mdstat 2>/dev/null)"; fi DISKS=$(grep -A1 "$RAID_NAME" /proc/mdstat 2>/dev/null | head -1 | grep -o "\[2/2\]") if [[ -n "$DISKS" ]]; then ok "в массиве 2 диска ($DISKS)" else fail "диски массива" "ожидалось [2/2]: $(grep -A1 "$RAID_NAME" /proc/mdstat)"; fi else fail "массив $RAID_NAME" "не существует"; fi # --- 2. ФС ext4 и монтирование /raid --- FSTYP=$(lsblk -no FSTYPE /dev/$RAID_NAME 2>/dev/null) expect_eq "файловая система $RAID_NAME" "ext4" "$FSTYP" if mountpoint -q "$RAID_MOUNT" 2>/dev/null; then ok "$RAID_MOUNT смонтирована" else fail "$RAID_MOUNT" "не точка монтирования"; fi if grep -qE " .*$RAID_MOUNT " /etc/fstab 2>/dev/null \ && grep -E " .*$RAID_MOUNT .*ext4" /etc/fstab &>/dev/null; then ok "/raid прописан в /etc/fstab" else fail "/raid в fstab" "нет строки с $RAID_MOUNT (ext4): $(grep -E "raid" /etc/fstab)"; fi # --- 3. NFS --- if grep -qF "$NFS_EXPORT" /etc/exports 2>/dev/null; then EXPORT_LINE=$(grep -F "$NFS_EXPORT" /etc/exports) if check_var "сеть HQ-CLI для NFS" NFS_NET && grep -qF "$NFS_NET" <<<"$EXPORT_LINE" \ && grep -qw "rw" <<<"$EXPORT_LINE"; then ok "NFS экспорт: $EXPORT_LINE" else fail "NFS экспорт" "нет rw для $NFS_NET: '$EXPORT_LINE'"; fi else fail "NFS экспорт $NFS_EXPORT" "нет строки в /etc/exports"; fi if root_or_skip "exportfs (текущее состояние NFS)"; then if exportfs -v 2>/dev/null | grep -qF "$NFS_EXPORT"; then ok "NFS экспорт активен (exportfs)" else fail "NFS экспорт активен" "нет в exportfs -v"; fi fi # --- 4. chrony-клиент --- 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 не найден (ПРОВЕРИТЬ пакет chrony)"; fi # --- 5. apache + mariadb + приложение --- if systemctl is-active httpd &>/dev/null || systemctl is-active apache2 &>/dev/null; then ok "веб-сервер apache активен" else fail "apache" "служба не активна (ПРОВЕРИТЬ имя службы на РЕД ОС 8)"; fi HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:$APACHE_PORT/" 2>/dev/null) if [[ "$HTTP_CODE" == "200" ]]; then ok "apache отвечает 200 на порт $APACHE_PORT" else fail "ответ apache" "ожидалось 200, получено '$HTTP_CODE'"; fi if [[ -f /var/www/html/index.php && -f /var/www/html/logo.png ]]; then ok "index.php и logo.png в корне сайта" else fail "файлы сайта" "нет index.php/logo.png в /var/www/html"; fi MYSQL_OUT=$(mysql -u"$WEB_DB_USER" -p"$WEB_DB_PASS" -e "SHOW TABLES;" "$WEB_DB_NAME" 2>&1) if grep -q "Tables_in" <<<"$MYSQL_OUT"; then ok "доступ к БД $WEB_DB_NAME под $WEB_DB_USER (таблицы есть)" else fail "БД $WEB_DB_NAME" "нет таблиц или ошибка подключения: $MYSQL_OUT"; fi echo "" echo "=== Проверить вручную ===" echo " — страница приложения в браузере (функционал, картинка logo.png)" echo " — содержимое index.php (учётные данные БД указаны правильно)" echo " — скриншоты для отчёта: exportfs -v, mdadm --D dev/md0, df -h /raid" echo "" echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ===" [[ $FAIL -eq 0 ]] } main 2>&1 | tee "$LOG" STATUS=${PIPESTATUS[0]} echo "Лог сохранён: $LOG" exit $STATUS