105 lines
5.7 KiB
Bash
105 lines
5.7 KiB
Bash
#!/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
|