If you listen to events then you should be able to reliably receive a hangup event containing the variables <i>if you are still connected at that time</i>.<div><br></div><div>If you want a 100% reliable method use CDRs.</div>

<div><br></div><div>mod_xml_cdr can submit call CDRs to a webserver just after call hangup. The XML is verbose and will contain a full call history and all channel variables. Because it&#39;s submitted ASAP you get the results in real time and reliable. If the module can&#39;t submit the CDRs it writes them to an error folder on disk where you can resubmit them.</div>

<div><br></div><div>Real time seems useful for your use-case, as your script would just need to check your DB whether the CDR had been submitted yet. The channel UUID can either be captured from events or specified in advance in the originate (originate_uuid). There&#39;s a uuid api call to generate them for you. I&#39;d suggest looking at this method.</div>

<div class="gmail_extra"><br><br><div class="gmail_quote">On 28 November 2012 10:54, Richard Gration <span dir="ltr">&lt;<a href="mailto:richgration@gmail.com" target="_blank">richgration@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
I&#39;m trying to write something to fit into a two factor auth mechanism.<br>
I have a CGI script which is called with a phone number and a PIN as<br>
parameters. In the script I use the event socket api to place a call.<br>
The PHP code I&#39;m using to write to the socket is straight out of the<br>
FS docs (can&#39;t remember exactly, I think I got it from the wiki). This<br>
is my api command:<br>
<br>
api originate {originate_timeout=30}sofia/external/${dExt}@MGC<br>
&#39;&amp;play_and_get_digits(4 4 2 30000 # torvalds-says-linux.wav<br>
torvalds-says-linux.wav foo \d+)&#39;<br>
<br>
This all works fine, up to a point. The call is made, the wav is<br>
played. But then PAGD is supposed to put the digits into a channel<br>
var, in this case &quot;foo&quot;. But I&#39;ve been having trouble getting the<br>
value of this channel var *reliably*. If the # key is used to<br>
terminate the input, then I can get the channel var value with<br>
<br>
api uuid_getvar $uuid foo<br>
<br>
However, if the input is terminated by PAGD because 4 digits have been<br>
entered, then the call is hung up (by FS/PAGD) before I have a chance<br>
to get the value of the channel var. Can anyone help here please? I<br>
suppose I can work around this by increasing the digits to 5 and<br>
telling people to use # to terminate the input, but I&#39;d like to<br>
understand the correct way to use PAGD if possible.<br>
<br>
If you think I&#39;m going about this the wrong way entirely, then please<br>
suggest an alternative :-)<br>
<br>
My code is below. As I say, lines 1-71 are straight out of the docs.<br>
<br>
  1 &lt;?php<br>
  2<br>
  3  $password = &quot;xxxxxx&quot;;<br>
  4  $port = &quot;xxxx&quot;;<br>
  5  $host = &quot;127.0.0.1&quot;;<br>
  6<br>
  7  function event_socket_create($host, $port, $password) {<br>
  8       $fp = fsockopen($host, $port, $errno, $errdesc)<br>
  9          or die(&quot;Connection to $host failed&quot;);<br>
 10       socket_set_blocking($fp,false);<br>
 11<br>
 12       if ($fp) {<br>
 13             while (!feof($fp)) {<br>
 14                 $buffer = fgets($fp, 1024);<br>
 15                 usleep(100); //allow time for reponse<br>
 16                 if (trim($buffer) == &quot;Content-Type: auth/request&quot;) {<br>
 17                     fputs($fp, &quot;auth $password\n\n&quot;);<br>
 18                     break;<br>
 19                 }<br>
 20             }<br>
 21             return $fp;<br>
 22       }<br>
 23       else {<br>
 24             return false;<br>
 25       }<br>
 26  }<br>
 27<br>
 28  function event_socket_request($fp, $cmd) {<br>
 29<br>
 30       if ($fp) {<br>
 31             fputs($fp, $cmd.&quot;\n\n&quot;);<br>
 32             usleep(200); //allow time for reponse<br>
 33<br>
 34             $response = &quot;&quot;;<br>
 35             $i = 0;<br>
 36             $contentlength = 0;<br>
 37             while (!feof($fp)) {<br>
 38                 $buffer = fgets($fp, 4096);<br>
 39                 if ($contentlength &gt; 0) {<br>
 40                     $response .= $buffer;<br>
 41                 }<br>
 42<br>
 43                 if ($contentlength == 0) { //if contentlenght is<br>
already don&#39;t process again<br>
 44                      if (strlen(trim($buffer)) &gt; 0) { //run only<br>
if buffer has content<br>
 45                           $temparray = split(&quot;:&quot;, trim($buffer));<br>
 46                           if ($temparray[0] == &quot;Content-Length&quot;) {<br>
 47                               $contentlength = trim($temparray[1]);<br>
 48                           }<br>
 49                      }<br>
 50                 }<br>
 51<br>
 52                 usleep(200); //allow time for reponse<br>
 53<br>
 54                 //optional because of script timeout //don&#39;t let<br>
while loop become endless<br>
 55                 if ($i &gt; 90000) { break; }<br>
 56<br>
 57                 if ($contentlength &gt; 0) { //is contentlength set<br>
 58                      //stop reading if all content has been read.<br>
 59                      if (strlen($response) &gt;= $contentlength) {<br>
 60                          break;<br>
 61                      }<br>
 62                 }<br>
 63                 $i++;<br>
 64             }<br>
 65<br>
 66             return $response;<br>
 67       }<br>
 68       else {<br>
 69          echo &quot;no handle&quot;;<br>
 70       }<br>
 71  }<br>
 72<br>
 73  function strip_cr($str) {<br>
 74     return preg_replace(&quot;/\n/&quot;,&#39;&#39;,$str);<br>
 75  }<br>
 76<br>
 77  $dExt = $_GET[&#39;dExt&#39;];<br>
 78  if ($dExt) {<br>
 79     $fp = event_socket_create($host, $port, $password);<br>
 80<br>
 81     # Place call and find uuid<br>
 82     $cmd = &quot;api originate<br>
{originate_timeout=30}sofia/external/677${<a href="mailto:dExt%7D@194.145.191.131">dExt}@194.145.191.131</a><br>
&#39;&amp;play_and_get_digits(4 4 2 30000 # torvalds-says-linux.wav<br>
torvalds-says-linux.wav foo \d+)&#39;&quot;;<br>
 83     $response = event_socket_request($fp, $cmd);<br>
 84     $response = preg_replace(&#39;/&lt;/&#39;,&#39;&amp;lt;&#39;,$response);<br>
 85     $response = preg_replace(&#39;/&gt;/&#39;,&#39;&amp;gt;&#39;,$response);<br>
 86     $response = strip_cr($response);<br>
 87     $bits = preg_split(&#39;/\s+/&#39;,$response);<br>
 88     $uuid = $bits[1];<br>
 89<br>
 90     echo &#39;&lt;pre&gt;&#39;;<br>
 91     echo date(&#39;H:i:s&#39;) . &quot;\n&quot;;<br>
 92     echo &quot;call placed: $cmd\n&quot;;<br>
 93     echo &quot;response :$response:\n&quot;;<br>
 94     echo &quot;uuid $uuid\n&quot;;<br>
 95<br>
 96     # Retrieve channel variable<br>
 97     $cmd = &quot;api uuid_getvar $uuid foo&quot;;<br>
 98     $response = &#39;&#39;;<br>
 99     while (! $response or $response == &#39;_undef_&#39;) {<br>
100         echo &quot;in loop : got _undef_\n&quot;;<br>
101         $response = event_socket_request($fp, $cmd);<br>
102         $response = strip_cr($response);<br>
103     }<br>
104     echo &quot;response :$response:\n&quot;;<br>
105     echo &#39;&lt;/pre&gt;&#39;;<br>
106<br>
107     # Close socket<br>
108     fclose($fp);<br>
109  } else {<br>
110     echo &#39;Request URL in this format: /test.php?dExt=&lt;phone_number&gt;&#39; . &quot;\n&quot;;<br>
111  }<br>
112<br>
113  ?&gt;<br>
<br>
<br>
Cheers,<br>
Rich<br>
<br>
--<br>
Once our basic material needs are met - in my utopia, anyway - life<br>
becomes a perpetual celebration in which everyone has a talent to<br>
contribute. But we cannot levitate ourselves into that blessed<br>
condition by wishing it. We need to brace ourselves for a struggle<br>
against terrifying obstacles, both of our own making and imposed by<br>
the natural world. And the first step is to recover from the delusion<br>
that is positive thinking.<br>
       -- Barbara Ehrenreich<br>
<br>
_________________________________________________________________________<br>
Professional FreeSWITCH Consulting Services:<br>
<a href="mailto:consulting@freeswitch.org">consulting@freeswitch.org</a><br>
<a href="http://www.freeswitchsolutions.com" target="_blank">http://www.freeswitchsolutions.com</a><br>
<br>
FreeSWITCH-powered IP PBX: The CudaTel Communication Server<br>
<a href="http://www.cudatel.com" target="_blank">http://www.cudatel.com</a><br>
<br>
Official FreeSWITCH Sites<br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<a href="http://wiki.freeswitch.org" target="_blank">http://wiki.freeswitch.org</a><br>
<a href="http://www.cluecon.com" target="_blank">http://www.cluecon.com</a><br>
<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
</blockquote></div><br></div>