05.01.2016

ACL+Realtime

Создаем таблицу:
CREATE TABLE `acltable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL,
  `rule_order` int(11) NOT NULL,
  `sense` enum('permit','deny') NOT NULL DEFAULT 'deny',
  `rule` varchar(95) NOT NULL,
  PRIMARY KEY (`id`,`name`,`rule_order`,`sense`,`rule`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
В extconfig.conf говорим acls => mysql,asterisk,acltable

В данную таблицу вписываем данные:
name - имя ACL
rule_order - порядковый номер правила
sense - действие, возможно одно из 2-х: permit/deny
rule - IP/netmask 

Пример:
INSERT INTO `asterisk`.`acltable` (`name`, `rule_order`, `sense`, `rule`) VALUES ('lan', '1', 'permit', '10.0.10.0/24');
 
В таблице sippeers добавляем поле acl и добавляем имя ACL в это поле для нужного пира/транка.
  
При выполнении команды в CLI:  acl show  будет пустота.
При выполнении sip reload  применит нужный ACL.

Для обновления ACL кроме добавления записи в таблицу надо сделать module reload acl
При этом будет ошибка:
Named ACL 'lan' is already included in the ast_acl container.
chan_sip.c:31061 build_peer: Bad ACL entry in configuration line 11 : lan

Несмотря на ошибку ALC применяется, как пофиксить ошибку пока не разобрался.

Update 3.01.2016: Описание и патчи:
https://issues.asterisk.org/jira/browse/ASTERISK-24874
https://issues.asterisk.org/jira/browse/ASTERISK-24969

Realtime + register(row:callbackextension)+sip reload = Unregistered

Имеем проблему: если используем поле callbackextension в таблице Mysql и кол-во регистрации более 3-х, на меньшем не проявлялась, то при sip reload можем поиметь все регистрации со статусом Unregistered, помогает только рестарт * либо выгрузка/загрузка chan_sip.

Порывшись на просторах нашел вот это: https://issues.asterisk.org/jira/browse/ASTERISK-23789
на момент публикации еще открытый. Патч помогает, насколько он правильный судить не могу.

--- asterisk-12.2.0/channels/chan_sip.c 2014-04-21 17:02:00.000000000 -0400
+++ asterisk-12.2.0-modified/channels/chan_sip.c        2014-05-24 20:44:28.559519094 -0400
@@ -6566,8 +6566,12 @@
        AST_SCHED_DEL(sched, reg->expire);
        AST_SCHED_DEL(sched, reg->timeout);

+       if ((reg->;registryadded))
+       {
+               ast_atomic_fetchadd_int(&regobjs, -1);
+       }
+
        ast_string_field_free_memory(reg);
-       ast_atomic_fetchadd_int(&regobjs, -1);
        ast_free(reg);
 }

@@ -9556,6 +9560,7 @@
                registry_unref(tmp, "throw away found registry");
        } else {
                ast_atomic_fetchadd_int(&regobjs, 1);
+               reg->;registryadded = 1;
                ASTOBJ_CONTAINER_LINK(&regl, reg);
        }

--- asterisk-12.2.0/channels/sip/include/sip.h  2014-04-21 17:02:00.000000000 -0400
+++ asterisk-12.2.0-modified/channels/sip/include/sip.h 2014-05-24 20:37:42.557555124 -0400
@@ -1414,6 +1414,7 @@
        struct ast_sockaddr us;  /*!< Who the server thinks we are */
        int noncecount;         /*!< Nonce-count */
        char lastmsg[256];      /*!< Last Message sent/received */
+       unsigned short registryadded:1; /*!< If this registry object is already added to registry list */

 };

 struct tcptls_packet {
Update 10.01.2016
Порывшись еще найдено еще вот это: https://issues.asterisk.org/jira/browse/ASTERISK-23542
на момент публикации еще открытый.

--- channels/chan_sip.c    (revision 420532)
+++ channels/chan_sip.c    (working copy)
@@ -9218,11 +9218,12 @@
         reg->refresh = reg->expiry = reg->configured_expiry = default_expiry;
     }

+    ast_atomic_fetchadd_int(&regobjs, 1);
+
     /* Add the new registry entry to the list, but only if it isn't already there */
     if ((tmp = ASTOBJ_CONTAINER_FIND(&regl, reg->name))) {
         registry_unref(tmp, "throw away found registry");
     } else {
-        ast_atomic_fetchadd_int(&regobjs, 1);
         ASTOBJ_CONTAINER_LINK(&regl, reg);
     }


16.12.2015

Таблица CDR

Таблица CDR 
CREATE TABLE `cdr` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `calldate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `clid` VARCHAR(80) NOT NULL DEFAULT '',
  `src` VARCHAR(80) NOT NULL DEFAULT '',
  `dst` VARCHAR(80) NOT NULL DEFAULT '',
  `dcontext` VARCHAR(80) NOT NULL DEFAULT '',
  `channel` VARCHAR(80) NOT NULL DEFAULT '',
  `dstchannel` VARCHAR(80) NOT NULL DEFAULT '',
  `lastapp` VARCHAR(80) NOT NULL DEFAULT '',
  `lastdata` VARCHAR(80) NOT NULL DEFAULT '',
  `duration` INT(11) NOT NULL DEFAULT '0',
  `billsec` INT(11) NOT NULL DEFAULT '0',
  `disposition` VARCHAR(45) NOT NULL DEFAULT '',
  `amaflags` INT(11) NOT NULL DEFAULT '0',
  `accountcode` VARCHAR(20) NOT NULL DEFAULT '',
  `uniqueid` VARCHAR(32) NOT NULL DEFAULT '',
  `peeraccount` VARCHAR(20) NOT NULL DEFAULT '',
  `linkedid` VARCHAR(32) NOT NULL DEFAULT '',
  `sequence` INT(11) NOT NULL DEFAULT '0',
  `userfield` VARCHAR(255) NOT NULL DEFAULT '',
  `data` BLOB,
  `way` TINYINT(4) NOT NULL DEFAULT '0',
  `phn` INT(11) DEFAULT NULL,
  `active` TINYINT(4) NOT NULL DEFAULT '0',
  `tmp_val` VARCHAR(255) DEFAULT NULL,
  `rec_path` VARCHAR(255) DEFAULT NULL,
  `start` VARCHAR(255) DEFAULT NULL,
  `end` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `calldate` (`calldate`),
  KEY `accountcode` (`accountcode`),
  KEY `uniqueid` (`uniqueid`),
  KEY `dst` (`dst`),
  KEY `src` (`src`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

23.11.2015

insecure

Если у одного провайдера берем несколько транков то: 
Если в настройках транка стоит insecure=invite,port то все сыпется в первый в списке транк с этим ip. Если настроен Realtime то сначала ищем в базе а потом в файле.

Так как:
port: игнорировать номер порта, с которого пришла аутентификация
invite: не требовать начальное сообщение INVITE для аутентификации
port,invite: не требовать начальное сообщение INVITE для аутентификации и игнорировать порт, с которого пришел запрос

При установке  insecure=invite,port  - DID разгребаем в диалплане.

16.11.2015

Extracting Configuration with spacfg.xml from Linksys

Понадобилось сохранить конфиги:

http://<IP_address_of_phone>/spacfg.xml  - 8000
http://<IP_address_of_phone>/admin/spacfg.xml -303
http://<IP_address_of_phone>/admin/config.xml - 2102/3102(ver 5.2.13)

29.10.2015

Debug

Litnimax еще в 2009 году предложил:

И снова ты говоришь о pbx_config. Это там нужна отладка, в CLI. При выносе всей логики в mod_lua, ты волен сам делать такой debug, какой тебе хочется:
logger = logging.file("/tmp/test-%s.log", "%Y-%m-%d") logging.file("/tmp/test-%s.log", "%Y-%m-%d")
И далее вставляй log.debug(...) куда только захочешь.
Представь себе включение отладки для определенного пользователя - в sip.conf ставишь setvar=log_level=debug, и все звонки он него трассируются. И ты сам волен в любой момент воткнуть logger.debug(...) в любую ветку алгоритма или между любыми командами.

Надо проверить...

28.10.2015

DialPlan в устройствах Linksys

Сегодня пришлось малость переделать DialPlan в 2102 но как-то подзабыл что за то отвечает.
Поэтому для памяти взял у IGORG
Оригинал

 
Диалплан представляет из себя последовательность шаблонов, разделённых вертикальной чертой '|' и ограниченных круглыми скобками. Для каждой линии может задаваться свой диалплан (параметр Dial_Plan). Для устройств, где присутствуют FXO порты (например, SPA3102 и AG310), настроек с диалпланами гораздо больше (по 2 на каждый PIN, используемый для авторизации), в названиях есть аббревиатура DP, перечислять не буду. Есть ограничение на длину параметра, что-то около 256 или 128 символов, сейчас не могу найти точную информацию.
Следует заметить, что все коды дополнительных сервисов, сконфигурированных на устройстве, автоматически добавляются к диалплану, и их не нужно учитывать в записи параметра.
Запись последовательности цифр
Основой записи являются обозначения для записи последовательности набранных цифр. Последовательность цифр записывается с помощью нескольких обозначений:
  1. Цифры набираемые с клавиатуры телефона: 0, 1, 2, 3, ..., 9, # и *. Заметьте, что использование символа # в диалплане может блокировать завершение набора с помощью этой клавиши.
  2. Последовательность цифр, заключённая в квадратные скобки, соответствует любому из заключённых в скобки символу.
    • Пр.: ([1239]) — соответствует любой из цифр 1, 2, 3 или 9
  3. Через тире может быть указан диапазон символов. Чаще всего используется внутри квадратных скобок.
    • Пр.: (1-5) — любая цифра от 1 до 5, ([1-39]) — пример из прошлого пункта, но записанный по-другому
  4. Символ X соответствует любому числу от 0 до 9
    • Пр.: (1XX) — любой трёхзначный номер, начинающийся на 1
  5. Если после символа поставлена точка, то считается, что этот символ может быть повторён любое количество раз (больше нуля)
    • Пр.: (810X.) — международный номер, с любым количеством цифр
Настройки, влияющие на обработку диалплана
  • Interdigit Long Timer — время ожидания ввода следующей цифры в том случае если нет подходящих под набранную комбинацию шаблонов
  • Interdigit Short Timer — время ожидания ввода следующей цифры, если есть один или более подходящий шаблон
  • Enable IP Dialing — разрешает использование в диалплане также и прямых ip-адресов для набора номера, примеры ниже.
Дополнительные возможности:
  1. Замена набранной последовательности. Синтаксис: <arg1:arg2>. Возможность позволяет заменить набранную последовательность на любую последовательность набираемых символов. При этом второй аргумент должен быть указан определённым значением, оба аргумента могут быть пустыми.
    • Пр.: (<83812:> XXXXXX) — данная запись будет соответствовать набранным цифрам 83812, но эта последовательность будет опущена и передана на SIP сервер не будет.
  2. Вставка тона в набор. При выходе на межгород или, в офисных станциях, на город привычно слышать КПВ, что можно реализовать вставкой запятой в нужную позицию последовательности цифр.
    • Пр.: (8, 770) — при наборе номера 8770 после цифры 8 будет выдан непрерывный тон
  3. Запрет набора номера. Если в конце шаблона номера добавить восклицательный знак '!', то набор номеров, соответствующих шаблону будет заблокирован.
    • Пр.: (8 10X xxxxxxx ! | 8 xxx xxxxxxx ) — разрешает набор только междугородних номеров и исключает международные вызовы
  4. Замена значений таймеров набора номера. Значения таймеров могут быть назначены как для всего диалплана, так и для определённого шаблона.
  • Буква S отвечает за установку Interdigit Short Timer, а L — Interdigit Long Timer
  • Значение таймеров может быть указано для всех шаблонов в диалплане, если значение перечислены до открывающейся круглой скобки (если указано только значение короткого таймера, то обязательно должна присутствовать запятая после значение, как показано в примере). Пр.: S:4, (8XXX.) или S:4,L:8 (XXX)
  • Если эти значения указаны только в одной из последовательностей, то действуют только для неё. Так же в этом случае не надо ставить двоеточие между ключём и значением таймаута, значение может быть расположено в любом месте шаблона. Пр.: (S4 8XXX. | XXX) или ([1-5] XX S0) — вызовет мгновенную передачу вызова при наборе трехзначного номера, начинающегося на 1,2, ... , 5.
  • Так же в некоторую последовательности может быть вставлена пауза (ключ P)
Набор по прямому адресу (IP Dialing)

Символ @ поставленный после номера означает что далее будет указан адрес сервера, на который будет отправлен вызов на набранный номер. Лучше всего, если используется IP Dialing разрешить так же приём и передачу вызовов без регистрации (Call Without Reg, Answer Without Reg). Может помочь в случае отказа сервера :)
Для шлюзов SPA3102 вместо адреса может быть использовано ключевое слово gw0, тогда вызов пойдёт через PSTN линию. Адреса gw1, ... , gw4 используются для шлюзов заданных в Gateway1-4. Так же для авторизации на серверах прямо в диалплане могут быть указаны параметры usr, pwd, nat.
Кроме того формат адреса с IP Dialing может быть использован в номерах, предназначенных для переадресации звонков.
Примеры:
  • ( 8 xxx xxxxxxx ) — 11-значный номер, начинающийся на 8.
  • ( 8 xxx xxxxxxx | <:8495> xxxxxxx ) — 11-значный номер, начинающийся на 8, если введён 7-ми значный, то добавить к передаваемому номеру 8495. Очень удобно делать набор локальных номеров через SIP провайдера вроде SIPNET.
  • ( 0[123] | 8 [2-9]xx [2-9]xxxxxx ) — набор номеров экстренных служб, а так же некоторого странного набора междугородних номеров
  • ( S0 <:82125551234> ) — быстрый набор указанного номера, аналог режима хотлайн на других шлюзах
  • ( P5 <:1000> | xxxx ) — такой диал-план позволяет набрать любой номер, состоящий из цифр, а если ничего не введено в течении 5 секунд вызвать номер 1000 (пусть это будет секретарь)
  • Звонить с первой линии на вторую линию устройства: (<02:3463463@192.168.254.254:5061>). С учётом что аккаунт на второй линии 3463463, устройство настроено с использованием указанного IP адреса и номером порта на второй линии.