#!/usr/bin/bash

# Проверяем, запущен ли скрипт с правами root (требуется для установки и диагностики)
if [ "$EUID" -ne 0 ]; then
  echo "Пожалуйста, запустите скрипт с правами root (sudo)." >&2
  exit 1
fi

# Выводим список всех PCI-устройств, подключенных к системе
echo "=== Список PCI-устройств ==="
lspci

echo
# Выводим список всех USB-устройств, подключенных к системе
echo "=== Список USB-устройств ==="
lsusb

# Проверяем наличие утилиты smartctl (для проверки SMART-статуса дисков)
if ! command -v smartctl &> /dev/null; then
  echo
  echo "smartctl не найден, устанавливаем smartmontools..."  # Устанавливаем пакет, если отсутствует
  apt update && apt install -y smartmontools
else
  echo
  echo "smartctl уже установлен."  # Если уже есть, выводим сообщение
fi

# Проверяем наличие утилиты iostat (для мониторинга ввода-вывода дисков)
if ! command -v iostat &> /dev/null; then
  echo
  echo "iostat не найден, устанавливаем sysstat..."  # Устанавливаем пакет sysstat при отсутствии
  apt update && apt install -y sysstat
else
  echo
  echo "iostat уже установлен."
fi

# Проверяем наличие утилиты memtester (для тестирования памяти)
if ! command -v memtester &> /dev/null; then
  echo
  echo "memtester не найден, устанавливаем memtester..."
  apt update && apt install -y memtester
else
  echo
  echo "memtester уже установлен."
fi

echo
# Отображаем текущие активные процессы и загрузку системы (top вывод один раз, первые 15 строк)
echo "=== Текущая загрузка CPU и памяти (top - 5 секунд) ==="
top -b -n 1 | head -n 15

echo
# Показываем использование оперативной памяти в удобном для чтения формате
echo "=== Использование памяти ==="
free -h

echo
# Выводим SMART-статус основного диска /dev/sda для проверки его состояния
echo "=== SMART-статус диска /dev/sda ==="
smartctl -a /dev/sda || echo "Ошибка: не удалось получить SMART-статус диска /dev/sda"

echo
# Запускаем мониторинг ввода-вывода диска с интервалом 1 секунда, 3 раза подряд
echo "=== Мониторинг диска (iostat) за 3 секунды ==="
iostat -xz 1 3

echo
# Выводим последние ошибки и предупреждения из системного журнала (журнал systemd)
echo "=== Последние системные ошибки (журналы) ==="
journalctl -p 3 -xb | tail -n 20

echo
# Запускаем тест оперативной памяти memtester на 128 Мб, один проход
echo "=== Диагностика памяти (memtester 128M 1 проход) ==="
memtester 128M 1 || echo "memtester не может быть запущен, возможно недостаточно прав или ошибки."

echo
# Показываем список загруженных модулей ядра, ограничиваем вывод первыми 20 строками
echo "=== Список загруженных модулей ядра ==="
lsmod | head -n 20

echo
# Проверяем, загружен ли модуль usb_storage (поддержка USB накопителей)
echo "=== Проверка модуля ядра (например, 'usb_storage') ==="
if lsmod | grep -q usb_storage; then
  echo "Модуль usb_storage загружен."
else
  echo "Модуль usb_storage не загружен. Пробуем загрузить..."
  # Пытаемся загрузить модуль usb_storage
  modprobe usb_storage && echo "Модуль usb_storage успешно загружен." || echo "Не удалось загрузить модуль usb_storage."
fi

echo
# Сообщаем о завершении диагностики
echo "=== Диагностика завершена ==="
