1.05.2019

Черный список ip адресов для voip

sh скрипт который

!/bin/bash
BADIPSFILE="badips.list"
BADIPSFILETEMP="$BADIPSFILE".temp
ADDLISTFILE="$BADIPSFILE".load
# get new list
wget https://www.badips.com/get/list/voip/0 -O $BADIPSFILETEMP
# sort new list
sort $BADIPSFILETEMP -o $BADIPSFILETEMP
# touch to be sure that file exist
touch $BADIPSFILE
# diff old ans new file
diff $BADIPSFILE $BADIPSFILETEMP | grep -Po '\d+.\d+.\d+.\d+' > $ADDLISTFILE
# copy new file to old for next ips going fast
cp -f $BADIPSFILETEMP $BADIPSFILE
cp -f drop_temp.xml drop_temp_.xml
BLOCKED_IP=$ADDLISTFILE
IPTABLES="iptables"
if [ -f $BLOCKED_IP ]; then
while read BLOCKED; do
$IPTABLES -A INPUT_direct -i ens192 -s $BLOCKED -p udp -j DROP
done < $BLOCKED_IP
fi

10.04.2019

opensips. dispatcher. loadbalancing. wrong destination.

По установке по умолчания, если вы добавите несколько шлюзов в dispatcher то про запросе авторизации, Opensips будет пересылать новый invite на новый шлюз.

решается выставлением hash механизма ‘0’ в функции ds_select_dst который учитывает callid.

8.04.2019

troubleshoot. ACK sending to wrong host

picture when ACK sending to wrong dest

solve is add function fix_sdp_contact() into onreply_route .

по-русски: проблема была в том, что опенсипс получая ACK от абонента не пересылал его обратно, через внутренний интерфейс железке. А слал ACK напрямую тому, кто указан был в 200 OK оригинальном. в Итоге помогло добавление функции в onreply_route которая по идее должна заменять поле контакт на адрес источника запроса.

3.04.2019

FREEPBX. SURVEY. IVR. REPORT

Задача: написать модуль для freepbx который бы переводил пользователя на ivr оценки качества или просто опрос звонящего

Система обслуживания это несколько вопросов на которые пользователи должны дать ответ нажатием кнопки от 1 до 5.

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

Статья с примером реализации. Кстати отлично показывает как работают некоторые механизмы в freepbx.

итого для создания системы опроса в freepbx можно обойтись вообще без всего и даже отчеты получать в более-менее хорошем виде

1. add content to extensions_custom.conf
;-------Survey logic------------------------------
[macro-survey]

exten => _.,1,answer()

exten => _.,n,Read(answer1,/var/lib/asterisk/sounds/en/custom/${EXTEN}-1,1,,1,2)
exten => _.,n,Read(answer2,/var/lib/asterisk/sounds/en/custom/${EXTEN}-2,1,,1,2)
exten => _.,n,Read(answer3,/var/lib/asterisk/sounds/en/custom/${EXTEN}-3,1,,1,2)
exten => _.,n,Read(answer4,/var/lib/asterisk/sounds/en/custom/${EXTEN}-4,1,,1,2)
exten => _.,n,Read(answer5,/var/lib/asterisk/sounds/en/custom/${EXTEN}-5,1,,1,2)
exten => _.,n,Read(answer6,/var/lib/asterisk/sounds/en/custom/${EXTEN}-6,1,,1,2)
exten => _.,n,Read(answer7,/var/lib/asterisk/sounds/en/custom/${EXTEN}-7,1,,1,2)
exten => _.,n,Read(answer8,/var/lib/asterisk/sounds/en/custom/${EXTEN}-8,1,,1,2)
exten => _.,n,Read(answer9,/var/lib/asterisk/sounds/en/custom/${EXTEN}-9,1,,1,2)

exten => _.,n(finish),set(answer=${answer1}|${answer2}|${answer3}|${answer4}|${answer5}|${answer6}|${answer7}|${answer8}|${answer9})

exten => _.,n,Set(CDR(userfield)=${answer})

exten => _.,n,noop(EXTEN - ${EXTEN})
exten => _.,n,noop(DIDFROM - ${FROM_DID})
exten => _.,n,noop(DEXTEN - ${DEXTEN})
exten => _.,n,noop(TIMESTP - ${TIMESTR})
exten => _.,n,noop(CALLERID - ${CALLERID(num)})
exten => _.,n,noop(RECORDS - ${UNIQUEID})
exten => _.,n,noop(EXTFROM - ${EXTTOCALL})
exten => _.,n,noop(ANSWER1 - ${answer1})
exten => _.,n,noop(ANSWER2 - ${answer2})

exten => _.,n,MYSQL(Connect connid 127.0.0.1 surveyuser 123123 asterisk)
exten => _.,n,MYSQL(Query resultid ${connid} INSERT INTO surveys_report (surveynum,did,surveyname,agent,queue,start_date,calleridorig,callid,answer1,answer2) values ('${EXTEN}','${FROM_DID}',' ','${DEXTEN}',' ','${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}','${CALLERID(num)}','${UNIQUEID}','${answer1}','${answer2}'))

exten => _.,n,playback(/var/lib/asterisk/sounds/en/custom/${EXTEN}-thankyou)
;-------------------------------------

2. Prepare Recordings as at image 1
3. create Custom Destination as at image 2
4. create Ring Group as at image 3
5. all is ready for surveys, results and records will be stored at CDRs pages. for saving results in new table at mysql you should add new table in asterisk database;
6. SQL statement for create new table, also you should know user and password for database;
CREATE TABLE `surveys_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`surveynum` varchar(12) DEFAULT NULL,
`surveyname` varchar(255) NOT NULL,
`agent` varchar(64) DEFAULT NULL,
`queue` varchar(64) DEFAULT NULL,
`start_date` varchar(128) DEFAULT NULL,
`calleridorig` varchar(64) DEFAULT NULL,
`callid` varchar(128) DEFAULT NULL,
`answer1` varchar(64) DEFAULT NULL,
`answer2` varchar(64) DEFAULT NULL,
`did` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
)

CREATE USER 'surveyuser'@'localhost' IDENTIFIED BY '123123';
grand all on asterisk.* to 'surveyuser'@'localhost' IDENTIFIED BY '123123';

31.03.2019

d-link dvg6004s и asterisk

годные статейки перваяи вторая как подключить голосовые шлюзы, в том числе к elastix.

25.03.2019

mixmonitor. playback. file not found

если записать канал и затем попытаться воспроизвести его,то астериск выдаёт: does not exist in any format

решение оказалось таким, записываем без формата

same => n,mixmonitor(mytest-${UNIQUEID})

и воспроизводим тоже

same => n,background(/var/spool/asterisk/monitor/mytest-${UNIQUEID})

25.03.2019

freepbx + a2biling different places

Чтобы разнести а2биллинг и астериск по разным машинам, нужно определиться будем ли мы запускать скрипты на машине с астериском или через fastAGI

в интернете есть упоминания о том, что при использовании fastAGI возникли проблемы с биллингом по этому,был выбран путь 1. скачать скрипты, подключиться к БД и вперед

Есть одно неудобство, которая пока не знаю как победить – просмотр логов из панели а2биллинга невозможет, т.к. они лежат на другой тачке.

Что нужно чтобы скрипты заработали, за основу берем хорошую статью:

  • Скачать исходники а2биллинга(распаковывать кстати командой unzip, через mc Занимает много времени)
  • добавить AGI

Цитата: Set up AGI

mkdir /var/lib/asterisk/agi-bin
cd /usr/src/a2billing/AGI               
cp a2billing.php /var/lib/asterisk/agi-bin
cp a2billing_monitoring.php /var/lib/asterisk/agi-bin
chown -R asterisk. /var/lib/asterisk/agi-bin
chmod 755 /var/lib/asterisk/agi-bin/a2billing.php
chmod 755 /var/lib/asterisk/agi-bin/a2billing_monitoring.php
ln -s /var/www/html/a2billing/common/lib /var/lib/asterisk/agi-bin/lib
ln -s /var/www/html/a2billing/vendor /var/lib/asterisk/vendor

Add the following extensions to /etc/asterisk/extensions_custom.conf

If not using Freepbx then this would go into /etc/asterisk/extensions.conf.  Customize this to your needs.

The 1 in a2billing.php,1 refers to the default agi-conf1 configuration in a2billing system settings.  It is possible to add additional agi-conf such as agi-conf2 etc. via System Settings > Add agi-conf.

nano /etc/asterisk/extensions_custom.conf
[a2billing-did] 
exten => _X.,1,AGI(a2billing.php,1,did)
exten => _X.,n,Hangup()

[a2billing-out]
exten => _X.,1,AGI(a2billing.php,1)
exten => _X.,n,Hangup()

Add custom destinations to FreePBX via FreePBX GUI>Admin>Custom Destinations

These destinations are referring to the custom extensions created above in /etc/asterisk/extensions_custom.conf

Target: a2billing-did,${EXTEN},1 
Description: A2Billing - Inbound

Target: a2billing-out,${EXTEN},1 
Description: A2Billing - Outbound

Create inbound route

We are creating a universal DID inbound route.  This requires _. in the DID number field.  That is underscore character followed by period or dot character. 

Connectivity > Inbound Routes

Description: Some descriptive name

DID number: _.

Set Destination: Custom Destinations
                               A2Billing - Inbound

13.03.2019

connecting TATA sip trunk

TATA выдает подключает sip-trunkи через локальные сети, т.е. например они дают подсеть 10.0.8.6/32 со шлюзом 10.0.8.5 и только назначив первый ip адрес вы сможете подключиться к их voip сети.

Сразу укажу статью оригинал, которая помогла понять смысл подключения.

В качестве IP SBC\PBX тоже используются локальный адрес, например это может быть 10.0.74.11.

Едем дальше, чтобы получать входящие звонки нужно:

  • добавить интерфейс к centos ip address add 10.0.86.6/30 dev eth0:0
  • создать статический маршрут route add 10.0.74.11 gateway 10.0.8.5
  • регистрироваться на их SBC (пароль по-умолчанию 1234)
    register => 66810000:1234:66810000@10.0.74.11/66810000

для совершения исходящих:

  • нужно звонить по определенным правилам набора, например для индии это набор номера 10 знаков без 5.
  • нужно использовать в поле FROM правильный номер,
  • А также необходимо удостовериться что поле contact соответствует 10.0.8.6 (если такое сделать не получится, то у меня звонки проходили и без этого пункта ),
  • Обязательно добавьте SIP заголовок к исходящим
    P-Preferred-Identity: <sip:66810000@SBC_IP> ,

для FREEPBX добавить sip заголовок к исходящему звонку просто:

  • добавить в файл extensions_custom.conf нужный контекст, например такой:
[add-tata1-header] 
exten => s,1,SipAddHeader(P-Preferred-Identity: ${ARG1})
exten => s,n,Return
  • в настройках транка переопределить DIAL опции на:
B(add-tata1-header^s^1(66810000@10.0.76.11))

Вот так сумбурно, но в целом это все требования.

PS: чтобы freepbx подставлял в поле contact нужные данные, необходимо чтобы был маршрут до SBC. route add sbc_ip gateway gateway_IP. А также сети должны быть прописаны в конфигах Asterisk как localnet

5.03.2019

update elastix 2.5 to FreePBX 14

Оказывается, это можно сделать буквально в два движения.

Вот ссылка на инструкцию, там смысл простой запускаешь на машине-приёмнике команду, затем туже команду на машине-источнике и вуаля.

Кое-что придёт перенести вручную, но 90% работы делается автоматически.

1.03.2019

pjsip, pitch_shift, real-time

Необходимо решить такую задачу нужно в режиме реального времени менять тональность каналов на asterisk 13.

Для реализации будем использовать AMI который есть почти во всех астерисках.

  1. Получаем список активных каналов через команду
  2. “core show channels concise”
  3. Отображаем пользователям каналы и кнопки увеличения,уменьшения тональности для конкретных каналов
  4. Применяем к каналам данные настройки через команду:

Action: SetVar
Channel: 1551426910.36
Variable: PITCH_SHIFT(both)
Value: 3

или как итоге получилось:

dialplan set chanvar $channel PITCH_SHIFT(both) high