Как стать автором
Обновить

Комментарии 27

Вообще, по идее, это дыра, как и трансфер с городского (сотового) на городской (сотовый). По идее можно позвонить в Мозамбик, если знать куда звонить (ладно тут набираются 4 цифры). Лучший и удобный вариант — впн до работы, а там софт сипфон.
думаю ВПН не лучший и не удобный для обычного человека. И не у каждого смарт с которого можно ВПН поднять.
Можно выставить ПИНКОД и этого хватит с головой. А можно ещё ограничить на какие номера делать callback вызов. Статья то не о том как закрыть станцию, а как использовать её возможности.
Это не дыра. Точнее если подходить с таким взглядом на АТС но это вообще одна сплошная дыра- но все решаемо: ставьте пинкоды, 2-х, 3-х, N-факторные аутентификации. Закрывайте все что можно сертификатами и криптостойкими паролями и все будет хорошо. Суть статьи как правильно заметили — показать возможности АТС. Если учитывать все мелочи в статье, то она получится очень большая и основной смысл затеряется за мелочами.
из старых запасов:
[call-back-mont]
exten => s,1,noop(trying to record call-back)
exten => s,2,DeadAGI,call-back-mont.php
;exten => s,2,AGI,call-back-mont.php
exten => s,3,Hangup()


call-back-mont.php:
require 'phpagi.php';

$agi = new AGI();

$agi->verbose("######### welcome to call-back-mont... #########");
$caller_id = $agi->request['agi_callerid'];
$agi->verbose("######### Call ID: ".$caller_id." #########");
if(is_numeric($caller_id))
{
    $caller_id = '8'.$caller_id;
    $agi->verbose("######### CALL #########");
    $p = popen("/usr/bin/php /var/lib/asterisk/agi-bin/call-back.php $caller_id >> ./call-back.log &", 'r');
    $agi->verbose("######### '.$p.' #########");
    //sleep(1);
    pclose($p);
}else
{
    $agi->verbose("######### NOT NUMERIC #########");
}

$agi->hangup();


call-back.php
require_once("phpagi-asmanager.php");

sleep(15);


$f = fopen("/var/lib/asterisk/agi-bin/call-back.log","a");

$date = date("Y-m-d H:i:s");
$log =  "\n".$date.' '.$argv[1];
fwrite($f,$log);

$asm = new AGI_AsteriskManager();
$asm->connect('localhost', '***', '***');

$call = $asm->send_request('Originate',
    array('Channel'=>"SIP/***/".$argv[1],
        'Context'=>'inbound-1',
        'Priority'=>'1',
        'Exten'=>'****',
        'Callerid'=>'****',
        'Timeout' => '30000',
        'Async'=>true));

$asm->disconnect();

fclose($f);

ну а дальше только ваша фантазия.
AGI тяжелая штука для сервисов и вообще ИМХО зло. Стараюсь ее избегать. Пока что получается в 99,9% случаев. Только однажды пришлось делать свою реализацию очереди- использовали ARI- гораздо круче.
REST легче AGI?
а вообще, скрипт который я привел работает на всех версиях астериска, начиная от 1.4. Скрипту больше 6ти лет.
и в agi общение происходит через stdio
при использовании не PHP можно сделать свое ядро с «ручками» и дергать его по agi.
Причем AGI позволяет выполнять скрипт при уже мертвом канале.
При некоторой сноровке в скрипт (на любом языке) помещаются все необходимые проверки. AGI позволяет сделать доп функционал астериску без перегрузки диалплана. Например: Автозвонилка с автоинформатором по sql базе. Не буду объяснять почему работу sql в астериске лучше выносить за диалплан.
При мертвом канале можно выполнять и из диалплана. STDOUT реализуется на той же системе, что и АТС, а REST (ну или на крайний случай fastAgi) можно вынести с сервера. Ну до кучи у REST возможностей побольше будет. Все таки это приятное сочетание AGI + AMI. Особенно все это замечательно работает если дело касается распределенных систем.

По диалплану- быстрее всего все работает на lua. прибавим сюда производительность самого языка + расширение функциями С(++) + работу с sql + работу диалплана без предварительного парсинга со стороны АТС: получается все очень быстро.

Ну в общем и целом — ни одного плюса я в AGI интерфейсе не увидел пока что.
плюс agi в том, что он есть в любом астериске, начиная с версии 1.2
ARI появился этим летом (точной информации не нашел)
Ну лично для меня это плюсом не является. Я не использую старые версии в реализации своих проектов и на поддержку не свои продукты не беру. Ну это как бы не в упрек, просто личные предпочтения.
exten => callback,1,Read(NUM,input-number,4,n,1,5)

5 это вроде тайм-аут? Имхо побольше надо, а то пока на мобильный дозвонится…
Извиняюсь, не внимательно прочел

Есть ли возможность вызвать Read только если на том конце трубку сняли?
На том конце это на каком конце?) Когда отрабатывает call файл — сначала происходит звонок- берут трубку (cсоздается канал) и только потом запускается read
Когда астериск перезванивает на мобильный — берешь трубку и слышишь обрывок фразы, т.е. Read запускается еще до снятия трубки
Поставьте Answer() и потом wait(1) Перед read
прям Америку автор открыл… чесслово
Нормальные компании уже давно используют конвергентные решения на базе FMC — на мобиле внутренний безроуминговый номер, с которого можно напрямую звонить через офисный транк. Мы своим клиентам уже давно предлагаем такое решение — удобно, просто, никаких доп настроек.
Данное решение не обязательно привязывать к мобильным номерам. Можно же шире мыслить.
Ваше решение является как раз частным случаем расширенных возможностей использования API для организации callback'ов. Изначально постановка вопроса была: «Встречается ситуация когда сотрудники находясь в командировках звонят с сотовых по межгороду в головной офис».
Изначально проблематика ставилась как
да кучу ситуаций можно придумать общая проблема которых — обратный звонок

Не стоит вырывать из контекста.
FMC какого оператора пользуете? Как в целом работает, реквестирую отзыв. =)
У нас МТС и половина функций FMC просто не работает. Обещают уже год запустить услугу «Виртуальную АТС» (якобы там всё будет), но что-то тянут.
habrahabr.ru/post/104026/ — «Хитрый CallBack»
Моя статья от 2010 года… Что-нить принципиально новое у Вас есть???
Вашу статью не видел. Действительно дублируется, не хотел такой ситуации. А по поводу чего то нового — посмотрите в моих статьях. Может быть что то будет принципиально новым для Вас.
А вы прикидывали сколько можно заработать, если узнать ваш номер для перезвона и звонить на него ночью в максимальное количество линий с подстановкой номера 8-809 (платного)?
Можно защитить номер различными способами. Они уже обсуждались в комментариях.
А зачем писать такую статью? Напишите лучше как защищать.
Как в том анекдоте: «Как выходить из мертвой петли читайте в следующем номере журнала».
Зачем нужна такая статья? Смотрите, я умею писать скрипты и настраивать простые контексты в астериск?
Да это описано в любой книге по астериску, тут ничего нового, интересного, о чем стоило написать на habrahabr.
Вот специально для вас видимо писал P. S… У всех же есть голова на плечах. Статья написана о логике работы подобного сценария. Существуют шаблоны, которые можно внедрить и изменить получив необходимый результат. Если не все в состоянии это делать- то это уже не ко мне претензии. А за показухой мне гнаться не за чем, сложные с узкой специализацией диалпланы выкладывать смысла не имеет, так как широкого применения они не найдут, а описание отдельных функций действительно описано в литературе, собственно я его и не касался -если вы читали статью. Тут как бы людям помочь — основная цель, просветить что-ли. Естественно найдутся люди, у которых так же была необходимость внедрить что-то подобное, а найдутся и те, кому это будет полезно. Судя по добавлению в избранное статьи — это большинство.
А если я вам позвоню с номера мозамбика или 8-809 — перезвонит и будет держать до посинения?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации