#!/bin/ksh # Script writen by Daniel Jakots # First we go through the list of neighbor and we write all the peer and # their status in "${_TMPDIR}"/bgp-status. # Then we monitor if this file has changed between now and the previous run. # If it did, we send a mail with the states of the different sessions. set -u PATH=$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:. _MAILTO="noc@example.com" _TMPDIR=/tmp/check-bgp _HOSTNAME=$(hostname) mkdir -p "${_TMPDIR}" # Don't try to run if it's already running if [ -e "${_PIDFILE}" ]; then echo "$(date)" >> "${_TMPDIR}"/log # for debug purpose echo "bgpd was already running" | mail -s "[BGP] ${_HOSTNAME}" foo@example.com exit 1 else echo $$ >> "${_PIDFILE}" fi if [[ -f "${_TMPDIR}"/bgp-status ]] ; then mv "${_TMPDIR}"/bgp-status "${_TMPDIR}"/bgp-status.old else touch "${_TMPDIR}"/bgp-status touch "${_TMPDIR}"/bgp-status.old fi # List peers and loops on them to list them and their BGP state bgpctl show neighbor | grep Description | sed s,\ Description:\ ,,g > "${_TMPDIR}"/peers-list while read _PEER do _STATUS=$(/usr/sbin/bgpctl show neighbor "${_PEER}" | grep state | awk '{print $4}' |tr -d ',') echo -n "${_PEER}" >> "${_TMPDIR}"/bgp-status echo -n " " >> "${_TMPDIR}"/bgp-status # we note only if it's established or not if ! [[ "${_STATUS}" = "Established" ]] ; then _STATUS="NotEstablished" fi echo "${_STATUS}" >> "${_TMPDIR}"/bgp-status done <"${_TMPDIR}"/peers-list # Check for difference with previous run different=$(diff -q "${_TMPDIR}"/bgp-status.old "${_TMPDIR}"/bgp-status) if ! [[ -n "${different}" ]] ; then rm -f "${_PIDFILE}" exit 0 fi # It changed so we're going to send a mail _TMPMAILDIR="${_TMPDIR}"/mail mkdir -p "${_TMPMAILDIR}" # go through sessions and list them depending on their BGP state echo "*** Session(s) OK ***\n" >> "${_TMPMAILDIR}"/bodyok while read _LINE do # _LINE is session + status _STATUS=$(echo "${_LINE##* }") _SESSION=$(echo "${_LINE}" | awk '{$NF=""}1') if [[ "${_STATUS}" = "Established" ]] ; then bgpctl show | grep "${_SESSION}" >> "${_TMPMAILDIR}"/bodyok else bgpctl show | grep "${_SESSION}" >> "${_TMPMAILDIR}"/bodynok fi done <"${_TMPDIR}"/bgp-status # create the mail body echo "Dear NOC,\n\nThe state of one or more BGP session(s) has changed:\n" > "${_TMPMAILDIR}"/header cat "${_TMPMAILDIR}"/header "${_TMPMAILDIR}"/bodyok > "${_TMPMAILDIR}"/body if [[ -f "${_TMPMAILDIR}"/bodynok ]] ; then echo "\n*** Session(s) on error ***\n" >> "${_TMPMAILDIR}"/body cat "${_TMPMAILDIR}"/bodynok >> "${_TMPMAILDIR}"/body fi cat "${_TMPMAILDIR}"/body | mail -s "[BGP] ${_HOSTNAME} - State change" "${_MAILTO}" # cleaning if [[ -d "${_TMPMAILDIR}" ]] ; then rm -rf "${_TMPMAILDIR}" fi rm -f "${_PIDFILE}"