[svn-commits] kmoore: testsuite/asterisk/trunk r5230 - /asterisk/trunk/lib/python/asterisk/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jul 8 10:52:09 CDT 2014


Author: kmoore
Date: Tue Jul  8 10:52:07 2014
New Revision: 5230

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=5230
Log:
Testsuite: Add FastAGI pluggable module

This adds the FastAGIModule pluggable module to control AGI() in the
dialplan. It can run a list of static commands or it can call into a
python method for a more dynamic AGI script.

Modified:
    asterisk/trunk/lib/python/asterisk/pluggable_modules.py

Modified: asterisk/trunk/lib/python/asterisk/pluggable_modules.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/pluggable_modules.py?view=diff&rev=5230&r1=5229&r2=5230
==============================================================================
--- asterisk/trunk/lib/python/asterisk/pluggable_modules.py (original)
+++ asterisk/trunk/lib/python/asterisk/pluggable_modules.py Tue Jul  8 10:52:07 2014
@@ -15,6 +15,7 @@
 sys.path.append("lib/python")
 from ami import AMIEventInstance
 from twisted.internet import reactor
+from starpy import fastagi
 
 LOGGER = logging.getLogger(__name__)
 
@@ -335,3 +336,69 @@
 
         shutil.move(src_file, dst_file)
         os.utime(dst_file, None)
+
+class FastAGIModule(object):
+    """A class that makes a FastAGI server available to be called via the
+    dialplan and allows simple commands to be executed.
+
+    Configuration is as follows:
+    config-section:
+        host: '127.0.0.1'
+        port: 4573
+        commands:
+            - 'SET VARIABLE "CHANVAR1" "CHANVAL1"'
+
+    Instead of commands, a callback may be specified to interact with Asterisk:
+        callback:
+            module: fast_agi_callback_module
+            method: fast_agi_callback_method
+    """
+
+    def __init__(self, instance_config, test_object):
+        """Constructor for pluggable modules"""
+        super(FastAGIModule, self).__init__()
+        self.test_object = test_object
+        self.port = instance_config.get('port', 4573)
+        self.host = instance_config.get('host', '127.0.0.1')
+        self.commands = instance_config.get('commands')
+	if 'callback' in instance_config:
+            self.callback_module = instance_config['callback']['module']
+            self.callback_method = instance_config['callback']['method']
+        fastagi_factory = fastagi.FastAGIFactory(self.fastagi_connect)
+        reactor.listenTCP(self.port, fastagi_factory,
+            test_object.reactor_timeout, self.host)
+
+    def fastagi_connect(self, agi):
+        """Handle incoming connections"""
+	if self.commands:
+            return self.execute_command(agi, 0)
+        else:
+            callback_module = __import__(self.callback_module)
+            method = getattr(callback_module, self.callback_method)
+            method(self.test_object, agi)
+
+    def on_command_failure(self, reason, agi, idx):
+        """Failure handler for executing commands"""
+        LOGGER.error('Could not execute command %s: %s' %
+                     (idx, self.commands[idx]))
+        LOGGER.error(reason.getTraceback())
+        agi.finish()
+
+    def on_command_success(self, result, agi, idx):
+        """Handler for executing commands"""
+        LOGGER.debug("Successfully executed '%s': %s" %
+                     (self.commands[idx],
+                      result))
+        self.execute_command(agi, idx + 1)
+
+    def execute_command(self, agi, idx):
+        """Execute the requested command"""
+        if len(self.commands) <= idx:
+            LOGGER.debug("Completed all commands for %s:%s" % (self.host,
+                         self.port))
+            agi.finish()
+            return
+
+        agi.sendCommand(self.commands[idx]
+        ).addCallback(self.on_command_success, agi, idx
+        ).addErrback(self.on_command_failure, agi, idx)




More information about the svn-commits mailing list