Показаны сообщения с ярлыком asterisk. Показать все сообщения
Показаны сообщения с ярлыком asterisk. Показать все сообщения

вторник, 30 апреля 2019 г.

Asterisk запись разговоров

Можно так, все валить в одну кучу:
[ringroup_1]
exten => s,1,NoOp(<- Otdel klassnykh devchonok ->)
exten => s,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M)}--${CALLERID(number)}--${EXTEN})
exten => s,n,MixMonitor(/home/records_call/${fname}.wav)
exten => s,n,Dial(SIP/001,60,${DIALOPTIONS}i)
exten => s,n,Hangup


А можно создавать каталоги с годом и месяцем в имени:
[ringroup_2]
exten => s,1,NoOp(<- Otdel khoroshikh rebyat ->)
exten => s,n,Set(DESTDIR=/home/records_call/${STRFTIME(${EPOCH},,%Y-%m)})
exten => s,n,System(mkdir -p ${DESTDIR})
exten => s,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M)}--${CALLERID(number)}--${EXTEN})
exten => s,n,MixMonitor(${DESTDIR}/${fname}.wav)
exten => s,n,Dial(SIP/002,60,${DIALOPTIONS}i)
exten => s,n,Hangup

суббота, 17 марта 2018 г.

Asterisk подключение к СУБД используя ODBC.

Тут речь о дебианоподобных.
Сначала надо установить сам ODBC:

apt-get install unixodbc unixodbc-dev libmyodbc

Затем отредактировать файл (он есть в системе, но пуст):
nano /etc/odbcinst.ini
следующим образом:
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup           = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage       = 1


Изменение диалплана нажатием клавиш на телефонном аппарате.

Мне приходится работать в организации, которая помимо других сфер деятельности, также является и Интернет-провайдером. Как и у любого провайдера у нас бывают проблемы на сети. В таком случае, в саппорт сразу поступает большое количество звонков, и чтобы сообщить абонентам, что их проблема известна, над ее решением уже работают, был использован нехитрый набор действий. Суть в том, что в диалплан скриптом вставляется строчки, которые запускают проигрывание файла сообщающего о проблеме, при устранении проблемы, так же скриптом строчка убирается.

Диалплан:

Контекст сервисного номера:


.................................

[internal]
exten = 7934,1,Goto(Problem_ISP,s,1)

.................................

[Problem_ISP]
exten => s,1,NoOp(- Problem_ISP -)
exten => s,n,Authenticate(8725)
exten => s,n(service),Background(problem_ISP) ;тут голосовое меню - типа если есть проблема нажмите "1", если нет проблемы, и надо вернуть как было прежде нажмите "2"
exten => s,n,WaitExten(5)
exten => 1,1,System(/home/change/change.sh) ;скрипт меняющий диалплан
exten => 2,1,System(/home/change/unchange.sh) ;скрипт убирающий изменения
exten => t,1,Hungup()
.................................

Сами скрипты:
change.sh

#!/bin/bash
sed -i 's/exten => i,1,Playback(please_wait_on_line2)/exten => i,1,Playback(problem)/g' /etc/asterisk/extensions.conf
sed -i 's/exten => t,1,Playback(please_wait_on_line2)/exten => t,1,Playback(problem)/g' /etc/asterisk/extensions.conf
sed -i 's/exten = 1,1,Playback(please_wait_on_line2)/exten = 1,1,Playback(problem)/g' /etc/asterisk/extensions.conf
sed -i 's/exten = 2,1,Playback(please_wait_on_line2)/exten = 2,1,Playback(problem)/g' /etc/asterisk/extensions.conf
/usr/sbin/asterisk -rx 'dialplan reload'


unchange.sh

#!/bin/bash
sed -i 's/exten => i,1,Playback(problem)/exten => i,1,Playback(please_wait_on_line2)/g' /etc/asterisk/extensions.conf
sed -i 's/exten => t,1,Playback(problem)/exten => t,1,Playback(please_wait_on_line2)/g' /etc/asterisk/extensions.conf
sed -i 's/exten = 1,1,Playback(problem)/exten = 1,1,Playback(please_wait_on_line2)/g' /etc/asterisk/extensions.conf
sed -i 's/exten = 2,1,Playback(problem)/exten = 2,1,Playback(please_wait_on_line2)/g' /etc/asterisk/extensions.conf
/usr/sbin/asterisk -rx 'dialplan reload'

