Мне чтобы 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.