#!/bin/bash
### Скрипт вывода информации о unix-like системах
### Сделайте скрипт исполняемым: chmod a+x sysfull_info.sh

# Цветовые коды
ORANGE='\033[0;33m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
GREEN='\033[1;32m'
WHITE='\033[1;37m'
CIAN='\033[1;36m'
MAGENTA='\033[1;35m'
PINK='\033[38;5;199m'
NC='\033[0m'

section() {
    echo -e "${ORANGE}=== $1 ===${NC}"
}

# Проверка прав
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}ВНИМАНИЕ:${NC} Для полной информации запустите скрипт с sudo"
fi

section "Информация о системе"

echo ""

CURRENT_DATE=$(date '+%Y-%m-%d %H:%M:%S')
UPTIME=$(uptime -p)
echo -e "${WHITE}Текущее время:${NC} ${CIAN}$CURRENT_DATE${NC}"
echo -e "${WHITE}Аптайм:${NC} ${CIAN}$UPTIME${NC}"
echo -e "${WHITE}Активные пользователи:${NC} ${CIAN}$(who | wc -l)${NC}"
echo -e "${WHITE}Загрузка системы:${NC} ${CIAN}$(uptime | awk -F'load average: ' '{print $2}')${NC}"

echo ""

# Состояние основных компонентов
CPU_NAME=$(cat /proc/cpuinfo | grep -i 'model name'| sed -n '1p' | awk '{print $4,$5,$7,$8}')
CPU_TEMP=$(sensors | grep 'Package id 0' | awk '{print $4}' | sed 's/+//;s/\.0//')
FAN_RPM=$(sensors | grep 'fan2' | awk '{print $2}')
CPU_LOAD=$(top -bn1 | grep 'Cpu(s)' | awk '{printf "%.1f", $2 + $4}')
MEM_INFO=$(free -m | awk '/Mem:/||/^Память:/ {print $3, $2}')
MEM_USED=$(echo $MEM_INFO | awk '{print $1}')
MEM_TOTAL=$(echo $MEM_INFO | awk '{print $2}')
MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))
ZOMBIES=$(ps axo state | grep -c 'Z')

echo -e "   ┌─ ${WHITE}Процессор:${NC} ${CIAN}$CPU_NAME${NC}"
echo -e "   ├─ ${WHITE}Температура CPU:${NC} ${CIAN}$CPU_TEMP°C${NC}"
echo -e "   ├─ ${WHITE}Обороты кулера:${NC} ${CIAN}$FAN_RPM${NC} ${WHITE}RPM${NC}"
echo -e "   └─ ${WHITE}Загрузка CPU:${NC} ${CIAN}$CPU_LOAD%${NC}"

echo ""

echo -e "   ┌─ ${WHITE}Использовано памяти:${NC} ${CIAN}$MEM_USED МБ${NC} ${WHITE}из${NC} ${CIAN}$MEM_TOTAL МБ${NC} ${WHITE}($MEM_PERCENT%)${NC}"
echo -e "   ├─ ${WHITE}Процессов всего:${NC} ${CIAN}$(ps -e | wc -l)${NC}"
echo -e "   ├─ ${WHITE}Зомби-процессы:${NC} ${RED}$ZOMBIES${NC}"
if [ "$ZOMBIES" -gt 0 ]; then
    ps -eo pid,state,comm | awk '$2=="Z" {print $1, $3}' | while read -r pid comm; do
        echo -e "   ${RED}└─${NC} ${PINK}$pid${NC} ${YELLOW}(${comm})${NC}"
    done
fi

echo ""

