#!/usr/local/bin/php s,1,AGI(callback.php) exten => s,n,Goto(s,${aon-ret}) exten => s,n(aon-passed),Playback(vo-wait-for-callback) exten => s,n,Hangup() exten => s,400(aon-failed),Playback(vo-dosvidaniya) exten => s,n,Hangup() #include "extensions_callback.conf" Для работы скрипта необходимо: 1. переименовать callback.php.txt в callback.php 2. установить CLI версию PHP, если она не установлена 3. выполнить chmod a+x callback.php 4. переместить callback.php в папку /usr/local/share/asterisk/agi-bin =================================================================================== Put script into dir /usr/local/share/asterisk/agi-bin and use it in extentions.conf Don`t forget to do: 1. rename callback.php.txt to callback.php 2. install PHP CLI version if not installed 3. do chmod a+x callback.php 4. move callback.php to folder /usr/local/share/asterisk/agi-bin */ ///////////////// Определяем переменные / Set vars ///////////////// $stdin = fopen('php://stdin', 'r'); $stdout = fopen('php://stdout', 'w'); $outdir="/var/spool/asterisk/outgoing"; $log_file="/usr/local/share/asterisk/agi-bin/sms-callback.log"; $exten_file="/usr/local/etc/asterisk/extensions_callback.conf"; $aon_out="9998877"; ///////////////// Возврат по дефолту / Default return //////////////// $aon_pass=0; $auth_cmd="SET VARIABLE aon-ret aon-failed"; //Разрешенные номера $permit_num[]="89105647899"; $permit_num[]="89192236987"; ///////////////// Вкоючаем/отключаем дебаг / Enable Disable debug //////// $debug=1; //////////////////////////////////////////////// ///////////////// Получаем данные от Asterisk / Get vars from Asterisk /////////// while (!feof($stdin)) { $temp = fgets($stdin); $temp = str_replace("\n","",$temp); $s = explode(":",$temp); $agivar[$s[0]] = trim($s[1]); if (($temp == "") || ($temp == "\n")) { break; } } ///////////////////////////////////////////////// $log = fopen($log_file,'a'); if ($debug){ logg(sprintf("\nCaller: %s",$agivar['agi_callerid'])); logg("AGI ARGV Dump:"); foreach ($argv as $k=>$v) { logg(" -- $k = $v"); } logg("AGI Environment Dump:"); foreach ($agivar as $k=>$v) { logg(" -- $k = $v"); } } if (is_array($permit_num)){ foreach ($permit_num as $num){ if ($num==$agivar['agi_callerid']){ $permit=1; break; } } }else{ logg("[ERROR] \$permit_num isn`t array, fix the problem"); } if ($permit){ //Делаем exten`шены под разрешенные номера / Make extentions for callback $callback_ext="; !!! WARNING !!!\n; THIS IS AUTOMATIC GENERATED FILE\n; DO NOT EDIT !!!\n\n"; foreach ($permit_num as $num){ $callback_ext.=sprintf("[callback_to_%s] exten => s,1,Set(CallbackNumTries=0) exten => s,n(vo-hi),Background(vo-hi) exten => s,n,WaitExten(10) exten => _0X,1,Dial(SIP/\${EXTEN}@sip-provider) exten => _XXXXXXX,1,Dial(SIP/\${EXTEN}@sip-provider) exten => _8X.,1,Dial(SIP/\${EXTEN}@sip-provider) exten => i,1,Set(Callback_%s_NumTries=\$[\${Callback_%s_NumTries} + 1]) exten => i,n,Playback(vo-nomer-nabran-ne-verno) exten => i,n,GotoIf(\$[\"\${Callback_%s_NumTries}\" < \"3\"]?s|vo-hi) exten => i,n,Playback(vo-dosvidaniya) exten => i,n,Hangup() exten => t,1,Set(Callback_%s_NumTries=\$[\${Callback_%s_NumTries} + 1]) exten => t,n,GotoIf(\$[\"\${Callback_%s_NumTries}\" < \"3\"]?s|vo-hi) exten => t,n,Playback(vo-dosvidaniya) exten => t,n,Hangup()\n\n",$num,$num,$num,$num,$num,$num,$num); } if (strlen($callback_ext)>70){ $wr_conf=@fopen($exten_file,"w"); if (@fwrite($wr_conf,$callback_ext) === FALSE) { logg("[ERROR] Can`t write callback extentions file [$exten_file]!"); }else{ $aterisk_reload=`/usr/local/sbin/asterisk -r -x 'dialplan reload'`; system($aterisk_reload); } fclose($wr_conf); } $err=$cmd=""; $grep=sprintf("/bin/ls -la %s | grep %s | /usr/bin/wc -l",$outdir,$agivar['agi_callerid']); if ($debug){logg($grep);} $grep_res=`$grep`; if (preg_match("/(\d{1,2})/",$grep_res,$gtmp)){ if ($debug){logg("Number current call files: $gtmp[1]");} if ($gtmp[1]==0){ $callback_conf=sprintf("Channel: SIP/%s@sip-provider Callerid: %s MaxRetries: 2 RetryTime: 20 WaitTime: 120 Context: callback_to_%s Extension: s Priority: 1\n ",$agivar['agi_callerid'],$aon_out,$agivar['agi_callerid']); $cfile=sprintf("callback_%s_%s.call",$agivar['agi_callerid'],date("d.m.Y_H-i-s",time())); $wr_conf=@fopen(sprintf("/tmp/%s",$cfile),"w"); if (@fwrite($wr_conf,$callback_conf) === FALSE) { $err="[ERROR] Can`t write to callback tmp !"; } @fclose($wr_conf); //Меняем дату создания файла на на 5 сек. в будущем / Set file create date in future $cmd=sprintf("/usr/bin/touch -t %s /tmp/%s",date("ymdHi.s",time()+5),$cfile); `$cmd`; if ($err){ logg($err); }else{ $cmd=sprintf("/bin/mv /tmp/%s %s/%s",$cfile,$outdir,$cfile); system($cmd); $auth_cmd="SET VARIABLE aon-ret aon-passed"; if ($debug){logg("DONE");} } } } }else{ if ($debug){logg(sprintf("%s is forbidden for callback...",$agivar['agi_callerid']));} } send_cmd($auth_cmd); fclose($log); function send_cmd($cmd){ global $stdin,$debug; if ($debug){logg("[Sended] =>$cmd<=\n");} fputs(STDOUT,($cmd."\n")); fflush(STDOUT); usleep(500000); $res = str_replace("\n","",fgets($stdin)); if (preg_match("/^200/",$res)) { preg_match("/result=(-?\d+)/",$res,$tmp); if (!strlen($tmp[1])) { logg("[ERROR] FAIL while sending CMD ($cmd) back to asterisk ($res)\n"); }else{ if ($debug){logg("PASS ($tmp[1])\n");} return $tmp[1]; } }else{ logg("[ERROR] FAIL while sending CMD ($cmd) back to asterisk (unexpexted result '$res')\n"); } return false; } function logg($res){ global $log; if (is_resource($log)){ fputs($log, sprintf("%s %s\n",date("d.m.Y H:i:s",time()),$res)); } } ?>