#!/bin/sh
source /etc/functions
esc=$'\x1b' attr="$esc[41;30m" default="$esc[0m"

TIME=1


pidfile=/var/run/linkd.pid
CLISETTING="/usr/bin/CLISettings"
SETTING_NAME="ETHLCFG_LINK_UP"
POPUP_ID="$SETTING_NAME.popup"
TRUE="true"
FALSE="false"

help()
{
    local - FUNCTION="help"
    ENTER_FUNCTION

    echo "Syntax: linkd [-p|--pidfile <pidfile>]"
    echo "Launch a daemon that monitors the ethernet link state and update ETHLCFG_LINK_UP."
    echo ""
    echo "Where <pidfile> is the file to store the pid of the daemon"
    RETURN 0
}

set_link_up()
{
    local - FUNCTION="set_link_up" state="$1"
    ENTER_FUNCTION

    [[ "$state" != "$TRUE" ]] && [[ "$state" != "$FALSE" ]] && { RETURN 1; }
    : "${attr}Setting $SETTING_NAME to $state${default}"
    $CLISETTING set CURRENT $SETTING_NAME $state >/dev/null 2>&1
    send_infra dbus_event "LINK_STATUS_CHANGE" >/dev/null 2>&1	
    case "$state" in
        "$FALSE")
            displaypopup -i "$POPUP_ID" -k >/dev/null
            displaypopup -i "$POPUP_ID" -l error ethernet link lost !!!! >/dev/null
        ;;
        "$TRUE")
            displaypopup -i "$POPUP_ID" -k >/dev/null
        ;;
    esac
    RETURN 0
}

EXIT_handler()
{
    displaypopup -i "$POPUP_ID" -k
}

TRAP_handler()
{
    local FUNCTION="TRAP_handler"
    ENTER_FUNCTION

    if [[ "${-//x}" != "$-" ]]; then
        # in xtrace
        set +x
        exec >&- 2>&-
    else
        # not in xtrace
        set -x
        exec >/dev/console 2>/dev/console
    fi
    RETURN 0
}

polling_thread()
{
    local - FUNCTION=polling_thread
    ENTER_FUNCTION
    local cState=$($CLISETTING get CURRENT $SETTING_NAME) state

    trap "" HUP
    trap EXIT_handler 0
    trap TRAP_handler TRAP
    while :; do
        case "$(eth link $ETHLCFG_LAN '?')" in
            "Link up") : "${attr}Link up${default}"
                state=$TRUE
            ;;
            "Link down") : "${attr}Link down${default}"
                state=$FALSE
            ;;
        esac
        if [[ "$cState" != "$state" ]]; then
            set_link_up "$state"
            cState=$state
        fi
        sleep $TIME
    done
    RETURN 0
}

################
# MAIN
################
## process cmd line
###################
while [[ $# -ne 0 ]]; do
    case "$1" in
        -p|--pidfile) : "${attr}pidfile${default}"
            [[ -z "$2" ]] && help && exit 1
            pidfile="$2"
            shift
        ;;
        *) : "${attr}unknown parameter: $1${default}"
            help
            exit 1
        ;;
    esac
    shift
done

## read config
##############
readCurrentConfig

## start the polling
set +x
exec <&- >/dev/null 2>&1
{ polling_thread & echo "$!" > $pidfile; } &

exit 0
