четверг, 29 октября 2015 г.

[jira,conf] Прикручиваем mail server с SSL через JNDI к Confluence 5.5 и ниже (Jira)

1) Останавливаем Конфлу/jira
2) Перемещаем (НЕ КОПИРУЕМ) файл mail-x.x.x.jar из <confluence-install>/confluence/WEB-INF/lib в <confluence-install>/lib.
3) В /opt/atlassian/confluence/conf/server.xml

Добавляем раздел Resource перед </Context>

 <Resource name="mail/YandexSMTPSession"
        auth="Container"
        type="javax.mail.Session"
        mail.smtp.host="smtp.yandex.ru"
        mail.smtp.port="465"
        mail.smtp.auth="true"
        mail.smtp.user="xxxx@yandex.ru"
        password="lhk6kDH7s"
        mail.smtp.starttls.enable="true"
        mail.smtp.socketFactory.class="javax.net.ssl.SSLSocketFactory"
    />

4) Рестартуем Конфлу
5) Дальше в web интерфейсе Conflu настраиваем в разделе mail server SMTP mail server.

В поле JNDI LOCATION указываем java:comp/env/mail/YandexSMTPSession

Для jira может понадобиться импортировать SSl сертификат. Проще всего поставить плагин JIRA SSL Add-on. Тогда в настройках-система появится SSL Configure

Если без SSL Add-on:
сохраняем сертификат сайта (DER).
импортируем его в трастед кейстор (это файл cacerts) ./keytool -import -alias jira -file /home/shinta/tmp/jira.cer -keystore /opt/atlassian/bitbucket/4.2.1/jre/lib/security/cacerts
добавляем в /jira/bin/setenv.sh к аргументам java -Djavax.net.ssl.trustStore=/opt/atlassian/bitb ucket/4.2.1/jre/lib/security/cacerts

пятница, 8 мая 2015 г.

Asterisk+Dundi

Насчет ключей - можно обойтись без них. т.е просто не использовать поля "inkey =" и
"outkey =" в dundi.conf

cd /var/lib/asterisk/keys/ /usr/src/astgenkey -n aster4

создает ключи public/private, их следует сложить в /var/lib/asterisk/keys/ и /usr/share/asterisk/keys/

Обмениваемся  ключами  между астерами (ложим в /var/lib/asterisk/keys/ и /usr/share/asterisk/keys/) которые будут работать через Dundi

По идее дальним астерам нужны только pub ключи, но у меня не заработало только с ними. Разбираться сильно не стал, т.к система внутренняя.


scp aster4.pub root@192.168.3.52:/var/lib/asterisk/keys/
scp aster4.key root@192.168.3.52:/usr/share/asterisk/keys/
scp aster1.pub root@192.168.3.56:/var/lib/asterisk/keys/
scp aster1.key root@192.168.3.56:/usr/share/asterisk/keys/

файлы ключей должны принадлежать asterisk:asterisk

Перезагружаем в консоли астера module reload res_crypto.so (заодно он покажет, если есть какие то проблемы)

Затем  module reload pbx_dundi.so

проверяем, что ключи загрузились 

aster1*CLI> keys show
Key Name           Type     Status           Sum
------------------ -------- ---------------- --------------------------------
aster2             PUBLIC   [Loaded]         7379e2a11d5a8f8f4209b3fdc7febb20
freeworlddialup    PUBLIC   [Loaded]         5efd552d73309f29212331a75f3c701e
aster1             PUBLIC   [Loaded]         0ed4a73ac18fb141bbdd7f797542146d
aster1             PRIVATE  [Loaded]         9c5777e70e49a4e8e6a42ea67b5a6883
iaxtel             PUBLIC   [Loaded]         d919b3ef03eb4dc54c8fee86bfeeada1
aster2             PRIVATE  [Loaded]         da214b9a7dccf9c6ff28cbf2e38e9fed
aster4             PUBLIC   [Loaded]         7e1a1b95eea77dacbfc42b813dd26ba1


Проверяем, что обмен данными идет

dundi query 00:0c:29:8a:a9:f1@extensions


В sip.conf в секции [general] прописываем
regcontext=RegisteredDevices


Поднимаем sip trunk между астерисками 

в sip.conf 

aster4:
[dundi_to_asterisk1]
host=192.168.3.52
type=peer
secret=secret
context=local
disallow=all
allow=ulaw
allow=alaw
qualify=yes
defaultuser=dundi_to_asterisk4


aster1:
[dundi_to_asterisk4]
host=192.168.3.56
type=peer
secret=secret
context=local
disallow=all
allow=ulaw
allow=alaw
qualify=yes
canreinvite=no
nat=yes
defaultuser=dundi_to_asterisk1

Правим dundi.conf
Здесь мы настраиваем dundi пиры и создаем mapping'и. Один mapping можно использовать для любоко кол-ва данди пиров. Лукап происходит корректно, если номер зарегистрирован только на одном из астерисков.

aster4:
[general]
department=Your Department
organization=Your Company, Inc.
locality=Your City
stateprov=ST
country=US
email=your@email.com
phone=+12565551212
bindaddr=192.168.3.56
port=4520
entityid=00:0c:29:8a:a9:f1 ; MAC belong to this system
cachetime=5
ttl=2
autokill=yes

[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk2/${NUMBER},nopartial


[00:0c:29:c5:d6:e4] ; MAC Address of Asterisk1
model = symmetric
host = 192.168.3.52;(this is the IP address of the DUNDi Asterisk1)
inkey = aster4
outkey = aster1
include = extensions
permit = extensions
qualify = yes
order = primary

aster1:
[general]
department=Your Department
organization=Your Company, Inc.
locality=Your City
stateprov=ST
country=US
email=your@email.com
phone=+12565551212
bindaddr=192.168.3.52
port=4520
entityid=00:0c:29:c5:d6:e4
cachetime=5
ttl=2
autokill=yes

[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk1/${NUMBER},nopartial

[00:0c:29:8a:a9:f1]  ; MAC Address of Asterisk4
model = symmetric
host = 192.168.3.56;(this is the IP address of the DUNDi Asterisk4)
inkey = aster1
outkey = aster4
include = extensions
permit = extensions
qualify = yes
order = primary


В настройках dundi.conf следует иметь ввиду, что строки в mappings, это то что будет передаваться на удаленный dundi peer и именно на этом удаленном пире должны быть нужные настройки (например, context RegisteredDevices и SIP trunk dundi_to_asterisk1)


[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk1/${NUMBER},nopartial

Теперь перейдем к context'ам. Я использую конструкцию вида.

Если есть данные в dundi, то берем их. Если нет, то звоним на локальный астериск.

exten => 958898,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)

exten => 1001,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)

для получения направления звонка используется функция DUNDILOOKUP(1001,extensions,b)
она ищет экстеншен 1001 в маппинге extensions dundi.conf. Возвращает SIP/dundi_to_asterisk2

Это прямой аналог команды 
aster1*CLI> dundi lookup 1000@extensions
  1.     0 SIP/dundi_to_asterisk2/1000 (EXISTS)
     from 00:0c:29:de:70:6d, expires in 5 s
DUNDi lookup completed in 64 ms

Если экстеншен зарегистрирован на нескольких астерисках, то dundi lookup вернет несколько значений. Передаст при этом он только первое. Вполне так можно использовать для резервирования :)

