#!/bin/sh
### BEGIN INIT INFO
# Provides:          NS-G111-Print
# Required-Start:    $local_fs $network $syslog
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: NS g111 state monitor
# Description:       NS g111 state monitor
### END INIT INFO
. /lib/lsb/init-functions

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/ns/ns-printer-g111/bin/nsG111WD
WATCHDOGNAME=nsG111WD
SERVICENAME=nsG111Service
DESC="NS G111 Print Status Monitor"
SCRIPTNAME=/etc/init.d/nsG111Serviced

# --- 等待活跃用户会话 ---
wait_for_user_session() {
    echo "wait_for_user_session: 开始检测用户会话" >&2  
        while true; do
        # 获取会话信息并清理不可见字符
        session_info=$(loginctl list-sessions --no-legend | \
                      awk '!/lightdm|gdm|sddm/ && /seat/ {print $1, $3; exit}' | \
                      tr -d '\r\n\t')  # 删除回车、换行、制表符和空格

        if [ -n "$session_info" ]; then
            local session_id=$(echo "$session_info" | awk '{print $1}')
            local session_user=$(echo "$session_info" | awk '{print $2}')
            # 调试输出清理后的变量
            echo "检测到会话 - ID: [$session_id], 用户: [$session_user]" >&2

           if getent passwd "$session_user" >/dev/null 2>&1; then
                echo "$session_user"
                return 0
           fi
        fi
        sleep 1
    done
    return 1
}

# --- X11 环境设置 ---
setup_x11_env() {
    local XAUTHORITY_USER="$1"
    if [ -z "$XAUTHORITY_USER" ]; then
        log_failure_msg "错误：未指定用户！"
        return 1
    fi
    
    # 设置 .Xauthority 路径
    auth_path="/home/$XAUTHORITY_USER/.Xauthority"
    if [ -f "${auth_path}" ]; then
        export XAUTHORITY="$auth_path"
    else
        echo ".Xauthority 不存在，正在生成..."
        touch "${auth_path}"
        chmod 600 "${auth_path}"
        chown "${XAUTHORITY_USER}:${XAUTHORITY_USER}" "${auth_path}"
        display="${DISPLAY:-:0}"               
        mcookie=$(mcookie)
        sudo -u "${XAUTHORITY_USER}" sh -c " \
            export DISPLAY='${display}'; \
            xauth add '${display}' . '${mcookie}'; \
        "
        export XAUTHORITY="$auth_path"
    fi
    log_daemon_msg "检测到Xauthority路径: $XAUTHORITY"
    # 设置 DISPLAY 并放宽权限
    DISPLAY=":0"
    export DISPLAY XAUTHORITY
    xhost +local: >/dev/null 2>&1 || {
        log_warning_msg "xhost +local: 失败，尝试继续..."
    }

    # 最终检查
    if ! xdpyinfo >/dev/null 2>&1; then
        log_failure_msg "无法连接到 X Server！"
        log_failure_msg "当前变量: DISPLAY=$DISPLAY, XAUTHORITY=$XAUTHORITY"
        return 1
    fi
    return 0
}


case "$1" in
  start)
       echo "Starting $DESC"
       login_user=$(wait_for_user_session)
       echo "Starting $DESC"
       if [ $? -ne 0 ] || [ -z "$login_user" ]; then
        echo "获取登陆用户失败。"
        exit 1
       fi
	echo "获取登陆用户。$login_user"
       if ! setup_x11_env "$login_user"; then
        log_failure_msg "X11 环境配置失败！"
        exit 1
       fi

       log_daemon_msg "最终环境变量：DISPLAY=$DISPLAY, XAUTHORITY=$XAUTHORITY"
	nohup $DAEMON &> /dev/null &
	status=$?
	echo $status
	;;
  stop)
	echo "Stopping $DESC"
	killall $WATCHDOGNAME
	killall $SERVICENAME
	status=$?
	echo $status
	;;
  restart)
	echo "Restarting $DESC"
	killall $WATCHDOGNAME
	killall $SERVICENAME
	nohup $DAEMON &> /dev/null &
	status=$?
	echo $status
	;;
  status)
	status_of_proc -p "$DAEMON" "$WATCHDOGNAME" && exit 0 || exit $?
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
	exit 3
	;;
esac

exit 0