CentOS 7 & Asterisk 16.


28.12.2018

Всем привет! Вернёмся к теме астериска. И на этот раз попробуем развернуть 16ю версию. Прошлые статьи вполне функциональны и версии 15.6.2, которую там рассматривали вполне достаточно для полноценной работы телефонии. Но мы же всегда хотим стремится к большему. Просто добавим побольше деталей и лоска процессу развёртывания телефонии! Приступим:

Ставлю образ CentOS-7-x86_64-Minimal-1810.iso. Этот процесс вам знаком и рассматривать его не будем. Дальнейшие действия будут происходить уже в подключенном сеансе PuTTY. Делаем всё то что надо сделать на свеже установленном минимальном CentOS:

Смотрим релиз:

cat /etc/*release*


Ну а если нас интересует версия ядра, то набираем:

uname -r

Жмём Ctrl+L чтобы очистить терминал и далее отключим SELinux:

sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config

Далее отключим «firewalld»:

systemctl stop firewalld
systemctl disable firewalld

Обновим систему и перезагрузим:

yum update -y && reboot

Когда сервер уйдёт в перезагрузку - не нужно закрывать сеанс терминала PuTTY, просто нажмите на значок в левом верхнем углу и перезапустите сеанс:


Далее, традиционно, в качестве хорошего тона настройки серверов, приведём в порядок время:

yum install -y ntp && ntpdate pool.ntp.org && \ chkconfig ntpd on && service ntpd start

Установим несколько первоначально нужных пакетов:

yum -y install NetworkManager-tui net-tools.x86_64 mc nano vim

Взглянем на пакет «NetworkManager-tui» - набираем команду:

nmtui


И как вы могли заметить – это символьно-графический интерфейс, в котором можно изменить сетевые настройки, поменять hostname или же активировать добавленную сетевую карту.

Также благодаря пакету «net-tools.x86_64» нам теперь доступна команда:

ifconfig -a

Кстати если написать её с большой буквы, то работать не будет!

А благодаря пакету «mc» у нас есть двух панельный менеджер:


А если вам вдруг не нравиться редактировать файлы в «VI» или в «VIM» или же в «NANO», то можете воспользоваться редактором «mc», который интуитивно понятен тем, кто любил «Norton Commander»:

mcedit /etc/sysconfig/network-scripts/ifcfg-eth0

После такого редактирования не забываем перезапустить сетевые службы:

/etc/init.d/network restart

Но вернёмся к теме установки астериска, поставим нужные пакеты:

yum install -y epel-release dmidecode gcc-c++ ncurses-devel libxml2-devel make wget
yum install -y openssl-devel newt-devel kernel-devel sqlite-devel libuuid-devel
yum install -y gtk2-devel jansson-devel binutils-devel bzip2 bzip2-libs patch httpd mod_ssl
yum install -y php php-pear phpmyadmin php-common php-gd php-mysql php-xml php-mbstring

Далее создадим пользователя, от которого будет работать астериск. Сделать это нужно потому что нам может прийти в голову отключить «root» пользователя в целях безопасности.

adduser asterisk && passwd asterisk

Даём права «sudo» пользователю asterisk:

gpasswd -a asterisk wheel

Переключаемся на пользователя «asterisk»:

su asterisk

Далее установим библиотеку "PJSIP" - она нужна для функционирования протокола «SIP»:

Создадим каталог «build» и перейдём в него. Кстати значок ~ означает делать всё в домашнем каталоге пользователя от которого исходит команда:

cd

mkdir ~/build && cd ~/build

Теперь на машине где есть браузер идём на ресурс https://www.pjsip.org/download.htm и смотрим правильную ссылку которую надо вписать в команду «wget»:


Скачаем исходник «PJSIP»:

wget https://www.pjsip.org/release/2.8/pjproject-2.8.tar.bz2

Распакуем:

tar xvjf pjproject-2.8.tar.bz2

И переходим в распакованный каталог:

cd /home/asterisk/build/pjproject*

Конфигурируем компиляцию (вся команда одной строкой):
./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr


Запускаем компиляцию:

sudo make dep

Запускаем дополнительную компиляцию и установку:

sudo make && sudo make install && sudo ldconfig

Система попросит пароль от пользователя «asterisk».

Далее перегружаем систему:

sudo reboot

После загрузки авторизуемся под «asterisk» и вернёмся в наш каталог «pjproject-2.8»:

cd /home/asterisk/build/pjproject-2.8

И затем даём команду:

sudo ldconfig -p | grep pj

Удостоверимся что будет такой вывод:


Установка Asterisk 16

Вернёмся в каталог «build»:

cd ~/build

На этот раз качаем исходник самого астериска:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

Напомню по аналогии с предыдущим скачиванием – если команда не сработала значит меняем ссылку, которую можно взять с сайта www.asterisk.org.

Извлекаем исходник:

tar -zxvf asterisk-16-current.tar.gz

Переходим в распакованный каталог:

cd asterisk*

Для того чтобы можно было использовать «mp3» формат в нашем астериске – на текущем этапе установки скачаем требуемые дополнения:

sudo yum -y install svn

./contrib/scripts/get_mp3_source.sh

Далее традиционное конфигурирование, компиляция и установка:

sudo contrib/scripts/install_prereq install

В моём случае не нашлось пакетов «speexdsp-devel», «iksemel-devel», «libresample-devel» и «hoard»


Но мы продолжаем:

sudo ./configure --libdir=/usr/lib64 --with-jansson-bundled

Дожидаемся победного появления значка «астериск»:


Далее команда:

sudo make menuselect

В появившемся диалоге – в разделе «Add-ons» отметим клавишей «Enter» чеки на пунктах - «chan_mobile», «format_mp3», «app_mysql», «cdr_mysql» и «res_config_mysql»:


Далее в разделе «Applications» выделяем пункт «app_macro»:


Жмём «Save & exit» конечно. И далее долгая компиляция с установкой:

sudo make && sudo make install

В какой-то момент, перед тем как закончить, попросит пароль – будьте внимательны!

Далее генерация файлов образцов конфигураций:

sudo make samples

Затем ставим старт астериска при загрузке системы:

sudo make config

Далее от root пользователя нужно назначить нового владельца каталогам астериска:

su root
chown asterisk. /var/run/asterisk
chown asterisk. -R /etc/asterisk
chown asterisk. -R /var/{lib,log,spool}/asterisk
su asterisk

Ключ на старт - проверяем запуск:

sudo service asterisk start
sudo /sbin/chkconfig asterisk on
sudo asterisk -rvv


Выходим из CLI командой «exit». И ура – астериск установлен и готов к настройке!

Русская озвучка системных сообщений:


sudo mkdir /var/lib/asterisk/sounds/ru

Переходим туда:

cd /var/lib/asterisk/sounds/ru

Качаем пакет звуков:

sudo wget http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-ru-wav-current.tar.gz

Распаковываем:

sudo tar xfz asterisk-core-sounds-ru-wav-current.tar.gz

Проверим:
ls

Не забываем про момент с пользователем от которого работает астериск – его нужно объявить в файле «/etc/asterisk/asterisk.conf» в разделах runuser и rungroup предварительно раскоментировав их конечно!

nano /etc/asterisk/asterisk.conf

;;;;;
runuser=asterisk
rungroup=asterisk
;;;;;


Приступаем к настройке абонентов.

Сразу хочу объявить следующее:
Контекст [int[ - это внутренние звонки;
Контекст [ext] - это внешние звонки.
Делаем дубликат файла «sip.conf» и затем переходим к его редактированию:

cp /etc/asterisk/sip.conf /etc/asterisk/sip.conf.init

nano /etc/asterisk/sip.conf

Удаляем всё! – Ставим курсор вверху и жмём «ALT+T» и пишем следующее:

;;;;;
[general]
;тут пишем внешний ip адрес сервера если есть.
externaddr=94.97.200.10:5060
language=ru
context=default
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=no
tcpbindaddr=0.0.0.0
transport=udp
srvlookup=yes
allowguest=no
limitonpeers=yes

[authentication]

;Шаблон для бухгалтерии
[buh-phones](!)
type=friend
context=int
secret=123
host=dynamic
nat=no
qualify=yes
canreinvite=no
callgroup=1
pickupgroup=1
call-limit=1
dtmfmode=auto
disallow=all
allow=alaw
allow=ulaw
allow=g729
allow=g723
allow=g722

;описание номеров бухгалтерии
[100](buh-phones)
callerid="Number 100" <100>
[101](buh-phones)
callerid="Number 101" <101>
[102](buh-phones)
callerid="Number 102" <102>

;Шаблон для проектировщиков
[project-phones](!)
type=friend
context=int
secret=456
host=dynamic
nat=no
qualify=yes
canreinvite=no
callgroup=2
pickupgroup=2
call-limit=1
dtmfmode=auto
disallow=all
allow=alaw
allow=ulaw
allow=g729
allow=g723
allow=g722

;описание номеров проектного отдела
[111](project-phones)
callerid="Number 111" <111>
[112](project-phones)
callerid="Number 112" <112>
[113](project-phones)
callerid="Number 113" <113>
[114](project-phones)
callerid="Number 114" <114>
;;;;;

Далее нам надо настроить план звонков наших объявленных абонентов в «extensions.conf»:

cp /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.init

nano /etc/asterisk/extensions.conf
Всё стираем и пишем:


;;;;;

[general]
static=yes
writeprotect=no
[globals]
[default]

;Конец разговора
[handup-sip]
exten => _X!,1,HangUp()

;Местные звонки
[int]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
include => handup-sip
;;;;;


Вроде можно звонить. Но надо ещё сделать перезагрузку ядра:

asterisk -r

core reload

Настраиваем 2 аппарата – пробуем звонить. Теперь лог этого звонка можно увидеть в файле «/var/log/asterisk/cdr-csv/Master.csv»:

cat /var/log/asterisk/cdr-csv/Master.csv


А теперь добавим внешку на примере нашей любимой из прошлых статей «задармы». Снова редактируем «sip.conf» и в конце дописываем:

;;;;;
[527389]
host=sip.zadarma.com
insecure=invite,port
type=friend
fromdomain=sip.zadarma.com
disallow=all
allow=alaw
dtmfmode=auto
secret=ju8cN3
defaultuser=527389
trunkname=527389
fromuser=527389
callbackextension=527389
context=ext
qualify=400
directmedia=no
nat=force_rport,comedia
;;;;;


Далее, естественно нужно объявить контекст «ext» в диал плане:

В контекст «int» добавим возможность звонить на внешние номера:

exten => _XXX.,1,Dial(SIP/${EXTEN}@527389)

А также добавим контекст «ext», который позволит дозваниваться до нас из вне – но только звонок идёт сразу на номер 100 – предположим там будет голосовое меню.

[ext]
exten => 527389,1,Dial(SIP/100)

Теперь наш extensions.conf выглядит вот так:


;;;;;
[general]
static=yes
writeprotect=no
[globals]
[default]

;Конец разговора
[handup-sip]
exten => _X!,1,HangUp()

;местные звонки
[int]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@527389)

include => handup-sip

;звонки снаружи
[ext]
exten => 527389,1,Dial(SIP/100)
;;;;;


Перезагрузим ядро:

sudo asterisk -r

core reload

Смотрим регистрацию всех аппаратов в том числе и провайдера:

sip show peers

Проверяем звонки на внешку и из внешки. Ура! Всё работает!

Голосовое меню с приветствием.

План создания голосового меню – Приветствие – Предложение ввести номер абонента – Если не ввёл уводим звонок на секретаря.

А теперь откровение – КАК ЗАПИСАТЬ ГОЛОСОВОЕ МЕНЮ СРАЗУ В ТРУБКУ ТЕЛЕФОНА?

Делаем:

В файле extensions.conf – в контексте «int» нужно внедрить этот блок:

; ; ; ; ; ; ; ; ; ;
;Номер для записи меню, закончить запись жмём #
exten => 00001, 1, NoOp()
exten => 00001, n, Wait(2)
exten => 00001, n, Playback(beep)
exten => 00001, n, Record(/tmp/vmenu${EXTEN:2}:wav)
exten => 00001, n, Wait(1)
exten => 00001, n, Playback(/tmp/vmenu${EXTEN:2})
exten => 00001, n, Wait(2)
exten => 00001, n, Hangup()
; ; ; ; ; ; ; ; ; ;


sudo asterisk -r
dialplan reload

Теперь звоним на номер 00001 – после звукового сигнала наговариваем в трубку наше приветствие и в конце жмём #, и оно упадёт в каталог «/tmp». Файл будет называться «vmenu001.wav». После создаём специальный для голосового меню каталог и копируем созданный файл туда.

mkdir /var/lib/asterisk/moh/vmenu

cp /tmp/vmenu001.wav /var/lib/asterisk/moh/vmenu

Далее вносим соответствующие изменения в план набора:

nano /etc/asterisk/extensions.conf

Нужно вписать контекст [vmenu]:

;;;;;;;;;;;;;
[vmenu]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/var/lib/asterisk/moh/vmenu/vmenu001)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
;Звоним по введенному добавочному
exten => _XXX,1,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(vmenu,s,1)
;Если звонящий ничего не вводит, то звоним секретарю
exten => t,1,Dial(SIP/100)
;;;;;;;;;;;;;


Далее в контексте «ext» делаем перенаправление звонков извне от номера 100 на приветствие:

[ext]
exten => _X.,1,Goto(vmenu,s,1)

Сохраняем файл и перезагружаем диал-план.

Проверяем – звоним извне на «задарму» и попадаем на наше приветствие. Ура!

Теперь наш диал-план выглядит вот так:


;;;;;;;;;;;;;
[general]
static=yes
writeprotect=no
[globals]
[default]

;Конец разговора
[handup-sip]
exten => _X!,1,HangUp()

;Местные звонки
[int]

;Номер для записи меню, закончить запись жмём #
exten => 00001, 1, NoOp()
exten => 00001, n, Wait(2)
exten => 00001, n, Playback(beep)
exten => 00001, n, Record(/tmp/vmenu${EXTEN:2}:wav)
exten => 00001, n, Wait(1)
exten => 00001, n, Playback(/tmp/vmenu${EXTEN:2})
exten => 00001, n, Wait(2)
exten => 00001, n, Hangup()

;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@527389)

include => handup-sip

;Меню приветствия
[vmenu]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/var/lib/asterisk/moh/vmenu/vmenu001)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
;Звоним по введенному добавочному
exten => _XXX,1,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(vmenu,s,1)
;Если звонящий ничего не вводит, то уводим звонок секретарю
exten => t,1,Dial(SIP/100)

; Звонки снаружи
[ext]
exten => _X.,1,Goto(vmenu,s,1)
;;;;;;;;;;;;;


Статистика звонков

Для начала нужно чтобы истории звонков складывались не в лог-файл по умолчанию "/var/log/asterisk/cdr-csv/Master.csv" а в базу данных "mariadb". Напоминаю, что мы теперь всё время работаем под пользователем «asterisk» и поэтому на важных командах пишем «sudo».

Для начала установим на CentOS СУБД MariaDB:

sudo yum -y install mariadb mariadb-server mariadb-devel

Запустим:
sudo systemctl start mariadb

Ставим в автозагрузку:
sudo systemctl enable mariadb

Проверим статус:
sudo systemctl status mariadb

Теперь надо пройти опросник СУБД:

sudo mysql_secure_installation

Для начала на вопрос о пароле root от СУБД – просто нажимаем Enter

Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation

Далее мы установим пароль для root:
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!


Далее уберём анонимных пользователей:
Remove anonymous users? [Y/n] y
... Success!


Далее разрешим конектиться к базе только будучи на localhost:
Disallow root login remotely? [Y/n] y
... Success!


Далее почистим тестовые базы:
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!


Перечитаем привилегии чтобы применить изменения:
Reload privilege tables now? [Y/n] y
... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!


Закончили с настройками безопасности СУБД mariadb.

Далее подключаемся к mysql - создаем пользователя и базу данных:

Запускаем командную строку mysql:

mysql -uroot -p

Создаём базу данных «asterisk»:

create database asterisk;

Включаем работу с только что созданной базой:

use asterisk;

И теперь даём команду на создание таблицы «cdr» внутри нашей новой базы «asterisk» (копируйте весь блок):


CREATE TABLE `cdr` (
`id` int(9) unsigned NOT NULL auto_increment,
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`uniqueid` varchar(32) NOT NULL default '',
`userfield` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `calldate` (`calldate`),
KEY `accountcode` (`accountcode`),
KEY `uniqueid` (`uniqueid`),
KEY `dst` (`dst`),
KEY `src` (`src`) )
ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Далее мы придумали пользователя, который будет иметь право вносить данные в нашу базу данных. Пусть будет «astermd». И скажем СУБД о том, что этот пользователь с паролем «123» будет заполнять таблицы в нашей базе данных «asterisk»:

grant all on asterisk.* to 'astermd'@'localhost' identified by '123';

Перечитаем привилегии:

flush privileges;

exit

Командой «exit» мы вышли из внутренних команд СУБД. Далее устанавливаем odbc коннекторы:

sudo yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64

Редактируем файлы конфигурации «/etc/asterisk/res_odbc.conf». Добавляем в самый конец:

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => astermd
password => 123

Далее редактируем ещё один конфиг от odbc:

nano /etc/asterisk/cdr_adaptive_odbc.conf

Также в самый конец вставляем этот блок:

[cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate

Создаем файл /etc/odbc.ini
sudo nano /etc/odbc.ini

Заполняем:

[MySQL-asterisk]
Description = MySQL Asterisk database
Driver = MySQL
Server = localhost
User = astermd
Password = 123
Socket = /var/lib/mysql/mysql.sock
Database = asterisk

Едем дальше:
sudo nano /etc/odbcinst.ini

В конец файла в блоке [MySQL] после пункта «FileUsage = 1» вставляем эти 2 строки:

CPTimeout =
CPReuse =

Далее:

nano /etc/asterisk/cdr.conf

Ищем блок [csv] и меняем «usegmtime» на «no»:
usegmtime=no

Далее перезапустим весь астериск

sudo service asterisk restart

Далее заупстим и поставим в автозагрузку сервис «httpd», который обеспечит нам WEB страницу:

sudo systemctl start httpd
sudo systemctl enable httpd

Набираем в браузере IP адрес сервера – и там тестовая страница апача – здорово, но не то что нам надо.

Скачиваем «Asterisk-CDR-Viewer-Mod»

cd /usr/src
sudo wget https://github.com/prog-it/Asterisk-CDR-Viewer-Mod/tarball/master
sudo tar xzvf master
ls -la

У нас в итоге появился каталог «prog-it-Asterisk-CDR-Viewer-Mod-b337420»


Копируем содержимое этого каталога в корень web сервера:

sudo cp -r /usr/src/prog-it-Asterisk-CDR-Viewer-Mod-b337420/. /var/www/html

Далее берём предложенный образец файла с конфигурацией и делаем из него собственно рабочий файл, в котором следом указываем настройки подключения к базе данных cdr viewer.

sudo cp /var/www/html/inc/config/config.php.sample /var/www/html/inc/config/config.php

Редактируем файл «/var/www/html/inc/config/config.php»:

sudo nano /var/www/html/inc/config/config.php

В самом начале файла видим данные подключения – меняем на свои:


### Подключение к базе данных
'db' => array(
# Тип базы, который поддерживается PDO. Например: mysql, pgsql
'type' => 'mysql',
# Хост
'host' => 'localhost',
# Порт
'port' => '3306',
# Пользователь
'user' => 'astermd',
# Имя базы
'name' => 'asterisk',
# Пароль
'pass' => '123',
# Название таблицы
'table' => 'cdr',
# Доп. опции подключения
'options' => array(
//PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
),

Далее чуть ниже находим:

## Путь к папке, где находятся записи Asterisk. БЕЗ слеша на конце
'monitor_dir' => '/home/calls',
И меняем на:
'monitor_dir' => '/mnt/calls',


Далее ниже по конфигу находим «storage_format» и делаем его => 5;


Сохраняем и выходим.

Кстати «/mnt/calls» нужно ещё создать и дать права:
sudo mkdir /mnt/calls
sudo chown -R asterisk:asterisk /mnt/calls

Перезапускаем астериск:
sudo reboot

Далее необходимо добавить дополнительное поле в таблицу «cdr» хранения имени файла:

mysql -uroot -p
use asterisk;
alter table `cdr` add column `filename` varchar(120) DEFAULT 'none' after `userfield`;
flush privileges;

exit

Далее редактируем файл «/etc/asterisk/cdr_mysql.conf»:
nano /etc/asterisk/cdr_mysql.conf

В конец добавляем:
alias realdst => realdst
alias filename => filename

Редактируем «/etc/asterisk/extensions.conf»:
sudo nano /etc/asterisk/extensions.conf

В раздел [globals] добавим:

DIR_RECORDS=/mnt/calls/

Как вы наверно заметили мы плавно переходим к записи разговоров, которые будут падать в «/mnt/calls». Но давайте заморочимся на то чтобы записи были в «mp3». Для того чтобы происходила конвертация в «mp3» формат нужно в систему установить утилиту «lame»! Сделаем это:

su root
cd /usr/src
wget http://sourceforge.net/projects/lame/files/lame/3.98.4/lame-3.98.4.tar.gz
tar zxvf lame-3.*
cd lame-3.*
./configure
make && make install
su asterisk

Едем дальше. Вернёмся в «extensions.conf» - нужно внедрить макрос [macro-recording] для записи звонков. Но этот контекст нужно вставить перед контекстами звонков в конфиге:


[macro-recording]
exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);


Но торопитесь закрывать файл – нужно ещё внести изменения в контексты «int» и «vmenu»:

Изменения в [int]:

;Звонок на внутренний номер
exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX,n,Dial(SIP/${EXTEN})
;Звонок на внешний номер
exten => _XXX.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX.,n,Dial(SIP/${EXTEN}@527389)

Изменения в [vmenu]:

;Меню приветствия
[vmenu]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/var/lib/asterisk/moh/vmenu/vmenu001)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
;Звоним по введенному добавочному
exten => _XXX,n,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,n,Playback(privacy-incorrect)
exten => _XXX,n,Goto(vmenu,s,1)
;Если звонящий ничего не вводит, то звоним секретарю
exten => t,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => t,n,Dial(SIP/100)

Вот теперь сохраняем и выходим и перезагружаем сервер:
sudo reboot

Проверяем – совершаем звонок – и наблюдаем что в каталоге «mnt/calls» появился файл типа - 1545973716.0-2018-12-28-12_08-100-114.mp3. Набираем IP адрес сервера в браузере и видим, что запись можно не только прослушать но и скачать.

Ну не круто ли? Теперь остаётся только сделать чтобы в каталог «/mnt/calls» монтировалась шара – но это мы проходили в предыдущих статьях.

Ниже привожу итоговые файлы конфигурации:

«sip.conf»:

;;;;;
[general]
;тут пишем внешний ip адрес сервера если есть.
externaddr=94.97.200.10:5060
language=ru
context=default
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=no
tcpbindaddr=0.0.0.0
transport=udp
srvlookup=yes
allowguest=no
limitonpeers=yes

[authentication]

;Шаблон для бухгалтерии
[buh-phones](!)
type=friend
context=int
secret=123
host=dynamic
nat=no
qualify=yes
canreinvite=no
callgroup=1
pickupgroup=1
call-limit=1
dtmfmode=auto
disallow=all
allow=alaw
allow=ulaw
allow=g729
allow=g723
allow=g722

;описание номеров бухгалтерии
[100](buh-phones)
callerid="Number 100" <100>
[101](buh-phones)
callerid="Number 101" <101>
[102](buh-phones)
callerid="Number 102" <102>

;Шаблон для проектировщиков
[project-phones](!)
type=friend
context=int
secret=456
host=dynamic
nat=no
qualify=yes
canreinvite=no
callgroup=2
pickupgroup=2
call-limit=1
dtmfmode=auto
disallow=all
allow=alaw
allow=ulaw
allow=g729
allow=g723
allow=g722

;описание номеров проектного отдела
[111](project-phones)
callerid="Number 111" <111>
[112](project-phones)
callerid="Number 112" <112>
[113](project-phones)
callerid="Number 113" <113>
[114](project-phones)
callerid="Number 114" <114>


[527389]
host=sip.zadarma.com
insecure=invite,port
type=friend
fromdomain=sip.zadarma.com
disallow=all
allow=alaw
dtmfmode=auto
secret=3GdNc74
defaultuser=527389
trunkname=527389
fromuser=527389
callbackextension=527389
context=ext
qualify=400
directmedia=no
nat=force_rport,comedia
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

«extensions.conf»:

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

[globals]
DIR_RECORDS=/mnt/calls/

[default]

;Конец разговора
[handup-sip]
exten => _X!,1,HangUp()


[macro-recording]
exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);


;Местные звонки
[int]

;Номер для записи меню, закончить запись жмём #
exten => 00001, 1, NoOp()
exten => 00001, n, Wait(2)
exten => 00001, n, Playback(beep)
exten => 00001, n, Record(/tmp/vmenu${EXTEN:2}:wav)
exten => 00001, n, Wait(1)
exten => 00001, n, Playback(/tmp/vmenu${EXTEN:2})
exten => 00001, n, Wait(2)
exten => 00001, n, Hangup()


;Звонок на внутренний номер
exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX,n,Dial(SIP/${EXTEN},15)

;Звонок на внешний номер
exten => _XXX.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX.,n,Dial(SIP/${EXTEN}@527389)

include => handup-sip

[vmenu]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/var/lib/asterisk/moh/vmenu/vmenu001)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
;Звоним по введенному добавочному
exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX,n,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,n,Playback(privacy-incorrect)
exten => _XXX,n,Goto(vmenu,s,1)

;Если звонящий ничего не вводит, то звоним секретарю
exten => t,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => t,n,Dial(SIP/100)


[ext]
exten => _X.,1,Goto(vmenu,s,1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Статьи по теме:

https://www.tecmint.com/install-asterisk-on-centos-7/
https://serveradmin.ru/nastroyka-servera-telefonii-asterisk-s-nulya/
http://linux.mixed-spb.ru/asterisk/cdr-viewer-how-to-make.php


Линки для данного проекта:

CentOS 7.6.1810
CentOS-7-x86_64-Minimal-1810.iso

Asterisk 16
https://www.asterisk.org/downloads
downloads.asterisk.org
drive.google

Русская озвучка сервисных сообщений
downloads.asterisk.org
drive.google

Asterisk-CDR-Viewer-Mod
Asterisk-CDR-Viewer-Mod
drive.google

Утилита lame
sourceforge.net
drive.google


Навигация: