Differences
This shows you the differences between two versions of the page.
— |
monitors:asterisk-iax2 [2009/11/23 05:32] (current) |
||
---|---|---|---|
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 | ||