<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Matt,<br>
<br>
I think we agree on the goals:<br>
<ul>
  <li>To minimize the number of threads and sockets on the machine
running Asterisk to maximize the performance of the machine running
Asterisk</li>
  <li>To minimize the changes to Asterisk, but maximize the flexibility
of Asterisk</li>
  <li>To minimize the number of open Manager API connections</li>
</ul>
My proposal (and the code that I have already developed) allows the
posting of AGI commands from the Manager API to a given channel and
sending the response code for the commands from res_agi.c to the
Manager.&nbsp; The code simply pipes AGI commands from a source other than a
pipe that's dedicated to a single AGI session.<br>
<br>
Put another way, AGI is a lot like early CGI on web servers.&nbsp; Over
time, systems like mod_perl, etc. were developed to reduce load on
systems.&nbsp; What the merger between Manager API and AGI does is allows a
single manager connection to manage the execution of applications on an
arbitrary number of channels.<br>
<br>
mattf wrote:<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">When you say 100 concurrent channels do you mean 50 SIP phones connected to
50 Zap channels or 100 SIP phones in conversations with 100 other end
points?
  </pre>
</blockquote>
The initial system that we're building primarily performs IVR.&nbsp; All of
the channels will be terminated SIP calls.<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">
Have you done any load testing ? What kind of system configuration are you
planning on?
  </pre>
</blockquote>
Each of the Asterisk servers will be P4 3.x Ghz systems running Intel's
875 chipset.<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">
How exactly would you go about "creating" a calling card AGI through the
manager?
  </pre>
</blockquote>
Sending (or piping) the AGI commands through the Manager API so that
they are posted to a Channel.&nbsp; The exec_agi() routine in res_agi.c
dequeues the AGI command from the channel rather than reading it from a
file descriptor.&nbsp; Once the command is read or dequeue, it's executed
and the results are sent back to the fd or sent as a manager_event.<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">
What's wrong with just using AGI scripts?

  </pre>
</blockquote>
Please see my original posting.&nbsp; With AGI scripts, there's a seperate
process created for each AGI that's executed.&nbsp; Hooking the AGI process
to my central J2EE server means 2 open sockets for each running AGI.&nbsp;
Monitoring 100 channels on 25 machines means 2,500 open sockets to my
J2EE server.&nbsp; On the other hand, sending AGI commands via the Manager
API means only 25 open sockets for my J2EE server and only 1 open
connection from the Asterisk instance to my server.<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">A busy Asterisk server with 100 concurrent manager connections will not
work, especially if you want to actually use those manager connecitons for
anything.
  </pre>
</blockquote>
I think you're missing the point.&nbsp; There will only be 1 open manager
instance per Asterisk instance.&nbsp; That single manager instance will
control all the open channels.<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">
Attempting to run interactive programs like AGIs through the manager API
would complicate the managerAPI by adding many new inputs, outputs and
parsing rules to it and would slow it down even more, not to mention the
fact that you are depending on that client socket connection to keep flowing
perfectly in order to run your phone system and I can tell you that the
manager API is not fault tolerant enough to handle that kind of volume,
complexity and data-delivery-assurance with any kind of reliability.

  </pre>
