Мне чтобы Zabbix мог инициализировать звонок нужен sip-клиент
Я перепробовал и sipcmd, pjsua
и ни один из них меня не устроил, но тут наткнулся на одну заметку где автор упомянул что он использует консольный клиент linphonec
. Заинтересовался, и о чудо! По-другому я бы не выразился — я могу его использовать для своего проекта по настройке «Уведомление через Asterisk из Zabbix Server 4.4»
Что понадобится:
srv-asterisk (172.33.33.2)
srv-bionic (172.33.33.14)
Шаг №1: На сервере где развернут сервис Asterisk 16
создаю SIP
—аккаунт:
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/sip.conf [2005](default-sip) callerid="Number 2005" <2005> username=2005 secret=pbx2005 ekzorchik@srv-asterisk:~$ sudo asterisk -rx "core reload"
Шаг №2: Теперь на системе srv-bionic
устанавливаю консольный SIP
—клиент:
ekzorchik@srv-bionic:~$ apt-cache search linphone-nogtk linphone-nogtk - SIP softphone - console-only client ekzorchik@srv-bionic:~$ apt-cache show linphone-nogtk | grep Version Version: 3.6.1-3build1 ekzorchik@srv-bionic:~$ sudo apt-get install -y linphone-nogtk
Шаг №3: Теперь чтобы инициализировать авторизацию на сервисе Asterisk
запускаю клиент linphonec
:
ekzorchik@srv-bionic:~$ linphonec linphonec> linphonec> register sip:2005@172.33.33.2 172.33.33.2 pbx2005 linphonec> Registration on <sip:172.33.33.2> successful. linphonec>
если выйти из консольного режима sip
-клиента, последующий запуск приводит к автоматической регистрации, т.к. данные авторизации сохраняются в конфигурационном файле в корне пользовательского каталога:
linphonec> quit Terminating... Unregistration on <sip:172.33.33.2> done. linphonec> ekzorchik@srv-bionic:~$ linphonec linphonec> Registration on <sip:172.33.33.2> successful. linphonec> ekzorchik@srv-bionic:~$ ls -al .linphone* -rw------- 1 ekzorchik ekzorchik 60 Dec 2 21:40 .linphonec_history -rw------- 1 ekzorchik ekzorchik 2142 Dec 2 21:40 .linphonerc
- в файл
.linphonec_history
-> записывается история работы - в файл
.linphonerc
-> он создается при успешной регистрации наAsterisk
—сервере и потому последующий запуск уже идет без указания авторизации.
Проверяю на сервере где установлен Asterisk
, что действительно консольный клиент авторизован:
ekzorchik@srv-asterisk:~$ sudo asterisk -rvvv Asterisk 16.6.2, Copyright (C) 1999 - 2018, Digium, Inc. and others. Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 623) -- Registered SIP '2005' at 172.33.33.14:5060 ekzorchik@srv-asterisk:~$ sudo asterisk -rx "sip show peers" Name/username Host Dyn Forcerport Comedia ACL Port Status Description 2002/2002 (Unspecified) D No No A 0 UNKNOWN 2003/2003 (Unspecified) D No No A 0 UNKNOWN 2005/2005 172.33.33.14 D No No A 5060 OK (10 ms) 3 sip peers [Monitored: 1 online, 2 offline Unmonitored: 0 online, 0 offline] ekzorchik@srv-asterisk:~$
Из вывода видно, что так оно и есть — консольный клиент авторизован.
Шаг №4: Для чего нужен такой клиент спросил я себя? А как использовать его? Поставил задачу: Нужно с помощью него сделать вызов конкретного номера где на определенном номере запрограммировано действие. А действие создание к примеру файла.
Для решения данной задачи создаю правило набора.
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/extensions.conf [run] exten => 2006,1,Wait(1) exten => 2006,n,System(echo "1" > /tmp/a.log) exten => 2006,n,Hangup() [phones] include = local include = info include = run ekzorchik@srv-asterisk:~$ sudo asterisk -rx "dialplan reload" Dialplan reloaded. ekzorchik@srv-asterisk:~$ linphonec> Registration on <sip:172.33.33.2> successful. linphonec> linphonec> help call 'call <sip-url or number> [options]' : initiate a call to the specified destination. Options can be: --audio-only : initiate the call without video. --early-media : sends audio and video stream immediately when remote proposes early media. linphonec> linphonec> call 2006 Establishing call id to <sip:2006@172.33.33.2>, assigned id 1 Contacting <sip:2006@172.33.33.2> linphonec> Call 1 to <sip:2006@172.33.33.2> in progress. linphonec> Call declined. linphonec> Call 1 with <sip:2006@172.33.33.2> ended (Call declined).
нажимаю клавишу <ENTER>
linphonec> linphonec> quit Terminating... Unregistration on <sip:172.33.33.2> done. linphonec> ekzorchik@srv-bionic:~$
и происходит запуск команды System
которая от имени учетной записи из под которой работает Asterisk
(у меня из под Login: asterisk
) создает в директории /tmp
текcтовый файл.
srv-asterisk*CLI> !bash root@srv-asterisk:~# ls -l /tmp | grep a.log -rw-r--r-- 1 asterisk asterisk 2 Dec 2 22:13 a.log root@srv-asterisk:~# exit exit srv-asterisk*CLI>
Шаг №5: На основе решенной задачи «Шаг №4» теперь я хочу чтобы данный вызов происходил из запуска клиента в консоли bash
, т.к. чтобы я могу запустить скрипт и он инициализирует через sip
—клиент вызов определенного номера:
ekzorchik@srv-bionic:~$ whereis linphonecsh linphonecsh: /usr/bin/linphonecsh /usr/share/man/man1/linphonecsh.1.gz ekzorchik@srv-bionic:~$ linphonecsh --help Usage: linphonecsh <action> [arguments] where action is one of
Вот вызов как должно быть:
ekzorchik@srv-bionic:~$ linphonecsh init ekzorchik@srv-bionic:~$ linphonecsh register --host 172.33.33.2 --username 2005 --password pbx2005 ekzorchik@srv-bionic:~$ linphonecsh dial 2006@172.33.33.2 Establishing call id to <sip:2006@172.33.33.2>, assigned id 1 Call 1 to <sip:2006@172.33.33.2> in progress. ekzorchik@srv-bionic:~$ linphonecsh exit ekzorchik@srv-asterisk:~$ ls -lh /tmp/ | grep a.log -rw-r--r-- 1 asterisk asterisk 2 Dec 2 22:20 a.log ekzorchik@srv-asterisk:~$
Строки отработали успешно, файл создал, на текущий момент дата его создания соответствует времени инициализации звонка.
Шаг №6: Создать простенький скрипт на bash
который инициализирует вызов:
Сперва нужно запустить linphonec
единожды дабы настроить свою учетную запись, затем уже:
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/extensions.conf [runs] exten => 2006,1,Wait(1) exten => 2006,n,NoOp(${CALLERID}${DATETIME}}) exten => 2006,n,System(echo "1" > /tmp/a.log) exten => 2006,n,Hangup() ekzorchik@srv-asterisk:~$ sudo systemctl stop asterisk && sudo systemctl start asterisk && sudo systemctl status asterisk | head -n5 ● asterisk.service - LSB: Asterisk PBX Loaded: loaded (/etc/init.d/asterisk; generated) Active: active (running) since Tue 2019-12-03 00:03:05 MSK; 12ms ago Docs: man:systemd-sysv-generator(8) Process: 862 ExecStop=/etc/init.d/asterisk stop (code=exited, status=0/SUCCESS) ekzorchik@srv-asterisk:~$ ekzorchik@srv-bionic:~$ linphonec linphonec> linphonec> register sip:2005@172.33.33.2 172.33.33.2 pbx2005 linphonec> Registration on <sip:172.33.33.2> successful. linphonec> quit Terminating... Unregistration on <sip:172.33.33.2> done. linphonec> ekzorchik@srv-bionic:~$
Либо же полученный конфигурационный файл .linphonec
поместить к скрипт.
Скрипт №1:
ekzorchik@srv-bionic:~$ nano call #!/bin/bash cat > ~/.linphonerc << EOF [rtp] download_ptime=0 audio_rtp_port=7078 video_rtp_port=9078 audio_jitt_comp=60 video_jitt_comp=60 nortp_timeout=30 audio_adaptive_jitt_comp_enabled=1 video_adaptive_jitt_comp_enabled=1 [sip] media_encryption=none default_proxy=0 guess_hostname=1 contact=sip:ekzorchik@unknown-host inc_timeout=30 in_call_timeout=0 delayed_timeout=4 use_ipv6=0 register_only_when_network_is_up=1 register_only_when_upnp_is_ok=1 display=0 capture=0 show_local=0 size=cif [net] download_bw=0 upload_bw=0 mtu=1300 [auth_info_0] username=2005 passwd=pbx2005 [proxy_0] reg_proxy=<sip:172.33.33.2> reg_identity=sip:2005@172.33.33.2 reg_expires=3600 reg_sendregister=1 publish=0 dial_escape_plus=0 [sound] remote_ring=/usr/share/sounds/linphone/ringback.wav playback_gain_db=0.000000 mic_gain_db=0.000000 [audio_codec_0] mime=opus rate=48000 channels=1 enabled=1 [audio_codec_1] mime=speex rate=16000 channels=1 enabled=1 [audio_codec_2] mime=speex rate=8000 channels=1 enabled=1 [audio_codec_3] mime=PCMU rate=8000 channels=1 enabled=1 [audio_codec_4] mime=PCMA rate=8000 channels=1 enabled=1 [audio_codec_5] mime=AAL2-G726-40 rate=8000 channels=1 enabled=0 [audio_codec_6] mime=AAL2-G726-32 rate=8000 channels=1 enabled=0 [audio_codec_7] mime=AAL2-G726-24 rate=8000 channels=1 enabled=0 [audio_codec_8] mime=AAL2-G726-16 rate=8000 channels=1 enabled=0 [audio_codec_9] mime=G726-40 rate=8000 channels=1 enabled=0 [audio_codec_10] mime=speex rate=32000 channels=1 enabled=0 [audio_codec_11] mime=G726-32 rate=8000 channels=1 enabled=0 [audio_codec_12] mime=G726-24 rate=8000 channels=1 enabled=0 [audio_codec_13] mime=G726-16 rate=8000 channels=1 enabled=0 [audio_codec_14] mime=L16 rate=44100 channels=1 enabled=0 [audio_codec_15] mime=L16 rate=44100 channels=2 enabled=0 [audio_codec_16] mime=G722 rate=8000 channels=1 enabled=0 [video_codec_0] mime=VP8 rate=90000 enabled=1 [video_codec_1] mime=MP4V-ES rate=90000 enabled=1 recv_fmtp=profile-level-id=3 [video_codec_2] mime=H263-1998 rate=90000 enabled=0 recv_fmtp=CIF=1;QCIF=1 [video_codec_3] mime=theora rate=90000 enabled=0 [video_codec_4] mime=H263 rate=90000 enabled=0 EOF kill -9 `pidof linphonec` export PATH=$PATH:`pwd` linphonecsh init -c ~/.linphonerc -d 6 -l /tmp/log.txt linphonecsh status registered > /dev/null 2>&1 if [[ $? == 255 ]] then echo "Linphone daemon no started" sleep 2 fi linphonecsh register --host 172.33.33.2 --username 2005 --password pbx2005 REGISTER_STATUS=$(linphonecsh status registered) if [[ $? == 0 ]] then echo "SIP Account not register" exit 0 else echo $REGISTER_STATUS linphonecsh dial 2006@172.33.33.2 fi linphonecsh unregister linphonecsh exit ls -al .linphone*
После не забываем сохранить внесенные изменения. Присваиваем атрибуты запуска скрипта:
ekzorchik@srv-bionic:~$ chmod +x call
и запускаем:
ekzorchik@srv-bionic:~$ ./call kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] Linphone daemon no started registered=-1 Establishing call id to <sip:2006@172.33.33.2>, assigned id 1 Call 1 to <sip:2006@172.33.33.2> in progress. -rw------- 1 ekzorchik ekzorchik 198 Dec 3 00:12 .linphonec_history -rw------- 1 ekzorchik ekzorchik 2142 Dec 3 00:12 .linphonerc ekzorchik@srv-bionic:~$
Лог работы скрипта:
[Dec 3 00:14:39] NOTICE[1226]: chan_sip.c:24889 handle_response_peerpoke: Peer '2005' is now Reachable. (19ms / 2000ms) -- Unregistered SIP '2005' -- Registered SIP '2005' at 172.33.33.14:5060 == Using SIP RTP CoS mark 5 -- Executing [2006@phones:1] Wait("SIP/2005-00000001", "1") in new stack == Spawn extension (phones, 2006, 1) exited non-zero on 'SIP/2005-00000001' -- Unregistered SIP '2005'
Скрипт успешно отрабатывает.
Скрипт №2:
ekzorchik@srv-bionic:~$ sudo apt-get install expect -y ekzorchik@srv-zabbix:~$ nano call2 #!/bin/bash kill -9 `pidof linphonec` #or #kill -9 $(pidof linphonec) export PATH=$PATH:`pwd` /usr/bin/expect - <<EOD set timeout 10 spawn linphonec sleep 2 expect "linphonec>*" sleep 2 send "register sip:2005@172.33.33.2 172.33.33.2 pbx2005\r" expect "linphonec>*" send "call 2006\r" sleep 2 send "quit\n" sleep 4 EOD ekzorchik@srv-zabbix:~$ chmod +x call2 ekzorchik@srv-zabbix:~$ ./call2 kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] spawn linphonec Ready Warning: video is disabled in linphonec, use -V or -C or -D to enable. linphonec> Registration on <sip:172.33.33.2> successful. linphonec> register sip:2005@172.33.33.2 172.33.33.2 pbx2005 linphonec> ekzorchik@srv-zabbix:~$
и 100%
отработка скрипта.
Вот теперь я считаю заметку работоспособной.
Т.е. я могу теперь на Zabbix
-сервер поставить данный клиент сформировать bash
скрипт и по триггеру дергать его, а он в свою очередь инициализирует звонок на определенный Extension
и запускает что заложено в плане вызова. КРУТО не правда ли.
Вот такие вот возможности предоставляет консольный sip
клиент linphonec
и его утилита linphonecsh
.
Пока на этом всё. С уважением автор блога Олло Александр aka ekzorchik.