Ejemplo n.º 1
0
    '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.."
Ejemplo n.º 2
0
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:
Ejemplo n.º 3
0
    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,
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
                    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:]))
Ejemplo n.º 6
0
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:
Ejemplo n.º 7
0
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)