Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/local/bin/php
- <?
- /*
- File/Файл: callback.php
- Autor/Автор: Nikolaev Dmitry/Николаев Дмитрий
- Site/Сайт: Subnets.ru
- URL/Статья: http://subnets.ru/blog/?p=1444
- Version/Версия: 0.2
- Date/Дата: 11.02.2011
- Скрипт располагается в /usr/local/share/asterisk/agi-bin и используется в extentions.conf, пример:
- [callback]
- exten => 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));
- }
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement