iax2.sh

Author Eric Meddaugh
Compatibility Xymon 4.2
Requirements Perl
Download None
Last Update 2008-09-11

Monitor IAX2 on an Asterisk server. Needs access to UDP port 4569.

Client configuration

None.

Server configuration

Add following to the hobbitlaunch.cfg file

[iax2]
        ENVFILE /home/hobbit/server/etc/hobbitserver.cfg
        NEEDS hobbitd
        CMD  $BBHOME/ext/iax2.sh
        LOGFILE $BBSERVERLOGS/iax2.log
        INTERVAL 1m

Add the “iax2” tag in bb-hosts.

Monitor Code

iax2.sh – Place in ext directory, this is the main script hobbit calls.

Show Code ⇲

Hide 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


iax2ping.pl – Place in ext folder

Show Code ⇲

Hide Code ⇱

#!/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";
}
  • 2008-09-11
    • Initial release
  • monitors/asterisk-iax2.txt
  • Last modified: 2009/11/23 05:32
  • (external edit)