Знакомый попросил настроить Asterisk без вебок.
Результат в конфигах под катом (конфиги ориентированы на Украину).
extensions.ael
context local { _1[1-3]XX => { Dial(SIP/${EXTEN},20,Tt); }; _NXXXXXX => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _0NXXXXXXXX => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _10[1-4] => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _911 => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _15XX => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _00. => { Set(CALLERID(all)=DEFAULT_TRUNK); Dial(SIP/${EXTEN}@DEFAULT_TRUNK,20,TtwW); }; _88. => { AGI(out_dial.php); }; }; context from-trunk { _X. => { Answer(); Set(CALLERID(name)=${EXTEN}|${CALLERID(num)}); Dial(SIP/1111,20,Tt); HangUp(); }; };
1[1-3]XX — внутренние номера (например: 1311)
DEFAULT_TRUNK — имя транка по умолчанию. Через него будут уходить звонки если не набран специальный код
_88. — специальный код для выхода через определенную линию
AGI(out_dial.php); — скрипт-обработчик исходящего вызова
————————
out_dial.php
#!/usr/bin/php -q <?php set_time_limit(0); require('/var/lib/asterisk/agi-bin/phpagi.php'); require('/var/lib/asterisk/agi-bin/linelist.php'); $agi = new AGI(); $agi->noop('test'); $_onum = $agi->request['agi_dnid']; $_lnum = substr($_onum, 2, 2); $_did = substr($_onum, 4); $agi->noop($_lnum."|||".$lines[$_lnum]."|||".$_did); $lineid = "SIP/".$lines[$_lnum]; $agi->set_callerid($lines[$_lnum]); $agi->exec_dial($lineid, $_did, "20,Tt"); ?>
linelist.php — файл со списком исходящих линий
Т.к. исходящих линий было достаточно много, для их идентификации использовался двухзначный код (передавался в $_lnum).
————————
linelist.php
<?php $lines = array( '01' => 'DEFAULT_TRUNK', '02' => 'ANOTHER_TRUNK', ); ?>
————————
Итого получаем следующее:
- при звонке на любую из входящий линий меняется CALLERID(name) к виду <имя линии>|<номер звонящего>
- при наборе номера 8802585XXXX, мы произведем звонок с нашей второй линии
P.S.
К слову произвел следующую конфигурацию на серваке:
[general] context=default
Т.к. сервак смотрел голой жопой в мир, все пытающиеся ломать телефонию попадали в черную дыру. Это вызывало ошибку в логе Asterisk’а. Натравленный на лог fail2ban отлично банил злоумышленников.