</blockquote>
Nope.&nbsp; Here's the total change to manager.c (okay, there's one other
change where the action_magi function is registered, but that's an
additional line in an array of functions):<br>
<tt>static int action_magi(struct mansession *s, struct message *m)<br>
{<br>
&nbsp; char *command = astman_get_header(m, "Command");<br>
&nbsp; char *channel = astman_get_header(m, "Channel");<br>
&nbsp; char *id = astman_get_header(m, "Uniqueid");<br>
<br>
&nbsp; if (!command || ast_strlen_zero(command)) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "Command not specified");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; if (!channel || ast_strlen_zero(channel)) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "Channel not specified");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; if (!id || ast_strlen_zero(id)) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "UniqueID not specified");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; struct ast_channel *theChan = ast_get_channel_by_name_locked(channel);<br>
<br>
&nbsp; if (!theChan) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "Channel not found");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; // allocate the structure here... it will be<br>
&nbsp; // free'ed if enqueuing fails or if <br>
&nbsp; struct ast_magi *magi = ast_magi_new();<br>
<br>
&nbsp; if (!magi) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "MAGI not allocated -- out of memory");<br>
&nbsp;&nbsp;&nbsp; ast_mutex_unlock(&amp;theChan-&gt;lock);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; // being smart, cmd is 1 char longer than MAX_AGI_CMD_LEN<br>
&nbsp; // so we strncpy, and then set the last char to 0<br>
&nbsp; strncpy(magi-&gt;cmd, command, MAX_AGI_CMD_LEN);<br>
&nbsp; magi-&gt;cmd[MAX_AGI_CMD_LEN] = 0;<br>
<br>
&nbsp; // see above re field lengths<br>
&nbsp; strncpy(magi-&gt;uniqueid, id, MAX_MAGI_UNIQUE_ID);<br>
&nbsp; magi-&gt;uniqueid[MAX_MAGI_UNIQUE_ID] = 0;<br>
<br>
<br>
&nbsp; // if the add fails, this routine cleans up<br>
&nbsp; // the magi<br>
&nbsp; int added = ast_add_magi_to_channel(theChan, magi, 0);<br>
<br>
&nbsp; ast_mutex_unlock(&amp;theChan-&gt;lock);<br>
<br>
&nbsp; if (!added) {<br>
&nbsp;&nbsp;&nbsp; astman_send_error(s, m, "MAGI not added to channel");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp; }<br>
<br>
&nbsp; ast_cli(s-&gt;fd, "Response: Success\r\n"<br>
&nbsp;&nbsp;&nbsp; &nbsp; "Uniqueid: %s\r\n\r\n",<br>
&nbsp;&nbsp;&nbsp; &nbsp; id);<br>
<br>
&nbsp; return 0;<br>
}<br>
</tt><br>
All of the parsing for the commands is done is reg_agi and the commands
are treated <b>exactly</b> like the commands that came in from a
pipe/file descriptor that the current AGI monitors.<br>
<br>
If you can find anything in this code that will reduce the stability of
the Manager or create a bottleneck, please let me know.<br>
<br>
Thanks,<br>
<br>
David<br>
<br>
<blockquote
 cite="midDB43F516702AAF4392AA45573F181819502258@vicimail.vicimarketinggroup.com"
 type="cite">
  <pre wrap="">MATT---


-----Original Message-----
From: David Pollak [<a class="moz-txt-link-freetext" href="mailto:dpp-asterisk@projectsinmotion.com">mailto:dpp-asterisk@projectsinmotion.com</a>]
Sent: Tuesday, August 10, 2004 10:58 PM
To: <a class="moz-txt-link-abbreviated" href="mailto:asterisk-dev@lists.digium.com">asterisk-dev@lists.digium.com</a>
Subject: Re: [Asterisk-Dev] Integration of AGI and Management API



  
My application will initially have 25 Asterisk servers managed by 1
application server.  That number must be scalable to at least 500 Asterisk
servers.

Given the initial 25 servers, with 100 open channels each, that's 2,500
channels to manage.  

 

So, I've been looking over the Asterisk source and I had an idea... what 
if there was a merger of the Manager API and AGI.  Here's specifically 
what I was thinking:
    

It looks like you've already done that above.  You already
started using the AGI and the AMI, so that's where the
merger is.  I could be wrong on this, but the rest of your
message concerns how to put these two things back together.
So you are making a circle, when a straight line would do.
  
I have not found a straight line from the Manager API that allows the
execution of an application on a given channel with all the normal responses
(e.g., waiting for DTMF, etc.)  If you can show me how to do that, I'd
really appreciate it.
  

Yep... I can see originating a call to an application, but I cannot see how
to respond to an existing channel.  For example, how would one create the
Calling Card sample AGI application by originating a call?


To my mind, all AGI scripts represent dynamic dial plans.  I haven't done
the full analysis, but it seems that dial plans themselves are Turing
complete.  However, it's really, really hard to build complex applications
using dial plans.  Thus, AGI script allow for a better language to write
dynamic dial plans.  My changes are simply to allow the AGI commands to be
sent to a channel via the Manager API rather than via a pipe to a separate
process.  In res_agi.c, the next command is recalled from the Channel rather
than by reading from the pipe.  That's the fundimental difference.

  
I don't think that works.  I think the AGI was added to Asterisk because the
ability to control a channel via the Manager API is limitted.  My changes
have simply added a new way in which an AGI script can send commands to a
Channel that's expecting AGI commands.

Thanks,

David
_______________________________________________
Asterisk-Dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Asterisk-Dev@lists.digium.com">Asterisk-Dev@lists.digium.com</a>
<a class="moz-txt-link-freetext" href="http://lists.digium.com/mailman/listinfo/asterisk-dev">http://lists.digium.com/mailman/listinfo/asterisk-dev</a>
To UNSUBSCRIBE or update options visit:
   <a class="moz-txt-link-freetext" href="http://lists.digium.com/mailman/listinfo/asterisk-dev">http://lists.digium.com/mailman/listinfo/asterisk-dev</a>
  </pre>
</blockquote>
</body>
</html>