aster2*CLI> dundi lookup 1001@extensions
  1.     0 SIP/dundi_to_asterisk1/1001 (EXISTS)
     from 00:0c:29:c5:d6:e4, expires in 5 s
  2.     0 SIP/dundi_to_asterisk4/1001 (EXISTS)
     from 00:0c:29:8a:a9:f1, expires in 5 s
DUNDi lookup completed in 89 ms




Вообщем то с этого момента можно плодить астериски с данди. Остальные настройки уже распространяются на диалплан и специфичны для конкретных конфигураций.

Пример моей тестовой конфигурации состоящей из трех астерисков:


aster1:

sip.conf

[general]
context=poumolchaniu
srvlookup=no
disallow=all
allow=ulaw
allow=g729
allow=ilbc
language=ru
trustrpid=yes
sendrpid=yes
registertimeout=20
registerattempts=10
t38pt_udptl=no
allow=h263
videosupport=yes
autocreatepeer=no
minexpiry=60
maxexpirey=3600
rtsavesysname=yes
rtptimeout=60
rtpholdtimeout=300
dtmfmode=auto
directrtpsetup=no
canreinvite=no
sdpsession=Aster1 Server
#include sipuserss.conf
#include sipgw.conf
#include siptrunk.conf
alwaysauthreject=yes
videosupport=yes
defaultexpiry=3600
regcontext=RegisteredDevices

;workaround for asteriks crash
session-timers = refuse



sipgw.conf

[dundi_to_asterisk2]
host=192.168.3.53
type=peer
secret=secret
context=local
disallow=all
allow=ulaw
allow=alaw
qualify=yes
canreinvite=no
nat=yes
defaultuser=dundi_to_asterisk1


[dundi_to_asterisk4]
host=192.168.3.56
type=peer
secret=secret
context=local
disallow=all
allow=ulaw
allow=alaw
qualify=yes
canreinvite=no
nat=yes
defaultuser=dundi_to_asterisk1

sipusers.conf

[1000]
type=friend
accountcode=outgoing
host=dynamic
qualify=yes
callerid=""<958877>
language=ru
username=1000
disallow=all
allow=gsm
allow=g729
allow=ulaw
allow=h263
context=tolkogorod+zona+mezhgorod+mezhdunarodka
nat=yes
busylevel=2
call-limit=1
dtmfmode = rfc2833

[1001]
type=friend
accountcode=outgoing
host=dynamic
qualify=yes
callerid=""<958898>
language=ru
username=1001
disallow=all
allow=gsm
allow=g729
allow=ulaw
allow=h263
context=tolkogorod+zona+mezhgorod+mezhdunarodka
nat=yes
busylevel=2
call-limit=1
dtmfmode = rfc2833


dundi.conf
[general]
department=Your Department
organization=Your Company, Inc.
locality=Your City
stateprov=ST
country=US
email=your@email.com
phone=+12565551212
bindaddr=192.168.3.52
port=4520
entityid=00:0c:29:c5:d6:e4
cachetime=5
ttl=2
autokill=yes

[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk1/${NUMBER},nopartial

[00:0c:29:de:70:6d] ; MAC Address of Asterisk2
model = symmetric
host = 192.168.3.53;(this is the IP address of the DUNDi Asterisk2)
inkey = aster1
outkey = aster2
include = extensions
permit = extensions
qualify = yes
order = primary

[00:0c:29:8a:a9:f1]  ; MAC Address of Asterisk4
model = symmetric
host = 192.168.3.56;(this is the IP address of the DUNDi Asterisk4)
inkey = aster1
outkey = aster4
include = extensions
permit = extensions
qualify = yes
order = primary

extensions.conf

[RegisteredDevices]

[tolkogorod+zona+mezhgorod+mezhdunarodka]
Include => local
Include => CallerIDoutCiscofon
Include => specslugbi
Include => gorod
Include => zona
Include => mezhgorod
Include => mezhdunarodka


[local]
#include extensionslookup.conf


extensionslookup.conf
exten => 958877,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1000,extensions,b)})}>0]?${DUNDILOOKUP(1000,extensions,b)}:"SIP/1000")},30)
exten => 958898,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)
exten => 1000,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1000,extensions,b)})}>0]?${DUNDILOOKUP(1000,extensions,b)}:"SIP/1000")},30)
exten => 1001,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)


aster2

sip.conf

[general]
srvlookup=no
NAT=yes
bindport=5060
allowguest=no
canreinvite=no
regcontext=RegisteredDevices

[1000]
type=friend
context=LocalSets
host=dynamic
disallow=all
allow=gsm
canreinvite=no
qualify=yes
defaultuser=1000
fromuser=1000
callerid=""<958877>

[dundi_to_asterisk1]
host=192.168.3.52
type=peer
secret=secret
context=LocalSets
disallow=all
allow=ulaw
allow=alaw
qualify=yes
defaultuser=dundi_to_asterisk2

dundi.conf
[general]
department=Your Department
organization=Your Company, Inc.
locality=Your City
stateprov=ST
country=US
email=your@email.com
phone=+12565551212
bindaddr=192.168.3.53
port=4520
entityid=00:0c:29:de:70:6d
cachetime=5
ttl=2
autokill=yes

