#!/bin/bash
## TEST #######

ETH_ENABLED=false
ETH_MODE=static
ETH_IP=192.168.3.1
ETH_MASK=255.255.255.0
ETH_GW=192.168.3.1
ETH_DNS1=10.0.1.51
ETH_DNS2=10.0.2.9

ETH_ENABLED=true
ETH_MODE=dhcp
ETH_IP=
ETH_MASK=
ETH_GW=
ETH_DNS1=
ETH_DNS2=

###
WIFI_ENABLED=true
WIFI_MODE=dhcp
WIFI_SSID=HTC9MG
WIFI_PASS=baccabacca
WIFI_IP=
WIFI_MASK=
WIFI_GW=
WIFI_DNS1=
WIFI_DNS2=

NET_NTP=pool.ntp.org
NET_ZONE=Europe/Paris

### ESERCIZIO #########################

#
# json exctract value di param
#
json_param() {
    picurl=`jsonpar.py -p $1 -f $CONFIG_NET`
}


loadJson() {
    log "Loading config..."
    json_param 'eth_enabled'  ; ETH_ENABLED="$picurl"  ; export ETH_ENABLED
    json_param 'eth_mode'     ; ETH_MODE="$picurl"     ; export ETH_MODE
    json_param 'eth_ip'       ; ETH_IP="$picurl"       ; export ETH_IP
    json_param 'eth_mask'     ; ETH_MASK="$picurl"     ; export ETH_MASK
    json_param 'eth_gw'       ; ETH_GW="$picurl"       ; export ETH_GW
    json_param 'eth_dns1'     ; ETH_DNS1="$picurl"     ; export ETH_DNS1
    json_param 'eth_dns2'     ; ETH_DNS2="$picurl"     ; export ETH_DNS2

    json_param 'wifi_enabled' ; WIFI_ENABLED="$picurl" ; export WIFI_ENABLED
    json_param 'wifi_mode'    ; WIFI_MODE="$picurl"    ; export WIFI_MODE
    json_param 'wifi_ssid'    ; WIFI_SSID="$picurl"    ; export WIFI_SSID
    json_param 'wifi_pass'    ; WIFI_PASS="$picurl"    ; export WIFI_PASS
    json_param 'wifi_ip'      ; WIFI_IP="$picurl"      ; export WIFI_IP

    json_param 'wifi_type'        ; WIFI_TYPE="$picurl"        ; export WIFI_TYPE
    json_param 'wifi_eap_pass'    ; WIFI_EAP_PASS="$picurl"    ; export WIFI_EAP_PASS
    json_param 'wifi_eap_user'    ; WIFI_EAP_USER="$picurl"    ; export WIFI_EAP_USER
    json_param 'wifi_hidden'      ; WIFI_HIDDEN="$picurl"      ; export WIFI_HIDDEN

    if [[ $WIFI_EAP_PASS == *"no par"* ]]; then
        log "no wifi_eap_pass, set to \"\" ($WIFI_EAP_PASS)"
        WIFI_EAP_PASS=""
    fi

    if [[ $WIFI_EAP_USER == *"no par"* ]]; then
        log "no wifi_eap_user, set to \"\" ($WIFI_EAP_USER)"
        WIFI_EAP_USER=""
    fi

    if [[ $WIFI_TYPE == *"no par"* ]]; then
        log "no wifi_type, set to \"\"     ($WIFI_TYPE)"
        WIFI_TYPE=""
    fi

    if [[ $WIFI_HIDDEN == *"no par"* ]]; then
        log "no wifi_hidden, set to \"\"   ($WIFI_HIDDEN)"
        WIFI_HIDDEN=""
    fi


    json_param 'wifi_mask'    ; WIFI_MASK="$picurl"    ; export WIFI_MASK
    json_param 'wifi_gw'      ; WIFI_GW="$picurl"      ; export WIFI_GW
    json_param 'wifi_dns1'    ; WIFI_DNS1="$picurl"    ; export WIFI_DNS1
    json_param 'wifi_dns2'    ; WIFI_DNS2="$picurl"    ; export WIFI_DNS2

    json_param 'net_ntp'      ; NET_NTP="$picurl"      ; export NET_NTP
    json_param 'net_zone'     ; NET_ZONE="$picurl"     ; export NET_ZONE

}

CONFIG_NET="/home/st/configured_cfg_net.json"
CONNMAN_DIR=/var/lib/connman
WPACONF=/etc/wpa_supplicant/wpa_supplicant.conf
NTPCONF=/etc/systemd/timesyncd.conf
LOGCONF=/home/st/config_net_log.log

