Как установить Asterisk 1.8 из исходников на Linux CentOS 7

Материал из Викиадмин
Перейти к навигации Перейти к поиску

Asterisk - замечательная система телефонии с просто удивительными возможностями. Впрочем, если вы решили её установить, значи описывать её возможности и преимущества нет необходимости. Итак…

Подготовка системы

Для начала отключаем Selinux, останавливаем Firewalld (который можно настроить позже) и устанавливаем нужные пакеты.

   vi /etc/selinux/config

Выставляем setenforce 0

   systemctl stop firewalld
   systemctl disable firewalld
   reboot

Установка нужных пакетов:

   yum install -y epel-release
   yum update -y
   yum install -y gcc gcc-c++ lynx bison mariadb-devel mariadb-server mariadb gmime-devel psmisc php php-mysql php-pear php-mbstring
   yum install -y tftp-server httpd make ncurses-devel libtermcap-devel sendmail sendmail-cf caching-nameserver sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel
   yum install -y kernel-devel-$(uname -r) git subversion kernel-devel php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel libtool sqlite-devel libuuid-devel bzip2
   yum install -y htop mc

Ставим и запускаем сервер базы данных. Она потом пригодится для статистики, поэтому поставим это сразу.

   systemctl enable mariadb.service
   systemctl start mariadb.service
   mysql_secure_installation

Ставим db посвежее:

   pear uninstall db
   pear install db-1.7.14

Собираем asterisk и компоненты из исходников

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

Для начала PJSIP, с ним работа через NAT будет проще. :)

   cd /usr/src/
   wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
   tar -xjvf pjproject-2.4.tar.bz2
   cd pjproject-2.4*
   ./configure –prefix=/usr –enable-shared –disable-sound –disable-resample –disable-video –libdir=/usr/lib64
   make dep
   make
   make install
   cd ..
   wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
   tar xvfz dahdi-linux-complete-current.tar.gz
   cd dahdi-linux-complete-*
   make all
   make install
   make config

А эта библиотека пригодится для конвертации wav в mp3

   cd ..
   wget https://downloads.sourceforge.net/project/lame/lame/3.98.4/lame-3.98.4.tar.gz
   tar zxvf lame-3.98.4.tar.gz
   cd lame-3.98.4
   ./configure
   make
   make install
   cd ..
   wget http://www.digip.org/jansson/releases/jansson-2.5.tar.gz
   tar zvxf jansson-2.5.tar.gz
   cd jansson-2.5
   ./configure –prefix=/usr
   make clean
   make
   make install
   ldconfig
   cd ..
   wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.6.0.tar.gz
   tar xvfz libpri-1.6.0.tar.gz
   cd libpri-1.6.0
   make
   make install
   cd ..
   wget -c http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.8.32.3.tar.gz
   tar xvfz asterisk-1.8.32.3.tar.gz
   cd asterisk-1.8.32.3
   ./configure –libdir=/usr/lib64
   contrib/scripts/get_mp3_source.sh
   make menuselect

Выбираем всё, что нам пригодится. Звуковые файлы и нужные модули - выбираем всё, потом будет поздно. :)

   make
   make install
   make samples
   make config
   useradd -m asterisk
   chown asterisk.asterisk /var/run/asterisk
   chown -R asterisk.asterisk /etc/asterisk
   chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
   chown -R asterisk.asterisk /usr/lib64/asterisk

Запуск и проверка

Теперь запускаем астериск и заходим в его консоль.

   systemctl restart asterisk
   systemctl enable asterisk
   asterisk -rvv

Примеры настроек

Для начала sip.conf

[general]
allowguest=yes ;разрешаем гостевые. 
; Да, нормальная настройка и вам можно будет звонить "на почту".

; это для "введение в заблуждение вероятного противника"
alwaysauthreject=yes

; прикидываемся непонятно чем
useragent=Cisco-SIPGateway/IOS-12.x
sdpsession=SIP Call
sdpowner=CiscoSystemsSIP-GW-UserAgent

context=from-internet ; контекст по-умолчанию для входящих

language=ru

; отключаем все кодеки и разрешаем только некоторые для аудио и видео
disalow=all
allow=alaw
allow=ulaw
allow=gsm
allow=h261
allow=h263
allow=h263p

; и пара дополнительных опций
transport=udp
srvlookup=yes
qualify=800
videosupport=yes


; регистрируемся на sip-сервере провайдера
register => user:pass@wikiadmin.net/КудаОтправить

; для звонков через провайдера
[provider]
type=peer
secret=pass
username=user
host=wikiadmin.net
fromuser=user
fromdomain=wikiadmin.net
insecure=invite
nat=force_rport
context=КонтекстПользователей
dtmfmode=inband

; шаблон
[user](!)
type=friend
host=dynamic
disallow=all
allow=alaw
allow=ulaw
allow=gsm
allow=h261
allow=h263
allow=h263p
context=user_context ;этот параметр встретим в конце extensions.conf
nat=yes
qualify=600
call-limit=1
deny=0.0.0.0/0.0.0.0
permit=172.16.0.0/255.255.255.0

[100](user) ;для примера поставим номер 100
secret=pass
callerid="Фамилия Имя"

Теперь подкорректируем extensions.conf, где и направим звонки куда нам нужно.


[general]
static=yes
writeprotect=yes
clearglobalvars=no