[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk2/${NUMBER},nopartial


[00:0c:29:c5:d6:e4] ; MAC Address of Asterisk1
model = symmetric
host = 192.168.3.52;(this is the IP address of the DUNDi Asterisk1)
inkey = aster2
outkey = aster1
include = extensions
permit = extensions
qualify = yes
order = primary

extensions.conf
[general]
static=yes
writeprotect=no
autofallthrough=no
clearglobalvars=no
priorityjumping=no


[RegisteredDevices]
;exten => 1000,1,NoOp()

[lookup]
exten => 958877,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1000,extensions,b)})}>0]?${DUNDILOOKUP(1000,extensions,b)}:"SIP/1000")},30)
exten => 958898,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)
exten => 1000,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1000,extensions,b)})}>0]?${DUNDILOOKUP(1000,extensions,b)}:"SIP/1000")},30)
exten => 1001,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1001,extensions,b)})}>0]?${DUNDILOOKUP(1001,extensions,b)}:"SIP/1001")},30)


[LocalSets]
include => lookup

aster4
sip.conf
[general]
srvlookup=no
NAT=yes
bindport=5060
allowguest=no
canreinvite=no
regcontext=RegisteredDevices



[1002]
type=friend
context=LocalSets
host=dynamic
disallow=all
allow=gsm
canreinvite=no
qualify=yes
defaultuser=1002
fromuser=1002
callerid=""<958877>

[dundi_to_asterisk1]
host=192.168.3.52
type=peer
secret=secret
context=DUNDi_Incoming
disallow=all
allow=ulaw
allow=alaw
qualify=yes
defaultuser=dundi_to_asterisk4

dundi.conf
[general]
department=Your Department
organization=Your Company, Inc.
locality=Your City
stateprov=ST
country=US
email=your@email.com
phone=+12565551212
bindaddr=192.168.3.56
port=4520
entityid=00:0c:29:8a:a9:f1
cachetime=5
ttl=2
autokill=yes

[mappings]
extensions => RegisteredDevices,0,SIP,dundi_to_asterisk4/${NUMBER},nopartial


[00:0c:29:c5:d6:e4] ; MAC Address of Asterisk1
model = symmetric
host = 192.168.3.52;(this is the IP address of the DUNDi Asterisk1)
inkey = aster4
outkey = aster1
include = extensions
permit = extensions
qualify = yes
order = primary

extensions.conf
[general]
static=yes
writeprotect=no
autofallthrough=no
clearglobalvars=no
priorityjumping=no


[RegisteredDevices]

[DUNDi_Incoming]
exten => 1002,1,Dial(${IF($[${LEN(${DUNDILOOKUP(1002,extensions,b)})}>0]?${DUNDILOOKUP(1002,extensions,b)}:"SIP/1002")},30)




[jira] Продвинутая обработка входящих писем (incomming mail handlers)

Натолкнулся на прикольную церновскую разработку.

https://wikis.web.cern.ch/wikis/display/JMH/JIRA+Advanced+Mail+Handler

Плагин для Jira. Скачиваем и устанавливаем через Upload Plug-in из Manage add-ons

Настраиваем Incomming mail в System, добавляем Mail Handler там же. В качестве Handler указываем advancedCreateOrCommentHandler

Плагин позволяет добавлять в тему писем таги в виде  #TAG-NAME=tag-value или #TAG-NAME=tag-value1,tag-value2,tag-value3. По ним задачам будут навешиваться или изменяться поля и компоненты.

Например включаем в тему письма таг,
#PROJECT=GNOM
#ASSIGNEE=vasya
#BUG#NEWFEATURE  - issue type
#BLOCKER#CRITICAL - priority
#COMPONENT=sloniki
#EST=1h
#DUE=2015-11-01

Ну а дальше полет фантазии: можно правилами в почтовике (MTA ) настроить добавление тегов по фильтрам, можно писать руками при отправке.


четверг, 7 мая 2015 г.

Vim

Доступные синтаксы


/usr/share/vim/vim73/syntax


установить синтакс в vim
:set filetype=название

Запустить команды оболочки из Vim, используя команду ':!'
например, :!ls

Доступ ко всем возможностям оболочки, запустите :sh или :bash

Открытие файлового менеджера в vim
:Vex или :E

кодировка
:set encoding=

vim -c :E  - запустить вим с выполнением команды :E


Команды в vim



:E - file explorer

!ls -la - выполнение команды в шеле
:split filename  - разделить экран и открыть второй файл (ctrl-w - переход между окнами)
:vsplit filename
colorschemes ложить в .vim/colors


настройки в /home/.vim.rc


 colorscheme sexy-railscasts
 set fileencodings=utf-8,koi8-r,cp1251
 set fileformats=unix,dos,mac
set number   #номера строк
set pastetoggle=<F2>   #биндим на f2 включение и отключение paste, чтобы vim не коверкал строки при вставке из буфера.

set foldenable
set foldmethod=manual

#меняем foldmethod по нажатию f4
map <F4>  <esc>:call SWITCHFOLD()<cr> "{{{   
 function SWITCHFOLD()
 if &foldmethod=="marker"
 set foldmethod=syntax
 return
 endif
 if &foldmethod=="syntax"
 set foldmethod=indent
 return
 endif
 if &foldmethod=="indent"
 set foldmethod=manual
 return
 endif
 if &foldmethod=="manual"
 set foldmethod=marker
 return
 endif

 endfunction



earlier 4m
вернетеся на 4 минуты, т.е. состояние текста которое было 4 минут назад "earlier".

е двинуться вперед во времени:
:later 45s
интервал составит 45 секунд.

отмена 5ти внесенных изменений:
:undo 5

просмотреть дерево undo:
:undolist





понедельник, 7 января 2013 г.

SCE Subscriber manager и Quota manager

Статья не преследует цели дать полное описание SM и QM. Этого добра навалом в интернетах и в официальном руководстве. Здесь только то, что не так явно и полезно как минимум мне.

Живут SM и QM всегда вместе на одном сервере, в отличии от CM который с SM на одном серваке жить не должен.

До версии SM 3.5.5 QM безумно убог.

Версия SM (хотя бы первые два индекса) должна совпадать с версией SCOS на SCE (не обязательное, но крайне желательное условие).

Очень важно чтобы внутреннее время SM было выставлено корректно. Иначе могут быть реальные проблеме в работе квот (будут криво учитываться обновления и нотификации для hourly и minutes).

При установке SM не забываем разлочить и сменить пароль у пользователя pcube.

Настройка Quota на СЦЕ


































































RDR-formatter destination 127.0.0.1 port 33001 category number 4 priority 100


SCE8000(config)#> service RDR-formatter

inte line0
tunable GT_REP_QP_RemainQuota_Enable value true
tunable GT_REP_QP_QuotaBreach_Enable value true
tunable GT_REP_QP_ThresholdBreach_Enable value true
tunable GT_REP_QP_RemainQuota_MaxFrequency value 1000
tunable GT_REP_QP_RemainQuota_Rate value 60






