#!/bin/bash
set +x
G_MML_FILE_PATH="/opt/huawei/snas/script/inspect_mml"
source $G_MML_FILE_PATH/CheckItems
CurInspectNum="278"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="${G_TMP_INSPECT_PATH}tmpResult${CurInspectFun}"
LOG_FILE="/var/log/inspect.log"
>${RESULTFILE}

RET_BLANK=""
RET_SUCCESS="yes"
RET_FAILURE="no"
TIP_OPERARION_RESULT="RESULT"
TIP_JOINED_DOMAIN="JOINED DOMAIN"
TIP_DOMAIN_CONTROL_STATUS="DOMAIN AVAILABLE"
Result=""
isPass=0

function LOG
{
   time=$(date)
   echo [${time}][$$][${CurInspectFun}]$@ >> ${LOG_FILE}
}

#===  FUNCTION  ================================================================
#         NAME: TryRunCmd
#      PURPOSE: 执行指定命令. 尝试执行指定次数,如果有执行成功(退出值为0)则退出返回0;
#                             如果每次都失败退出返回1
#   PARAMETERS: $1= 最大执行次数
#               $2= 每次执行命令失败后的延时
#               $3= 需要执行的命令
#      RETURNS: 0-成功
#               1-失败
#  DESCRIPTION: examples:
#===============================================================================
function TryRunCmd()
{
    #参数检查
    if [[ $# -ne 3 ]]; then
        LOG "ERROR:Parameters count($#) error, should be 3 parameters.('$@' | ${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
        return 1
    else
        if [[ ! "$1" =~ ^[0-9]+$ ]] || [[ $1 < 1 ]]; then
            LOG "ERROR:Parameter 1 '$1' should be number and > 0.('$@' | ${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
            return 1
        elif [[ ! "$2" =~ ^[0-9]+$ ]] || [[ $1 < 0 ]]; then
            LOG "ERROR:Parameter 2 '$2' should be number and >= 0.('$@' | ${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
            return 1
        elif [[ -z "$3" ]]; then
            LOG "ERROR:Parameter 3 '$3' is empty.('$@' | ${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
            return 1
        fi
    fi

    local max=$1
    local sleeptime=$2
    local cmd=$3
    local ret=0
    local i=0
    #执行命令
    for (( i=1; i<=$max; i++))
    do
        eval "$cmd" >> "$LOG_FILE" 2>&1
        ret=$?
        if [[ ("$ret" = 0) || ("$i" = "$max") ]] ; then
            break
        fi
        sleep $sleeptime
    done

    if [ "$ret" -ne 0 ]; then
        LOG "ERROR:TryRunCmd failed($i times):'$3'. (${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
        return 1
    fi

    LOG "INFO:TryRunCmd success($i times):'$3'. (${BASH_SOURCE[1]}:${BASH_LINENO[0]})"
    return 0
}

managenetinfo=`sudo cat /opt/huawei/snas/etc/cm.ini`
if [ $? -ne 0 ]
then
    isPass=1
    LOG "get the ip address of gateway failed"
    echo "[ERR]INFO:Get the ip address of gateway failed from file(/opt/product/snas/etc/cm.ini)."  >>${RESULTFILE}
    echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}
    exit 1
fi

mgipv4GateWay=$(echo "${managenetinfo}" | sed -n 's/^omGateway=\([.0-9]\+\).*/\1/p')
mgipv6GateWay=$(echo "${managenetinfo}" | sed -n 's/^omGateway_v6=\([.:0-9a-fA-F]\+\).*/\1/p')
gatewaysipv4=()
gatewaysipv6=()

#多vlan,前端网关有多个。应该是ping多个网关。
if [ "$(ls /etc/sysconfig/network-scripts |grep route-)" != "" ];then
    netName=$(cat /opt/huawei/snas/etc/snas.ini | grep subnetwork_port | awk -F= ' {print $2}')
    for item in $netName;do
        frontGateWay=$(cat /etc/sysconfig/network-scripts/route-$item |grep -m1 default |awk '{print $3}')
        isExist=0
        for i in ${gatewaysipv4[@]}
        do
            if [ "$i" == "$frontGateWay" ];then
                isExist=1
                break
            fi
        done
        if [ $isExist -eq 0 ];then
            gatewaysipv4=(${gatewaysipv4[@]} $frontGateWay)
        fi
    done
fi
if [ "$(ls /etc/sysconfig/network-scripts |grep route6-)" != "" ];then
    netName6=$(cat /opt/huawei/snas/etc/snas.ini | grep subnetwork_port | awk -F= ' {print $2}')
    for item6 in $netName6;do
        frontGateWay6=$(cat /etc/sysconfig/network-scripts/route6-$item6 |grep -m1 default |awk '{print $3}')
        isExist=0
        for i in ${gatewaysipv6[@]}
        do
            if [ "$i" == "$frontGateWay6" ];then
               isExist=1
               break
            fi
        done
        if [ $isExist -eq 0 ];then
            gatewaysipv6=(${gatewaysipv6[@]} $frontGateWay6)
        fi
    done
fi
function isCMMainNode()
{
    local omiptype=$1
    local SubDomainNum=$(cat /opt/huawei/snas/etc/cm.ini |grep SubDomain|awk -F "=" '{print $2}')
    if [ "${SubDomainNum}" != "0" ]; then
        return 1
    fi

    local addrOnDev=""
    if [ "ipv4" == "${omiptype}" ];then
        local omip=$(cat /opt/huawei/snas/etc/cm.ini |grep -w omip|awk -F "=" '{print $2}')
        if [ -z "${omip}" -o "${omip}" == "\"\"" ]; then
            return 1
        fi
        addrOnDev=$(ip addr show|grep -w "${omip}"|awk -F " " '{print $NF}')
        if [ -z "${addrOnDev}" ]; then
            return 1
        fi
    fi

    if [ "ipv6" == "${omiptype}" ];then
        local omipv6=$(cat /opt/huawei/snas/etc/cm.ini |grep -w omip_v6|awk -F "=" '{print $2}')
        if [ -z "${omipv6}" -o "${omipv6}" == "\"\"" ]; then
            return 1
        fi
        addrOnDev=$(ip addr show|grep -w "${omipv6}"|awk -F " " '{print $NF}')
        if [ -z "${addrOnDev}" ]; then
            return 1
        fi
    fi
    return 0
}

function isLocalomipExist()
{
    local omiptype=$1

    if [ "ipv4" == "${omiptype}" ];then
        local localomip=$(cat /opt/huawei/snas/etc/cm.ini |grep -w Localomip|awk -F "=" '{print $2}')
        if [[ ! "${localomip}" =~ ^[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}$ ]]; then
            return 1
        fi
    fi

    if [ "ipv6" == "${omiptype}" ];then
        local localomip_v6=$(cat /opt/huawei/snas/etc/cm.ini |grep -w Localomip_v6|awk -F "=" '{print $2}')
        if [[ ! "${localomip_v6}" =~ ^[0-9A-Fa-f]+[.:]+[0-9A-Fa-f.:]+$ ]]; then
            return 1
        fi
    fi
    return 0
}

function checkIsConnectible()
{
    local gwipv4=""
    local gwipv6=""
    local iRet1=0
    local iRet2=0
    local iRet3=0
    local iRet4=0
    local ipAddr=""

    isCMMainNode "ipv4"
    iRet1=$?
    isCMMainNode "ipv6"
    iRet2=$?
    isLocalomipExist "ipv4"
    iRet3=$?
    isLocalomipExist "ipv6"
    iRet4=$?

    if [ ${iRet1} -eq 0 -o ${iRet3} -eq 0 ]; then
        gwipv4=(${mgipv4GateWay} ${gatewaysipv4[@]})
    else
        gwipv4=(${gatewaysipv4[@]})
    fi
    if [ ${iRet2} -eq 0 -o ${iRet4} -eq 0 ]; then
        gwipv6=(${mgipv6GateWay} ${gatewaysipv6[@]})
    else
        gwipv6=(${gatewaysipv6[@]})
    fi
    for ipAddr in ${gwipv4[@]}
    do
        if [ -z "$ipAddr" ]
        then
            LOG "$ipAddr is null"
        else
            #执行ping 网关，最多执行5次，每次间隔2秒。任意一次成功，则该网关可达；连续5次失败，则该网关不可达。
            res=$(TryRunCmd 5 2 "ping -c 1 ${ipAddr}" 2>&1)
            if [ $? -ne 0 ]; then
                LOG "ERROR:check gateway($ipAddr) time out. detail: $res"
                echo "[ERR]INFO:Ping ($ipAddr) time out."  >>${RESULTFILE}
                return 1
            fi
            LOG "INFO: check gateway($ipAddr) ok."
        fi
    done

    for ipAddr in ${gwipv6[@]}
    do
        if [ -z "$ipAddr" ]
        then
            LOG "$ipAddr is null"
        else
            res=$(TryRunCmd 5 2 "ping6 -c 1 ${ipAddr}" 2>&1)
            if [ $? -ne 0 ]; then
                LOG "ERROR:check gateway6($ipAddr) time out. detail: $res"
                echo "[ERR]INFO:Ping ($ipAddr) time out."  >>${RESULTFILE}
                return 1
            fi
            LOG "INFO: check gateway6($ipAddr) ok."
        fi
    done

    return 0
}
function CheckManagementIP()
{
    local errResult=""
    local cluster_om_ip=""
    local cluster_om_ipv4=$(grep -Po '(?<=^omip=)[0-9.]*' /opt/huawei/snas/etc/cm.ini)
    local cluster_om_ipv6=$(grep -Po '(?<=^omip_v6=).*' /opt/huawei/snas/etc/cm.ini | sed 's/"//g')
    local mylocalip=""
    local mylocalipv4=$(grep -Po '(?<=^Localomip=)[0-9.]*' /opt/huawei/snas/etc/cm.ini)
    local mylocalipv6=$(grep -Po '(?<=^Localomip_v6=).*' /opt/huawei/snas/etc/cm.ini | sed 's/"//g')
    local productVersion=$(grep ProductVersion /opt/huawei/deploy/package/version |awk -F= '{print $2}')
    local port_omCard="NULL"
    local port_LocalOMCard="NULL"
    local port_LocalOMCard_v6="NULL"
    if [ "X${mylocalipv4}" = "X" -a "X${mylocalipv6}" = "X" ];then
        mylocalip="NULL"
    else
        local routeIp=$(ip route show table om1 | awk '{print $NF}' | head -1)
        local isOnLocalNode=$(ip addr | grep -wF "${routeIp}")
        if [ "X${isOnLocalNode}" = "X" ];then
            isPass=1
            errResult="[ERR]INFO:Management route error."
            echo "$errResult">>${RESULTFILE} 2>&1
        fi
        port_omCard=$(grep -Po '(?<=^omCard=).*' /opt/huawei/snas/etc/cm.ini | sed 's/"//g')
        if [ "X${port_omCard}" = "X" ];then
            LOG "omCard is null in cm.ini."
            isPass=1
            errResult="[ERR]INFO:The cluster omCard is null in cm.ini"
            echo "$errResult" >>${RESULTFILE} 2>&1
            return 0
        fi
        if [ "X${cluster_om_ipv4}" != "X" ];then
            port_LocalOMCard=$(grep -Po '(?<=^LocalOMCard=).*' /opt/huawei/snas/etc/cm.ini | sed 's/"//g')
            if [ "X${port_LocalOMCard}" != "X" ] && [ "X${port_omCard}" != "X${port_LocalOMCard}" ];then
                isPass=1
                errResult="[ERR]INFO:The cluster management IP(${port_omCard}) and local management IP(${port_LocalOMCard}) are on different network ports."
                echo "$errResult" >>${RESULTFILE} 2>&1
            fi
        elif [ "X${cluster_om_ipv6}" != "X" ];then
            port_LocalOMCard_v6=$(grep -Po '(?<=^LocalOMCard_v6=).*' /opt/huawei/snas/etc/cm.ini | sed 's/"//g')
            if [ "X${port_LocalOMCard_v6}" != "X" ] && [ "X${port_omCard}" != "X${port_LocalOMCard_v6}" ];then
                isPass=1
                errResult="[ERR]INFO:The cluster management IP(${port_omCard}) and local management IP(${port_LocalOMCard_v6}) are on different network ports."
                echo "$errResult" >>${RESULTFILE} 2>&1
            fi
        else
            isPass=1
            errResult="[ERR]INFO:The cluster management IP is null."
            echo "$errResult" >>${RESULTFILE} 2>&1
        fi
    fi
}
function isZeroDomain()
{
    local domainID=$(grep SubDomain /opt/huawei/snas/etc/cm.ini|awk -F "=" '{print $2}')
    return $domainID
}
isZeroDomain
if [ $? -eq 0 ]; then
    CheckManagementIP
else
    LOG "$(hostname) isn't in subdomian of zero.(CheckManagementIP)"
fi

checkIsConnectible
ret=$?
if [ $ret -eq 0 -a $isPass -eq 0 ];then
   Result="Check result:check gateway success"
else
   isPass=1
   Result="Check result:check gateway fail"
fi
echo "${Result}" >> ${RESULTFILE}
echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}