#section "Состояние GPU"
detect_gpu() {
    # NVIDIA
    if command -v nvidia-smi &> /dev/null; then
        GPU_NAME=$(nvidia-smi --query-gpu=gpu_name --format=csv,noheader 2>/dev/null | head -1)
        GPU_VRAM=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader 2>/dev/null | awk '{print $1}')
        GPU_TEMP=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader)
        echo -e "   ┌─ ${WHITE}Видеокарта:${NC} ${CIAN}NVIDIA $GPU_NAME${NC}"
        echo -e "   ├─ ${WHITE}Температура GPU:${NC} ${CIAN}$GPU_TEMP°C${NC}"
        echo -e "   └─ ${WHITE}Утилизация VRAM:${NC} ${CIAN}$GPU_VRAM МБ${NC}"
    # AMD
    elif [ -d /sys/class/drm/card0/device ]; then
        GPU_NAME=$(cat /sys/class/drm/card0/device/gpu_bus_id 2>/dev/null)
        if [ -n "$GPU_NAME" ]; then
            GPU_TEMP=$(sensors | grep 'edge' | awk '{print $2}' | sed 's/+//;s/°C//')
            echo -e "${WHITE}Видеокарта:${NC} ${CIAN}AMD $GPU_NAME${NC}"
            echo -e "${WHITE}Температура GPU:${NC} ${CIAN}$GPU_TEMP°C${NC}"
        fi
    # Intel
    elif [ -d /sys/class/drm/card0 ]; then
        echo -e "${WHITE}Видеокарта:${NC} ${CIAN}Intel Integrated Graphics${NC}"
    else
        echo -e "${WHITE}Видеокарта:${NC} ${CIAN}Не обнаружена${NC}"
    fi
}
detect_gpu

echo ""

# Начало блока "Статус сервисов"
#services=("ssh" "nginx" "ejabberd")
#for service in "${services[@]}"; do
#    if systemctl is-active --quiet $service 2>/dev/null; then
#        status="${GREEN}активен${NC}"
#    else
#        status="${RED}не активен${NC}"
#    fi
#    echo -e "${WHITE}$service:${NC} ${status}"
#done
# Конец блока "Статус сервисов", если этот блок нужен, комментарии от его начала и до сюда, затем вписать нужные имена сервисов виесто уже забинденных.
echo ""

# Доступные обновления
if command -v apt &> /dev/null; then
    updates=$(apt list --upgradable 2>/dev/null | wc -l)
    if [ $updates -gt 1 ]; then
        echo -e "${WHITE}Доступно обновлений:${NC} ${CIAN}$((updates - 1))${NC}"
    else
        echo -e "${WHITE}Система обновлена${NC}"
    fi
else
    echo -e "${WHITE}Информация недоступна (только apt-системы)${NC}"
fi

REBOOT_NEEDED=$(if [ -f /var/run/reboot-required ]; then echo "Да"; else echo "Нет"; fi)
echo -e "${WHITE}Требуется перезагрузка:${NC} ${CIAN}$REBOOT_NEEDED${NC}"

echo ""

# Сетевой трафик
NET_STATS=$(netstat -i | grep -E '^(ens|eth|enp)' | awk '{rx+=$3; tx+=$7} END {print rx, tx}')
RX_MB=$(echo "scale=2; $(echo $NET_STATS | awk '{print $1}') / 1024" | bc)
TX_MB=$(echo "scale=2; $(echo $NET_STATS | awk '{print $2}') / 1024" | bc)
echo -e "${WHITE}Получено данных за сессию:${NC} ${CIAN}$RX_MB МБ${NC}"
echo -e "${WHITE}Передано данных за сессию:${NC} ${CIAN}$TX_MB МБ${NC}"

echo ""