ну и выставим права:

cd /home/change
chown asterisk:asterisk change.sh
chown asterisk:asterisk unchange.sh
chmod 755 change.sh
chmod 755 unchange.sh



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


среда, 27 декабря 2017 г.

Белый список для Asterisk

Черный список для Asteriska я уже делал дома (кстати, довольно успешно - те, кто беспокоили меня звонками уже не беспокоят). Теперь, на работе руководство поставило задачу оградить сотрудников IT, от звонков сотрудников, кроме определенного круга приближенных. Эти звонки должны уходить в ринг-группу технической поддержки.

Используем AstDB, создаем список разрешенных номеров:

asterisk -rx 'database put allow_for_it 343 1'

asterisk -rx 'database put allow_for_it 344 1'

и т.д.

Удалить номер из базы так:

asterisk -rx 'database del allow_for_it 343'

В диалплане:

exten = 343,1,ExecIf($["${DB(allow_for_it/${CALLERID(num)})}" != "1"] ?Goto(ringroup-IT,s,1))
exten = 343,n,Dial(SIP/343,20,t)



суббота, 5 августа 2017 г.

Радиоприемник на громкой связи. Asterisk. В двух вариантах.

Суть простая - набираешь цифру, а потом выбираешь радиостанцию, которая звучит из потока.

Ver.1

В вашем внутреннем контескте в extensions.conf:

exten => 9,1,NoOp(=radio=)
exten => 9,n,Answer()
exten => 9,n,Background(beep)
exten => 9,n,WaitExten(3)
exten => 1,1,MusicOnHold(radio1)
exten => 2,1,Set(VOLUME(TX)=5) ;поток тихо звучал, поднял ему громкость
exten => 2,2,MusicOnHold(radio2)
exten => t,1,Hangup()


В musiconhold.conf:

[radio1]
mode=custom
application=/usr/bin/mpg123 -q -s --mono -r 8000 -f 4096 -Z http://address1/stream.mp3

[radio2]
mode=custom
application=/usr/bin/mpg123 -q -s --mono -r 8000 -f 4096 -Z http://address2/stream.mp3

В консоли asteriska делаем:

dialplan reload

и

module reload res_musiconhold.so

Ver.2
Все же решил сделать без musiconhold. Так как musiconhold постоянно тянет поток из Интернет, вне зависимости от того слушаете вы его или нет. Мне не очень нравится, что нагрузка на сеть и железо (пусть и небольшая) осуществляется без необходимости.
Если используется CDR, можно добавить NoCDR по желанию, я добавил

Достаточно этого (перед MP3Player обязательно должен быть Answer или Progress!):

