Collection of CheckMK checks (see https://checkmk.com/). All checks and plugins are provided as is. Absolutely no warranty. Send any comments to thl-cmk[at]outlook[dot]com

Skip to content
Snippets Groups Projects
Commit ff58f68a authored by thl-cmk's avatar thl-cmk :flag_na:
Browse files

update project

parent f845104e
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# License: GNU General Public License v2
#
# Author: thl-cmk[at]outlook[dot]com
# URL : https://thl-cmk.hopto.org
# Date : 2023-01-16
#
# Monitor status of Arista Networks BGP Peers (IPv4 and IPv6)
#
#
#
import copy
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass
from cmk.base.plugins.agent_based.agent_based_api.v1 import (
register,
SNMPTree,
startswith,
OIDEnd,
OIDBytes,
)
from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
StringByteTable,
)
from cmk.base.plugins.agent_based.utils.bgp_peer import (
BgpPeer,
bgp_get_peer_entry,
bgp_get_ip_address_from_oid,
)
from cmk.base.plugins.agent_based.utils.arista_bgp_peer import (
arista_afi_safi_mapping,
)
@dataclass
class AristaPrefixes:
afi: str
safi: str
accepted_prefixes: int
metric_count: List[Tuple[str, int]]
metric_rate: List[Tuple[str, int]]
def parse_arista_bgp_peer(string_table: List[StringByteTable]) -> Optional[Dict[str, BgpPeer]]:
BgpPeerTable, BgpPrefixCountersTable = string_table
peer_table = {}
peer_prefixes = {}
for entry in BgpPrefixCountersTable:
oid_end, in_prefixes, in_prefixes_accepted, out_prefixes = entry
oid_end_split = oid_end.split('.')
afi = oid_end_split[-2]
safi = oid_end_split[-1]
index = '.'.join(oid_end_split[:-2])
prefixes = AristaPrefixes(
afi=afi,
safi=safi,
accepted_prefixes=int(in_prefixes_accepted),
metric_rate=[],
metric_count=[
('in_prefixes', int(in_prefixes)),
('out_prefixes', int(out_prefixes)),
],
)
if peer_prefixes.get(index):
peer_prefixes[index].append(prefixes)
else:
peer_prefixes[index] = [prefixes]
for entry in BgpPeerTable:
oid_end, remote_as, remote_id, admin_state, peer_state, in_updates, out_updates, in_messages, out_messages, \
fsm_established_transitions, fsm_established_time, in_update_elapsed_time = entry
remote_addr = bgp_get_ip_address_from_oid(f'{oid_end[2:]}')
bgp_peer = bgp_get_peer_entry(
remote_addr=remote_addr,
peer_state=peer_state,
admin_state=admin_state,
remote_as=remote_as,
in_updates=in_updates,
out_updates=out_updates,
in_messages=in_messages,
out_messages=out_messages,
fsm_established_transitions=fsm_established_transitions,
fsm_established_time=fsm_established_time,
in_update_elapsed_time=in_update_elapsed_time
)
prefixes = peer_prefixes.get(oid_end, [])
for address_family in prefixes:
address_family_str = arista_afi_safi_mapping(address_family.afi, address_family.safi)
item = f'{remote_addr} {address_family_str}'
peer_table[item] = copy.deepcopy(bgp_peer[remote_addr])
peer_table[item].accepted_prefixes = address_family.accepted_prefixes
peer_table[item].metric_count += address_family.metric_count
peer_table[item].metric_rate += address_family.metric_rate
peer_table[item].item['address_family'] = address_family_str
peer_table[item].item['routing_instance'] = ''
return peer_table
register.snmp_section(
name='arista_bgp_peer',
parse_function=parse_arista_bgp_peer,
parsed_section_name='bgp_peer',
supersedes=['bgp_peer', 'arista_bgp'],
fetch=[
SNMPTree(
base='.1.3.6.1.4.1.30065.4.1.1', # AARISTA-BGP4V2-MIB::aristaBgp4V2Objects
oids=[
OIDEnd(),
'2.1.10', # aristaBgp4V2PeerRemoteAs
OIDBytes('2.1.11'), # aristaBgp4V2PeerRemoteIdentifier
'2.1.12', # aristaBgp4V2PeerAdminStatus
'2.1.13', # aristaBgp4V2PeerState
'7.1.1', # aristaBgp4V2PeerInUpdates
'7.1.2', # aristaBgp4V2PeerOutUpdates
'7.1.3', # aristaBgp4V2PeerInTotalMessages
'7.1.4', # aristaBgp4V2PeerOutTotalMessages
'7.1.5', # aristaBgp4V2PeerFsmEstablishedTransitions
'4.1.1', # aristaBgp4V2PeerFsmEstablishedTime
'4.1.2', # aristaBgp4V2PeerInUpdatesElapsedTime
]),
SNMPTree(
base='.1.3.6.1.4.1.30065.4.1.1.8.1', # ARISTA-BGP4V2-MIB::aristaBgp4V2PrefixGaugesEntry
oids=[
OIDEnd(), # index.afi.safi
'3', # aristaBgp4V2PrefixInPrefixes
'4', # aristaBgp4V2PrefixInPrefixesAccepted
'5', # aristaBgp4V2PrefixOutPrefixes
]
),
],
detect=startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.30065'), # ARISTA-SMI-MIB::arista
),
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# License: GNU General Public License v2
#
# Author: thl-cmk[at]outlook[dot]com
# URL : https://thl-cmk.hopto.org
# Date : 2023-01-17
#
# inventory of Arista Networks BGP Peers (IPv4 and IPv6)
#
#
from typing import List
from cmk.base.plugins.agent_based.agent_based_api.v1 import (
register,
SNMPTree,
OIDBytes,
startswith,
OIDEnd,
)
from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
StringByteTable,
)
from cmk.base.plugins.agent_based.utils.bgp_peer import (
InvBgpPeer,
bgp_error_as_string,
bgp_error_code_as_hex,
bgp_render_ip_address,
get_bgp_type,
bgp_get_ip_address_from_oid,
)
from cmk.base.plugins.agent_based.utils.arista_bgp_peer import (
arista_afi_safi_mapping,
)
def parse_inv_arista_bgp_peer(string_table: List[StringByteTable]):
peers, address_families = string_table
bgp_peers = []
peer_families = {}
for entry in address_families:
oid_end, in_prefixes = entry
oid_end_split = oid_end.split('.')
afi = oid_end_split[-2]
safi = oid_end_split[-1]
index = '.'.join(oid_end_split[:-2])
if peer_families.get(index):
peer_families[index] = peer_families[index] + [arista_afi_safi_mapping(afi, safi)]
else:
peer_families[index] = [arista_afi_safi_mapping(afi, safi)]
for entry in peers:
oid_end, local_addr_type, local_addr, local_as, local_id, remote_as, remote_id, state, last_error_received, \
fsm_established_time, fsm_established_trans = entry
remote_addr = bgp_get_ip_address_from_oid(f'{oid_end[2:]}')
# assuming IPv4 address format
local_id = bgp_render_ip_address('1', local_id)
remote_id = bgp_render_ip_address('1', remote_id)
bgp_peer: InvBgpPeer = {
'remote_addr': remote_addr,
'remote_id': remote_id,
'version': '4',
'local_addr': bgp_render_ip_address(local_addr_type, local_addr),
'remote_as': remote_as,
'local_as': local_as,
'local_id': local_id,
'bgp_type': get_bgp_type(local_as, remote_as),
'fsm_established_time': int(fsm_established_time),
'peer_state': 1 if state == '6' else 2, # adjust to match if_oper_status for inventory painter
'last_error_code': bgp_error_code_as_hex(last_error_received),
'last_error': bgp_error_as_string(last_error_received),
'status_columns': {},
'address_family': ', '.join(peer_families.get(oid_end, []))
}
bgp_peers.append(bgp_peer)
return bgp_peers
register.snmp_section(
name='inv_arista_bgp_peer',
parse_function=parse_inv_arista_bgp_peer,
parsed_section_name='inv_bgp_peer',
supersedes=['inv_bgp_peer'],
fetch=[
SNMPTree(
base='.1.3.6.1.4.1.30065.4.1.1', # AARISTA-BGP4V2-MIB::aristaBgp4V2Objects
oids=[
OIDEnd(),
'2.1.2', # aristaBgp4V2PeerLocalAddrType
OIDBytes('2.1.3'), # aristaBgp4V2PeerLocalAddr
'2.1.7', # aristaBgp4V2PeerLocalAs
OIDBytes('2.1.8'), # aristaBgp4V2PeerLocalIdentifier
'2.1.10', # aristaBgp4V2PeerRemoteAs
OIDBytes('2.1.11'), # aristaBgp4V2PeerRemoteIdentifier
'2.1.13', # aristaBgp4V2PeerState
OIDBytes('3.1.1'), # aristaBgp4V2PeerLastErrorCodeReceived
'4.1.1', # aristaBgp4V2PeerFsmEstablishedTime
'7.1.5', # aristaBgp4V2PeerFsmEstablishedTransitions
]
),
SNMPTree(
base='.1.3.6.1.4.1.30065.4.1.1.8.1', # ARISTA-BGP4V2-MIB::aristaBgp4V2PrefixGaugesEntry
oids=[
OIDEnd(), # index.addr-type.addr_length.addr.afi[-2].safi[-1]
'3', # aristaBgp4V2PrefixInPrefixes
]
),
],
detect=startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.30065'), # ARISTA-SMI-MIB::arista
),
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# License: GNU General Public License v2
#
# Author: thl-cmk[at]outlook[dot]com
# URL : https://thl-cmk.hopto.org
# Date : 2023-01-16
#
# include file, will be used with arista_bgp_peer and inv_arista_bgp_peer
#
#
def arista_address_type(st: str):
names = {
'0': 'unknown',
'1': 'ipv4',
'2': 'ipv6',
}
return names.get(st, st)
def arista_address_family(st: str):
names = {
'0': 'unknown',
'1': 'ipv4',
'2': 'ipv6',
}
return names.get(st, st)
def arista_afi_safi_mapping(afi: str, safi: str) -> str:
names = {
(1, 1): 'IPv4 unicast',
(1, 2): 'IPv4 multicast',
(2, 1): 'IPv6 unicast',
(2, 2): 'IPv6 multicast',
(1, 4): 'MPLS IPv4',
(2, 4): 'MPLS IPv6',
}
return names.get((int(afi), int(safi)), f'AFI {afi} SAFI {safi}')
File added
{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
'description': 'Monitors Arista Networks BGP Peers.\n'
'\n'
'- creates one service for each peer/address family (IPv4 '
'and IPv6)\n'
'- performance data include: peer uptime, prefixes accepted, '
'advertised,\n'
'- this package contains also a inventory plugin\n'
'\n'
'NOTE: this plugin will supersede the original arista_bgp '
'plugin\n'
'\n'
'NOTE: to use this plugin you must also install my bgp_peer '
'plugin '
'(https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/bgp_peer)\n'
'\n',
'download_url': 'https://thl-cmk.hopto.org/gitlab/arista/arista_bgp_peer',
'files': {'agent_based': ['arista_bgp_peer.py',
'inv_arista_bgp_peer.py',
'utils/arista_bgp_peer.py']},
'name': 'arista_bgp_peer',
'num_files': 3,
'title': 'Arista BGP peer',
'version': '20230117.v0.01',
'version.min_required': '2.0.0',
'version.packaged': '2021.09.20',
'version.usable_until': None}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment