Asterisk для небольшого офиса и много Sip-транков

2015-01-30

Знакомый попросил настроить 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 отлично банил злоумышленников.

 

*nixТелефонияaelagiasteriskcalleridcallerid(name)callerid(num)phpagi.php

155 нужных фраз для разговора на английском

Визуализация работы join’ов