From fce750234234d3dc3d74584cd3746e6f1b968e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Elio=20Petten=C3=B2?= Date: Sun, 30 Dec 2012 12:22:52 -0800 Subject: [PATCH] asterisk: first part of the new Asterisk plugin. This plugin is targeting to enter main distribution in 2.1 to remove the multiple Asterisk plugins present in 2.0. It features full autoconfiguration support, multigraph capabilities, and less error-prone code. For the moment, it only implements a replacement for asterisk_channels. --- plugins/asterisk/asterisk | 141 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100755 plugins/asterisk/asterisk diff --git a/plugins/asterisk/asterisk b/plugins/asterisk/asterisk new file mode 100755 index 00000000..2e023ddd --- /dev/null +++ b/plugins/asterisk/asterisk @@ -0,0 +1,141 @@ +#!/usr/bin/perl -w +# -*- cperl -*- + +=head1 NAME + +asterisk - Multigraph-capable plugin to monitor Asterisk + +=head1 CONFIGURATION + +The following configuration parameters are used by this plugin + + [asterisk] + 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] + env.host 127.0.0.1 + env.port 5038 + +=head2 WILDCARD CONFIGURATION + +It's possible to use the plugin in a virtual-node capacity, in which +case the host configuration will default to the hostname following the +underscore: + + [asterisk_someserver] + env.host someserver + env.port 5038 + +=head1 AUTHOR + +Copyright (C) 2005 Rodolphe Quiedeville +Copyright (C) 2012 Diego Elio Pettenò + +=head1 LICENSE + +GPLv2 + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=cut + +use strict; +use Munin::Plugin; +use IO::Socket; + +sub readreply { + my $socket = shift; + my $line; + my $return; + + while ( $line = $socket->getline and $line ne "\r\n" ) { + $return .= $line; + } + + return $return; +} + +$0 =~ /asterisk(?:_(.+))$/; +my $hostname = $1; + +my $peeraddr = $ENV{'host'} || $hostname || '127.0.0.1'; +my $peerport = $ENV{'port'} || '5038'; + +my $username = $ENV{'username'}; +my $secret = $ENV{'secret'}; + +my $line, my $error; +my $socket = new IO::Socket::INET(PeerAddr => $peeraddr, + PeerPort => $peerport, + Proto => 'tcp') + or $error = "Could not create socket: $!"; + +if ( $socket ) { + # This will consume the "Asterisk Call Manager" welcome line. + $socket->getline; + + $socket->print("Action: login\nUsername: $username\nSecret: $secret\nEvents: off\n\n"); + my $auth_status = readreply $socket; + + if ( $auth_status !~ /^Response: Success/ ) { + $auth_status =~ s/.*\nMessage: (.*)\r\n/$1/; + $error = "Asterisk authentication error: " . $auth_status; + $socket->close(); + $socket = undef; + } +} + +if ( $ARGV[0] and $ARGV[0] eq 'autoconf' ) { + if ( $error ) { + print "no ($error)\n"; + } else { + print "yes\n"; + } + + exit 0; +} elsif ( $ARGV[0] and $ARGV[0] eq 'config' ) { + print "host_name $hostname" if $hostname; + + print <print("Action: command\nCommand: core show channels\n\n"); +my $shown_channels = readreply $socket; + +my $channels = 'U'; +$channels = $1 if $shown_channels =~ /\n([0-9]+) active channels/; + +print <close();