#!/bin/bash

LOGFILE="/var/log/inspect.log"

function log_file()
{
    echo [`date`][$$]$@ >> $LOGFILE
}

function CheckEthSpeed()
{
    local isPass=0

    ETH_NAME=$(ls /etc/sysconfig/network/ifcfg-* | grep -wv lo | sed 's/\/etc\/sysconfig\/network\/ifcfg-//' | grep -v '\.')
    if [ "$ETH_NAME" = "" ]; then
        log_file "[$FUNCNAME][$LINENO]no eth port, failed"
        return 1
    fi

    for ITEM in $ETH_NAME; do
        NET_NAME_INFO="NetName: $ITEM"
        ETH_TYPE=$(ethtool -i $ITEM | grep "driver" | awk '{print $2}')
        if [ "$ETH_TYPE" = "" ]; then
            log_file "[$FUNCNAME][$LINENO]get eth type, failed"
            return 1
        else
            log_file "[$FUNCNAME][$LINENO]get eth type success, ETH_TYPE==${ETH_TYPE}"
        fi

        if [ "$ETH_TYPE" == "ipoib" -o "$ETH_TYPE" == "ib_ipoib" ]; then
            ETH_INFO=$(ibstat)
        else
            ETH_INFO=$(ethtool "$ITEM")
        fi

        if [ "$ETH_INFO" = "" ]; then
            log_file "[$FUNCNAME][$LINENO]ethtool or ibstat, failed"
            return 1
        fi

        LINK_STATUS=$(echo "$ETH_INFO" | grep "Link detected" | awk '{print $3}')
        if [ "$LINK_STATUS" = "yes" -o "$LINK_STATUS" = "Yes" ]; then
            log_file "[$FUNCNAME][$LINENO]eth ${ITEM} status is ${LINK_STATUS}"
            LINK_STATUS_INFO="Link detected: Yes"
            SUPPORTS_NEGOTIATION=$(echo "$ETH_INFO" | grep "Supports auto-negotiation" | awk '{print $3}')
            if [ "$SUPPORTS_NEGOTIATION" = "" ]; then
                SUPPORTS_NEGOTIATION_INFO="Supports auto-negotiation: --"
            else
                SUPPORTS_NEGOTIATION_INFO="Supports auto-negotiation: ${SUPPORTS_NEGOTIATION}"
                if [[ "$ETH_TYPE" != "ipoib" && "$ETH_TYPE" != "ib_ipoib" ]]; then
                    if [ "$SUPPORTS_NEGOTIATION" = "Yes" -o "$SUPPORTS_NEGOTIATION" = "yes" ]; then
                        log_file "[$FUNCNAME][$LINENO]Supports auto-negotiation: ${SUPPORTS_NEGOTIATION}"
                    else
                        log_file "[$FUNCNAME][$LINENO]Supports auto-negotiation: ${SUPPORTS_NEGOTIATION}, failed"
                    fi
                fi
            fi

            ADVERTISED_NEGOTIATION=$(echo "$ETH_INFO" | grep "Advertised auto-negotiation" | awk '{print $3}')
            if [ "$ADVERTISED_NEGOTIATION" = "" ]; then
                ADVERTISED_NEGOTIATION_INFO="Advertised auto-negotiation: --"
            else
                ADVERTISED_NEGOTIATION_INFO="Advertised auto-negotiation: ${ADVERTISED_NEGOTIATION}"
                if [[ "$ETH_TYPE" != "ipoib" && "$ETH_TYPE" != "ib_ipoib" ]]; then
                    if [ "$ADVERTISED_NEGOTIATION" = "Yes" -o "$ADVERTISED_NEGOTIATION" = "yes" ]; then
                        log_file "[$FUNCNAME][$LINENO]Advertised auto-negotiation: ${ADVERTISED_NEGOTIATION}"
                    else
                        log_file "[$FUNCNAME][$LINENO]Advertised auto-negotiation: ${ADVERTISED_NEGOTIATION}, failed"
                    fi
                fi
            fi

            SPEED=$(echo "$ETH_INFO" | grep "Speed:" | awk '{print $2}')
            if [ "$SPEED" = "" ]; then
                SPEED_INFO="Speed: --"
            else
                SPEED_INFO="Speed: ${SPEED}"
                log_file "[$FUNCNAME][$LINENO]Speed: ${SPEED}"
                if [[ "$ETH_TYPE" != "ipoib" && "$ETH_TYPE" != "ib_ipoib" ]]; then
                    if [ "$SPEED" != "1000Mb/s" -a "$SPEED" != "10000Mb/s" ]; then
                        log_file "[$FUNCNAME][$LINENO]Speed: ${SPEED}, failed"
                        echo "[ERR]$ITEM speed($SPEED) is not 1000Mb/s or 10000Mb/s!"
                    fi
                    if [ "$SPEED" = "1000Mb/s" ]; then
                        if [ "$ETH_TYPE" = "bnx2" -o "$ETH_TYPE" = "igb" ]; then
                            log_file "[$FUNCNAME][$LINENO]GE Speed: ${SPEED}"
                        else
                            log_file "[$FUNCNAME][$LINENO]${ETH_TYPE} Speed: ${SPEED}"
                            isPass=1
                            echo "[ERR]${ITEM} speed err (${SPEED})"
                        fi
                    fi
                fi
            fi

            DUPLEX=$(echo "$ETH_INFO" | grep "Duplex" | awk '{print $2}')
            if [ "$DUPLEX" = "" ]; then
                DUPLEX_INFO="Duplex: --"
            else
                DUPLEX_INFO="Duplex: ${DUPLEX}"
                if [[ "$ETH_TYPE" != "ipoib" && "$ETH_TYPE" != "ib_ipoib" ]]; then
                    if [ "$DUPLEX" = "Full" ]; then
                        log_file "[$FUNCNAME][$LINENO]Duplex: ${DUPLEX}"
                    else
                        log_file "[$FUNCNAME][$LINENO]Duplex: ${DUPLEX}, failed"
                        echo "[ERR]$ITEM DUPLEX is not Full"
                    fi
                fi
            fi

            #ʹù߸ʽ
            echo "$NET_NAME_INFO||$LINK_STATUS_INFO||$SUPPORTS_NEGOTIATION_INFO||$ADVERTISED_NEGOTIATION_INFO||$SPEED_INFO||$DUPLEX_INFO"
        else
            log_file "[$FUNCNAME][$LINENO]eth ${ITEM} error or not connect"
            if [ "$ETH_TYPE" == "ipoib" -o "$ETH_TYPE" == "ib_ipoib" ]; then
                LINK_STATUS_INFO="Link detected: --"
            else
                LINK_STATUS_INFO="Link detected: ${LINK_STATUS}"
            fi
            SUPPORTS_NEGOTIATION_INFO="Supports auto-negotiation: --"
            ADVERTISED_NEGOTIATION_INFO="Advertised auto-negotiation: --"
            SPEED_INFO="Speed: --"
            DUPLEX_INFO="Duplex: --"

            #ʹù߸ʽ
            echo "$NET_NAME_INFO||$LINK_STATUS_INFO||$SUPPORTS_NEGOTIATION_INFO||$ADVERTISED_NEGOTIATION_INFO||$SPEED_INFO||$DUPLEX_INFO"
        fi
    done

    return $isPass
}

CheckEthSpeed
exit 0