monitors:asterisk-iax2

no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


monitors:asterisk-iax2 [2009/11/23 05:32] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== iax2.sh ======
 +
 +^ Author | [[ etmsys@rit.edu | Eric Meddaugh ]] |
 +^ Compatibility | Xymon 4.2 |
 +^ Requirements | Perl |
 +^ Download | None |
 +^ Last Update | 2008-09-11 |
 +
 +===== Description =====
 +
 +Monitor IAX2 on an Asterisk server. Needs access to UDP port 4569.
 +
 +===== Installation =====
 +=== Client configuration ===
 +
 +None.
 +
 +=== Server configuration ===
 +
 +Add following to the hobbitlaunch.cfg file
 +<code>
 +[iax2]
 +        ENVFILE /home/hobbit/server/etc/hobbitserver.cfg
 +        NEEDS hobbitd
 +        CMD  $BBHOME/ext/iax2.sh
 +        LOGFILE $BBSERVERLOGS/iax2.log
 +        INTERVAL 1m
 +</code>
 +
 +Add the "iax2" tag in bb-hosts.
 +
 +===== Source =====
 +
 +==== Monitor Code ====
 +iax2.sh -- Place in ext directory, this is the main script hobbit calls.
 +<hidden onHidden="Show Code ⇲" onVisible="Hide Code ⇱">
 +<code>
 +#!/bin/sh
 +
 +#
 +
 +COLUMN=iax2
 +TIMEOUT=10
 +
 +$BBHOME/bin/bbhostgrep --no-down ${COLUMN} |
 +while read L
 +do
 +     set $L
 +     IP="$1"
 +     HOSTNAME="$2"
 +     COLOR=green
 +
 +# linux use "/usr/bin/time -p" instead of ptime
 +     /bin/ptime $BBHOME/ext/iax2ping.pl $IP >$BBTMP/${COLUMN}.out 2>&1
 +     SECONDS=`egrep "^real" $BBTMP/${COLUMN}.out | awk '{printf $2}'`
 +     OK=`/bin/egrep -c "Response from" $BBTMP/${COLUMN}.out`
 +     BAD=`/bin/egrep -c "Error" $BBTMP/${COLUMN}.out`
 +
 +     if [ ${OK} -eq 0 -a ${BAD} -ge 1 ] ; then
 +        COLOR=red
 +        MSG="IAX2 query failed
 +
 +`cat $BBTMP/${COLUMN}.out | egrep -vi user`
 +
 +Seconds: ${SECONDS}
 +"
 +     elif [ ${OK} -ge 1 -a ${BAD} -ge 1 ] ; then
 +        COLOR=yellow
 +        MSG="IAX2 query weird
 +
 +`cat $BBTMP/${COLUMN}.out | egrep -vi user`
 +
 +Seconds: ${SECONDS}
 +"
 +     else
 +        COLOR=green
 +        MSG="IAX2 query succeeded
 +
 +`cat $BBTMP/${COLUMN}.out | egrep -vi user`
 +
 +Seconds: ${SECONDS}
 +"
 +  fi
 +
 +  $BB $BBDISP "status $HOSTNAME.$COLUMN $COLOR `date`
 +
 +  $MSG"
 +done
 +
 +exit 0
 +</code>
 +</hidden>
 +\\ 
 +
 +iax2ping.pl -- Place in ext folder
 +<hidden onHidden="Show Code ⇲" onVisible="Hide Code ⇱">
 +<code perl>
 +#!/usr/bin/perl -w 
 +#udp ping tool 
 +
 +use IO::Socket; 
 +$target = shift; #"192.168.0.255"; 
 +$target_port = 4569; 
 +
 +socket(PING, PF_INET, SOCK_DGRAM, getprotobyname("udp")); 
 +
 +# Build Packet ...  
 +# Names from ethereal filter of registration packet 
 +
 +$src_call = "8000"; #8000 most siginificant bit is IAX packet type full ... required for a poke etc... 
 +$dst_call = "0000"; 
 +$timestamp = "00000000"; 
 +$outbound_seq = "00"; 
 +$inbound_seq = "00"; 
 +$type = "06"; #IAX_Control 
 +$iax_type = "1e"; #POKE 
 +$msg = pack "H24", $src_call . $dst_call . $timestamp . $outbound_seq . $inbound_seq . $type . $iax_type; 
 +
 +# Send UDP packet 
 +
 +$ipaddr = inet_aton($target); 
 +$sendto = sockaddr_in($target_port,$ipaddr); 
 +
 +send(PING, $msg, 0, $sendto) == length($msg) or die "cannot send to $target : $target_port : $!\n"; 
 +
 +# Listen for responses... listen for TIMEOUT seconds and report all responders (works for broadcast pings)
 +
 +$MAXLEN = 1024; 
 +$TIMEOUT = 15; 
 +
 +eval { 
 +local $SIG{ALRM} = sub { die "alarm time out"; }; 
 +alarm $TIMEOUT; 
 +$total = 3; 
 +$count = 0; 
 +while ($count < $total) { 
 +  $recvfrom = recv(PING, $msg, $MAXLEN, 0) or die "recv: $!"; 
 +  ($port, $ipaddr) = sockaddr_in($recvfrom); 
 +  $respaddr = inet_ntoa($ipaddr); 
 +  print "Response from $respaddr : $port\n"; 
 +  $count++; 
 +
 +
 +$type = "06"; #IAX_Control 
 +$iax_type = "04"; #ACK 
 +$msg = pack "H24", $src_call . $dst_call . $timestamp . $outbound_seq . $inbound_seq . $type . $iax_type; 
 +send(PING, $msg, 0, $sendto) == length($msg) or die "cannot send to $target : $target_port : $!\n"; 
 +
 +}; 
 +
 +if ($@) { 
 +       print "Error Timeout waiting for packet from: $target\r\n"; 
 +       $type = "06"; #IAX_Control 
 +       $iax_type = "04"; #ACK 
 +       $msg = pack "H24", $src_call . $dst_call . $timestamp . $outbound_seq . $inbound_seq . $type . $iax_type;
 +       send(PING, $msg, 0, $sendto) == length($msg) or die "cannot send to $target : $target_port : $!\n";
 +}
 +</code>
 +</hidden>
 +
 +===== Known  Bugs and Issues =====
 +
 +===== To Do =====
 +
 +===== Credits =====
 +
 +===== Changelog =====
 +
 +  * **2008-09-11**
 +    * Initial release
  
  • monitors/asterisk-iax2.txt
  • Last modified: 2009/11/23 05:32
  • by 127.0.0.1