Устанавливаем через install-sm.sh
Разлочиваем пользователя pcube
passwd -u -f pcube
перезагружаем машину


[Domain.domain1]
elements = SCE1,SCE2
aliases = *

[SCE.SCE1]
ip=xxx.xxx.xxx.xxx
port=14374

[SCE.SCE2]
ip=xxx.xxx.xxx.xxx
port=14374

[RDR Server]
start=yes





Step 1 In the Service Configuration Editor, click the Classification tab.

Step 2 Choose Configuration > Classification > RDR Settings.

Step 3 Click the Quota RDRs tab.


--------------------







Configuring the Quota Manager Section

The [Quota Manager] section in the subscriber manager configuration file contains the following parameters:

•start—Defines whether to start the Quota Manager or not.

Possible values are yes and no. The default value is no.

•reset_quota_on_profile_switch—Defines whether the Quota Manager should reset quota history cross global profiles.

Possible values are true and false. The default value is true.

•reset_quota_on_penalty_profile_switch—Defines whether the quota manager should reset quota history across penalty profiles.

Possible values are true and false. The default value is false.

•log_all—Defines whether the Quota Manager should add all messages to the user log.

Possible values are true and false. The default value is false.

•log_failures—Defines whether the Quota Manager should add messages about failures to the user log.

Possible values are true and false. The default value is true.

•log_breach_events—Setting the log_breach_events parameter to true logs only events of subscriber bucket breach and new aggregation period starts.

Possible values are true or false. The default value is false.

•handle_out_of_penalty_on_aggregation_period_end—Determines whether to allow a subscriber to come out of penalty at the end of an aggregation period. The default value is false.

•multiple_sce_support—Determines whether to enable multiple Cisco SCE support.

Possible values are true or false. The default value is false.

•quota_allocation_based_on—Determines which flavor to choose for multiple Cisco SCE support. The possible values are consumption and provisioned. The default value is consumption.




прописать ип адрес системы в /etc/hosts


Посмотреть статус см sudo -u pcube ./p3sm --sm-status

запустить см sudo -u pcube ./p3sm --start

перезапустить см sudo -u pcube ./p3sm --restart

перезагрузить конфиг sm sudo -u pcube ./p3sm --load-config

синхронизировать базы пользователей со всеми сце sudo -u pcube ./p3sm--resync-all

смотрим статусы подключения sm к сце sudo -u pcube ./p3net --show-all --detail

ручное подключение к sm к сце sudo -u pcube ./p3net --connect 10.10.10.10




Пользователей добавлять утилитой sudo -u pcube --add --ip=10.10.10.10 --subscriber=shinta --property=packageId=10

Пользователей удалять утилитой sudo -u pcube --remove --subscriber=shinta

апдейтить утилитой  sudo -u pcube ./p3subs --set --subscriber=shinta --property=packageId=5

вычищаем всех пользователей из базы sudo -u pcube ./p3subsdb --clear-all

экспортируем пользователей в csv файл sudo -u pcube ./p3subsdb --export --output=

импортируем пользователей из csv файла sudo -u pcube ./p3subsdb --import --file=












среда, 5 сентября 2012 г.

kamalio+asterisk+realtime mysql


Дружим kamailio и астериск с удаленным mysql server

kamilio в качестве SIP register, sip users хранятся в mysql на удаленном сервере.



на mysql ставим

apt-get install mysql-server
apt-get install libmysqlclient-dev

на aster и kamailio накатываем
apt-get install unixodbc-dev libmyodbc


kamailio собирал из сырцов так
apt-get install bison flex libmysqlclient-dev make gcc
cd /usr/local/src
wget http://www.kamailio.org/pub/kamailio/3.0.1/src/kamailio-3.0.1_src.tar.gz
tar xvfz kamailio-3.0.1_src.tar.gz
cd kamailio-3.0.1
make include_modules="db_mysql" cfg
make all
make install



1) на удаленном mysql настраиваем /etc/mysql/my.cnf
2) рестартуем mysql
service mysql restart


3) настраиваем привилегии
mysql -u root -p
grant all privileges  on *.* to root@'%' identified by 'password' with grant option;
grant all privileges  on *.* to openser@'%' identified by 'openserrw';

4) На kamailio

vim /usr/local/etc/kamailio/kamctlrc

пишем

DBENGINE=MYSQL
DBHOST=xxx.xxx.xxx.xxx
DBNAME=openser
DBRWUSER=openser
DBRWPW="openserrw"

5) Создаем базу на удаленном mysql


на kamailio сервере запускаем
 /usr/local/sbin/kamdbctl create

6) дополняем базу данных данными для астера.

на mysql сервере создаем файл asterisk.sql следующего содержания:

CREATE DATABASE asterisk;

USE asterisk;

GRANT ALL ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'asterisk';
GRANT ALL ON asterisk.* to asterisk@"%" IDENTIFIED BY 'asterisk';

