diff --git a/scripts/sflowenable b/scripts/sflowenable index 4abfcd1..9445271 100755 --- a/scripts/sflowenable +++ b/scripts/sflowenable @@ -4,9 +4,48 @@ # # Copyright (c) 2001 InMon Corp. Licensed under the terms of the InMon sFlow licence: # http://www.inmon.com/technology/sflowlicense.txt +# Copyright (C) 2015, Vitaliy Ivanov, Interface Masters Technologies, Inc. +# + +check_oid() +{ + oid=$1 + value=$2 + + t_value=$(snmpget -v 2c -c $COMMUNITY $SWITCH $oid | sed -r 's/.*\.([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) = .*: (.*)/\2/g' | sed 's/ *$//g') + + if [ "$t_value" -eq "$t_value" ] 2>/dev/null; then + # Integer + if [ "$t_value" != "$value" ]; + then + echo "$t_value is not equal to $value" + exit 1 + fi + + else + # String or hex + if [ "${t_value:0:1}" != "\"" ]; + then + # Hex + if [ "$t_value" != "$value" ]; + then + echo "$t_value is not equal to $value" + exit 1 + fi + else + # String + if [ "$t_value" != "\"$value\"" ]; + then + echo "$t_value is not equal to $value" + exit 1 + fi + fi + fi + +} MINPARAMS=3 -if [ $# -lt "$MINPARAMS" ] +if [ $# -lt "$MINPARAMS" ] then echo "Usage: $0 switch community receiver [port] [rate] [interval] [timeout] [force]" echo " where:" @@ -35,7 +74,7 @@ TIMEOUT=${7:-3600} USEFORCE=${8:-0} # initialize static variables -OWNER="$HOSTNAME;$0" +OWNER="$HOSTNAME;$0" ADDRESSTYPE=1 # IP v4 SFLOWMIB=".1.3.6.1.4.1.14706.1" IFINDEX="11.1.3.6.1.2.1.2.2.1.1" @@ -52,7 +91,7 @@ RCVRINDEX=$(snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.4.1.2 | awk -v last = idx; if(owner == me) lastOwner = idx; if(owner == "") lastFree = idx; - } + } END{ if(lastOwner) print lastOwner; else if(lastFree) print lastFree; @@ -60,11 +99,11 @@ RCVRINDEX=$(snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.4.1.2 | awk -v }') if [ ! $RCVRINDEX ] -then +then echo "No free sFlowRcvrTable entries found, current sFlowRcvrOwners:" snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.4.1.2 | awk --source '{print $2}' exit 1 -fi +fi if [ $TIMEOUT -eq 0 ] then @@ -87,11 +126,19 @@ echo "sFlowRcvrPort = $PORT" snmpset -v 2c -c $COMMUNITY $SWITCH $SFLOWMIB.1.4.1.2.$RCVRINDEX s $OWNER $SFLOWMIB.1.4.1.3.$RCVRINDEX i $TIMEOUT $SFLOWMIB.1.4.1.5.$RCVRINDEX i $ADDRESSTYPE $SFLOWMIB.1.4.1.6.$RCVRINDEX x $HEXRECEIVER $SFLOWMIB.1.4.1.7.$RCVRINDEX i $PORT if [ $? -ne 0 ] -then +then echo "SNMP set failed" exit 1; fi +HEXRECEIVER=$(echo $HEXRECEIVER | awk '$0=gensub(/(..)/,"\\1 ","g")' | sed 's/ *$//g') + +check_oid $SFLOWMIB.1.4.1.2.$RCVRINDEX $OWNER +check_oid $SFLOWMIB.1.4.1.3.$RCVRINDEX $TIMEOUT +check_oid $SFLOWMIB.1.4.1.5.$RCVRINDEX $ADDRESSTYPE +#check_oid $SFLOWMIB.1.4.1.6.$RCVRINDEX "$HEXRECEIVER" +check_oid $SFLOWMIB.1.4.1.7.$RCVRINDEX $PORT + echo "Grabbing entries in sFlowFsTable" for ENTRY in $(snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.5.1.3.$IFINDEX | awk -v myRcvrIndex=$RCVRINDEX -v useforce=$USEFORCE --source ' @@ -105,7 +152,7 @@ for ENTRY in $(snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.5.1.3.$IFIN last[ifIndex] = instance; if(receiver == myRcvrIndex) lastOwner[ifIndex] = instance; if(receiver == 0) lastFree[ifIndex] = instance; -} +} END{ for (i in last) { if(lastOwner[i]) print i "." lastOwner[i]; @@ -122,6 +169,9 @@ END{ echo "Now set values" fi snmpset -v 2c -c $COMMUNITY $SWITCH $SFLOWMIB.1.5.1.3.$IFINDEX.$ENTRY i $RCVRINDEX $SFLOWMIB.1.5.1.4.$IFINDEX.$ENTRY i $RATE + + check_oid $SFLOWMIB.1.5.1.3.$IFINDEX.$ENTRY $RCVRINDEX + check_oid $SFLOWMIB.1.5.1.4.$IFINDEX.$ENTRY $RATE done echo "Grabbing entries in sFlowCpTable" @@ -137,7 +187,7 @@ for ENTRY in $(snmpwalk -v 2c -Oqn -c $COMMUNITY $SWITCH $SFLOWMIB.1.6.1.3.$IFIN last[ifIndex] = instance; if(receiver == myRcvrIndex) lastOwner[ifIndex] = instance; if(receiver == 0) lastFree[ifIndex] = instance; -} +} END{ for (i in last) { if(lastOwner[i]) print i "." lastOwner[i]; @@ -154,6 +204,9 @@ END{ snmpset -v 2c -c $COMMUNITY $SWITCH $SFLOWMIB.1.6.1.3.$IFINDEX.$ENTRY i 0 echo "Now set values" fi - + snmpset -v 2c -c $COMMUNITY $SWITCH $SFLOWMIB.1.6.1.3.$IFINDEX.$ENTRY i $RCVRINDEX $SFLOWMIB.1.6.1.4.$IFINDEX.$ENTRY i $INTERVAL + + check_oid $SFLOWMIB.1.6.1.3.$IFINDEX.$ENTRY $RCVRINDEX + check_oid $SFLOWMIB.1.6.1.4.$IFINDEX.$ENTRY $INTERVAL done