[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