smeserver-zabbix-agent/root/var/lib/zabbix/bin/check_asterisk

211 lines
5.4 KiB
Perl

#!/usr/bin/perl -w
use Asterisk::AMI::Common;
use Getopt::Long;
open STDERR, '>/dev/null';
# Set some default
my $host = '127.0.0.1';
my $port = '5038';
my $user = 'zabbixagent';
my $secret = 'zabbixsecret';
my $what = 'sip_peers';
GetOptions(
"host=s" => \$host,
"port=s" => \$port,
"user=s" => \$user,
"secret=s" => \$secret,
"what=s" => \$what
);
our $ast = Asterisk::AMI::Common->new(
PeerAddr => $host,
PeerPort => $port,
Username => $user,
Secret => $secret
);
die "Unable to connect to asterisk manager" unless ($ast);
sub help{
print<<"EOF";
usage: $0 --host=asterisk.domain.tld --port=5038 --user=manager --secret=azerty --what=sip_peers
--what can take the following argument:
* sip_peers: number of connected sip peers
* max_latency: highest latency of connected sip_peers
* channels: total number of active channels
* internal_calls: number of active internal calls
* outgoing_calls: number of active outgoing calls (external)
* incoming_calls: number of active incoming calls (external)
* external_calls: number of external calls (in + out)
* duration_internal: actual highest duration of internal calls
* duration_external: actual highest duration of external calls
EOF
}
if ($what eq 'sip_peers'){
print get_connected_peers_num('sip');
}
elsif ($what eq 'max_latency'){
print get_max_peer_latency();
}
elsif($what eq 'channels'){
print get_active_channels_num();
}
elsif ($what eq 'internal_calls'){
print get_internal_call_num();
}
elsif ($what eq 'outgoing_calls'){
print get_outgoing_call_num();
}
elsif ($what eq 'incoming_calls'){
print get_incoming_call_num();
}
elsif ($what eq 'external_calls'){
print get_outgoing_call_num() + get_incoming_call_num();
}
elsif ($what eq 'duration_internal'){
print get_max_duration_internal();
}
elsif ($what eq 'duration_external'){
print get_max_duration_external();
}
else{
help();
$ast->disconnect();
exit (1);
}
$ast->disconnect();
exit(0);
# Return the number of connected peers for
# the specified protocol (only SIP supporteed for now)
sub get_connected_peers_num{
my $proto = shift;
my $peers;
if ($proto eq 'sip'){
$peers = get_sip_peers();
}
else{
return 'unsupported protocol';
}
my $num = 0;
foreach my $peer (keys %{$peers}){
my $status = $peers->{$peer}->{'Status'};
$num++ if ($status =~ m/^OK/);
}
return $num;
}
# Return the list of SIP peers (as a hashref)
sub get_sip_peers{
return $ast->sip_peers();
}
# Return the highest latency of all the peers
sub get_max_peer_latency{
my $peers = get_sip_peers();
my $latency = 0;
foreach my $peer (keys %{$peers}){
my $status = $peers->{$peer}->{'Status'};
$status =~ /\((\d+)\sms\)/;
$latency = $1 if ($1 > $latency);
}
return $latency;
}
# Return channels list as a hashref
sub get_channels(){
return $ast->channels();
}
# Return the number of channels
sub get_active_channels_num{
my $channels = get_channels();
my $num = 0;
foreach my $chan (keys %{$channels}){
$num++;
}
return $num;
}
# Return the number of active channels
sub get_up_channels_num{
my $channels = get_channels();
my $num = 0;
foreach my $chan (keys %{$channels}){
my $status = $channels->{$chan}->{'State'};
$num++ if ($status eq 'Up');
}
return $num;
}
# Return the number of outgoing calls
sub get_outgoing_call_num{
my $channels = get_channels();
my $num = 0;
foreach my $chan (keys %{$channels}){
my $context = $channels->{$chan}->{'Context'};
my $status = $channels->{$chan}->{'State'};
$num++ if ($context eq 'macro-dialout-trunk' and $status eq 'Up');
}
return $num;
}
# Return the number of incoming calls
sub get_incoming_call_num{
my $channels = get_channels();
my $num = 0;
foreach my $chan (keys %{$channels}){
my $context = $channels->{$chan}->{'Context'};
my $status = $channels->{$chan}->{'State'};
$num++ if ($context =~ /^from\-(trunk|pstn|zaptel|dahdi)/ and $status eq 'Up');
}
return $num;
}
# Return the number of internal calls
sub get_internal_call_num{
my $channels = get_channels();
my $num = 0;
foreach my $chan (keys %{$channels}){
my $context = $channels->{$chan}->{'Context'};
my $status = $channels->{$chan}->{'State'};
$num++ if (($context eq 'macro-dial' or $context eq 'from-internal') and $status eq 'Up');
}
return $num
}
# Return the max duration of current internal calls
sub get_max_duration_internal{
my $channels = get_channels();
my $max = 0;
foreach my $chan (keys %{$channels}){
my $dur = $channels->{$chan}->{'Seconds'};
my $context = $channels->{$chan}->{'Context'};
$max = $dur if (($context eq 'macro-dial' or $context eq 'from-internal') and $dur > $max);
}
return $max
}
# Return the max duration of current external calls (in or out)
sub get_max_duration_external{
my $channels = get_channels();
my $max = 0;
foreach my $chan (keys %{$channels}){
my $dur = $channels->{$chan}->{'Seconds'};
my $context = $channels->{$chan}->{'Context'};
$max = $dur if (($context eq 'macro-dialout-trunk' or $context =~ /^from\-(trunk|pstn|zaptel|dahdi)/) and $dur > $max);
}
return $max
}