#!/system/bin/sh
# KernelSU模块监控工具 - 实时监控模块状态
# 版本: 1.0
# 作者: RootManage Module System

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 配置变量
MONITOR_INTERVAL=5
LOG_FILE="/data/local/tmp/module-monitor.log"
PID_FILE="/data/local/tmp/module-monitor.pid"

# 显示帮助信息
show_help() {
    echo "KernelSU模块监控工具"
    echo ""
    echo "用法: module-monitor [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help           显示此帮助信息"
    echo "  -i, --interval SEC   监控间隔(秒), 默认5秒"
    echo "  -l, --log FILE       日志文件路径"
    echo "  -d, --daemon         后台运行模式"
    echo "  -s, --stop           停止后台监控"
    echo "  -t, --tail           实时查看日志"
    echo "  -c, --clear          清空日志"
    echo "  --status             显示监控状态"
    echo ""
    echo "示例:"
    echo "  module-monitor              # 前台监控"
    echo "  module-monitor -d           # 后台监控"
    echo "  module-monitor -i 10        # 10秒间隔监控"
    echo "  module-monitor -t           # 查看实时日志"
}

# 获取模块列表
get_modules() {
    find /data/adb/modules* -maxdepth 1 -type d -name "*" 2>/dev/null | grep -v "^/data/adb/modules$" | grep -v "^/data/adb/modules_update$"
}

# 获取模块信息
get_module_info() {
    local module_path="$1"
    local module_id=$(basename "$module_path")
    local prop_file="$module_path/module.prop"
    
    local name="Unknown"
    local version="Unknown"
    local versionCode="Unknown"
    local author="Unknown"
    local description="Unknown"
    
    if [ -f "$prop_file" ]; then
        name=$(grep "^name=" "$prop_file" 2>/dev/null | cut -d'=' -f2)
        version=$(grep "^version=" "$prop_file" 2>/dev/null | cut -d'=' -f2)
        versionCode=$(grep "^versionCode=" "$prop_file" 2>/dev/null | cut -d'=' -f2)
        author=$(grep "^author=" "$prop_file" 2>/dev/null | cut -d'=' -f2)
        description=$(grep "^description=" "$prop_file" 2>/dev/null | cut -d'=' -f2)
    fi
    
    echo "$module_id|$name|$version|$versionCode|$author|$description"
}

# 检查模块状态
check_module_status() {
    local module_path="$1"
    local module_id=$(basename "$module_path")
    
    # 检查是否启用
    local enabled="是"
    if [ -f "$module_path/disable" ]; then
        enabled="否"
    fi
    
    # 检查是否移除
    local remove="否"
    if [ -f "$module_path/remove" ]; then
        remove="是"
    fi
    
    # 检查更新标记
    local update="否"
    if [ -f "$module_path/update" ]; then
        update="是"
    fi
    
    # 检查服务脚本
    local service="否"
    if [ -f "$module_path/service.sh" ]; then
        service="是"
    fi
    
    # 检查安装后脚本
    local post_fs="否"
    if [ -f "$module_path/post-fs-data.sh" ]; then
        post_fs="是"
    fi
    
    echo "$enabled|$remove|$update|$service|$post_fs"
}

