#!/bin/bash
#
# 系统巡检报告脚本
# 功能: 一键生成 Linux 服务器巡检报告
#

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 阈值配置
CPU_WARN=80
MEM_WARN=80
DISK_WARN=80

# 分隔线
print_line() {
    echo "================================================================================"
}

print_section() {
    echo -e "\n${BLUE}【$1】${NC}"
}

# 检查状态
check_status() {
    local value=$1
    local warn=$2
    if [ "$value" -ge "$warn" ]; then
        echo -e "${RED}⚠ 警告${NC}"
    else
        echo -e "${GREEN}✓${NC}"
    fi
}

# 头部信息
print_header() {
    print_line
    echo -e "                           ${CYAN}系统巡检报告${NC}"
    echo "                     $(date '+%Y-%m-%d %H:%M:%S')"
    print_line
}

# 系统信息
get_system_info() {
    print_section "系统信息"
    echo "  主机名称: $(hostname)"

    if [ -f /etc/os-release ]; then
        echo "  操作系统: $(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)"
    elif [ -f /etc/redhat-release ]; then
        echo "  操作系统: $(cat /etc/redhat-release)"
    fi

    echo "  内核版本: $(uname -r)"
    echo "  系统架构: $(uname -m)"
    echo "  运行时间: $(uptime -p 2>/dev/null || uptime | awk -F',' '{print $1}' | awk -F'up' '{print $2}')"
}

# CPU 信息
get_cpu_info() {
    print_section "CPU 信息"

    local cpu_model=$(grep "model name" /proc/cpuinfo | head -1 | cut -d':' -f2 | sed 's/^ //')
    local cpu_cores=$(grep -c "processor" /proc/cpuinfo)
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}' | cut -d'.' -f1)

    echo "  CPU 型号: $cpu_model"
    echo "  CPU 核心: $cpu_cores"
    echo -n "  CPU 使用率: ${cpu_usage}%  "
    check_status "$cpu_usage" "$CPU_WARN"
}

# 内存信息
get_memory_info() {
    print_section "内存信息"

    local mem_info=$(free -h | grep "Mem:")
    local total=$(echo "$mem_info" | awk '{print $2}')
    local used=$(echo "$mem_info" | awk '{print $3}')
    local available=$(echo "$mem_info" | awk '{print $7}')
    local cache=$(echo "$mem_info" | awk '{print $6}')

    local mem_usage=$(free | grep "Mem:" | awk '{printf "%.0f", $3/$2*100}')

    echo "  总内存: $total"
    echo -n "  已使用: $used (${mem_usage}%)  "
    check_status "$mem_usage" "$MEM_WARN"
    echo "  可用: $available"
    echo "  缓存: $cache"
}

# 磁盘信息
get_disk_info() {
    print_section "磁盘信息"
    echo "  文件系统              大小    已用   可用   使用率   挂载点"

    df -h | grep -E "^/dev/" | while read line; do
        local fs=$(echo "$line" | awk '{print $1}')
        local size=$(echo "$line" | awk '{print $2}')
        local used=$(echo "$line" | awk '{print $3}')
        local avail=$(echo "$line" | awk '{print $4}')
        local usage=$(echo "$line" | awk '{print $5}' | tr -d '%')
        local mount=$(echo "$line" | awk '{print $6}')

        printf "  %-20s %6s  %6s  %6s  %5s%%   %-10s " "$fs" "$size" "$used" "$avail" "$usage" "$mount"
        check_status "$usage" "$DISK_WARN"
    done
}

# 网络信息
get_network_info() {
    print_section "网络信息"

    # 获取 IP 地址
    ip addr | grep "inet " | grep -v "127.0.0.1" | while read line; do
        local iface=$(echo "$line" | awk '{print $NF}')
        local ip=$(echo "$line" | awk '{print $2}' | cut -d'/' -f1)
        echo "  $iface: $ip"
    done

    # 连接数
    local conn=$(ss -ant | grep -c ESTAB 2>/dev/null || netstat -ant | grep -c ESTABLISHED)
    echo "  已建立连接数: $conn"
}

# TOP 进程
get_top_processes() {
    print_section "TOP 10 内存占用进程"
    echo "  PID    进程名           内存占用"
    ps aux --sort=-%mem | head -11 | tail -10 | awk '{printf "  %-6s %-16s %s%%\n", $2, $11, $4}'
}

# 尾部信息
print_footer() {
    echo ""
    print_line
    echo -e "                           ${GREEN}巡检完成${NC}"
    print_line
}

# 主函数
main() {
    print_header
    get_system_info
    get_cpu_info
    get_memory_info
    get_disk_info
    get_network_info
    get_top_processes
    print_footer
}

main