export ETH_ENABLED ETH_MODE ETH_IP ETH_MASK ETH_GW ETH_DNS1 ETH_DNS2
export WIFI_ENABLED WIFI_MODE WIFI_SSID WIFI_PASS WIFI_IP WIFI_MASK WIFI_GW WIFI_DNS1 WIFI_DNS2
export NET_NTP NET_ZONE NTPCONF
export CONFIG_NET
export CONNMAND_DIR
export WPACONF

#CONFIG ETHERNET

log () {
    echo `date +"%Y-%m-%d %T"` $1 >>"$LOGCONF"
    echo `date +"%Y-%m-%d %T"` $1
}

#
# config
#
deleteconf () {
    log "deleteconf $1"
    if [ "$1" == "wifi" ]
    then
        rm -rf $CONNMAN_DIR/wifi*
    else
        rm -rf $CONNMAN_DIR/ethernet*
    fi
}

appendNtp () {
    echo "$1" >>$NTPCONF.NEW
}

createNtp () {
    # rm -rf $NTPCONF
    appendNtp "[Time]"
    appendNtp "Servers = $NET_NTP "
    appendNtp " "
    diff $NTPCONF $NTPCONF.NEW >>/dev/null
    RC=$?
    export RC
    if [ "$RC" == "0" ]
    then
        log "NTP Conf not changed "
        rm $NTPCONF.NEW
    else
        log "NTP Conf changed,Restarted systemd-timesyncd service "
        cp $NTPCONF.NEW $NTPCONF
        rm $NTPCONF.NEW
        systemctl restart systemd-timesyncd
    fi
}

appendConfig () {
    echo "$1" >>/var/lib/connman/$SERVICE-psk.config
}

appendConfigLast () {
    appendConfig " "
    appendConfig "Nameservers = $WIFI_DNS1,$WIFI_DNS2 "
    appendConfig "Timeservers = $NET_NTP "
    appendConfig " "

    ## cat /var/lib/connman/$SERVICE-psk.config
    ## echo "Created /var/lib/connman/$SERVICE-psk.config "
    log "Wifi created $SERVICE-psk.config config"
}



createConfig () {
    rm -rf /var/lib/connman/$SERVICE-psk.config
    appendConfig "[global]"
    appendConfig "Name = RC"
    appendConfig "Description = RC Wifi service config file"
    appendConfig " "
    appendConfig "[service_$SERVICE]"
    appendConfig "Type = wifi"
    appendConfig "Name = $WIFI_SSID "
    if [ "$WIFI_HIDDEN" == "true" ]
    then
        log "set wifi_hidden = true"
        appendConfig "Hidden=true "
    fi

    if [ "$WIFI_TYPE" == "" -o "$WIFI_TYPE" == "WPA2-PSK" ]
    then
        log "no wifi_type, using default wpa2"
        appendConfig "Passphrase = $WIFI_PASS "
        appendConfig " "
    fi

    if [ "$WIFI_TYPE" == "WPA2 EAP-PSK" ]
    then
        log "wifi_type WPA2 EAP-PSK, using Passphrase of wpa2"
        appendConfig "EAP = peap "
        appendConfig "Phase2 = MSCHAPV2 "
        appendConfig "Identity = $WIFI_EAP_USER "
        appendConfig "Passphrase = $WIFI_EAP_PASS "
        appendConfig " "
    fi

}



################## MAIN

log "configure_net started"
if [ "$1" != "" ]
then
    log "$0 try_only_mode"
    TRY_ONLY_MODE="true" ; export TRY_ONLY_MODE
else
    TRY_ONLY_MODE="false" ; export TRY_ONLY_MODE
fi

loadJson

