[Freeswitch-svn] [commit] r5709 - freeswitch/trunk/scripts/contrib/trixter
Freeswitch SVN
trixter at freeswitch.org
Sun Sep 16 13:36:06 EDT 2007
Author: trixter
Date: Sun Sep 16 13:36:06 2007
New Revision: 5709
Added:
freeswitch/trunk/scripts/contrib/trixter/call-progress.pl (contents, props changed)
Log:
perl script using event socket to monitor ring/answer/hangup events and issue commands when it gets them
Added: freeswitch/trunk/scripts/contrib/trixter/call-progress.pl
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/trixter/call-progress.pl Sun Sep 16 13:36:06 2007
@@ -0,0 +1,153 @@
+#!/usr/bin/perl
+# -*- mode:cperl; tab-width:4; c-basic-offset:4; c-indent-level:4; indent-tabs-mode:nil; -*-
+use FreeSWITCH::Client;
+use POSIX ':signal_h'; # used for alarm to ensure we get heartbeats
+use Data::Dumper; # used to print out myhash debug info
+
+
+# configure these
+my $password = "ClueCon"; # the password for event socket
+my $host = "localhost"; # the hostname to connect to
+my $port = 8021; # the port to connect to
+my $timeout = 30; # seconds to expect a heartbeat event or reconnect
+my $conntime = 30; # seconds to wait between connection attempts
+my $CIDNAME = "its me"; # name to use when originating a call
+my $CIDNUM = "1234567890"; # number to use when originating a call
+my $TIMEOUT = 30; # timeout to wait for answer
+
+# array of the regexps for channels that match, useful if you dont want to do this for
+# all calls on your switch
+my @channels = (
+ '^sofia\/mydomain.com\/\d+\@192.168.0.6$',
+ '^sofia/external/888 at conference.freeswitch.org$',
+);
+
+##
+# dont touch these
+##
+my $fs;
+my $lastheartbeat;
+my $lastconnect;
+
+
+sub watchedChannel($) {
+ my $channame = shift;
+
+print "Checking $channame\n";
+
+
+ foreach $regexp (@channels) {
+ if($channame =~ /$regexp/) {
+ return 1;
+ }
+ }
+ return undef;
+}
+
+
+sub do_ring($) {
+ my $myhash = shift;
+
+ print "Got RING for $myhash->{'channel-name'} - $myhash->{'unique-id'}\n";
+
+ # here we are going to just hang it up since its just a silly example
+ # but for variety lets wait 2 seconds before it dies
+ $fs->sendmsg({'command' => "api sched_hangup +2 $myhash->{'unique-id'}"});
+}
+
+
+sub do_answer($) {
+ my $myhash = shift;
+
+ print "Got ANSWER for $myhash->{'channel-name'}\n";
+
+ # here we are going to just hang it up since its just a silly example
+ $fs->sendmsg({'command' => "api killchan $myhash->{'unique-id'}"});
+}
+
+
+
+sub do_hangup($) {
+ my $myhash = shift;
+
+ print "Got HANGUP for $myhash->{'channel-name'} $myhash->{'unique-id'}\n";
+
+ # hey it was a hangup, lets call someone now!
+ $cmd = "api originate sofia/mydomain.com/123\@192.168.0.6 &playback(/sounds/conf-enter.raw) XML default \"$CIDNAME\" \"$CIDNUM\"";
+ $fs->sendmsg({'command' => $cmd});
+}
+
+
+
+# this connects to the event socket
+sub es_connect() {
+ if(! defined $lastconnect) {
+ $lastconnect = time - $conntime;
+ }
+
+ if($lastconnect <= (time - $conntime)) {
+ $lastconnect = time;
+ print "Connecting to $host:$port\n";
+ eval {
+ $fs = init FreeSWITCH::Client {-password => $password, -host => $host, -port => $port};
+ if(defined $fs) {
+ $fs->sendmsg({'command' => 'event plain CHANNEL_STATE CHANNEL_ANSWER heartbeat CHANNEL_HANGUP all'});
+ $lastheartbeat = time;
+ }
+ } or do {
+ print "Error connecting - waiting for retry\n";
+ }
+ }
+
+ }
+
+
+sigaction SIGALRM, new POSIX::SigAction sub {
+ if ($lastheartbeat < (time - $timeout)) {
+ print "Did not receive a heartbeat in the specified timeout\n";
+ if (defined $fs) {
+ $fs->disconnect();
+ undef $fs;
+ }
+ es_connect();
+ }
+
+ # reset the alarm
+ alarm $timeout;
+} or die "Error setting SIGALRM handler: $!\n";
+
+
+
+es_connect();
+alarm $timeout;
+
+while (1) {
+ if(defined $fs) {
+ my $reply = $fs->readhash(undef);
+ if ($reply->{socketerror}) {
+ es_connect();
+ }
+
+ if ($reply->{body}) {
+ $myhash = $reply->{event};
+
+ if ($myhash->{'event-name'} eq "HEARTBEAT") { ## Deal with heartbeats
+ $lastheartbeat = time;
+ print "Got a heartbeat\n";
+
+ } elsif (watchedChannel($myhash->{'channel-name'})) {
+ if ($myhash->{'event-name'} eq "CHANNEL_ANSWER") { ## deal with answers
+ do_answer($myhash);
+ } elsif ($myhash->{'event-name'} eq "CHANNEL_STATE" && $myhash->{'channel-state'} eq "CS_RING") {
+ do_ring($myhash);
+ } elsif ($myhash->{'event-name'} eq "CHANNEL_HANGUP") { ## last thing done on a channel
+ do_hangup($myhash);
+ } else { ## Unknown event
+ print Dumper $myhash;
+ # print "$reply->{body}\n"; # print out what was sent, myhash is translated by Client.pm
+ }
+ } # end channel-name filter
+ }
+ }
+}
+
More information about the Freeswitch-svn
mailing list