Asterisk+Lua+регулярное обновление DEF кодов

    Снова всех приветствую. После написания прошлой статьи про использование lua в астериске, пришла мысль про небольшое пояснение об использовании DEF-кодов совместно с lua. Ранее тут пролетала статья про генерацию кодов используя скрипт на php. Я этим скриптом успешно пользовался и пользуюсь, но с небольшими (совсем не большими) доработками.


    Приводить листинг самого скрипта не буду, вы можете его прочитать по ссылке:
    habrahabr.ru/post/150793
    тут укажу только сами доработки.

    Первое — нам надо генерировать код на lua и сохранять его по стандартному «библиотечному» пути (/usr/lib/lua/5.1 или для 64бит систем /usr/lib64/lua/5.1). Для этого в выше упомянутом скрипте в самом его начале делаем запись:

    $dp = fopen('/usr/lib/lua/5.1/mphonetable.lua','w');		//lua dialplan
    

    эту строчку я вставил сразу после
    $defs = array();


    Далее, в конце оригинального скрипта, после цикла foreach я добавил следующую запись, которая генерирует код на lua:

    # генерируем шаблоны для правила набора выхода через 9ку
    $linecode = '98';
    
    fwrite($dp,"extensions.mobile_out={\n");
    
    foreach($regs as $op => $reg) {
        foreach($reg as $r) {
    	fwrite($dp,"\t[\"_");
    	echo "\t[\"_";
            echo $linecode.$r.'"]=call_mobile;'."\n";
            $line = $linecode.$r.'"]=call_mobile;'."\n";
            fwrite($dp,$line);
        }
    }
    
    # генерируем шаблоны для правила набора выхода без 9ки
    $linecode = '8';
    
    foreach($regs as $op => $reg) {
        foreach($reg as $r) {
    	fwrite($dp,"\t[\"_");
    	echo "\t[\"_";
            echo $linecode.$r.'"]=call_mobile;'."\n";
            $line = $linecode.$r.'"]=call_mobile;'."\n";
            fwrite($dp,$line);
        }
    }
    fwrite($dp,"\tinclude = {\"out_trunk\"};\n");
    fwrite($dp,"}\n");
    fclose($dp);
    


    call_mobile — это функция которая обрабатывает события выхода на сотовые.

    Второе — нам нужно применить изменения в Астериске:

    #--------------------------------------------------------
    ob_implicit_flush(true);
    set_time_limit(0);
    #Основные настройки
    $host="192.168.xxx.xxx";          # айпишник сами вставите
    $port="5038";
    $user="login";
    $pass="password";
    $wrets="";
    #открываем сокет
    $socket = fsockopen("$host","$port");
    if (!$socket) exit("no connect to ats");
    #авторизация
    fputs($socket, "Action: login\r\n");
    fputs($socket, "Events: off\r\n");
    fputs($socket, "UserName: $user\r\n");
    fputs($socket, "Secret: $pass\r\n\r\n");
    fputs($socket, "Action: command\r\n");
    fputs($socket, "command: module reload pbx_lua\r\n\r\n");
    fputs($socket, "Action: logoff\r\n\r\n");
    #читаем ответ
    while (!feof($socket)) {
        $line = fread($socket,8192);
        echo $line;
    }
    fclose($socket);
    
    # там далее идут две функции оригинального скрипта...
    


    Третье — сам скрипт вешаем в crone и забываем про его существование :) У меня скрипт исполнялся раз в сутки.

    На самом деле можно избежать громоздкой записи экстеншена и реализовать парсинг собития выхода на внешку через функцию, но тут спорный вопрос — не факт что это будет оптимально. Описание событий всё ровно составляется не руками, а автоматом, поэтому можно после написания вообще забыть про эту проблему.

    Про маршруты непосредственно самих звонков (какие направления через что или кого пропускать) тут вы уже сами решайте. У меня стояло около 8 gsm шлюзов. Для выхода на сотовые использовались два сотовых оператора с интересными тарифами. Эконимия должна быть экономной:).

    Всё. До свиданья!
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.