# 显示模块状态
show_modules_status() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    echo -e "${CYAN}========================================${NC}"
    echo -e "${CYAN} KernelSU模块监控 - $timestamp ${NC}"
    echo -e "${CYAN}========================================${NC}"
    
    local modules=$(get_modules)
    if [ -z "$modules" ]; then
        echo -e "${YELLOW}[INFO]${NC} 未发现已安装的模块"
        return
    fi
    
    printf "%-20s %-25s %-10s %-6s %-6s %-6s %-6s %-6s\n" "模块ID" "名称" "版本" "启用" "移除" "更新" "服务" "POST"
    echo "----------------------------------------------------------------------------------------------------"
    
    echo "$modules" | while read -r module_path; do
        if [ -n "$module_path" ]; then
            local info=$(get_module_info "$module_path")
            local status=$(check_module_status "$module_path")
            
            local module_id=$(echo "$info" | cut -d'|' -f1)
            local name=$(echo "$info" | cut -d'|' -f2)
            local version=$(echo "$info" | cut -d'|' -f3)
            
            local enabled=$(echo "$status" | cut -d'|' -f1)
            local remove=$(echo "$status" | cut -d'|' -f2)
            local update=$(echo "$status" | cut -d'|' -f3)
            local service=$(echo "$status" | cut -d'|' -f4)
            local post_fs=$(echo "$status" | cut -d'|' -f5)
            
            # 限制显示长度
            if [ ${#module_id} -gt 18 ]; then
                module_id="${module_id:0:15}..."
            fi
            if [ ${#name} -gt 23 ]; then
                name="${name:0:20}..."
            fi
            if [ ${#version} -gt 8 ]; then
                version="${version:0:5}..."
            fi
            
            # 设置状态颜色
            local enabled_color="$GREEN"
            if [ "$enabled" = "否" ]; then
                enabled_color="$RED"
            fi
            
            local remove_color="$NC"
            if [ "$remove" = "是" ]; then
                remove_color="$RED"
            fi
            
            printf "%-20s %-25s %-10s ${enabled_color}%-6s${NC} ${remove_color}%-6s${NC} %-6s %-6s %-6s\n" \
                "$module_id" "$name" "$version" "$enabled" "$remove" "$update" "$service" "$post_fs"
        fi
    done
    
    echo ""
}

# 监控模式
monitor_mode() {
    local daemon_mode="$1"
    
    if [ "$daemon_mode" = "true" ]; then
        echo -e "${BLUE}[INFO]${NC} 启动后台监控模式..."
        echo $$ > "$PID_FILE"
        exec > "$LOG_FILE" 2>&1
    fi
    
    while true; do
        if [ "$daemon_mode" != "true" ]; then
            clear
        fi
        
        show_modules_status
        
        if [ "$daemon_mode" = "true" ]; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') - 监控完成" >> "$LOG_FILE"
        fi
        
        sleep "$MONITOR_INTERVAL"
    done
}

# 停止后台监控
stop_daemon() {
    if [ -f "$PID_FILE" ]; then
        local pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            kill "$pid"
            rm -f "$PID_FILE"
            echo -e "${GREEN}[SUCCESS]${NC} 后台监控已停止"
        else
            echo -e "${YELLOW}[WARN]${NC} 后台监控进程不存在"
            rm -f "$PID_FILE"
        fi
    else
        echo -e "${YELLOW}[WARN]${NC} 未找到后台监控进程"
    fi
}

# 显示监控状态
show_status() {
    if [ -f "$PID_FILE" ]; then
        local pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            echo -e "${GREEN}[INFO]${NC} 后台监控正在运行 (PID: $pid)"
        else
            echo -e "${RED}[INFO]${NC} 后台监控进程异常"
            rm -f "$PID_FILE"
        fi
    else
        echo -e "${YELLOW}[INFO]${NC} 后台监控未运行"
    fi
    
    if [ -f "$LOG_FILE" ]; then
        local log_size=$(wc -c < "$LOG_FILE")
        echo -e "${BLUE}[INFO]${NC} 日志文件大小: $log_size 字节"
    fi
}

# 实时查看日志
tail_log() {
    if [ -f "$LOG_FILE" ]; then
        echo -e "${BLUE}[INFO]${NC} 实时查看日志 (Ctrl+C 退出)"
        tail -f "$LOG_FILE"
    else
        echo -e "${YELLOW}[WARN]${NC} 日志文件不存在"
    fi
}

# 清空日志
clear_log() {
    if [ -f "$LOG_FILE" ]; then
        > "$LOG_FILE"
        echo -e "${GREEN}[SUCCESS]${NC} 日志已清空"
    else
        echo -e "${YELLOW}[WARN]${NC} 日志文件不存在"
    fi
}

# 主函数
main() {
    local daemon_mode="false"
    
    # 解析命令行参数
    while [ $# -gt 0 ]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -i|--interval)
                MONITOR_INTERVAL="$2"
                shift 2
                ;;
            -l|--log)
                LOG_FILE="$2"
                shift 2
                ;;
            -d|--daemon)
                daemon_mode="true"
                shift
                ;;
            -s|--stop)
                stop_daemon
                exit 0
                ;;
            -t|--tail)
                tail_log
                exit 0
                ;;
            -c|--clear)
                clear_log
                exit 0
                ;;
            --status)
                show_status
                exit 0
                ;;
            -*)
                echo -e "${RED}[ERROR]${NC} 未知选项: $1"
                show_help
                exit 1
                ;;
            *)
                echo -e "${RED}[ERROR]${NC} 未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 验证监控间隔
    if ! echo "$MONITOR_INTERVAL" | grep -q '^[0-9]\+$' || [ "$MONITOR_INTERVAL" -lt 1 ]; then
        echo -e "${RED}[ERROR]${NC} 监控间隔必须为正整数"
        exit 1
    fi
    
    # 启动监控
    monitor_mode "$daemon_mode"
}

# 信号处理
trap 'echo -e "\n${YELLOW}[INFO]${NC} 监控已停止"; exit 0' INT TERM

# 执行主函数
main "$@"
