Asterisk-AMI
view release on metacpan or search on metacpan
examples/cmd_server.pl view on Meta::CPAN
#!/usr/bin/perl
#Author: Ryan Bullock
#Version: 0.2
#Description: This provided a very simple command server for the asterisk manager interface.
use strict;
use warnings;
use AnyEvent::Impl::Perl;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;
use Asterisk::AMI;
#Port to listen on
my $port = 5080;
#Delimiters
my $EOL = "\015\012";
my $EOR = $EOL;
#Command list;
my $list = 'Command List:' . $EOL;
$list .= 'channels - Displays list of active channels' . $EOL;
$list .= 'mailbox <mailbox> - Displays messages for a mailbox' . $EOL;
$list .= 'hangup <channel> - Hangs up a channel' . $EOL;
$list .= 'quit - Disconnects from server' . $EOL;
$list .= 'list - Displays this list' . $EOL . $EOR;
#Keep a list of clients
my %clients;
#Connect to asterisk
my $astman = Asterisk::AMI->new(PeerAddr => '127.0.0.1',
Username => 'test',
Secret => 'supersecret',
Timeout => 3, #Default timeout for all operations, 3 seconds
Keepalive => 60, #Send a keepalive every minute
on_error => sub { print "Error occured on socket\r\n"; exit; },
on_timeout => sub { print "Connection to asterisk timed out\r\n"; exit; },
Blocking => 0
);
die "Unable to connect to asterisk" unless ($astman);
#Callback on mailbox command
sub mailboxcb {
my ($asterisk, $action, $client) = @_;
my $id = $action->{'ActionID'};
my $mbstr;
if ($action->{'GOOD'} && exists $action->{'PARSED'}) {
while (my ($key, $value) = each %{$action->{'PARSED'}}) {
$mbstr .= $key . ': '. $value . $EOL;
}
} else {
$mbstr = 'Invalid Mailbox, or command failed' . $EOL;
}
$client->push_write($mbstr . $EOR);
}
#Callback on channels command
sub chancb {
my ($asterisk, $action, $client) = @_;
my $id = $action->{'ActionID'};
my $chanstr;
if ($action->{'GOOD'} && exists $action->{'EVENTS'}) {
foreach my $channel (@{$action->{'EVENTS'}}) {
$chanstr .= $channel->{'Channel'} . $EOL;
}
} else {
$chanstr = 'No channels active' . $EOL;
}
$client->push_write($chanstr . $EOR);
}
#Callback on hangup command
sub hangupcb {
my ($asterisk, $action, $client) = @_;
my $id = $action->{'ActionID'};
my $str;
if ($action->{'GOOD'}) {
$str = 'Channel hungup';
} else {
$str = 'Failed to hangup channel';
}
( run in 2.462 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )