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);
     }