From 3d388be5e62b1c833c85e9bcab4acb170517a8dd Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Thu, 19 May 2022 11:36:51 +0200 Subject: [PATCH] Add check_sip_zombie_channels --- check_sip_zombie_channels | 128 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 check_sip_zombie_channels diff --git a/check_sip_zombie_channels b/check_sip_zombie_channels new file mode 100755 index 0000000..79d6032 --- /dev/null +++ b/check_sip_zombie_channels @@ -0,0 +1,128 @@ +#!/bin/bash + +DEBUG=0 +WARNING_HOURS=3 +CRITICAL_HOURS=6 + +function usage() { + [ -n "$1" ] && echo "$1" && echo + echo "Usage : $0 [-cX] [-wX] [-d]" + echo " -h Show this help message" + echo " -d Enable debug mode" + echo " -c[X] Specify critical call duration threshold" + echo " -w[X] Specify warning call duration threshold" +} + +function debug() { + [ $DEBUG -eq 1 ] && echo -e "$( date "+%Y/%m/%d %H:%M:%S" ) - $1" +} + +CRITICAL=10 +WARNING=8 +DEBUG=0 + +for arg in $@ +do + if [ $( echo $arg|egrep -c '^-[cwdh][0-9]*$' ) -gt 0 ] + then + a=$( echo $arg|sed 's/^-\([cwdh]\).*$/\1/' ) + v=$( echo $arg|sed 's/^-[cwdh]//' ) + case $a in + c) + CRITICAL_HOURS=$v + ;; + w) + WARNING_HOURS=$v + ;; + d) + DEBUG=1 + ;; + h) + usage + exit 0 + ;; + esac + else + usage "Invalid argument '$arg'" + fi +done + +let WARNING_SECONDS=WARNING_HOURS*3600 +let CRITICAL_SECONDS=CRITICAL_HOURS*3600 + + +STATE=OK +EXITCODE= + +CRITICAL=0 +CRITICAL_CHANNELS="" +WARNING=0 +WARNING_CHANNELS="" +OK=0 + +debug "Retreive current channels info using rasterisk..." + +## Output example for asterisk cli commande 'core show channels concise' : +## format : +## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +## chanid!context!exten!prio!state!app!appdata!callerid![?]![?]![?]!duration!bridgedtochan![?] +## SIP/trunk-00010bc5!incoming!02XXXXXX19!1!Down!AppDial!(Outgoing Line)!02XXXXXX19!!!3!0!(None)!1447335911.168247 +## SIP/trunk-00010bc0!macro-callqueue!s!4!Up!Queue!natlrecouvrement,,,,120!09XXXXXX68!!!3!19!(None)!1447335892.168238 +CURRENT_CHANNELS=$( /usr/bin/sudo -u root /usr/sbin/rasterisk -rnx 'core show channels concise' | grep -v '^CBAnn/' | grep -Ev "^Setting\s+max\s+files") + +debug "Current channels:\n$CURRENT_CHANNELS" + +IFS=" +" +for line in $CURRENT_CHANNELS +do + if [ $(echo $line | grep -c "^Message/ast_msg_queue") -eq 1 ] + then + debug "Info Message/ast_msg_queue channel (line: $line)" + continue + fi + + channel=$( echo -e "$line"|cut -d'!' -f1 ) + duration=$( echo -e "$line"|cut -d'!' -f12 ) + debug "Channel '$channel' duration: '$duration'" + + if [ $duration -gt $CRITICAL_SECONDS ] + then + debug "Channel '$channel' duration is CRITICAL" + let CRITICAL=CRITICAL+1 + CRITICAL_CHANNELS="$CRITICAL_CHANNELS $channel" + elif [ $duration -gt $WARNING_SECONDS ] + then + debug "Channel '$channel' duration is WARNING" + let WARNING=WARNING+1 + WARNING_CHANNELS="$WARNING_CHANNELS $channel" + else + debug "Channel '$channel' duration is OK" + let OK=OK+1 + fi +done + +debug "Critical channels count: $CRITICAL ($CRITICAL_CHANNELS)" +debug "Warning channels count: $WARNING ($WARNING_CHANNELS)" +debug "OK channels count: $OK" + +if [ $CRITICAL -gt 0 ] +then + STATE=CRITICAL + EXITCODE=2 + MSG="$CRITICAL channels open since more than $CRITICAL_HOURS hours" +elif [ $WARNING -gt 0 ] +then + STATE=WARNING + EXITCODE=1 + MSG="$WARNING channels open since more than $WARNING_HOURS hours" +else + STATE=OK + EXITCODE=0 + MSG="$OK channels open since less than $WARNING_HOURS hours" +fi + +echo "$STATE - $MSG|ok=$OK,warning=$WARNING,critical=$CRITICAL" +[ -n "$CRITICAL_CHANNELS" ] && echo "Critical channels :$CRITICAL_CHANNELS" +[ -n "$WARNING_CHANNELS" ] && echo "Warning channels :$WARNING_CHANNELS" +exit $EXITCODE