#!/bin/sh
# 网络配置

uboot_env=$(fw_printenv)
if [ -z "$uboot_env" ]; then
    uboot_env=$(factory get)
fi

# PRODUCT=$(echo "$uboot_env" | grep -i ^PRODUCT | awk -F = '{print $2}' | tr '\n' '\0')
BOARD_NAME=$(cat /tmp/sysinfo/board_name)
sn=$(echo "$uboot_env" | awk -F'=' '/^SN=/{print $2}')
if [ -z "$BOARD_NAME" ] || [ -z "$sn" ]; then
    echo "product or sn err"
    exit 1
else
    echo "BOARD_NAME=$BOARD_NAME"
    echo "sn=$sn"
fi

system_cfg_file="/app/config/system_cfg.json"
bcast_port="lo"
bcast_ip="127.0.0.1"
lan_ip="172.18.39.254"
wan_cfg="dhcp"
wan_ip=""

reload_net_cfg() {
    case "$1" in
    WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        /etc/init.d/network restart
        ;;
    WLOSANY_EM1000 | WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
        netuci
        ;;
    *) ;;
    esac
}

set_network() {
    case "$1" in
    WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        /lib/dyiot/bin/set_vap.sh set ap -name vap00 -ssid EMS-$cab_id-$sn -key lnxall123
        /lib/dyiot/bin/set_lan_inline.sh del ilan
        /lib/dyiot/bin/set_lan_inline.sh set lan --ipaddr $lan_ip
        if [ "$wan_cfg" = "dhcp" ]; then
            /lib/dyiot/bin/set_wan.sh set wan -D
        else
            /lib/dyiot/bin/set_wan.sh set wan -S $wan_cfg
        fi
        ;;
    WLOSANY_EM1000)
        bash /opt/lnxall_app/lib/dyiot/bin/set_lan_inline.sh del ilan
        bash /opt/lnxall_app/lib/dyiot/bin/set_lan_inline.sh set lan --ipaddr $lan_ip
        if [ "$wan_cfg" = "dhcp" ]; then
            bash /opt/lnxall_app/lib/dyiot/bin/set_wan.sh set wan -D
        else
            bash /opt/lnxall_app/lib/dyiot/bin/set_wan.sh set wan -S $wan_cfg
        fi
        ;;
    WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
        bash /opt/lnxall_app/lib/dyiot/bin/set_lan_inline.sh set lan --ipaddr $lan_ip
        if [ "$wan_cfg" = "dhcp" ]; then
            bash /opt/lnxall_app/lib/dyiot/bin/set_wan.sh set wan -D
        else
            bash /opt/lnxall_app/lib/dyiot/bin/set_wan.sh set wan -S $wan_cfg
        fi

        ;;
    *) ;;
    esac
}

sd_pwd="/mnt/ssd"
start_httpd_and_ftp() {
    df |grep $sd_pwd
    if [ $? -eq 0 ]; then            #判断sd卡是否挂载
        case "$1" in
        SMC-SERVWE_V2 | WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
                uci set uhttpd.main.home=$sd_pwd #http
                uci commit
                /etc/init.d/uhttpd reload

                ###ftp
                ftp_config_pwd=/etc/vsftpd.conf
                if [ -f "$ftp_config_pwd"]; then
                    sed -i "s/anonymous_enable=NO/anonymous_enable=YES/g" $ftp_config_pwd
                    grep -q "anon_root" $ftp_config_pwd
                    if [ $? -ne 0 ]; then
                        echo "anon_root=$sd_pwd" >>$ftp_config_pwd
                    else
                        sed -i "s/anon_root.*/anon_root=$sd_pwd/g" $ftp_config_pwd
                    fi
                    /etc/init.d/vsftpd reload
                fi
                ####
            ;;
        WLOSANY_EM1000)
                ###ftp
                ftp_config_pwd=/etc/vsftpd.conf
                if [ -f "$ftp_config_pwd" ]; then
                    sed -i "s/anonymous_enable=NO/anonymous_enable=YES/g" $ftp_config_pwd
                    grep -q "anon_root" $ftp_config_pwd
                    if [ $? -ne 0 ]; then
                        echo "anon_root=$sd_pwd" >>$ftp_config_pwd
                    else
                        sed -i "s/anon_root.*/anon_root=$sd_pwd/g" $ftp_config_pwd
                    fi
                    /etc/init.d/vsftpd reload
                fi
                ####
            ;;
            WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
                ###ftp
                killall "busybox tcpsvd"
                busybox tcpsvd -vE 0.0.0.0 21 busybox ftpd -a root -w $ftp_config_pwd &
            ;;
            *) ;;
        esac
    fi
}