CREATE TABLE `sipusers` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(80) NOT NULL DEFAULT '',
 `host` varchar(31) NOT NULL DEFAULT '',
 `nat` varchar(5) NOT NULL DEFAULT 'no',
 `type` enum('user','peer','friend') NOT NULL DEFAULT 'friend',
 `accountcode` varchar(20) DEFAULT NULL,
 `amaflags` varchar(13) DEFAULT NULL,
 `call-limit` smallint(5) UNSIGNED DEFAULT NULL,
 `callgroup` varchar(10) DEFAULT NULL,
 `callerid` varchar(80) DEFAULT NULL,
 `cancallforward` char(3) DEFAULT 'yes',
 `canreinvite` char(3) DEFAULT 'yes',
 `context` varchar(80) DEFAULT NULL,
 `defaultip` varchar(15) DEFAULT NULL,
 `dtmfmode` varchar(7) DEFAULT NULL,
 `fromuser` varchar(80) DEFAULT NULL,
 `fromdomain` varchar(80) DEFAULT NULL,
 `insecure` varchar(4) DEFAULT NULL,
 `language` char(2) DEFAULT NULL,
 `mailbox` varchar(50) DEFAULT NULL,
 `md5secret` varchar(80) DEFAULT NULL,
 `deny` varchar(95) DEFAULT NULL,
 `permit` varchar(95) DEFAULT NULL,
 `mask` varchar(95) DEFAULT NULL,
 `musiconhold` varchar(100) DEFAULT NULL,
 `pickupgroup` varchar(10) DEFAULT NULL,
 `qualify` char(3) DEFAULT NULL,
 `regexten` varchar(80) DEFAULT NULL,
 `restrictcid` char(3) DEFAULT NULL,
 `rtptimeout` char(3) DEFAULT NULL,
 `rtpholdtimeout` char(3) DEFAULT NULL,
 `secret` varchar(80) DEFAULT NULL,
 `setvar` varchar(100) DEFAULT NULL,
 `disallow` varchar(100) DEFAULT NULL,
 `allow` varchar(100) DEFAULT NULL,
 `fullcontact` varchar(80) NOT NULL DEFAULT '',
 `ipaddr` varchar(15) NOT NULL DEFAULT '',
 `port` mediumint(5) UNSIGNED NOT NULL DEFAULT '0',
 `regserver` varchar(100) DEFAULT NULL,
 `regseconds` int(11) NOT NULL DEFAULT '0',
 `lastms` int(11) NOT NULL DEFAULT '0',
 `username` varchar(80) NOT NULL DEFAULT '',
 `defaultuser` varchar(80) NOT NULL DEFAULT '',
 `subscribecontext` varchar(80) DEFAULT NULL,
 `useragent` varchar(20) DEFAULT NULL,
 `sippasswd` varchar(80) DEFAULT NULL,
 PRIMARY KEY  (`id`),
 UNIQUE KEY `name_uk` (`name`)
);

CREATE TABLE `sipregs` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(80) NOT NULL DEFAULT '',
 `fullcontact` varchar(80) NOT NULL DEFAULT '',
 `ipaddr` varchar(15) NOT NULL DEFAULT '',
 `port` mediumint(5) UNSIGNED NOT NULL DEFAULT '0',
 `username` varchar(80) NOT NULL DEFAULT '',
 `regserver` varchar(100) DEFAULT NULL,
 `regseconds` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY  (`id`),
 UNIQUE KEY `name` (`name`)
);