if [ $ETH_ENABLED == "true" ]
then
    log "Configuring ethernet..."
    log "disabling wifi..."
    connmanctl disable wifi

    if [ "$TRY_ONLY_MODE" == "true" ]
    then
        log "try only disabling(5s), enabling(5s) ..."

        log "connmanctl ethernet, sleep 5"
        connmanctl disable ethernet
        sleep 5

        log "connmanctl enable ethernet, sleep 5"
        connmanctl enable ethernet
        sleep 5

    else
        log "configure : stopped, deleting, started, configure, enabling..."

        log "systemctl stop connman, sleep 5"
        systemctl stop connman
        sleep 5

        log "deleting old ethernet configuration..."
        deleteconf ethernet

        log "systemctl start connman, sleep 5"
        systemctl start connman
        sleep 5

        SERVICE=`connmanctl services | grep ethernet | awk '{ print $NF }'`
        export SERVICE

        if [ x$SERVICE == x ]
        then
            log "No ethernet service present"
        else
            log "Ethernet service : $SERVICE"
            case "$ETH_MODE" in
                static)
                    connmanctl config $SERVICE --ipv4 manual $ETH_IP $ETH_MASK $ETH_GW --nameservers $ETH_DNS1 $ETH_DNS2 --timeservers $NET_NTP
                    log "Ethernet configured STATIC ip:$ETH_IP mask:$ETH_MASK gw:$ETH_GW dns:$ETH_DNS1,$ETH_DNS2 ntp:$NET_NTP"

                ;;
                dhcp)
                    connmanctl config $SERVICE --ipv4 dhcp --timeservers $NET_NTP
                    log "Ethernet configured DHCP ntp:$NET_NTP"
                ;;
                *)
                    log "Ethernet Mode unknown : $ETH_MODE"
            esac
        fi
    fi
else
    log "connmanctl disable ethernet"
    connmanctl disable ethernet

    log "Ethernet deconfigured "
fi

# CONFIG WIFI
if [ $WIFI_ENABLED == "true" ]
then
    log "Configuring WIFI $WIFI_SSID..."
    log "disabling ethernet..."
    connmanctl disable ethernet



    if [ "$TRY_ONLY_MODE" == "true" ]
    then
        log "try_only : disabling(5s), enabling(5s), scanning(15s)..."

        log "connmanctl disable wifi, sleep 5"
        connmanctl disable wifi
        sleep 5

        log "connmanctl enable wifi, sleep 5"
        connmanctl enable wifi
        sleep 5

        log "connmanctl scan wifi, sleep 15"
        connmanctl scan wifi
        sleep 15
    else
        log "configure : disabling, enabling, scanning..."

        log "systemctl stop connman, sleep 5"
        systemctl stop connman
        sleep 5

        #log "delete wpa_supplicant conf"
        #cp $WPACONF.default $WPACONF

        log "deleting old wifi configuration..."
        deleteconf wifi

        log "systemctl start connman, sleep 5"
        systemctl start connman
        sleep 5

        log "connmanctl enable wifi, sleep 5"
        connmanctl enable wifi
        sleep 5

        log "connmanctl scan wifi, sleep 15"
        connmanctl scan wifi
        sleep 15

        log "found networks : "
        WI=`connmanctl services` ; export WI
        log "$WI"

        SERVICE=`connmanctl services | grep wifi | grep " $WIFI_SSID " |  awk '{ print $NF }'`
        export SERVICE

        if [ x$SERVICE == x -a "$WIFI_HIDDEN" == "true" ]
        then
            log "Hidden network : SERVICE set \"wifi_$WIFI_SSID\" "
            SERVICE="wifi_$WIFI_SSID"
            export SERVICE
        fi

        if [ x$SERVICE == x -a "$WIFI_HIDDEN" != "true" ]
        then
            log "No wifi service \"$WIFI_SSID\" present"
        else
            log "Wifi service : $SERVICE"
            createConfig

            case "$WIFI_MODE" in
                static)
                    log "Wifi static conf :  $WIFI_IP/$WIFI_MASK/$WIFI_GW "
                    # connmanctl agent on
                    # connmanctl config $SERVICE --ipv4 manual $WIFI_IP $WIFI_MASK $WIFI_GW --nameservers $WIFI_DNS1 $WIFI_DNS2 --timeservers $NET_NTP
                    # connmanctl scan wifi
                    appendConfig "IPv4 = $WIFI_IP/$WIFI_MASK/$WIFI_GW "
                    appendConfigLast
                    connmanctl services >>/dev/null

                    connmanctl connect $SERVICE
                ;;

                dhcp)
                    log "Wifi dhcp conf "
                    # connmanctl scan wifi
                    # append DHCP to file
                    appendConfig "IPv4 = dhcp "
                    appendConfigLast
                    connmanctl services >>/dev/null

                    connmanctl connect $SERVICE
                ;;

                *)
                    log "WIFI Mode unknown : $WIFI_MODE"
            esac
            log "Wifi configured : $WIFI_SSID"
        fi
    fi
else
    log "connmanctl disable wifi, sleep 5"
    connmanctl disable wifi
    #deleteconf wifi
    # cp $WPACONF.default $WPACONF
    log "WIFI deconfigured"
fi

##### Timezone

createNtp
rm /etc/localtime
ln -s /usr/share/zoneinfo/$NET_ZONE /etc/localtime
log "Zoneinfo created"

log "Net configured"
