#!/bin/sh


sError="ERROR: "
[ ! -z "$SYNOPKG_PKGNAME" ] && sError="<br />${sError}"
TIMEOUT=120
PACKAGE_NAME="RustDesk Server"
PACKAGE_BASE="/var/packages/${PACKAGE_NAME}/target"
HBBR_BIN="${PACKAGE_BASE}/bin/hbbr"
HBBR_PORT=`synogetkeyvalue "${PACKAGE_BASE}/config/hbbr.conf" port`
HBBR_LOG="/var/log/hbbr.log"
HBBS_BIN="${PACKAGE_BASE}/bin/hbbs"
HBBS_PORT=`synogetkeyvalue "${PACKAGE_BASE}/config/hbbs.conf" port`
KEY=`synogetkeyvalue "${PACKAGE_BASE}/config/hbbs.conf" key`
HBBS_LOG="/var/log/hbbs.log"
PACKAGE_ENABLED="/var/packages/${PACKAGE_NAME}/enabled"
PS_CMD="/bin/ps -w"
DSM_MAJORVERSION=`synogetkeyvalue /etc.defaults/VERSION majorversion`
if [[ $DSM_MAJORVERSION -gt 5 ]]; then
    PS_CMD="$PS_CMD -x"
fi

CheckIfDaemonAlive() {
    local PID="$1"
    PROCESS_ALIVE="0"
    [ -z "$PID" ] && return 1

    kill -0 "$PID"
    [ "0" == "$?" ] && PROCESS_ALIVE="1"
}

running_hbbr() {
    local PID=$(${PS_CMD} | sed -e 's/^[ \t]*//' | grep -v grep | grep hbbr | grep "${PACKAGE_NAME}" | head -n1 | cut -f1 -d' ')
    CheckIfDaemonAlive $PID
    [ "0" == "$PROCESS_ALIVE" ] && return 1
    return 0
}

running_hbbs() {
    local PID=$(${PS_CMD} | sed -e 's/^[ \t]*//' | grep -v grep | grep hbbs | grep "${PACKAGE_NAME}" | head -n1 | cut -f1 -d' ')
    CheckIfDaemonAlive $PID
    [ "0" == "$PROCESS_ALIVE" ] && return 1
    return 0
}

start() {  
    [ "$SYNOPKG_TEMP_LOGFILE" == "" ] && SYNOPKG_TEMP_LOGFILE="/var/log/rustdeskserver.start.log"
    LANG=C cd "$PACKAGE_BASE" && (nohup "$HBBR_BIN" -p $HBBR_PORT -k "$KEY" > "$HBBR_LOG" 2>&1 &) && (nohup "$HBBS_BIN" -p $HBBS_PORT -k "$KEY" > "$HBBS_LOG" 2>&1 &)


    i=0
    while true; do
        if ! running_hbbr || ! running_hbbs ; then
#           echo "WAIT: ${i}s of ${TIMEOUT}s"
            sleep 5s
            i=$((i+5))
        else
            break
        fi
        [ $i -ge $TIMEOUT ] && break
    done

    # 检查hbbr进程状态
    if ! running_hbbr ; then
        echo -e "${sError}hbbr process not running" | tee -a $SYNOPKG_TEMP_LOGFILE
        stop
        return 1
    fi

    # 检查hbbs进程状态
    if ! running_hbbs ; then
        echo -e "${sError}hbbs process not running" | tee -a $SYNOPKG_TEMP_LOGFILE
        stop
        return 1
    fi

    return 0
}

stop() {
    [ "$SYNOPKG_TEMP_LOGFILE" == "" ] && SYNOPKG_TEMP_LOGFILE="/var/log/rustdeskserver.stop.log"
    # 检查hbbr进程状态
    if running_hbbr ; then
        local PID=$(${PS_CMD} | sed -e 's/^[ \t]*//' | grep -v grep | grep hbbr | grep "${PACKAGE_NAME}" | head -n1 | cut -f1 -d' ')
        [ -z "$PID" ] && return 0
        kill -15 $PID
        sleep 5s

        # 检查hbbr进程状态
        if running_hbbr ; then
            kill -9 $PID
            sleep 5s
            if running_hbbr ; then
                echo "${sError}Failed to kill hbbr process(pid=$PID)!" | tee -a $SYNOPKG_TEMP_LOGFILE
                return 1
            fi
        fi
    fi

    # 检查hbbs进程状态
    if running_hbbs ; then
        local PID=$(${PS_CMD} | sed -e 's/^[ \t]*//' | grep -v grep | grep hbbs | grep "${PACKAGE_NAME}" | head -n1 | cut -f1 -d' ')
        [ -z "$PID" ] && return 0
        kill -15 $PID
        sleep 5s

        # 检查hbbs进程状态
        if running_hbbs ; then
            kill -9 $PID
            sleep 5s
            if running_hbbs ; then
                echo "${sError}无法关闭hbbs进程 (pid=$PID)!" | tee -a $SYNOPKG_TEMP_LOGFILE
                return 1
            fi
        fi
    fi

    return 0
}

case $1 in
    start)
        # 启动服务器
        start
        exit $?
    ;;
    stop)
        # 关闭服务器
        stop
        exit $?
    ;;
    status)
        # 检查套件开关
        if [ ! -f "${PACKAGE_ENABLED}" ]; then
            echo "${sError}package not started" | tee -a $SYNOPKG_TEMP_LOGFILE
            exit 0
        fi

        # 检查hbbr进程状态
        if ! running_hbbr ; then
            echo "${sError}hbbr process killed" | tee -a $SYNOPKG_TEMP_LOGFILE
            exit 1
        fi

        # 检查hbbs进程状态
        if ! running_hbbs ; then
            echo "${sError}hbbs process killed" | tee -a $SYNOPKG_TEMP_LOGFILE
            exit 1
        fi

        exit 0
    ;;
    log)
        echo "$PACKAGE_BASE/logs/server.log"
        exit 0
    ;;
esac