exten => 9,1,NoCDR()
exten => 9,n,NoOp(=radio=)
exten => 9,n,Answer()
exten => 9,n,Background(beep)
exten => 9,n,WaitExten(10)
exten => 9,n,Hangup()
exten => 1,1,MP3Player(http://stream1.com.mp3)
exten => 2,1,MP3Player(http://stream2.com.mp3)
exten => 3,1,MP3Player(http://stream3.com.mp3)
exten => t,1,Hangup()

и

dialplan reload

Потоки можно ТУТ поискать.

пятница, 17 марта 2017 г.

Ограничение вызовов в транке по количеству и времени.

Я пользуюсь услугами оператора sipnet, а именно бесплатными звонками по городским номерам Москвы и Питера. Бесплатность как бы условная  - на счету надо иметь не менее 10 у.е., и тогда появляется возможность совершать 5 разговоров в сутки,  общей продолжительностью 30 мин. Для следования этим ограничениям был написан следующий диалплан.
Скорее всего это не самая изящная, а наверное даже громоздкая  в части обработки переменнных конструкция, но тем не менее рабочая, и позволяющая сэкономить мои, и если захотите, ваши средства.

В /etc/asterisk/extensions.conf:

[sipnet]

exten => _7XXXXXXXXXX, 1, NoOp(=calling_sipnet=)

exten => _7XXXXXXXXXX, n, Set(TOTALCOUNT=5);общее количество возможных звонков
exten => _7XXXXXXXXXX, n, Set(CUR_COUNT=${SHELL(/home/asterisk/sipnet/count.sh)}) ;проверяем сколько звонков уже совершили
exten => _7XXXXXXXXXX, n, Set(ALLOW_COUNT=$[${TOTALCOUNT} - ${CUR_COUNT}]) ;отнимаем из значения одной переменной значение другой и выводим в третью переменную
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Playback(tt-weasels)) ;в случае если значение полученной выше переменной равно 0 проигрываем звуковой файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Hangup()) ;и кладем трубку

exten => _7XXXXXXXXXX, n, Set(TOTALTIME=1740) ;количество разрешенных секунд (я сознательно уменьшил на 60 секунд)
exten => _7XXXXXXXXXX, n, Set(CUR_TIME=${SHELL(/home/asterisk/sipnet/time.sh)}) ;получаем в переменную значение сколько секунд уже наговорили
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME=$[${TOTALTIME} - ${CUR_TIME}]) ;получаем в переменную сколько секунд осталось на разговоры
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Playback(tt-somethingwrong)) ; если менее 41 секунды - проигрываем файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Hangup()) ;и кладем трубку
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME_MILL=$[${ALLOW_TIME} * 1000]) ;для дальнейшего использования получаем из разрешенных секунд милисекунды

exten => _7XXXXXXXXXX, n, Set(LIMIT_WARNING_FILE=beep) ;проиграем beep в начале (типа время пошло)
exten => _7XXXXXXXXXX, n, Dial(SIP/${EXTEN}@sipnet,50,L(${ALLOW_TIME_MILL}:31000)) ;звоним 50 сек. задав длительность разговора значением ранее полученной переменной, за 31 сек. до конца разговора сообщим, что скоро время закончится (вспомним тут про 41 секунду фигурировавшую ранее)
exten => _7XXXXXXXXXX, n, Playback(vm-nobodyavail) ;в случае если никто не ответил или занято проиграем файл 
exten => _7XXXXXXXXXX, n, Hangup() ;и положим трубку

В диалплане используются два bash скрипта, получающиеие значения из базы:

cat count.sh
#!/bin/bash
echo "SELECT COUNT('id') FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%' and disposition like 'ANSWERED';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1

cat time.sh
#!/bin/bash
echo "SELECT SUM(billsec) FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1

 Соответственно, чтобы все это работало mysql база содержащая таблицу CDR должна быть подключена к Asterisk.

Еще раз поясню:
Если уже было 5-ть попыток - проигрываем звуковой файл и сбрасываем звонок.

Определяем сколько секунд осталось говорить, (я сократил на минуту общую продолжительность на всякий случай на 60 секунд), если это значение менее 41 секунды проигрываем звуковой файл, и обрываем соединение, затем умножаем значение секунд которые можно говорить на 1000 для получения единицы в милисекундах и подставляем это значение в аргумент продолжительности разговора, когда до конца будет оставаться 31 секунда проигрывается сообщение сообщающее время оставшегося разговора, затем произойдет разрыв. Отсюда и значение 41 секунда - типа все равно за 41 секунду не поговорить, все равно через 10 сек проиграет сообщение о скором принудительном разрыве.

среда, 24 августа 2016 г.

Автодозвон в Asterisk.

Почти все тоже самое, что и тут, только у меня Asterisk 1.8 собранный из исходников.
(В 13-том Asterisk-е тоже все ок.)

1. Создаем контекст для автодозвонщика, который будет дергать скрипт создающий call-файл для Астера:

[autocall]

exten => _99X.,1,Answer()
exten => _99X.,n,System(/home/asterisk/autodial.sh ${CALLERID(num)} ${EXTEN:2})
exten => _99X.,n,Playback(beep)
exten => _99X.,n,Hangup()

