'CISCO-VIRTUAL-SWITCH-MIB::cvsSwitchCapability.0', # 0=standalone, 1=core(part of vss cluster) 'CISCO-VIRTUAL-SWITCH-MIB::cvsSwitchMode.0' # 1=standalone, 2=multiNode(VSS) ] cvsSwitchCapability = my_snmp_get(args, oids_switch[0]) cvsSwitchMode = my_snmp_get(args, oids_switch[1]) if cvsSwitchCapability.value != u'\xc0' and cvsSwitchCapability.value != u'\x80': print "UNKNOWN: Switch is not VSS capable!" sys.exit(STATE_UNKNOWN) if cvsSwitchMode.value != u'2': print "OK: Switch is VSS capable, but isn't running in VSS mode" sys.exit(STATE_OK) rawdata_chassis = my_snmp_walk(args, oids_chassis) rawdata_VSL = my_snmp_walk(args, oids_VSL) # Sort the walked data into a nicer format chassis = snmpresult_to_dict(rawdata_chassis) VSL = snmpresult_to_dict(rawdata_VSL) # A valid and healthy VSS cluster is always 2 members if len(chassis) < 2: print "CRITICAL: Only one chassis found, possible cluster member outage!" sys.exit(STATE_CRIT) chassis1 = chassis[list(chassis.keys())[0]] chassis2 = chassis[list(chassis.keys())[1]] # We want to catch: standby/standby active/active and whether either are in standalone # Critting immediately here as all of this are much more critical than all other checks if chassis1['cvsChassisRole'].value == chassis2['cvsChassisRole'].value: if chassis1['cvsChassisRole'].value == u'1': print "CRITICAL: Both VSS members are in standalone role? Shouldn't be possible.."
args = parser.parse_args() # Get local AS number local_as = my_snmp_get(args, 'BGP4-MIB::bgpLocalAs.0').value # Get all BGP peers oids = [ 'CISCO-BGP4-MIB::cbgpPeer2RemoteAs', 'CISCO-BGP4-MIB::cbgpPeer2AdminStatus', 'CISCO-BGP4-MIB::cbgpPeer2LastErrorTxt', 'CISCO-BGP4-MIB::cbgpPeer2State' ] rawdata = my_snmp_walk(args, oids) data = snmpresult_to_dict(rawdata) # Now loop over data, and for _iBGP_ check the states status = STATE_OK statusstr = "" num_ibgp = 0 for index, peer in data.iteritems(): if local_as not in peer['cbgpPeer2RemoteAs'].value: continue num_ibgp += 1 peer_ip = snmp_oid_decode_ip(index) admin_state = int(peer['cbgpPeer2AdminStatus'].value) bgp_state = int(peer['cbgpPeer2State'].value) last_error = peer['cbgpPeer2LastErrorTxt'].value.strip() if not last_error:
oid_stack_num_units = f10_oid_stack_num_units oids_stack_status = f10_oids_stack_status oid_num_psus = f10_oid_num_psus oid_num_fans = f10_oid_num_fans oid_psu_oper = f10_oid_psu_oper oid_fans_oper = f10_oid_fans_oper oid_mgmt_status = f10_oid_mgmt_status else: f10 = False num_stackunits = my_snmp_get(args, oid_stack_num_units) raw_stackunit_status = my_snmp_walk(args, oids_stack_status) status = STATE_OK statusstr = "" stackunit_status = snmpresult_to_dict(raw_stackunit_status) num_mgmt_units = 0 for index, su in stackunit_status.iteritems(): mgmt_status = my_snmp_get(args, oid_mgmt_status.format(index)) if mgmt_status.value == u'1': num_mgmt_units += 1 if f10: unit_status_label = 'chStackUnitStatus' else: unit_status_label = 'dellNetStackUnitStatus' unit_status = int(str(su[unit_status_label].value)) if unit_status == 2: status, statusstr = trigger_not_ok( status, statusstr, STATE_CRIT,
parser.add_argument('-I', metavar='<interface>', required=True, help='Interface to check') args = parser.parse_args() # OSPF oids nei_oids = [ 'OSPF-MIB::ospfNbrIpAddr', 'OSPF-MIB::ospfNbrRtrId', 'OSPF-MIB::ospfNbrState' ] # Iterating all SNMPv3 contexts that have a configured VRF mapping rawdata = my_snmp_walk_v3(args, 'CISCO-CONTEXT-MAPPING-MIB::cContextMappingVrfName') data = snmpresult_to_dict(rawdata) for index, mapping in data.iteritems(): if not mapping['cContextMappingVrfName'].value: continue # This is an auto-created context which likely doesn't contain anything useful snmp_context = snmp_translate_oid2string(index) snmp_vrf = mapping['cContextMappingVrfName'].value # Get routing table of the current context raw_ipforward = my_snmp_walk_v3( args, 'IP-FORWARD-MIB::inetCidrRouteIfIndex.1.4', snmp_context) snmp_ipforward = snmpresult_to_dict(raw_ipforward) routingtable = [] for ipf_index, ipf_data in snmp_ipforward.iteritems(): ipf_index_parts = ipf_index.split(".") ipf_ip = ".".join(ipf_index_parts[2:6]) ipf_cidr = ipf_index_parts[6:7].pop()
required=True, help='Privacy password') parser.add_argument('-H', metavar='<host>', required=True, help='Host to check') parser.add_argument('-I', metavar='<interface>', required=True, help='Interface to check') args = parser.parse_args() # Iterating all SNMPv3 contexts that have a configured VRF mapping rawdata = my_snmp_walk_v3(args, 'CISCO-CONTEXT-MAPPING-MIB::cContextMappingVrfName') data = snmpresult_to_dict(rawdata) for index, mapping in data.iteritems(): if not mapping['cContextMappingVrfName'].value: continue # This is an auto-created context which likely doesn't contain anything useful snmp_context = snmp_translate_oid2string(index) snmp_vrf = mapping['cContextMappingVrfName'].value # Get NDP table (IPv6 equivalent of ARP) - actually we get both since AF is the OID after ifIndex..... raw_ndp = my_snmp_walk_v3(args, 'IP-MIB::ipNetToPhysicalPhysAddress', snmp_context, True) snmp_ndp = snmpresult_to_dict(raw_ndp) v6addr_2_ifindex = {} for ndp_index, ndp_data in snmp_ndp.iteritems(): ndp_ifindex = ndp_index.split(".")[0] if ".2.16." in ndp_index: v6_addr = snmp_oid_decode_ip(".".join(ndp_index.split(".")[1:]))
parser.add_argument('-p', metavar='<peer>', required=True, help='Neighbor to check (peer IP)') args = parser.parse_args() # OSPF oids nei_oids = [ 'OSPF-MIB::ospfNbrIpAddr', 'OSPF-MIB::ospfNbrRtrId', 'OSPF-MIB::ospfNbrState' ] # Iterating all SNMPv3 contexts that have a configured VRF mapping rawdata = my_snmp_walk_v3(args, 'CISCO-CONTEXT-MAPPING-MIB::cContextMappingVrfName') data = snmpresult_to_dict(rawdata) for index, mapping in data.iteritems(): if not mapping['cContextMappingVrfName'].value: continue # This is an auto-created context which likely doesn't contain anything useful snmp_context = snmp_translate_oid2string(index) snmp_vrf = mapping['cContextMappingVrfName'].value # Iterating the neighbors of the current context raw_neighbors = my_snmp_walk_v3(args, nei_oids, snmp_context) neighbors = snmpresult_to_dict(raw_neighbors) for nei_index, nei_data in neighbors.iteritems(): nei_ip = nei_data['ospfNbrIpAddr'].value nei_rtrid = nei_data['ospfNbrRtrId'].value nei_state = int(nei_data['ospfNbrState'].value) if nei_ip == args.p:
parser.add_argument('-C', metavar='<community>', required=True, help='SNMP Community') parser.add_argument('-H', metavar='<host>', required=True, help='Host to check') parser.add_argument('-g', metavar='<host>', required=True, help='Graphite host') args = parser.parse_args() rawdata = my_snmp_walk(args, 'IF-MIB::ifDescr') data = snmpresult_to_dict(rawdata) for if_index, if_data in data.iteritems(): if if_data['ifDescr'].value.lower().startswith('vlan'): vlan_rawdata = my_snmp_walk( args, 'IP-MIB::ipNetToPhysicalType.{}.1'.format(if_index), True) vlan_data = snmpresult_to_dict(vlan_rawdata) cnt = 0 for vl_index, vl_data in vlan_data.iteritems(): if vl_data['ipNetToPhysicalType'].value == 'dynamic': cnt += 1 send_metrics( "arp.{}.vlan.{}".format(args.H, if_data['ifDescr'].value.split(" ")[1]), cnt)