disk_info() {
    local device=$1
    local device_name=${device##*/}
    local device_type
    local model
    local temp
    local health
    local errors=""
    local disk_size

    if [[ $device == *"nvme"* ]]; then
        device_type="NVMe SSD"
        model=$(nvme list | grep "$device" | awk '{for(i=3;i<=NF-5;i++) printf $i" "}' | sed 's/ *$//')
        temp=$(nvme smart-log $device | grep 'temperature' | awk '{print $3}')
        health=$(nvme smart-log $device | grep 'percentage_used' | awk '{print $3}')
        health="Износ: ${health}%"
    elif [[ $(cat /sys/block/${device_name}/queue/rotational) -eq 0 ]]; then
        device_type="SATA SSD"
        model=$(smartctl -i $device | awk -F': ' '/Device Model|Model Number/{print $2}' | head -1 | sed 's/ *$//')
        temp=$(smartctl -a $device | awk '/Temperature_Celsius/ {print $10}')
        health=$(smartctl -a $device | grep -m1 'overall-health' | awk '{print $NF}')
    else
        device_type="HDD"
        model=$(smartctl -i $device | awk -F': ' '/Device Model|Model Number/{print $2}' | head -1 | sed 's/ *$//')
        temp=$(smartctl -a $device | awk '/Temperature_Celsius/ {print $10}')

        # SMART-статус для HDD
        smart_status=$(smartctl -H $device | grep 'result' | awk '{print $NF}')
        if [[ "$smart_status" == "PASSED" ]]; then
            health="Хорошо"
        else
            # Проверка конкретных ID атрибутов
            critical_errors=$(smartctl -A $device | awk '
                $1 == 1  && $10 > 0 { printf "Raw_Read_Error: %d ", $10 }
                $1 == 5  && $10 > 0 { printf "Reallocated_Sectors: %d ", $10 }
                $1 == 7  && $10 > 0 { printf "Seek_Error_Rate: %d ", $10 }
                $1 == 187 && $10 > 0 { printf "Reported_Uncorrect: %d ", $10 }
                $1 == 194 && $10 > 60 { printf "Temp: %d°C ", $10 }
                $1 == 196 && $10 > 0 { printf "Realloc_Event_Count: %d ", $10 }
                $1 == 197 && $10 > 0 { printf "Pending_Sectors: %d ", $10 }
                $1 == 198 && $10 > 0 { printf "Offline_Uncorrect: %d ", $10 }
                $1 == 199 && $10 > 0 { printf "UDMA_CRC_Errors: %d ", $10 }
                $1 == 200 && $10 > 0 { printf "Write_Error_Rate: %d ", $10 }
            ')
            health="Плохо"
            errors="$critical_errors"
        fi
    fi

    # Получаем размер диска
    disk_size=$(lsblk -bdno SIZE $device | numfmt --to=iec --format "%.2fB" | sed 's/,/./; s/ //g')

    # Вывод основной информации
    echo -e "   ┌─ ${MAGENTA}[$device_type] ${model} ${device}: ${disk_size}${NC}"
    echo -e "   ├─ Температура: ${CIAN}${temp}°C${NC}"
    echo -e "   ├─ Состояние: ${CIAN}${health}${NC}"

    if [[ -n "$errors" ]]; then
        echo -e "   ├─ Ошибки: ${RED}${errors}${NC}"
    fi

    # Получаем смонтированные разделы
    partitions=$(lsblk -lno NAME,SIZE,MOUNTPOINT $device | grep -v '^NAME' | awk '$3 != ""')

    if [[ -n "$partitions" ]]; then
        echo -e "   └─ Точки монтирования:"

        # Выводим разделы
        counter=0
        while IFS= read -r part; do
            part_name=$(echo "$part" | awk '{print $1}')
            part_size=$(echo "$part" | awk '{print $2}')
            part_mount=$(echo "$part" | awk '{print $3}')
            used=$(df -h /dev/$part_name 2>/dev/null | awk 'NR==2 {print $5}')
            [[ -z "$used" ]] && used="N/A"

            if [[ $counter -eq $(($(echo "$partitions" | wc -l)-1)) ]]; then
                symbol="└─"
            else
                symbol="├─"
            fi

            echo -e "        ${symbol} ${CIAN}/dev/${part_name}:${NC} ${part_size} -> ${YELLOW}${part_mount}${NC} (${WHITE}${used}${NC})"
            ((counter++))
        done <<< "$partitions"
    else
        echo -e "   └─ ${YELLOW}Не смонтирован${NC}"
    fi
    echo ""
}

section "Состояние накопителей"
echo ""
{
    # Сначала NVMe
    lsblk -dno NAME,TYPE,ROTA | grep ' disk' | grep 'nvme' | awk '{print $1}'
    # Затем SSD (не NVMe)
    lsblk -dno NAME,TYPE,ROTA | grep ' disk' | grep -v 'nvme' | awk '$3 == 0 {print $1}'
    # Затем HDD
    lsblk -dno NAME,TYPE,ROTA | grep ' disk' | grep -v 'nvme' | awk '$3 == 1 {print $1}'
} | while read -r disk; do
    disk_info "/dev/$disk"
done

exit