CREATE TABLE IF NOT EXISTS `voiceboxes` (
 `uniqueid` int(4) NOT NULL AUTO_INCREMENT,
 `customer_id` varchar(10) DEFAULT NULL,
 `context` varchar(10) NOT NULL,
 `mailbox` varchar(10) NOT NULL,
 `password` varchar(12) NOT NULL,
 `fullname` varchar(150) DEFAULT NULL,
 `email` varchar(50) DEFAULT NULL,
 `pager` varchar(50) DEFAULT NULL,
 `tz` varchar(10) DEFAULT 'central',
 `attach` enum('yes','no') NOT NULL DEFAULT 'yes',
 `saycid` enum('yes','no') NOT NULL DEFAULT 'yes',
 `dialout` varchar(10) DEFAULT NULL,
 `callback` varchar(10) DEFAULT NULL,
 `review` enum('yes','no') NOT NULL DEFAULT 'no',
 `operator` enum('yes','no') NOT NULL DEFAULT 'no',
 `envelope` enum('yes','no') NOT NULL DEFAULT 'no',
 `sayduration` enum('yes','no') NOT NULL DEFAULT 'no',
 `saydurationm` tinyint(4) NOT NULL DEFAULT '1',
 `sendvoicemail` enum('yes','no') NOT NULL DEFAULT 'no',
 `delete` enum('yes','no') NULL DEFAULT 'no',
 `nextaftercmd` enum('yes','no') NOT NULL DEFAULT 'yes',
 `forcename` enum('yes','no') NOT NULL DEFAULT 'no',
 `forcegreetings` enum('yes','no') NOT NULL DEFAULT 'no',
 `hidefromdir` enum('yes','no') NOT NULL DEFAULT 'yes',
 `stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY  (`uniqueid`),
 KEY `mailbox_context` (`mailbox`,`context`)
);

CREATE TABLE `voicemessages` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `msgnum` int(11) NOT NULL DEFAULT '0',
 `dir` varchar(80) DEFAULT '',
 `context` varchar(80) DEFAULT '',
 `macrocontext` varchar(80) DEFAULT '',
 `callerid` varchar(40) DEFAULT '',
 `origtime` varchar(40) DEFAULT '',
 `duration` varchar(20) DEFAULT '',
 `mailboxuser` varchar(80) DEFAULT '',
 `mailboxcontext` varchar(80) DEFAULT '',
 `recording` longblob,
 `flag` varchar(128) DEFAULT '',
 PRIMARY KEY  (`id`),
 KEY `dir` (`dir`)
);


CREATE TABLE version (
    table_name VARCHAR(32) NOT NULL,
    table_version INT UNSIGNED DEFAULT 0 NOT NULL
);
INSERT INTO version (table_name, table_version) VALUES ('sipusers','6');


7) заливаем скрипт командой

 mysql -u root -p <asterisk.sql


проверяем, что создалась база

mysql -u root -p
show databases;


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| asterisk           |
| mysql              |
| openser            |
| phpmyadmin         |
+--------------------+
5 rows in set (0.01 sec)

8) на kamailio и asterisk настраиваем odbc

UnixODBC Configuration

Edit /etc/odbcinst.ini and add:

[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =
UsageCount = 1


Edit /etc/odbc.ini and add:

[MySQL-asterisk]
Description = MySQL Asterisk database
Trace = Off
TraceFile = stderr
Driver = MySQL
SERVER = xxx.xxx.xxx.xxx
USER = asterisk
PASSWORD = asterisk
PORT = 3306
DATABASE = asterisk


На астериске настраиваем:

Asterisk UnixODBC Configuration

Edit /etc/asterisk/res_odbc.conf and set:

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk
password => asterisk
pre-connect => yes

Edit /etc/asterisk/extconfig.conf and set:

sipusers => odbc,asterisk,sipusers
sippeers => odbc,asterisk,sipusers
sipregs => odbc,asterisk,sipregs
voicemail => odbc,asterisk,voiceboxes


в /etc/asterisk/modules.conf раскомментариваем:
preload => res_odbc.so
preload => res_config_odbc.so

там же заккоментариваем
;noload => res_config_odbc.so
;noload => res_config_pgsql.so

перезагружаем с cli aster'a модуль

module reload res_odbc.so

также в sip.conf расскомментариваем

 rtcachefriends=yes

это заставляет астериск кэшировать данные . Нужно для того, чтобы работали команды sip show peers и избавляет от части других проблем вызванных динамическим представлением данных


9) Заносим в mysql данные о sip users

use asterisk;

INSERT INTO sipusers (name, username, host, sippasswd, fromuser, fromdomain, mailbox)
  VALUES ('101', '101', 'dynamic', '101', '101', 'yoursip.com', '101');
INSERT INTO sipusers (name, username, host, sippasswd, fromuser, fromdomain, mailbox)
  VALUES ('102', '102', 'dynamic', '102', '102', 'yoursip.com', '102');
INSERT INTO sipusers (name, username, host, sippasswd, fromuser, fromdomain, mailbox)
  VALUES ('103', '103', 'dynamic', '103', '103', 'yoursip.com', '103');

INSERT INTO sipregs(name) VALUES('101');
INSERT INTO sipregs(name) VALUES('102');
INSERT INTO sipregs(name) VALUES('103');

INSERT INTO voiceboxes(customer_id, context, mailbox, password) VALUES ('101', 'default', '101', '1234');
INSERT INTO voiceboxes(customer_id, context, mailbox, password) VALUES ('101', 'default', '102', '1234');
INSERT INTO voiceboxes(customer_id, context, mailbox, password) VALUES ('101', 'default', '103', '1234');

10) заливаем конфиг kamailio. меняем localhost на ip удаленного mysql и правим логин/пароли


#!KAMAILIO
 
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_ASTERISK
 
#
# $Id$
#
# Kamailio (OpenSER) SIP Server v3.0 - basic configuration script
#     - web: http://www.kamailio.org
#     - git: http://sip-router.org
#
# Direct your questions about this file to: <users@lists.kamailio.org>
#
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
# for an explanation of possible statements, functions and parameters.
#
# Several features can be enabled using '#!define WITH_FEATURE' directives:
#
# *** To run in debug mode: 
#     - define WITH_DEBUG
#
# *** To enable mysql: 
#     - define WITH_MYSQL
#
# *** To enable authentication execute:
#     - enable mysql
#     - define WITH_AUTH
#     - add users using 'kamctl'
#
# *** To enable persistent user location execute:
#     - enable mysql
#     - define WITH_USRLOCDB
#
# *** To enable presence server execute:
#     - enable mysql
#     - define WITH_PRESENCE
#
# *** To enable nat traversal execute:
#     - define WITH_NAT
#     - install RTPProxy: http://www.rtpproxy.org
#     - start RTPProxy:
#        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
#
# *** To enable PSTN gateway routing execute:
#     - define WITH_PSTN
#     - set the value of pstn.gw_ip
#     - check route[PSTN] for regexp routing condition
#
# *** To enhance accounting execute:
#     - enable mysql
#     - define WITH_ACCDB
#     - add following columns to database
#!ifdef ACCDB_COMMENT
  ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
#!endif
 
 
####### Global Parameters #########
 
#!ifdef WITH_DEBUG
debug=4
log_stderror=yes
#!else
debug=2
log_stderror=no
#!endif
 
memdbg=5
memlog=5
 
log_facility=LOG_LOCAL0
 
fork=yes
children=4
 
/* uncomment the next line to disable TCP (default on) */
#disable_tcp=yes
 
/* uncomment the next line to disable the auto discovery of local aliases
   based on revers DNS on IPs (default on) */
#auto_aliases=no
 
 
/* uncomment and configure the following line if you want Kamailio to 
   bind on a specific interface/port/proto (default bind on all available) */
#listen=udp:10.0.0.10:5060
 
listen=udp:192.168.178.23
port=5060
 
####### Custom Parameters #########
 
# These parameters can be modified runtime via RPC interface
# - see the documentation of 'cfg_rpc' module.
#
# Format: group.id = value 'desc' description
# Access: $sel(cfg_get.group.id) or @cfg_get.group.id
#
 
#!ifdef WITH_PSTN
# PSTN GW Routing
#
# - pstn.gw_ip: valid IP or hostname as string value, example:
# pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
#
# - by default is empty to avoid misrouting
pstn.gw_ip = "" desc "PSTN GW Address"
#!endif
 
#!ifdef WITH_ASTERISK
asterisk.bindip = "192.168.178.23" desc "Asterisk IP Address"
asterisk.bindport = "5080" desc "Asterisk Port"
kamailio.bindip = "192.168.178.23" desc "Kamailio IP Address"
kamailio.bindport = "5060" desc "Kamailio Port"
#!endif
 
####### Modules Section ########
 
#set module path
# mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
mpath="modules_k/:modules/"
 
/* uncomment next line for MySQL DB support */
#!ifdef WITH_MYSQL
loadmodule "db_mysql.so"
#!endif
loadmodule "mi_fifo.so"
loadmodule "kex.so"
loadmodule "tm.so"
loadmodule "tmx.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri_db.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "mi_rpc.so"
loadmodule "acc.so"
#!ifdef WITH_AUTH
loadmodule "auth.so"
loadmodule "auth_db.so"
#!endif
/* uncomment next line for aliases support
   NOTE: a DB (like db_mysql) module must be also loaded */
#loadmodule "alias_db.so"
/* uncomment next line for multi-domain support
   NOTE: a DB (like db_mysql) module must be also loaded
   NOTE: be sure and enable multi-domain support in all used modules
         (see "multi-module params" section ) */
#loadmodule "domain.so"
#!ifdef WITH_PRESENCE
loadmodule "presence.so"
loadmodule "presence_xml.so"
#!endif
 
#!ifdef WITH_NAT
loadmodule "nathelper.so"
#!endif
 
#!ifdef WITH_ASTERISK
loadmodule "uac.so"
#!endif
 
# ----------------- setting module-specific parameters ---------------
 
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
 
 
# ----- rr params -----
# add value to ;lr param to cope with most of the UAs
modparam("rr", "enable_full_lr", 1)
# do not append from tag to the RR (no need for this script)
#!ifdef WITH_ASTERISK
modparam("rr", "append_fromtag", 1)
#!else
modparam("rr", "append_fromtag", 0)
#!endif
 
 
# ----- rr params -----
modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)
 
 
# ----- uri_db params -----
/* by default we disable the DB support in the module as we do not need it
   in this configuration */
modparam("uri_db", "use_uri_table", 0)
modparam("uri_db", "db_url", "")
 
 
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
/* by default ww do not adjust the direct of the sequential requests.
   if you enable this parameter, be sure the enable "append_fromtag"
   in "rr" module */
modparam("acc", "detect_direction", 0)
/* account triggers (flags) */
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "log_extra", 
 "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
/* enhanced DB accounting */
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
modparam("acc", "db_url",
 "mysql://openser:openserrw@localhost/openser")
modparam("acc", "db_extra",
 "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
#!endif
 
# ----- usrloc params -----
/* enable DB persistency for location entries */
#!ifdef WITH_USRLOCDB
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url",
 "mysql://openser:openserrw@localhost/openser")
#!endif
 
# ----- auth_db params -----
/* enable the DB based authentication */
#!ifdef WITH_AUTH
modparam("auth_db", "calculate_ha1", yes)
#!ifdef WITH_ASTERISK
modparam("auth_db", "user_column", "username")
modparam("auth_db", "password_column", "sippasswd")
modparam("auth_db", "db_url",
 "mysql://asterisk:asterisk_password@localhost/asterisk")
#!else
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url",
 "mysql://openser:openserrw@localhost/openser")
#!endif
modparam("auth_db", "load_credentials", "")
#!endif
 
# ----- alias_db params -----
/* uncomment the following lines if you want to enable the DB based
   aliases */
#modparam("alias_db", "db_url",
# "mysql://openser:openserrw@localhost/openser")
 
 
# ----- domain params -----
/* uncomment the following lines to enable multi-domain detection
   support */
#modparam("domain", "db_url",
# "mysql://openser:openserrw@localhost/openser")
#modparam("domain", "db_mode", 1)   # Use caching
 
 
# ----- multi-module params -----
/* uncomment the following line if you want to enable multi-domain support
   in the modules (dafault off) */
#modparam("alias_db|auth_db|usrloc|uri_db", "use_domain", 1)
 
 
# ----- presence params -----
/* enable presence server support */
#!ifdef WITH_PRESENCE
modparam("presence|presence_xml", "db_url",
 "mysql://openser:openserrw@localhost/openser")
modparam("presence_xml", "force_active", 1)
modparam("presence", "server_address", "sip:10.0.0.10:5060")
#!endif
 
# ----- nathelper -----
#!ifdef WITH_NAT
modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7722")
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", 7)
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
modparam("registrar|nathelper", "received_avp", "$avp(i:80)")
modparam("usrloc", "nat_bflag", 6)
#!endif
 
 
####### Routing Logic ########
 
 
# main request routing logic
 
route{
 
 if (!mf_process_maxfwd_header("10")) {
  sl_send_reply("483","Too Many Hops");
  exit;
 }
 
 if(!sanity_check("1511", "7"))
 {
  xlog("Malformed SIP message from $si:$sp\n");
  exit;
 }
 
 # NAT detection
 route(NAT);
 
 if (has_totag()) {
  # sequential request withing a dialog should
  # take the path determined by record-routing
  if (loose_route()) {
   if (is_method("BYE")) {
    setflag(1); # do accounting ...
    setflag(3); # ... even if the transaction fails
   }
   route(RELAY);
  } else {
   if (is_method("SUBSCRIBE") && uri == myself) {
    # in-dialog subscribe requests
    route(PRESENCE);
    exit;
   }
   if ( is_method("ACK") ) {
    if ( t_check_trans() ) {
     # non loose-route, but stateful ACK; must be an ACK after a 487
     # or e.g. 404 from upstream server
     t_relay();
     exit;
    } else {
     # ACK without matching transaction ... ignore and discard.\n");
     exit;
    }
   }
   sl_send_reply("404","Not here");
  }
  exit;
 }
 
 #initial requests
 
 # CANCEL processing
 if (is_method("CANCEL"))
 {
  if (t_check_trans())
   t_relay();
  exit;
 }
 
 t_check_trans();
 
 # authentication
 route(AUTH);
 
 # record routing for dialog forming requests (in case they are routed)
 # - remove preloaded route headers
 remove_hf("Route");
 if (is_method("INVITE|SUBSCRIBE"))
  record_route();
 
 # account only INVITEs
 if (is_method("INVITE")) {
  setflag(1); # do accounting
 }
 if (!uri==myself)
 /* replace with following line if multi-domain support is used */
 ##if (!is_uri_host_local())
 {
  append_hf("P-hint: outbound\r\n"); 
  route(RELAY);
 }
 
 # requests for my domain
 
 if( is_method("PUBLISH|SUBSCRIBE"))
  route(PRESENCE);
 
 if (is_method("REGISTER"))
 {
  if(isflagset(5))
  {
   setbflag("6");
   # uncomment next line to do SIP NAT pinging 
   ## setbflag("7");
  }
  if (!save("location"))
   sl_reply_error();
 
#!ifdef WITH_ASTERISK
  route(REGFWD);
#!endif
  exit;
 }
 
 if ($rU==$null) {
  # request with no Username in RURI
  sl_send_reply("484","Address Incomplete");
  exit;
 }
 
 route(PSTN);
 
 # apply DB based aliases (uncomment to enable)
 ##alias_db_lookup("dbaliases");
 
#!ifdef WITH_ASTERISK
 if(!is_method("INVITE")) {
  # non-INVITE request are routed directly by Kamailio
#!endif
 if (!lookup("location")) {
  switch ($rc) {
   case -1:
   case -3:
    t_newtran();
    t_reply("404", "Not Found");
    exit;
   case -2:
    sl_send_reply("405", "Method Not Allowed");
    exit;
  }
 }
#!ifdef WITH_ASTERISK
 } /* end non-INVITE test */
 # only INVITE from now on
 if(route(FROMASTERISK))
 {
  # coming from Asterisk - do location lookup
  if (!lookup("location")) {
   switch ($rc) {
    case -1:
    case -3:
     t_newtran();
     t_reply("404", "Not Found");
     exit;
    case -2:
     sl_send_reply("405", "Method Not Allowed");
     exit;
   }
  }
 } else {
  # new call - send to Asterisk
  route(TOASTERISK);
 }
#!endif
 
 # when routing via usrloc, log the missed calls also
 setflag(2);
 
 route(RELAY);
}
 
 
route[RELAY] {
#!ifdef WITH_NAT
 if (check_route_param("nat=yes")) {
  setbflag("6");
 }
 if (isflagset(5) || isbflagset("6")) {
  route(RTPPROXY);
 }
#!endif
 
 /* example how to enable some additional event routes */
 if (is_method("INVITE")) {
  #t_on_branch("BRANCH_ONE");
  t_on_reply("REPLY_ONE");
  t_on_failure("FAIL_ONE");
 }
 
 if (!t_relay()) {
  sl_reply_error();
 }
 exit;
}
 
 
# Presence server route
route[PRESENCE]
{
#!ifdef WITH_PRESENCE
 if (!t_newtran())
 {
  sl_reply_error();
  exit;
 };
 
 if(is_method("PUBLISH"))
 {
  handle_publish();
  t_release();
 }
 else
 if( is_method("SUBSCRIBE"))
 {
  handle_subscribe();
  t_release();
 }
 exit;
#!endif
 
 # if presence enabled, this part will not be executed
 if (is_method("PUBLISH") || $rU==$null)
 {
  sl_send_reply("404", "Not here");
  exit;
 }
 return;
}
 
# Authentication route
route[AUTH] {
#!ifdef WITH_AUTH
 
#!ifdef WITH_ASTERISK
 # do not auth traffic from Asterisk - trusted!
 if(route(FROMASTERISK))
  return;
#!endif
 
 if (is_method("REGISTER"))
 {
  # authenticate the REGISTER requests (uncomment to enable auth)
#!ifdef WITH_ASTERISK
  if (!www_authorize("", "sipusers"))
#!else
  if (!www_authorize("", "subscriber"))
#!endif
  {
   www_challenge("", "0");
   exit;
  }
 
  if ($au!=$tU)
  {
   sl_send_reply("403","Forbidden auth ID");
   exit;
  }
 } else {
  # authenticate if from local subscriber (uncomment to enable auth)
  if (from_uri==myself)
  {
#!ifdef WITH_ASTERISK
   if (!proxy_authorize("", "sipusers")) {
#!else
   if (!proxy_authorize("", "subscriber")) {
#!endif
    proxy_challenge("", "0");
    exit;
   }
   if (is_method("PUBLISH"))
   {
    if ($au!=$tU) {
     sl_send_reply("403","Forbidden auth ID");
     exit;
    }
   } else {
    if ($au!=$fU) {
     sl_send_reply("403","Forbidden auth ID");
     exit;
    }
   }
 
   consume_credentials();
   # caller authenticated
  }
 }
#!endif
 return;
}
 
# Caller NAT detection route
route[NAT]{
#!ifdef WITH_NAT
 force_rport();
 if (nat_uac_test("19")) {
  if (method=="REGISTER") {
   fix_nated_register();
  } else {
   fix_nated_contact();
  }
  setflag(5);
 }
#!endif
 return;
}
 
# RTPProxy control
route[RTPPROXY] {
#!ifdef WITH_NAT
 if (is_method("BYE")) {
  unforce_rtp_proxy();
 } else if (is_method("INVITE")){
  force_rtp_proxy();
 }
 if (!has_totag()) add_rr_param(";nat=yes");
#!endif
 return;
}
 
# PSTN GW routing
route[PSTN] {
#!ifdef WITH_PSTN
 # check if PSTN GW IP is defined
 if (strempty($sel(cfg_get.pstn.gw_ip))) {
  xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
  return;
 }
 
 # route to PSTN dialed numbers starting with '+' or '00'
 #     (international format)
 # - update the condition to match your dialing rules for PSTN routing
 if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
  return;
 
 # only local users allowed to call
 if(from_uri!=myself) {
  sl_send_reply("403", "Not Allowed");
  exit;
 }
 
 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
 
 route(RELAY);
 exit;
#!endif
 
 return;
}
 
#!ifdef WITH_ASTERISK
# Test if coming from Asterisk
route[FROMASTERISK] {
 if($si==$sel(cfg_get.asterisk.bindip)
   && $sp==$sel(cfg_get.asterisk.bindport))
  return 1;
 return -1;
}
 
# Send to Asterisk
route[TOASTERISK] {
 $du = "sip:" + $sel(cfg_get.asterisk.bindip) + ":"
   + $sel(cfg_get.asterisk.bindport);
 route(RELAY);
 exit;
}
 
# Forward REGISTER to Asterisk
route[REGFWD] {
 if(!is_method("REGISTER"))
 {
  return;
 }
 $var(rip) = $sel(cfg_get.asterisk.bindip);
 $uac_req(method)="REGISTER";
 $uac_req(ruri)="sip:" + $var(rip) + ":" + $sel(cfg_get.asterisk.bindport);
 $uac_req(furi)="sip:" + $au + "@" + $var(rip);
 $uac_req(turi)="sip:" + $au + "@" + $var(rip);
 $uac_req(hdrs)="Contact: <sip:" + $au + "@"
    + $sel(cfg_get.kamailio.bindip)
    + ":" + $sel(cfg_get.kamailio.bindport) + ">\r\n";
 if($sel(contact.expires) != $null)
  $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $sel(contact.expires) + "\r\n";
 else
  $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $hdr(Expires) + "\r\n";
 uac_req_send();
}
 
#!endif
 
# Sample branch router
branch_route[BRANCH_ONE] {
 xdbg("new branch at $ru\n");
}
 
# Sample onreply route
onreply_route[REPLY_ONE] {
 xdbg("incoming reply\n");
#!ifdef WITH_NAT
 if ((isflagset(5) || isbflagset("6")) && status=~"(183)|(2[0-9][0-9])") {
  force_rtp_proxy();
 }
 if (isbflagset("6")) {
  fix_nated_contact();
 }
#!endif
}
 
# Sample failure route
failure_route[FAIL_ONE] {
#!ifdef WITH_NAT
 if (is_method("INVITE")
   && (isbflagset("6") || isflagset(5))) {
  unforce_rtp_proxy();
 }
#!endif
 
 if (t_is_canceled()) {
  exit;
 }
 
 # uncomment the following lines if you want to block client 
 # redirect based on 3xx replies.
 ##if (t_check_status("3[0-9][0-9]")) {
 ##t_reply("404","Not found");
 ## exit;
 ##}
 
 # uncomment the following lines if you want to redirect the failed 
 # calls to a different new destination
 ##if (t_check_status("486|408")) {
 ## sethostport("192.168.2.100:5060");
 ## append_branch();
 ## # do not set the missed call flag again
 ## t_relay();
 ##}
}

11) Стоит проверить, что данные в конфиге kamailio раздела

#!ifdef WITH_ASTERISK
asterisk.bindip = "192.168.178.23" desc "Asterisk IP Address"
asterisk.bindport = "5080" desc "Asterisk Port"

совпадают с настройками sip.conf астериска.

12)  Теперь можно логинится sip клиентом хоть на kamailio, хоть на asterisk.

13) Правим диалпланы и конфиги kamailio и asterisk под свои задачи