2.  Еще один контекст, который собственно, будет использоваться Астериском при дозвоне на основании созданного скриптом call-файла:

[dozvonka]

exten => _X,1,Dial(SIP/${EXTEN})
exten => _XXXXXXX,1,NoCDR() ;если настроен CDR, и не хотим спама в базе
exten => _XXXXXXX,n,Dial(SIP/${EXTEN}@westcall-reg)
exten => _7XXXXXXXXXX,1,NoCDR() ;если настроен CDR, и не хотим спама в базе
exten => _7XXXXXXXXXX,n,Dial(SIP/${EXTEN}@sipnet)


3. Скрипт который дергает Астер:

#!/bin/sh
CALLERNUM=$1
DIALNUM=$2
FILENAME=$CALLERNUM.call
CALLERINFO="AutoCall to $CALLERNUM <$CALLERNUM>";

echo "Action: originate" >> /home/asterisk/$FILENAME
echo "Channel: Local/$DIALNUM@dozvonka" > /home/asterisk/$FILENAME
echo "MaxRetries: 80" >> /home/asterisk/$FILENAME
echo "WaitTime: 20" >> /home/asterisk/$FILENAME
echo "RetryTime: 10" >> /home/asterisk/$FILENAME
echo "CallerID: $CALLERINFO" >> /home/asterisk/$FILENAME
echo "Extension: $CALLERNUM" >> /home/asterisk/$FILENAME
echo "Set: REALCALLERIDNUM=$DIALNUM" >> /home/asterisk/$FILENAME
echo "Priority: 1" >> /home/asterisk/$FILENAME

chown asterisk:asterisk /home/asterisk/$FILENAME
mv /home/asterisk/$FILENAME /var/spool/asterisk/outgoing/
#~~~~~~~~~~end~of~script~~~~~~~~~~~~

4. Назначим нашего Астериска владельцем скрипта:

chown asterisk:asterisk /home/asterisk/autodial.sh
и сделаем его исполняемым 
chmod +x /home/asterisk/autodial.sh

P.S. Как это работает.
Занято на номере 1111111? 
Набираем 991111111, дергается скрипт, в который передадутся значения номера вызывающего ${CALLERID(num)}, и отрежутся первые две цифры ${EXTEN:2}, создастся call-файл в /home/asterisk/, выполняютя условия скрипта, проигрывается beep, произойдет разъединение, и затем начнется дозвон, согласно диалплана контекста dozvonka. 

В консоли астера (asterisk -rvvvvvvvv) все будет наглядно. 

Когда абонет 1111111 освободится, то получит входящий звонок, когда он снимет трубку, то услышить зумер, как будто он куда-то звонил, в момент, когда 1111111 снимет трубку зазвонит телефон у того, кто инициировал дозвон, он снимет трубку, и они будут говорить)

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

BLACKLIST Asterisk

Добавить номер в черный список:

в extensions.conf:
exten => _X., 1, GotoIf($[${BLACKLIST()}=1]?blacklist)

добавляем номер нехороших людей в базу. в консоли asteriska делаем:
database put blacklist 79876543210 1

если надо удалить из базы:
database del blacklist 79876543210




пятница, 24 июля 2015 г.

Разное для Asterisk


Убить зависший peer


Сначала выведем информацию о текущих звонках

core show channels 

Убьем зависший peer --

CLI> channel request hangup SIP/xxx-xxxxxxxxxxx



Вывести версии моделей аппаратов, и номера пиров (с пробелами и переносом строк):
 for a in `asterisk -rx "sip show peers"|cut -f1 -d/` ;do asterisk -rx "sip show peer $a";done | awk '/Useragent/ {print $3"  "} /name/ {print $3,$4"  "}'  | sed ':a; /$/N; s/\n//;'



Вывести имена пользователей и их номера (с пробелами и переносом строк) :
cat /etc/asterisk/users.conf | awk '/^label/ {print $3"  "} /^fullname/ {print $3,$4"  "}'| sed ':a; /$/N; s/\n//;'

Нужно понимать, что значения print в вашем случае могут отличаться.