#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs shows a login webpage on walled garden networks.
# See NetworkManager(8) for further documentation of the dispatcher events.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
URL="network-test.kylinos.cn"
URL_FULL="http://network-test.kylinos.cn"
URLS_FULL="https://network-test.kylinos.cn"

#url_response=$(curl -s -o /dev/null -w "%{http_code}" $URL)
#url_response_full=$(curl -s -o /dev/null -w "%{http_code}" $URL_FULL)
#urls_response_full=$(curl -s -o /dev/null -w "%{http_code}" $URLS_FULL)

if [ -x "/usr/bin/logger" ]; then
    logger="/usr/bin/logger -s -t captive-portal"
else
    logger=":"
fi

wait_for_process() {
    PNAME=$1
    while [ -z "$(/usr/bin/pgrep  -x $PNAME)" ]; do
        sleep 3;
    done
}

check_user() {
    # Iterate over all logged in users and start a browser for each of them
    for user in $(loginctl list-users --no-legend|awk '{print $2}'); do
        # Skip root user
        if [ "$user" = "root" ]; then
            continue
        fi
        # 使用loginctl show-user命令获取用户状态
        user_status=$(loginctl --no-legend show-user $user -p State --value)
        if [ $? -eq 0 ]; then
            if [ "$user_status" = "active" ]; then
                for se in `loginctl --no-legend show-user $user -p Sessions --value`
                do
                    display=$(loginctl --no-legend show-session $se -p Display --value)
                    if [ -n "$display" ];then
                    break
                    fi
                done
                #display=$(who | awk -v user="$user" '$1 ==user {print $NF}' | sed 's/[()]//g')
                # Start the browser for the user
                start_browser "$user" "$display" || $logger -p user.err "Failed for user: '$user' display: '$display'"
                break
            fi
        else
            $logger -p user.warning "User '$user' does not have an active desktop session"
            exit 0
        fi
    done
}

#launch the browser, but on boot we need to wait that nm-applet starts
start_browser() {
    $logger "start_browser=============="
    local user="$1"
    local display="$2"

    export DISPLAY="$display"
	export GTK_IM_MODULE=fcitx
   # wait_for_process nm-applet
    wait_for_process kylin-nm

    export XAUTHORITY="/home/$user/.Xauthority"

    $logger "Running browser as '$user' with display '$display' to login in captive portal"
    sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY,GTK_IM_MODULE -H xdg-open http://network-test.kylinos.cn 2>&1 > /dev/null
}

# Run the right scripts
case "$2" in
    connectivity-change)
    $logger -p user.debug "dispatcher script triggered on connectivity change: $CONNECTIVITY_STATE"
    if [ "$CONNECTIVITY_STATE" = "PORTAL" ]; then
    check_user
	#$logger -p user.debug "1111111111111111111"
    #    url_response=$(curl -s -o /dev/null -w "%{http_code}" $URL)
	#$logger -p user.debug "2222222222222222222: $URL $url_response"
    #    url_response_full=$(curl -s -o /dev/null -w "%{http_code}" $URL_FULL)
	#$logger -p user.debug "3333333333333333333: $URL_FULL $url_response_full"
        #urls_response_full=$(curl -s -o /dev/null -w "%{http_code}" "https://network-test.kylinos.cn")
	#$logger -p user.debug "4444444444444444444: $URLS_FULL $urls_response_full"
    #   if [ $url_response_full -eq 200 ]||[ $urls_response_full -eq 200 ]; then
    #        $logger -p user.debug "The network is good"
    #    else
            # 检测到重定向，需要进行认证
            $logger -p user.debug "The network need to auth"
            # Match last column of who's output with ' :[at least one digit] '
            #who | awk '$NF ~ /\(:[0-9]+\)/ { print $1 " " substr($NF, 2, length($NF)-2) };' | \
            #while read user display; do
            #   start_browser $user $display || $logger -p user.err "Failed for user: '$user' display: '$display'"
            #done
    #    fi
    fi
    ;;
    *)
    # In a down phase
    exit 0
    ;;
esac
