#!/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 }