#!/usr/bin/perl -w # -*- perl -*- =head1 NAME asterix_sippeers - Plugin to monitor number of sip peers registered =head1 CONFIGURATION The following configuration parameters are used by this plugin [asterisk_sippeers] env.host - hostname to connect to env.port - port number to connect to env.username - username used for authentication env.secret - secret used for authentication The "username" and "secret" parameters are mandatory, and have no defaults. =head2 DEFAULT CONFIGURATION [asterisk_sippeers] env.host 127.0.0.1 env.port 5038 =head1 AUTHOR Copyright (C) 2005 Rodolphe Quiedeville =head1 LICENSE Gnu GPLv2 =begin comment This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. If you improve this script please send your version to my email address with the copyright notice upgrade with your name. =end comment =head1 MAGIC MARKERS #%# family=contrib =cut # ################################################################################# # Following example from current asterisk 1.4 #> sip show peers #Name/username Host Dyn Nat ACL Port Status #104-RANDALLBUILT/104-RAND 74.218.176.166 D 5060 Unmonitored #... #102-ROCKSOLID/102-ROCKSOL (Unspecified) D 0 Unmonitored #101-ROCKSOLID/101-ROCKSOL (Unspecified) D N 0 UNKNOWN #20 sip peers [Monitored: 0 online, 1 offline Unmonitored: 2 online, 17 offline] # ################################################################################# use IO::Socket; use strict; if ($ARGV[0] and $ARGV[0] eq "config") { print "graph_title Asterisk sip peers\n"; print "graph_args --base 1000 -l 0\n"; print "graph_order mon moff umon umoff\n"; print "graph_vlabel peers\n"; print "graph_category asterisk\n"; #print "peers.label total\n"; print "mon.draw AREA\n"; print "mon.label monitored online\n"; print "moff.draw STACK\n"; print "moff.label monitored offline\n"; print "umon.draw STACK\n"; print "umon.label unmonitored online\n"; print "umoff.draw STACK\n"; print "umoff.label unmonitored offline\n"; #graph_scale no #load.warning 10 #load.critical 120 #graph_info The ... describes .... #load.info Average load for the five minutes. exit 0; } my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1"; my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038"; my $username = $ENV{'username'}; my $secret = $ENV{'secret'}; my $pop = new IO::Socket::INET (PeerAddr => $host, PeerPort => $port, Proto => 'tcp'); die "Could not create socket: $!\n" unless $pop; ## Read connection message. my $line = $pop->getline; die $line unless $line =~ /^Asterisk/; ## Send user name. $pop->print("Action: login\n"); $pop->print("Username: $username\n"); $pop->print("Secret: $secret\n"); $pop->print("Events: off\n"); $pop->print("\n"); while ($line = $pop->getline) { last if $line eq "\r\n"; } #Response: Success #Message: Authentication accepted ## Request status of messages. $pop->print("Action: command\n"); $pop->print("Command: sip show peers\n"); $pop->print("\n"); my ($peers,$monitor_online,$monitor_offline,$unmonitor_online,$unmonitor_offline)=(0,0,0,0,0); while (($line = $pop->getline) and ($line ne "\r\n")) { $line =~ s/^Output: //; my @fields = split(' ', $line); my $count = @fields; #20 sip peers [Monitored: 0 online, 1 offline Unmonitored: 2 online, 17 offline] if (($count > 10) and ($fields[1] eq 'sip' and $fields[2] eq 'peers')) { $peers = $fields[0]; $monitor_online = $fields[4]; $monitor_offline = $fields[6]; $unmonitor_online = $fields[9]; $unmonitor_offline = $fields[11]; #print STDERR "$peers $monitor_online $monitor_offline $unmonitor_online $unmonitor_offline\n"; last; } } $pop->print("Action: logoff\n"); $pop->print("\n"); ## Exhaust buffer before closing (to avoid polluting Asterisk's logs) while ($line = $pop->getline) {} #print "peers.value $peers\n"; print "mon.value $monitor_online\n"; print "moff.value $monitor_offline\n"; print "umon.value $unmonitor_online\n"; print "umoff.value $unmonitor_offline\n"; # vim:syntax=perl