#!/usr/bin/env bash # SNMP "smoketest" Basic snmpget test for a scalar # Magic line must be first in script (see README.md) s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi # Re-use main example backend state callbacks APPNAME=example if [ ${ENABLE_NETSNMP} != "yes" ]; then echo "Skipping test, Net-SNMP support not enabled." rm -rf $dir if [ "$s" = $0 ]; then exit 0; else return 0; fi fi cfg=$dir/conf_startup.xml fyang=$dir/clixon-example.yang fstate=$dir/state.xml # AgentX unix socket SOCK=/var/run/snmp.sock # Relies on example_backend.so for $fstate file handling cat < $cfg $cfg ${YANG_INSTALLDIR} ${YANG_STANDARD_DIR} ${MIB_GENERATED_YANG_DIR} $fyang $dir/$APPNAME.sock /usr/local/lib/$APPNAME/backend /usr/local/var/run/$APPNAME.pidfile $dir unix:$SOCK IF-MIB false EOF cat < $fyang module clixon-example{ yang-version 1.1; namespace "urn:example:clixon"; prefix ex; import IF-MIB { prefix "if-mib"; } } EOF # This is state data written to file that backend reads from (on request) # integer and string have values, sleeper does not and uses default (=1) cat < $fstate 1 0 0 1 Test ethernetCsmacd 1500 10000000 aa:bb:cc:dd:ee:ff testing up 0 123 124 124 125 126 127 128 129 129 130 131 132 0.0 ifname1 2 Test 2 ethernetCsmacd 1400 1000 11:22:33:44:55:66 down down 0 111 222 333 444 555 666 777 888 999 101010 111111 111 1.2.3 ifname2 1 11:bb:cc:dd:ee:ff active other 2 aa:22:33:44:55:66 createAndGo volatile EOF # This is the expected result from snmpwalk: # $ snmpwalk -cpublic -v2c localhost IF-MIB::ifTable # .1.3.6.1.2.1.2.2 # IF-MIB::ifIndex.1 = INTEGER: 1 # IF-MIB::ifDescr.1 = STRING: Test # IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6) # IF-MIB::ifMtu.1 = INTEGER: 1500 # IF-MIB::ifSpeed.1 = Gauge32: 10000000 # IF-MIB::ifPhysAddress.1 = STRING: aa:bb:cc:dd:ee:ff # IF-MIB::ifAdminStatus.1 = INTEGER: up(1) # IF-MIB::ifOperStatus.1 = INTEGER: up(1) # IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00 # IF-MIB::ifInOctets.1 = Counter32: 123 # IF-MIB::ifInUcastPkts.1 = Counter32: 123 # IF-MIB::ifInNUcastPkts.1 = Counter32: 123 # IF-MIB::ifInDiscards.1 = Counter32: 123 # IF-MIB::ifInErrors.1 = Counter32: 123 # IF-MIB::ifInUnknownProtos.1 = Counter32: 123 # IF-MIB::ifOutOctets.1 = Counter32: 123 # IF-MIB::ifOutUcastPkts.1 = Counter32: 123 # IF-MIB::ifOutNUcastPkts.1 = Counter32: 123 # IF-MIB::ifOutDiscards.1 = Counter32: 123 # IF-MIB::ifOutErrors.1 = Counter32: 123 # IF-MIB::ifOutQLen.1 = Gauge32: 123 # IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero function testinit(){ new "test params: -s init -f $cfg -- -sS $fstate" if [ $BE -ne 0 ]; then # Kill old backend and start a new one new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err "Failed to start backend" fi sudo pkill -f clixon_backend new "Starting backend" start_backend -s init -f $cfg -- -sS $fstate fi new "wait backend" wait_backend if [ $SN -ne 0 ]; then # Kill old clixon_snmp, if any new "Terminating any old clixon_snmp processes" sudo killall -q clixon_snmp new "Starting clixon_snmp" start_snmp $cfg fi new "wait snmp" wait_snmp } function testexit(){ stop_snmp if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi # kill backend stop_backend -f $cfg fi } new "SNMP tests" testinit # IF-MIB::interfaces MIB=".1.3.6.1.2.1" for (( i=1; i<23; i++ )); do eval OID${i}="${MIB}.2.2.1.$i.1" done OID24=".1.3.6.1.2.1.31.1.4.1.1.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" OID25=".1.3.6.1.2.1.31.1.4.1.1.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" OID26=".1.3.6.1.2.1.31.1.4.1.2.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" OID27=".1.3.6.1.2.1.31.1.4.1.2.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" OID28=".1.3.6.1.2.1.31.1.4.1.3.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" OID29=".1.3.6.1.2.1.31.1.4.1.3.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" OID30=".1.3.6.1.2.1.31.1.1" NAME1="IF-MIB::ifIndex" NAME2="IF-MIB::ifDescr" NAME3="IF-MIB::ifType" NAME4="IF-MIB::ifMtu" NAME5="IF-MIB::ifSpeed" NAME6="IF-MIB::ifPhysAddress" NAME7="IF-MIB::ifAdminStatus" NAME8="IF-MIB::ifOperStatus" NAME9="IF-MIB::ifLastChange" NAME10="IF-MIB::ifInOctets" NAME11="IF-MIB::ifInUcastPkts" NAME12="IF-MIB::ifInNUcastPkts" NAME13="IF-MIB::ifInDiscards" NAME14="IF-MIB::ifInErrors" NAME15="IF-MIB::ifInUnknownProtos" NAME16="IF-MIB::ifOutOctets" NAME17="IF-MIB::ifOutUcastPkts" NAME18="IF-MIB::ifOutNUcastPkts" NAME19="IF-MIB::ifOutDiscards" NAME20="IF-MIB::ifOutErrors" NAME21="IF-MIB::ifOutQLen" NAME22="IF-MIB::ifSpecific" NAME23="IF-MIB::ifName" NAME24="IF-MIB::ifRcvAddressAddress.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" NAME25="IF-MIB::ifRcvAddressAddress.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" NAME26="IF-MIB::ifRcvAddressStatus.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" NAME27="IF-MIB::ifRcvAddressStatus.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" NAME28="IF-MIB::ifRcvAddressType.1.17.49.49.58.98.98.58.99.99.58.100.100.58.101.101.58.102.102" NAME29="IF-MIB::ifRcvAddressType.2.17.97.97.58.50.50.58.51.51.58.52.52.58.53.53.58.54.54" new "$snmpget" new "Test SNMP get all entries in ifTable" new "Test $OID1 ifIndex" validate_oid $OID1 $OID1 "INTEGER" "1" validate_oid "$NAME1.1" "$NAME1.1" "INTEGER" 1 validate_oid "$NAME1.1" "$NAME1.2" "INTEGER" 2 new "Test $OID2 ifDescr" validate_oid $OID2 $OID2 "STRING" "Test" validate_oid $NAME2.1 $NAME2.1 "STRING" "Test" validate_oid $NAME2.2 $NAME2.2 "STRING" "Test" new "Test $OID3 ifType" validate_oid $OID3 $OID3 "INTEGER" "ethernetCsmacd(6)" validate_oid $NAME3.1 $NAME3.1 "INTEGER" "ethernetCsmacd(6)" validate_oid $NAME3.2 $NAME3.2 "INTEGER" "ethernetCsmacd(6)" new "Test $OID4 ifMtu" validate_oid $OID4 $OID4 "INTEGER" "1500" validate_oid $NAME4.1 $NAME4.1 "INTEGER" 1500 validate_oid $NAME4.2 $NAME4.2 "INTEGER" 1400 new "Test $OID5 ifSpeed" validate_oid $OID5 $OID5 "Gauge32" "10000000" validate_oid $NAME5.1 $NAME5.1 "Gauge32" 10000000 validate_oid $NAME5.2 $NAME5.2 "Gauge32" 1000 new "Test $OID6 ifPhysAddress yang:phys-address" validate_oid $OID6 $OID6 "STRING" "aa.bb:cc:dd:ee:ff" validate_oid $NAME6.1 $NAME6.1 "STRING" "aa.bb:cc:dd:ee:ff" validate_oid $NAME6.2 $NAME6.2 "STRING" "11:22:33:44:55:66" new "Test $OID7 ifAdminStatus" validate_oid $OID7 $OID7 "INTEGER" "testing(3)" validate_oid $NAME7.1 $NAME7.1 "INTEGER" "testing(3)" validate_oid $NAME7.2 $NAME7.2 "INTEGER" "down(2)" new "Test $OID8 ifOperStatus" validate_oid $OID8 $OID8 "INTEGER" "up(1)" validate_oid $NAME8.1 $NAME8.1 "INTEGER" "up(1)" validate_oid $NAME8.2 $NAME8.2 "INTEGER" "down(2)" new "Test $OID9 ifLastChange" validate_oid $OID9 $OID9 "Timeticks" "(0) 0:00:00.00" validate_oid $NAME9.1 $NAME9.1 "Timeticks" "(0) 0:00:00.00" validate_oid $NAME9.2 $NAME9.2 "Timeticks" "(0) 0:00:00.00" new "Test $OID10 ifInOctets" validate_oid $OID10 $OID10 "Counter32" 123 validate_oid $NAME10.1 $NAME10.1 "Counter32" 123 validate_oid $NAME10.2 $NAME10.2 "Counter32" 111 new "Test $OID11 ifInUcastPkts" validate_oid $OID11 $OID11 "Counter32" 124 validate_oid $NAME11.1 $NAME11.1 "Counter32" 124 validate_oid $NAME11.2 $NAME11.2 "Counter32" 222 new "Test $OID12 ifInNUcastPkts" validate_oid $OID12 $OID12 "Counter32" 124 validate_oid $NAME12.1 $NAME12.1 "Counter32" 124 validate_oid $NAME12.2 $NAME12.2 "Counter32" 333 new "Test $OID13 ifInDiscards" validate_oid $OID13 $OID13 "Counter32" 125 validate_oid $NAME13.1 $NAME13.1 "Counter32" 125 validate_oid $NAME13.2 $NAME13.2 "Counter32" 444 new "Test $OID14 ifInErrors" validate_oid $OID14 $OID14 "Counter32" 126 validate_oid $NAME14.1 $NAME14.1 "Counter32" 126 validate_oid $NAME14.2 $NAME14.2 "Counter32" 555 new "Test $OID15 ifInUnknownProtos" validate_oid $OID15 $OID15 "Counter32" 127 validate_oid $NAME15.1 $NAME15.1 "Counter32" 127 validate_oid $NAME15.2 $NAME15.2 "Counter32" 666 new "Test $OID16 ifOutOctets" validate_oid $OID16 $OID16 "Counter32" 128 validate_oid $NAME16.1 $NAME16.1 "Counter32" 128 validate_oid $NAME16.2 $NAME16.2 "Counter32" 777 new "Test $OID17 ifOutUcastPkts" validate_oid $OID17 $OID17 "Counter32" 129 validate_oid $NAME17.1 $NAME17.1 "Counter32" 129 validate_oid $NAME17.2 $NAME17.2 "Counter32" 888 new "Test $OID18 ifOutNUcastPkts" validate_oid $OID18 $OID18 "Counter32" 129 validate_oid $NAME18.1 $NAME18.1 "Counter32" 129 validate_oid $NAME18.2 $NAME18.2 "Counter32" 999 new "Test $OID19 ifOutDiscards" validate_oid $OID19 $OID19 "Counter32" 130 validate_oid $NAME19.1 $NAME19.1 "Counter32" 130 validate_oid $NAME19.2 $NAME19.2 "Counter32" 101010 new "Test $OID20 ifOutErrors" validate_oid $OID20 $OID20 "Counter32" 131 validate_oid $NAME20.1 $NAME20.1 "Counter32" 131 validate_oid $NAME20.2 $NAME20.2 "Counter32" 111111 new "Test $OID21 ifOutQLen" validate_oid $OID21 $OID21 "Gauge32" 132 validate_oid $NAME21.1 $NAME21.1 "Gauge32" 132 validate_oid $NAME21.2 $NAME21.2 "Gauge32" 111 new "Test $OID22 ifSpecific" validate_oid $OID22 $OID22 "OID" ".0.0" validate_oid $NAME22.1 $NAME22.1 "OID" "SNMPv2-SMI::zeroDotZero" validate_oid $NAME22.2 $NAME22.2 "OID" "iso.2.3" new "Test ifXTable ifName" validate_oid $NAME23.1 $NAME23.1 "STRING" "ifname1" validate_oid $NAME23.2 $NAME23.2 "STRING" "ifname2" new "Test ifTable" expectpart "$($snmptable IF-MIB::ifTable)" 0 "Test 2" "1400" "1000" "11:22:33:44:55:66" "down" "111" "222" "333" "444" "555" "666" "777" "888" "999" "101010" "111111" "111" new "Walk the walk..." expectpart "$($snmpwalk IF-MIB::ifTable)" 0 "IF-MIB::ifIndex.1 = INTEGER: 1" \ "IF-MIB::ifIndex.2 = INTEGER: 2" \ "IF-MIB::ifDescr.1 = STRING: Test" \ "IF-MIB::ifDescr.2 = STRING: Test 2" \ "IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)" \ "IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)" \ "IF-MIB::ifMtu.1 = INTEGER: 1500" \ "IF-MIB::ifMtu.2 = INTEGER: 1400" \ "IF-MIB::ifSpeed.1 = Gauge32: 10000000" \ "IF-MIB::ifSpeed.2 = Gauge32: 1000" \ "IF-MIB::ifPhysAddress.1 = STRING: aa:bb:cc:dd:ee:ff" \ "IF-MIB::ifPhysAddress.2 = STRING: 11:22:33:44:55:66" \ "IF-MIB::ifAdminStatus.1 = INTEGER: testing(3)" \ "IF-MIB::ifAdminStatus.2 = INTEGER: down(2)" \ "IF-MIB::ifOperStatus.1 = INTEGER: up(1)" \ "IF-MIB::ifOperStatus.2 = INTEGER: down(2)" \ "IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00" \ "IF-MIB::ifLastChange.2 = Timeticks: (0) 0:00:00.00" \ "IF-MIB::ifInOctets.1 = Counter32: 123" \ "IF-MIB::ifInOctets.2 = Counter32: 111" \ "IF-MIB::ifInUcastPkts.1 = Counter32: 124" \ "IF-MIB::ifInUcastPkts.2 = Counter32: 222" \ "IF-MIB::ifInNUcastPkts.1 = Counter32: 124" \ "IF-MIB::ifInNUcastPkts.2 = Counter32: 333" \ "IF-MIB::ifInDiscards.1 = Counter32: 125" \ "IF-MIB::ifInDiscards.2 = Counter32: 444" \ "IF-MIB::ifInErrors.1 = Counter32: 126" \ "IF-MIB::ifInErrors.2 = Counter32: 555" \ "IF-MIB::ifInUnknownProtos.1 = Counter32: 127" \ "IF-MIB::ifInUnknownProtos.2 = Counter32: 666" \ "IF-MIB::ifOutOctets.1 = Counter32: 128" \ "IF-MIB::ifOutOctets.2 = Counter32: 777" \ "IF-MIB::ifOutUcastPkts.1 = Counter32: 129" \ "IF-MIB::ifOutUcastPkts.2 = Counter32: 888" \ "IF-MIB::ifOutNUcastPkts.1 = Counter32: 129" \ "IF-MIB::ifOutNUcastPkts.2 = Counter32: 999" \ "IF-MIB::ifOutDiscards.1 = Counter32: 130" \ "IF-MIB::ifOutDiscards.2 = Counter32: 101010" \ "IF-MIB::ifOutErrors.1 = Counter32: 131" \ "IF-MIB::ifOutErrors.2 = Counter32: 111111" \ "IF-MIB::ifOutQLen.1 = Gauge32: 132" \ "IF-MIB::ifOutQLen.2 = Gauge32: 111" \ "IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero" \ "IF-MIB::ifSpecific.2 = OID: iso.2.3" # There is an intricate error in the return of this test that has to with validation of state data # clixon_snmp queries using xpath: # if-mib:IF-MIB/if-mib:ifRcvAddressTable/if-mib:ifRcvAddressEntry[if-mib:ifIndex='1'] # But if-mib:ifIndex is a leafref that point to a value outside the XPath, which make the validation fail # But if you set CLICON_VALIDATE_STATE_XML:true its ok new "Test $OID24" validate_oid $OID24 $OID24 "STRING" "11:bb:cc:dd:ee:ff" validate_oid $NAME24 $NAME24 "STRING" "11:bb:cc:dd:ee:ff" "IF-MIB::ifRcvAddressAddress.1.\"11:bb:cc:dd:ee:ff\" = STRING: 11:bb:cc:dd:ee:ff" new "Get next $OID24" validate_oid $OID24 $OID25 "STRING" "aa:22:33:44:55:66" validate_oid $NAME24 $NAME25 "STRING" "aa:22:33:44:55:66" "IF-MIB::ifRcvAddressAddress.2.\"aa:22:33:44:55:66\" = STRING: aa:22:33:44:55:66" new "Get $NAME25" validate_oid $OID25 $OID25 "STRING" "aa:22:33:44:55:66" validate_oid $NAME25 $NAME25 "STRING" "aa:22:33:44:55:66" "IF-MIB::ifRcvAddressAddress.2.\"aa:22:33:44:55:66\" = STRING: aa:22:33:44:55:66" new "Get next $OID25" validate_oid $OID25 $OID26 "INTEGER" "active(1)" validate_oid $NAME25 $NAME26 "INTEGER" "active(1)" "IF-MIB::ifRcvAddressStatus.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: active(1)" new "Get $OID26" validate_oid $OID26 $OID26 "INTEGER" "active(1)" validate_oid $NAME26 $NAME26 "INTEGER" "active(1)" "IF-MIB::ifRcvAddressStatus.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: active(1)" new "Get next $OID26" validate_oid $OID26 $OID27 "INTEGER" "createAndGo(4)" validate_oid $NAME26 $NAME27 "INTEGER" "createAndGo(4)" "IF-MIB::ifRcvAddressStatus.2.\"aa:22:33:44:55:66\" = INTEGER: createAndGo(4)" new "Get $OID27" validate_oid $OID27 $OID27 "INTEGER" "createAndGo(4)" validate_oid $NAME27 $NAME27 "INTEGER" "createAndGo(4)" "IF-MIB::ifRcvAddressStatus.2.\"aa:22:33:44:55:66\" = INTEGER: createAndGo(4)" new "Get next $OID27" validate_oid $OID27 $OID28 "INTEGER" "other(1)" validate_oid $NAME27 $NAME28 "INTEGER" "other(1)" "IF-MIB::ifRcvAddressType.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: other(1)" new "Get $OID28" validate_oid $OID28 $OID28 "INTEGER" "other(1)" validate_oid $NAME28 $NAME28 "INTEGER" "other(1)" "IF-MIB::ifRcvAddressType.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: other(1)" new "Get next $OID28" validate_oid $OID28 $OID29 "INTEGER" "volatile(2)" validate_oid $NAME28 $NAME29 "INTEGER" "volatile(2)" "IF-MIB::ifRcvAddressType.2.\"aa:22:33:44:55:66\" = INTEGER: volatile(2)" new "Test ifTable" expectpart "$($snmptable IF-MIB::ifRcvAddressTable)" 0 "SNMP table: IF-MIB::ifRcvAddressTable" "ifRcvAddressStatus" "ifRcvAddressType" "active" "other" "createAndGo" "volatile" new "Walk ifRcvTable" expectpart "$($snmpwalk IF-MIB::ifRcvAddressTable)" 0 "IF-MIB::ifRcvAddressAddress.1.\"11:bb:cc:dd:ee:ff\" = STRING: 11:bb:cc:dd:ee:ff" \ "IF-MIB::ifRcvAddressAddress.2.\"aa:22:33:44:55:66\" = STRING: aa:22:33:44:55:66" \ "IF-MIB::ifRcvAddressStatus.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: active(1)" \ "IF-MIB::ifRcvAddressStatus.2.\"aa:22:33:44:55:66\" = INTEGER: createAndGo(4)" \ "IF-MIB::ifRcvAddressType.1.\"11:bb:cc:dd:ee:ff\" = INTEGER: other(1)" \ "IF-MIB::ifRcvAddressType.2.\"aa:22:33:44:55:66\" = INTEGER: volatile(2)" # XXX with valgrind on backend this fails with: # Error in packet. # Reason: (genError) A general failure occured # Failed object: IF-MIB::ifName.2 new "Walk ifXTable" expectpart "$($snmpwalk IF-MIB::ifXTable)" 0 "IF-MIB::ifName.1 = STRING: ifname1" \ "IF-MIB::ifName.2 = STRING: ifname2" expectpart "$($snmpwalk $OID30)" 0 "IF-MIB::ifName.1 = STRING: ifname1" \ "IF-MIB::ifName.2 = STRING: ifname2" testexit rm -rf $dir new "endtest" endtest