#!/bin/sh
# chkconfig: 2345 80 20
# description: Lnxall Applications Master Service
# processname: linit
# pidfile: /var/run/linit.pid
# config: /opt/lnxall_app/bin/linit.lua

### 核心配置（与原systemd服务完全一致，无需修改）
# 服务执行命令（匹配ExecStart）
LINIT_CMD="/opt/lnxall_app/bin/lua /opt/lnxall_app/bin/linit.lua"
# PID文件（记录服务主进程ID）
PID_FILE="/var/run/linit.pid"
# 日志文件（记录服务输出和启停日志）
LOG_FILE="/var/log/linit.log"
# 运行用户（匹配User=root）
RUN_USER="root"

### 日志输出函数（带时间戳，方便排查）
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

### 前置校验：检查依赖文件是否存在
check_deps() {
    # 检查lua解释器是否存在
    LUA_BIN=$(echo ${LINIT_CMD} | awk '{print $1}')
    if [ ! -x ${LUA_BIN} ]; then
        echo "错误：Lua解释器 ${LUA_BIN} 不存在或无执行权限！"
        exit 1
    fi
    # 检查linit.lua脚本是否存在
    LUA_SCRIPT=$(echo ${LINIT_CMD} | awk '{print $2}')
    if [ ! -f ${LUA_SCRIPT} ]; then
        echo "错误：Linit脚本 ${LUA_SCRIPT} 不存在！"
        exit 1
    fi
}

### 检查服务是否正在运行
is_running() {
    if [ -f ${PID_FILE} ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
        return 0  # 运行中，返回0
    else
        rm -f ${PID_FILE} >/dev/null 2>&1  # 清理无效PID文件
        return 1  # 未运行，返回1
    fi
}

### 启动服务函数（do_start）
do_start() {
    # 前置校验
    check_deps
    # 检查是否已运行
    if is_running; then
        echo "linit 服务已在运行，PID: $(cat ${PID_FILE})"
        log "linit服务启动失败：已处于运行状态，PID: $(cat ${PID_FILE})"
        return 0
    fi

    echo "正在启动 linit 服务..."
    log "开始启动linit服务，执行命令：${LINIT_CMD}"
    # 以root用户后台启动（匹配Type=simple前台运行，用nohup转后台守护）
    # 重定向所有输出到日志文件，匹配systemd的输出行为
    su - ${RUN_USER} -c "nohup ${LINIT_CMD} >${LOG_FILE} 2>&1 & echo \$! >${PID_FILE}"
    
    # 延时验证启动结果（给服务初始化时间）
    sleep 2
    if is_running; then
        local PID=$(cat ${PID_FILE})
        echo "linit 服务启动成功，PID: ${PID}"
        log "linit服务启动成功，PID: ${PID}"
        return 0
    else
        echo "linit 服务启动失败！请查看日志：${LOG_FILE}"
        log "linit服务启动失败：执行命令后进程未存活"
        return 1
    fi
}

### 停止服务函数（do_stop）- 匹配KillSignal=SIGKILL强制终止
do_stop() {
    # 检查是否未运行
    if ! is_running; then
        echo "linit 服务未运行"
        log "linit服务停止操作：服务未运行，无需处理"
        return 0
    fi

    local MAIN_PID=$(cat ${PID_FILE})
    echo "正在停止 linit 服务（PID: ${MAIN_PID}），强制终止（SIGKILL）..."
    log "开始停止linit服务，强制发送SIGKILL信号，PID: ${MAIN_PID}"
    
    # 匹配原systemd KillSignal=SIGKILL，直接强制终止（不可忽略/捕获）
    kill -9 ${MAIN_PID} >/dev/null 2>&1
    # 清理PID文件
    rm -f ${PID_FILE} >/dev/null 2>&1

    echo "linit 服务已强制停止"
    log "linit服务停止成功，PID: ${MAIN_PID} 已被SIGKILL终止"
    return 0
}

### 重启服务函数（do_restart）
do_restart() {
    echo "正在重启 linit 服务..."
    log "开始重启linit服务"
    # 先停止（无状态则跳过），再启动
    do_stop
    sleep 2  # 延时确保进程彻底终止
    do_start
    log "linit服务重启操作执行完成"
    return 0
}

### 状态查询函数（do_status）
do_status() {
    if is_running; then
        local PID=$(cat ${PID_FILE})
        echo "linit 服务正在运行"
        echo "  PID: ${PID}"
        echo "  运行用户: ${RUN_USER}"
        echo "  日志文件: ${LOG_FILE}"
        log "查询linit服务状态：运行中，PID: ${PID}"
        return 0
    else
        echo "linit 服务未运行"
        log "查询linit服务状态：未运行"
        return 3
    fi
}

### 主逻辑入口
case "$1" in
    start)
        do_start
        exit $?
        ;;
    stop)
        do_stop
        exit $?
        ;;
    restart)
        do_restart
        exit $?
        ;;
    status)
        do_status
        exit $?
        ;;
    *)
        # 非法命令提示
        echo "使用方法：$0 {start|stop|restart|status}"
        exit 2
        ;;
esac

exit 0
