Мультифон во FreePBX: полная автоматизация подключения

в 15:40, , рубрики: asterisk, freepbx, multifon, php, Мультифон

Приветствую!

Поделюсь еще одним маленьким, но очень полезным костылем к freepbx. Как известно, очень многие любят и пользуют multifon как sip-транк ко всяким астерискам, получая «почти-бесплатный» многоканальный входящий канал связи и вполне интересные цены на исходящий.

Стабильность сервиса, конечно, на уровне его цены. Но многих (в том числе меня) устраивает. При этом можно (и нужно!) одновременно пользоваться сим, например, для исходящих звонков по домашнему региону. Баланс «шевелится», номер не отберут за неиспользование.

Но иногда баланс уходит «в минус». Тогда мультифон отключается, и теряется настройка маршрутизации. При пополнении баланса звонки идут на сим, а не в asterisk.

Тем, у кого много таких транков, особенно на разных PBX (как у меня, я обслуживаю asterisk`и разных клиентов) — довольно проблематично постоянно отслеживать маршрутов «мультифонов» состояние вручную.

Я предлагаю автоматизированное решение для тех, у кого freepbx.
Скрипт запускается по крону (раз в час у меня) и делает следующее:

1) Вытаскивает из базы asterisk регистрационные данные всех транков multifon (по строке регистрации LIKE "%@multifon.ru%");
2) Проверяет на сервисе sm.megafon.ru маршрут, если он неверен — правит на нужный
3) Делает amportal restart для «обновления» транка. Ускоряет процедуру регистрации.

Скрипт запускается по крону, но также есть возможность «дернуть» его ссылкой в любой момент. Можно передать ему параметр «r», который по значениям совпадает с параметром «routing» сервиса sm.megafon.ru.

Вот текст скрипта (файл index.php)

<?php
#включение/отключение мультифона
#автоматическое извлечение из базы FreePBX
#для роутинга на телефон "?r=0", на PBX: "?r=1", на оба: "?r=2"
#vmcl****.ru

#mysql settings
$hostname = "localhost"; 
$username = "mysql_user"; 
$password = "mysql_password"; 
$dbName = "asterisk";

mysql_connect($hostname,$username,$password) or die("NO connect to MySQL: ".mysql_error());
mysql_select_db($dbName) or die("MySQL ERROR:".mysql_error());
mysql_query("set names 'utf8'");

date_default_timezone_set("Europe/Moscow");

if(isset($_GET['r'])) $r = $_GET['r']; else $r = '1'; //если роутинг не задан ?r=X, то включить на PBX

//browser settings
$header = array();
$header[] = 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
$header[] = 'Cache-Control: max-age=0';
$header[] = 'Connection: keep-alive';
$header[] = 'Keep-Alive: 300';
$header[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7';
$header[] = 'Accept-Language: en-us,en;q=0.5';
$header[] = 'Pragma: ';

//seach multifon trunks
$mf_query = mysql_query('SELECT `data` FROM `sip` WHERE `keyword` = "register" AND `data` LIKE "%@multifon.ru%" ORDER BY `data`') or die("MySQL ERROR:".mysql_error());
while($mf_row = mysql_fetch_array($mf_query, MYSQL_ASSOC)) {
  $pre_data = explode("@", $mf_row['data']);
  $data = explode(":", $pre_data[0]);
  print "Номер {$data[0]}...";
  //читаем
  $ch = curl_init(); 
  curl_setopt($ch, CURLOPT_URL, "https://sm.megafon.ru/sm/client/routing?login={$data[0]}@multifon.ru&password={$data[1]}");
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)");
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_ENCODING, '');
  curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  curl_close ($ch);
  $routing = json_decode(json_encode(simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA)), true);
  //проверяем
  if($routing['result']['code'] == 200) { //ответ ok
    if($routing['routing'] == $r) { //не изменился
      print "уже установлен в {$routing['routing']}<br>";
    } else {
      print "был {$routing['routing']}, меняем на $r...";
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, "https://sm.megafon.ru/sm/client/routing/set?login={$data[0]}@multifon.ru&password={$data[1]}&routing=$r");
      curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)");
      curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
      curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($ch, CURLOPT_ENCODING, '');
      curl_setopt($ch, CURLOPT_TIMEOUT, 20);
      $response = curl_exec($ch);
      curl_close ($ch);
      $result = json_decode(json_encode(simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA)), true);
      if($result['result']['code'] == 200) {
          print "{$result['result']['description']}<br>";
      } else {
          print "сервер sm.megafon.ru вернул ошибку {$result['result']['code']} {$result['result']['description']}<br>";
      }
      exec("amportal reload");
    }
  } else {
    print "сервер sm.megafon.ru вернул ошибку {$routing['result']['code']} {$routing['result']['description']}<br>";
  }
}
print "завершено";
?>

Вот sh-файл, который лежит в cron:

#!/bin/sh
#move this file to cron folders

cd /var/www/html/mf && /usr/bin/nohup /usr/bin/php -f index.php >/tmp/mf_php.log &

Скрипт, как видно, находится в каталоге /var/www/html/mf, в области видимости веб-сервера.
Нужно указать только данные для подключения к mysql в секции настроек скрипта.

Удачи!

Автор: whoim

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js