[globals]
CONSOLE=Console/dsp
IAXINFO=guest
TRUNK=DAHDI/G2
TRUNKMSD=1
 
; входящие с интернета.

[from-internet]

exten => post, 1, Answer() ; тут post из post@example.com
 same => n, Macro(monitor) ; этот макрос позволит нам один раз написать строки для записи разговора и больше не повторятся
 same => n, Dial(SIP/100,60,mtT) ; 60 секунд под музыку будем вызывать номер 100, если кто позвонит на почту
 same => n, Hangup()

; этот вариант просто ждёт 3 секунды и отрубается. Для защиты от перебора
exten => _X., 1, Verbose(1,Internet guest call from IP ${CHANNEL(peerip)})
 same => n, Wait(3)
 same => n, Hangup()


; исходящие

[internal]

; конверенцию разместим на номере 55, например
exten => 55, 1, Answer()
 same => n, Playback(conf-enteringno)
 same => n, Set(CONFBRIDGE_JOIN_SOUND=confbridge-join)
 same => n, Set(CONFBRIDGE(user,announce_join_leave)=yes)
 same => n, Set(CONFBRIDGE_LEAVE_SOUND=confbridge-leave)
 same => n, Macro(monitor)
 same => n, ConfBridge(55,Mc)
 same => n, Hangup()

; запись голоса и проверка. Помогает при формировании IVR
exten => 2000,1,Wait(2)
 same => n,Record(/tmp/asterisk-recording:wav)
 same => n,Wait(2)
 same => n,Playback(/tmp/asterisk-recording)
 same => n,Wait(2)
 same => n,Hangup

; эхо-тест для проверки
exten => 99,1,Playback(demo-echotest)
 same => n, Macro(monitor)
 same => n, Echo
 same => n, Hangup()

; звонки на трёхзначные внутренние сип-номера (100, 101 и т.д.)
exten => _XXX, 1, Answer()
 same => n, Macro(monitor)
 same => n, Dial(SIP/${EXTEN},60,mtT)
 same => n, Hangup()


; теперь входящие звонки и сразу добавим IVR

[incoming]
exten => КудаОтправить, 1, Answer() ; строчка из register в sip.conf
 same => n, Macro(monitor)
; я не против звонков, но давайте в рабочее время, ок?
 same => n, GotoIfTime(09:00-12:59,Mon-Fri,*,*?work)
 same => n, GotoIfTime(14:00-18:00,Mon-Thu,*,*?work)
 same => n, GotoIfTime(14:00-16:29,Mon-Fri,*,*?work)
; если в рабочее время не попали, то просто прощаемся и отрубаем звонок.
; Нет, можно и voicemail поставить, всё в ваших руках :)
 same => n, Background(/home/asterisk/ivr/RestTime)
 same => n, Hangup()
 same => n(work), Goto(incoming,s,1) ;а тут ловим переход из временных рамок и отправляем куда надо

exten => s, 1, Answer()
 same => n, Background(/home/asterisk/ivr/WorkTime)
 same => n, WaitExten(1)

exten => _XXX, 1, Dial(SIP/${EXTEN},60,mtT) ;эта строчка ловит если набрали добавочный
 same => n, Goto(incoming,t,1) ;и если добавочный не отвечает или недоступен, отправляем на оператора, куда и таймаут падает


exten => 3, 1, Answer() ;если нажали 3, то
 same => n, Queue(sales|tT|||40) ;отправляем на очередь sales (об этом чуть позже) на 40 секунд
 same => n, Dial(SIP/100,20,mtT) ; и потом на секретаря на номер 100 на 20 секунд, если из очереди не взяли звонок
 same => n, Hangup()

exten => i, 1, Answer() ;если набрали неправильно (incorrect), отправляем так же на timeout
 same => n, Goto(incoming,t,1)

; и теперь уже строчки, которые ловят дождавшихся оператора
exten => t, 1, Dial(SIP/100,20,mtT)
 same => n, Hangup()


; разумеется, пользователям надо и звонить. Для этого 
[outgoing]
exten => _[7,8]9XXXXXXXXX, 1, Answer()
 same => n, Macro(monitor)
 same => n, Dial(SIP/7${EXTEN:1}@provider,120,Ttr) ; provider у нас описан в sip.conf сразу за register
 same => n, HangUp

; а теперь тот самый макрос для записи разговора
[macro-monitor]
exten => s, 1, Set(MONITOR_FILE=/var/calls/${UNIQUEID})
 same => n, MixMonitor(${MONITOR_FILE}.wav)
 same => n, Set(CDR(filename)=${UNIQUEID}.wav) ; эта строка потребовалась, чтобы в ACDR нормально появлялись файлы для прослушивания.


;
; контексты (исходящие)
;

[user_context] ;этой группе (context в шаблоне в sip.conf) разрешим:
include => incoming ; принимать входящие
include => internal ; пользоваться внутренними сервисами и звонками
include => outgoing ; и звонить наружу


Ну и, как и обещал, про очереди, добавив в конец queues.conf следующее:

[sales]
strategy = rrmemory ; это равномерно распределит звонки.
                    ; Можно указать так же ringall (всем сразу) и linear (по очереди как написано)
member = SIP/100
member = SIP/101
member = SIP/102

это кратко, очередь имеет массу настроек.

Вот кратко что можно настроить. Если есть желание что-то добавить - добро пожаловать на почту.