WirelessInfo.be informatie over bedrade en draadloze netwerken
Mikrotik BGP monitoring email script

Mikrotik BGP monitoring email script

Dit script zal de status controleren van de BGP-peers. Als de BGP-peer gaat uitvallen of terug online gaat zal dit script dit melden via email. Het script moet in scheduler worden gedraaid en controleerd alle 30 seconden de status van de BGP-peers. Dit script zal niet werken als je maar 1 BGP-peer op de router hebt ingesteld, omdat de email niet via de router kan verstuurt worden. De uitgeschakelde BGP-peers gaat het script negeren.

Dit script is getest en werkend met volgende RouterOs

Routerboard RouterOs Bios firmware
OmniTik U-5HnDr2 6.27 3.22

Email instellingen kan je hier zien

De link hierboven laat zien hoe je de email instellingen moet uitvoeren, doe dit eerst en vooral.

Mikrotik scheduler configureren

bgpmon

In het hoofdmenu klik op "system" vervolgens op "scheduler".

bgpmon

Klik op het blauwe kruisje om een nieuwe scheduler taak aan te maken.

bgpmon

  • Bij "name" geef de scheduler taak een naam.
  • Bij "start date" zet een datum in dat nog niet verstreken is.
  • Bij "start time" zet het uur in dat de scheduler taak moet beginnen. Deze tijd mag eveneens niet verstreken zijn.
  • Bij "interval" kies je de tijd dat die terug de scheduler taak moet uitvoeren. Hier staat die ingesteld op 30 seconden. Iedere dertig seconden zal de scheduler het script draaien.
  • Kopieer het onderstaande script en plak het in het venster "on event".

Opgelet! Het script moet aangepast worden waar staat "EDIT HERE" tot "END EDIT" (rood gekleurd). Daar moet je de namen van de BGP-peers en het email adres veranderen.

Het script

Kopieer dit script en plak deze in een editor zoals kladblok. Pas het script aan (de rode tekst) en kopieer en plak deze in het scheduler venster. Maak dat de datum en tijd nog niet is verstreken of de scheduler taak zal niet opstarten.

BGP peer status monitor script
  • # EDIT HERE
  • :local arrBgpPeers [:toarray "bgp-peer1,bgp-peer2,bgp-peer3"];
  • :local arrEmails [:toarray "uwemail@voorbeeld.be"];
  • ::local debug true
  • # EDIT END
  • # Define Variables
  • :global arrBgpState;
  • :global gotKey false;
  • :local hostNameX ([/system identity get name]);
  • :local statusX;
  • :local peerX;
  • :local peerXarrEl;
  • :local mailToX;
  • :local mailSubjectX;
  • :local mailBodyX;
  • :local peerStatusX;
  • if ($debug = true) do={
  • :log info ("=============BGP PEER STATUS DETECTION STARTED=============" )
  • }
  • # Initialize global array - kinda lame way to do it :P
  • :if ( [:len $arrBgpState] =0 ) do={
  • :set $arrBgpState {"false"="false"}
  • }
  • # Loop through the peers array
  • :local arrPos
  • :for arrPos from=0 to=([:len $arrBgpPeers]-1) do={
  • # Set peerX to current peer name for this iteration
  • :set peerX [:pick $arrBgpPeers $arrPos];
  • # Check if peer is enabled and proceed
  • :if ([/routing bgp peer get [find name=$peerX] disabled ] != true) do={
  • # Get Peer Status
  • :set peerStatusX [/routing bgp peer get [find name="$peerX"] state]
  • # Find peer key in global array
  • :foreach k,v in=$arrBgpState do={
  • if ($k != "false") do={
  • :if ($gotKey = false) do={
  • :if ($k = $peerX) do={
  • :set gotKey true
  • }
  • }
  • }
  • }
  • # Initialize arrBgpState array element with peerX name if it doesn't already exist
  • :if ($gotKey = false) do={
  • :set ($arrBgpState->"$peerX") "up"
  • }
  • # Reset this for the next iteration
  • :set gotKey false
  • # Previous run peer status
  • :set statusX ($arrBgpState->"$peerX")
  • # Prepare Email body
  • :set mailBodyX ("Router Hostname: " . $hostNameX . "\nBGP Peer Status: " . $peerStatusX . "\nBGP Peer Name: " . $peerX . "\n");
  • # Check if BGP Peer is not established
  • :if ($peerStatusX != "established") do={
  • # Check if this is the first time the peer is doen
  • :if ( $statusX = "up" ) do={
  • # Set value to 'down' to peer global var key
  • :set ($arrBgpState->$peerX) "down"
  • # Informational Log
  • if ($debug = true) do={
  • :log error ("BGP Peer ". $peerX ." state is " . $peerStatusX . ". Sending email alerts!" )
  • }
  • # Prepare Email subject
  • :set mailSubjectX ("BGP Peer ". $peerX ." on ". $hostNameX . " is NOT established!");
  • # Loop over emails array to send emails to all recipients in array
  • :local arrPos2
  • :for arrPos2 from=0 to=([:len $arrEmails]-1) do={
  • # Set mailToX to recipient for this iteration
  • :set mailToX [:pick $arrEmails $arrPos2]
  • # Informational Log
  • :log error ("BGP Peer " . $peerX . " status is " .$peerStatusX. "! Sending Email alert to " . $mailToX . "." )
  • # Send Email
  • /tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX;
  • }
  • } else={
  • # Peer down. Already sent notification so do nothing.
  • if ($debug = true) do={
  • :log info ("BGP Peer ". $peerX ." is already down. Ignoring!")
  • }
  • }
  • } else={
  • # Check if peer just came back up and send informational email
  • if ($statusX = "down") do={
  • # Prepare Email subject
  • :set mailSubjectX ("BGP Peer ". $peerX ." on ". $hostNameX . " has recovered!");
  • # Loop over emails array to send emails to all recipients in array
  • :local arrPos2
  • :for arrPos2 from=0 to=([:len $arrEmails]-1) do={
  • # Set mailToX to recepient for this iteration
  • :set mailToX [:pick $arrEmails $arrPos2]
  • # Informational Log
  • :log warning ("BGP Peer " . $peerX . " status has recovered! Sending informational Email to " . $mailToX . "." )
  • # Send Email
  • /tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX;
  • }
  • }
  • if ($debug = true) do={
  • :log info ("BGP Peer " . $peerX . " is up. Nothing to do!")
  • }
  • # Set peer status to up
  • :set ($arrBgpState->$peerX) "up"
  • }
  • } else={
  • if ($debug = true) do={
  • :log warning ("BGP Peer " . $peerX . " is disabled. Ignoring!")
  • }
  • }
  • }
  • if ($debug = true) do={
  • :log info ("=============BGP PEER STATUS DETECTION ENDED===============" )
  • }

Indien de status van de BGP-peers veranderd naar "idle" of "established" zal het script een email zenden. Het heeft geen zin het script te draaien als het email script de email server niet kan bereiken natuurlijk. Een redundant netwerk is daarom op zijn plaats en een must.

Top