check_up_grade() {
    update_file_name="/tmp/ems.update"
    case "$1" in
    SMC-SERVWE_V2 | WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        if [ -f "$update_file_name" ]; then
            (
                tmp_name="/tmp/ems.ipk"
                mv $update_file_name $tmp_name
                echo "upgrade $tmp_name!!"
                /bin/opkg install --force-reinstall $tmp_name
                exit 0
            )
            sleep 5
        fi
        ;;
    WLOSANY_EM1000 | WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
        if [ -f "$update_file_name" ]; then
            (
                tmp_name="/tmp/ems.file"
                mv $update_file_name $tmp_name
                chmod 777 $tmp_name
                echo "upgrade $tmp_name!!"
                nohup $tmp_name &
                exit 0
            )
            sleep 5
        fi
        ;;
    *) ;;

    esac
}

check_program_and_recover() {
    if [ -z "$1" ]; then
        echo "Invalid the name of program or it whether enabled or not"
        return
    fi
    PROG=$1
    PRAM=$2
    PROG_PATH=.
    case "$BOARD_NAME" in
    WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        PROG_PATH=/app
        ;;
    WLOSANY_EM1000 | WLOSANY_RK3568)
        PROG_PATH=/opt/lnxall_app/bin
        ;;
    WLOSANY_BAU-B30-003)
        PROG_PATH=/opt/lnxall_app/bin
        PRAM="-g $PRAM"
    ;;
    *)
        exit 3
        ;;
    esac

    res=$(ps | grep $PROG | grep -v grep | wc -l)
    #查询端口下的运行进程的数目，也可以把8000改成想要守护的进程名
    if [ $res -eq 0 ]; then #如果进程数为0
        echo "Program [$PROG] has crashed ."
        eval "$PROG_PATH/$PROG $PRAM &"
    fi
}

stop_program() {
    if [ -z "$1" ]; then
        echo "Invalid the name of program or it whether enabled or not"
        return
    fi
    PROG=$1
    res=$(ps | grep $PROG | grep -v grep | wc -l)
    if [ $res -gt 0 ]; then #如果进程为>0
        echo "[killall -9 $PROG]"
        killall -9 $PROG
    fi
}

restart_frp() {
    case "$1" in
    WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        /etc/init.d/frpc restart
        ;;
    WLOSANY_EM1000 | WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
        systemctl restart frpc.service
        ;;
    *)
    esac
}

start_httpd_and_ftp "$BOARD_NAME"
check_up_grade "$BOARD_NAME"

if [ "$1" = "stop" ]; then
    stop_program proto_forward
    exit 0
fi

load_json_cfg() {
    case "$1" in
    WooLink2004_W_4G | WooLink_SMC_GW_V3_Lite | WooLink5F6280_W_4G | WooLink2F6280_W_4G | QIYANG_IMX6ULL_2)
        . /usr/share/libubox/jshn.sh
        ;;
    WLOSANY_EM1000 | WLOSANY_RK3568 | WLOSANY_BAU-B30-003)
        PATH=$PATH:/opt/lnxall_app/bin/
        . /opt/lnxall_app/share/libubox/jshn.sh
        ;;
    *)
        return 1
        ;;
    esac

    if [ -f "$system_cfg_file" ]; then
        #load json file
        json_load "$(cat "$system_cfg_file")"
        json_get_var id_v 'id'
        cab_id=$id_v
        echo "cab_id=$cab_id"
    else
        echo "Missing file :$system_cfg_file"
        return 2
    fi

    port_cfg="/app/config/port_config.json"
    if [ -f "$port_cfg" ]; then
        # lan
        json_load "$(cat "$port_cfg")"
        json_select dev_cfg
        json_select lan
        json_select attr
        json_select 1
        json_get_var tmp name
        if [ "$tmp" = "lan" ]; then
            json_get_var tmp ip
            lan_ip=$tmp
        else
            echo "the lan cfg is error, causing the IP to not take effect"
        fi
        # wan
        json_load "$(cat "$port_cfg")"
        json_select dev_cfg
        json_select wan
        json_select attr
        json_select 1
        json_get_var tmp name

        if [ "$tmp" = "wan" ]; then
            json_get_var tmp type
            if [ "$tmp" = "static" ]; then
                json_get_var tmp gateway
                wan_cfg=$tmp
                json_get_var tmp ip
                wan_cfg="$wan_cfg $tmp"
                wan_ip=$tmp
                json_get_var tmp mask
                wan_cfg="$wan_cfg/$tmp"
            else
                json_get_var wan_ip ip
            fi
        else
            echo "the wan cfg is error, causing the IP to not take effect" >> ttt.txt
        fi
    else
        echo "Missing file :$port_cfg"
        return 3
    fi

    echo "lan ip:$lan_ip"
    echo "wan cfg:$wan_cfg"
}

load_json_cfg "$BOARD_NAME"

#reload_frp #frps立即生效,重启设备生效防止每次应用重启断连
set_network "$BOARD_NAME"

reload_net_cfg "$BOARD_NAME"

restart_frp "$BOARD_NAME"

echo "check_program_and_recover start"

ulimit -c unlimited
while true; do
    check_program_and_recover ems_smu
    sleep 10
done
