Архив за месяц: Апрель 2015

Asterisk, отправка факса на email

Перерыл кучу интернета, дабы добраться до истины, но ни где не нашел достойного и подробного описания с объяснением до момента «взлетела». Попробую исправить это упущение.
И так, у нас есть Ubuntu 14.04.1, Asterisk 12. Требуется настроить его на принятие факсов. Не будем использовать решение от Digium, а будем использовать spandsp в ходящее в поставку Asterisk. Но т.к. мы собирали Asterisk сами, то данный модуль у нас отсутствует. Скачаем его и пересоберем Asterisk по новой.
Скачиваем пакет spandsp

wget http://soft-switch.org/downloads/spandsp/spandsp-0.0.6.tar.gz

Разархивируем его

tar -xzvf spandsp-0.0.6.tar.gz

Для работы нам понадобиться библиотека libtiff , установим ее. Сначала пропишем новый репозиторий и обновим

echo 'deb http://cz.archive.ubuntu.com/ubuntu saucy main universe' >> /etc/apt/sources.list.d/extra.list
apt-get update

Теперь установим библиотеку

apt-get install libtiff4 libtiff4-dev

Библиотека установлена, теперь перейдем не посредственно к установке spandsp. Переходим в каталог с spandsp и собираем его.

cd spandsp-0.0.6
./configure --prefix=/usr/local
make
make install

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

/etc/ld.so.conf.d/spandsp.conf << EOF
/usr/local
/usr/local/lib
EOF

Собираем Asterisk с поддержкой spandsp модуля. Обратимся к статье Установка Asterisk. Для начала выполним очистку

make distclean

По новой проверим все

./configure

Перейдем не посредственно к меню добавления модулей

make menuselect

В разделе Resource Modules необходимо убедится что выбрано два модуля. res_fax и res_fax_spandsp
Сохраняем конфигурацию и пересобираем Asterisk по новой

make
make install

После запускаем новый Asterisk

service asterisk start

Заходим в консоль

asterisk -rvv

И проверяем подключены ли модули

fax show capabilities

В нормальном случае должно выглядеть так

Registered FAX Technology Modules:

Type : Spandsp
Description : Spandsp FAX Driver
Capabilities : SEND RECEIVE T.38 G.711 GATEWAY

1 registered modules

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

module show like fax

В нормальном случае должно выглядеть так

Module                         Description                              Use Count  Status
res_fax.so                     Generic FAX Applications                 1          Running
res_fax_spandsp.so             Spandsp G.711 and T.38 FAX Technologies  0          Running
2 modules loaded

Если чуда не произошло то пытаемся перезапустить и загрузить данные модули

CLI> module reload res_fax.so
CLI> modeule load res_fax_spandsp.so

Если Asterisk выдал ошибку

Error loading module 'res_fax_psandsp.so' : libspandsp.so.2 cannot open shared object file: No such file or directory

То выходим из консоли Asterisk и вводим следующую команду

 ln /usr/local/lib/libspandsp.so.2.0.0  /lib/libspandsp.so.2

Модули подключили, а как же принять факс, и сохранить его в файл на сервере? Для этого отредактируем файл конфигурации диалплана в разделе [incoming_calls]

[incoming_calls]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии 2)
exten => _X.,n,answer()
exten => _X.,n,ReceiveFAX(/home/user/fax/rr.tif,f)

Перезапустим диалплан.

sudo asterisk -rcvv
Asterisk*CLI> dialplan reload

Пробуем отправить факс. Проверяем наличие файла в указанной директории. Идем дальше. Теперь требуется отправить данный файл на email.
Для начала установим пакет говорящий сам за себя sendemail

sudo apt-get install sendemail

Попробуем тестово отправить наше сообщение из консоли по smtp протоколу через какой нибудь сервер. Для этого нужно чтобы уже на этом сервере у нас была заведена учетная запись и пароль. В моем случае я назвал учетку fax

sendemail -f sender@local.host -t dest@example.com -u test -m "test test" -s mail.example.com:25 -o tls=auto -xu fax -xp p@s$w0rd -a "/home/user/fax/rr.tif"

Письмо ушло и мы получили его на той стороне. Теперь попробуем заставить это делать Asterisk
Для этого снова отредактируем фаил конфигурации диалплана. Приведем его к такому виду

[general]

[globals]

[default]

[incoming_calls]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии 2)
exten => _X.,n,Goto(fax-rx,receive,1)    ;переводим вызов на "процедуру" принятия факса

[outgoing_calls]
exten => _X.,1,Verbose(Совершается исходящий вызов)
exten => _X.,n,answer()
exten => _X.,n,Dial(SIP/Operator_SIP/${EXTEN})

[phones]
include => outgoing_calls

[fax-rx]
exten => receive,1,NoOP(------------------- FAX from ${CALLERID(number)} ------------------)
 same => n,Answer()     ;подымаем трубку
 same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID})      ;загоняем в переменную время номер звонящего и еще какую то херь
 same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)})
; same => n,Set(FAXOPT(localstationid)=Name)
; same => n,Set(FAXOPT(maxrate)=14400)
; same => n,Set(FAXOPT(minrate)=2400)
 same => n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
 same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
 same => n,NoOp(**** RECEIVING FAX : ${DT} ****)
 same => n,ReceiveFAX(/home/user/fax/${FAXOPT(headerinfo)}.tif,f)
 same => n,System(sendemail -f sender@local.host -t dest@example.com -u test -m "test test" -s mail.example.com:25 -o tls=auto -xu fax -xp p@s$w0rd -a "/home/severin/fax/${FAXOPT(headerinfo)}.tif")
 same => n,HangUp()

Сохраняем. Перезапускаем диалплан.

sudo asterisk -rcvv
Asterisk*CLI> dialplan reload

Проверяем работспособность.

Ссылки на статьи которые я использовал:
Ссылка 1
Ссылка 2
Ссылка 3
Ссылка 4

Asterisk, совершаем первый вызов на городскую линию.

И так, Asterisk у нас работает на входящие звонки, но не работает на исходящие. Надо решать.
Для того чтобы совершать и принимать звонки (да, то что мы описывали в предыдущей статье в разделе [default] тоже работает, но после внесения изменений описанных здесь, потребность и возможность в использовании этого раздела для приема звонков отпадет) добавим конфигурацию для нашего оператора.
Т.к. у нас оператор связи работает по SIP протоколу, обратимся для редактирования к файлу sip.conf

 sudo nano /etc/asterisk/sip.conf

И внесем данные об операторе

[Operator_SIP]
type=peer               ;указываем что при получении INVITE(вызов) будем сравнивать не имя поставщика сервисов а его IP адрес
host=sipprovaider.ru    ;указываем от кого мы должны получать/отправлять INVITE
fromuser=8800000        ;имя пользователя для аутентификации
defaultuser= 8800000
secret=p@ssword$
context=incoming_calls  ;задаем контекст, на него же будем принимать звонки
dtmfmode=rfc2833        ;метод генерации тонального DTFM-кода
disallow=all            ;запрещаем все кодеки
allow=gsm               ;разрешаем кодек GSM
allow=ulaw              ;разрешаем кодек
insecure=invite         ;

Далее нам требуется отредактировать диалплан.

 sudo nano /etc/asterisk/extensions.conf

Отредактируем его до такого вида

[general]

[globals]

[default]

[incoming_calls]
exten => _X.,1,Verbose(Получен вызов с внешней линии)
exten => _X.,n,Dial(SIP/100)

Как видно в контекст

[incoming_calls]

который мы описали в sip.conf поступает звонок и мы его сразу переводим на номер 100.
Перезапустим в Asterisk конфигурационные файлы.

sudo asterisk -rcvv
AsteriskGARS*CLI> dialplan reload
AsteriskGARS*CLI> sip reload

И попробуем совершить звонок с городского номера на телефонный аппарат.
Теперь требуется совершить звонок с внутреннего номера на городской. Для этого снова отредактируем файл диалплана

 sudo nano /etc/asterisk/extensions.conf

Следующим образом. Создадим раздел [outgoing_calls].

[outgoing_calls]
exten => _X.,1,Verbose(Совершается исходящий вызов)
exten => _X.,n,Dial(SIP/Operator_SIP/${EXTEN})

${EXTEN} — переменная которая содержит набранный вами номер.
Еще один важный момент, т.к. у нас телефонный аппарат находится в контексте phones, а метод вызова находится в контексте outgoing_calls, то они между собой не связаны, для того чтобы связать между собой эти два контекста воспользуемся выражением include. Добавим в фаил extensions.conf вот такие строки

[phones]
include => outgoing_calls

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

sudo asterisk -rcvv
AsteriskGARS*CLI> dialplan reload

Все должно работать.

Принимаем первый внешний звонок на внутренний номер.

И так, телефон подключен к Asterisk, а Asterisk подключен к оператору связи, теперь как бы дозвониться нам до абонента 100, с внешнего мира? Нужен Dialplan. В данном случае, мы на прямую пробросим наш городской номер на телефонный аппарат.Переименуем дефолтный файл диалплана extensions.conf

 sudo mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.backup

Создадим новый файл extensions.conf.

sudo nano /etc/asterisk/extensions.conf

Диалплан состоит из контекстов (это очень важно), кто знаком с программированием, то это сравнимо с процедурами. По умолчанию всегда имеются три контекста [general] [globals] и [default](не указывается явно).
Для решения наших целей нам нужен контекст default, добавим в него такие действия. Поступает звонок, АТС беред трубку, проигрывает звуковой файл, кладет трубку:

[general]

[globals]

[default]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии)        ;передаем произвольный текст в детальный вывод
exten => _X.,n,Answer()                                         ;поднимаем трубку
exten => _X.,n,Playback(hello-world)                            ;проигрываем звуковой файл
exten => _X.,n,Hangup()                                         ;ложим трубку

Сохраняем, перезапустим диалплан и проверим.

sudo asterisk -rcvv
dialplan reload

_X. — это шаблон, он обозначает любой набор цифр. В место шаблона можно было бы указать внешний номер нашей организации, но будем более универсальны.

Проверили, послушали приветствие, убедились что звонки с внешних линий к нам проходят. Теперь усложним: будем сразу поступающие звонки перенаправлять на внутренний номер 100. Для этого воспользуемся приложением Dial. Данное приложение пытается соединить каналы. Правим наш диалпан, заменим строчку в которой идет проигрыш звукового сигнала, на Dial.

[general]

[globals]

[default]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии)        ;передаем произвольный текст в детальный вывод
exten => _X.,n,Answer()                                         ;поднимаем трубку
exten => _X.,n,Dial(SIP/100)                                    ;переводим вызов на абонента 100
exten => _X.,n,Hangup()                                         ;ложим трубку

Сохраняем, перезапустим диалплан и проверим.

sudo asterisk -rcvv
dialplan reload

Если все правильно сделали, то должно заработать. Обращаю ваше внимание, что на исходящие звонки, с внутренних номеров на городские, наша АТС еще не настроена.

Подключение Asterisk к оператору связи

Сегодня будем пробовать подключаться к оператору связи через SIP протокол.
Так как это SIP протокол, то нам придется редактировать файл sip.conf

 sudo nano /etc/asterisk/sip.conf

Для подключения будем использовать выражение register, «данное выражение используется для регистрации вашего Asterisk на удаленном сервере».
У нас есть логин- телефон, пароль и адрес сервера для регистрации, попробуем зарегистрироваться. Делаем это в разделе [general]

[general]
register=88009999999:p@$$w0RD@sip01.serveroperator.ru

После занесения данных, сохраняем файл и пере запускаем конфигурацию sip протокола asterisk.

sudo asterisk -rcvv
sip show peers

Если не было ошибок проверяем регистрацию

Asterisk*CLI> sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time
sip01.serveroperator.ru:5060            N      88009999999        105 Registered           Mon, 13 Apr 2015 08:23:35
1 SIP registrations.

Все ОК, мы зарегистрировались на другом сервере, в данном случае на сервере оператора.

Подключение телефонного аппарата к Asterisk

Описание находится в книге Asterisk будущее телефонии Глава 4. Конфигурация SIP-телефона.

Будем рассматривать на примере Yealink-T22.
Переименуем наш файл конфигурации sip.conf в sip.conf.backup

sudo mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.backup

Создадим новый файл конфигурации sip.conf

sudo nano /etc/asterisk/sip.conf

И в несем в него минимальные конфигурационные данные для работы с SIP телефоном:

[100]                   ;аккаунт регистрации, считай его ID и номер телефона
type=friend             ;указываем что устройство может принимать и совершать вызовы
host=dynamic            ;указываем что IP адрес у телефона динамический т.е. по DHCP
context=phones          ;"контекст" в котором данный номер работает.

Далее заходим на сам телефонный аппарат по его IP адресу. И в разделе Аккаунт выставляем адрес сервера телефонии, и аккаунт (номер) телефона в Asterisk:
090420151620
Жмем сохранить и переходим дальше к нашему серверу.
Т.к. sip.conf файл уже настроен его нужно применить. Для этого входим в консоль управления Asterisk

sudo asterisk -rcvv

И перезапускам файл sip.conf

sip reload

Если все прошло без ошибок, то можно проверить статус подключения.

Asterisk*CLI> sip show peers
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status                                                                                                                               Description
100/100                   192.168.120.10                           D  Auto (No)  No             5062     Unmonitored                                                                                                                        
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 0 offline]

В данном случае все ОК и телефон зарегистрировался.

Поговорим о безопасности.
Т.к. наш телефон могут взломать и воспользоваться международными и междугородными звонками за наш счет, обезопасим себя, установим сложные пароли на вэб вход телефона (сами разберитесь где это). И защитим немного сам сервере Asterisk. Открываем sip.conf

sudo nano /etc/asterisk/sip.conf

В разделе [general].Сменим порт на который хотим принимать SIP соединения.

bindport=6743

Запрещаем отправку детального ответа «на отказ в соединении»

alwaysauthreject=yes

В дискрипшене аппарата ограничиваем диапазон сетей с которых ожидать подключение.

deny=0.0.0.0/0.0.0.0
permit=192.168.120.0/24

Устанавливаем пароль для аутентификации

secret=p@$$W0rd

В итоге получаем такой конфиг:

[general]
bindport=4563           ;порт на который желаем принимать SIP соединение
alwaysauthreject=yes    ;не выдаем детального сообщения причины почему нет подключения.

[100]                   ;аккаунт регистрации, считай его ID и номер телефона
type=friend             ;указываем что устройство может принимать и совершать вызовы
host=dynamic            ;указываем что IP адрес у телефона динамический т.е. по DHCP
context=phones          ;"контекст" в котором данный номер работает.
secret=p@$$W0rd         ;пароль для аутентификации аппарата на сервере
deny=0.0.0.0/0.0.0.0    ;запрещаем подключение со всех IP адресов
permit=192.168.120.0/24 ;разрешаем подключение с определенного диапазона IP адресов

Это не полный перечень как обезопасить себя, статья на эту тему.

Установка Asterisk

Годная статья , автор молодец, по этому запостю ее к себе с маленькими обновлениями.

Установку Asterisk 12 будем проводить на ОС Ubuntu 14.04.01 server x86_64, установленную на Oracle VM VirtualBox.

Заходим в терминал Ubuntu и обновим системные пакеты.

sudo apt-get update
sudo apt-get upgrade

Перезагрузим систему

sudo reboot

Синхронизируем время, для этого установим сервер NTP

sudo apt-get install ntp

Установим зависимости, которые будут необходимы для корректной работы Asterisk

sudo apt-get install build-essential linux-headers-`uname -r` openssh-server mysql-server mysql-client libgnutls28 bison flex curl sox libncurses5-dev libssl-dev libmysqld-dev libmysqlclient-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool git g++ subversion uuid-dev vim-nox php5 php5-curl php5-cli php5-mysql php-pear php-db php5-gd

В процессе установки нужно будет ввести пароль для root пользователя MYSQL
080420151126
Перезагружаем систему

sudo reboot

Создадим папку, куда будем скачивать дистрибутивы Asterisk, DAHDI и LibPRI

sudo mkdir -p /usr/src/asterisk-12
cd /usr/src/asterisk-12

Скачиваем исходники Asterisk 12.8.1 (на момент написания инструкции последняя актуальная версия), DAHDI (пакет, ранее называвшийся zaptel, который осуществляет обработку аналоговых и цифровых интерфейсов), libPRI (библиотека, предназначенная для работы с потоковыми TDM-интерфейсами ISDN: PRI (Primary Rate Interface) и BRI (Basic Rate Interface))

sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-12.8.1.tar.gz
sudo wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-2.10.1+2.10.1.tar.gz
sudo wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4.15.tar.gz

Распаковываем скаченные исходники

sudo tar xvfz dahdi-linux-complete-2.10.1+2.10.1.tar.gz
sudo tar xvfz libpri-1.4.15.tar.gz
sudo tar xvfz asterisk-12.8.1.tar.gz

Для начала компилируем DAHDI

cd /usr/src/asterisk-12/dahdi-linux-complete-2.10.1+2.10.1
sudo make all
sudo make install
sudo make config

Далее компилируем LibPRI

cd /usr/src/asterisk-12/libpri-1.4.15/
sudo make
sudo make install

Начнем установку Asterisk 12. Необходимые модули устанавливаем командой make menuselect.

cd /usr/src/asterisk-12/asterisk-12.8.1/
sudo ./configure

При установке может вылететь ошибка

configure: error: *** JSON support not found (this typically means the libjansson development package is missing)

Для этого делаем следующее

cd /usr/src/
sudo wget http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
sudo tar xvfz jansson-2.7.tar.gz
cd jansson-2.7/
sudo ./configure --prefix=/usr/
sudo make clean
sudo make
sudo make install
sudo ldconfig

Далее запускаем еще раз установку Asterisk

cd /usr/src/asterisk-12/asterisk-12.8.1/
sudo ./configure
sudo make menuselect

080420151455
По большей части, все необходимые модули уже включены. Вы можете что-то добавить или удалить. При выборе модуля у него будет короткое описание, за что он отвечает.

В разделе Add-ons выбираем модули format_mp3(понадобиться чтобы делать голосовое меню не в gsm формате, а в mp3) и все опции относящиеся к MySQL. Они понадобятся в случае подключения FreePBX.
Не забудьте загрузите модуль meetme.
Во вкладке Core Sound Packages – выберите необходимые форматы звуковых пакетов.
080420151502
В Music On Hold File Packages включаем все модули.
В Extras Sound Packages включаем первые 4 модуля содержащие EN
После настройки нажмите F12 для сохранения данных и выхода в окно консоли.
Далее вводим команду:

sudo make

Во время выполнения функции make у меня вылезла ошибка.

**************************************************************
***                                                        ***
***   --->  READ THIS OR YOUR BUILD WILL FAIL  <---        ***
***                                                        ***
*** format_mp3 has been selected to be installed, but the  ***
*** mp3 decoder library has not yet been downloaded into   ***
*** the source tree.  To do so, please run the following   ***
*** command:                                               ***
***                                                        ***
***          $ contrib/scripts/get_mp3_source.sh           ***
***                                                        ***
**************************************************************

   [CC] app_mysql.c -> app_mysql.o
   [LD] app_mysql.o -> app_mysql.so
   [CC] cdr_mysql.c -> cdr_mysql.o
   [LD] cdr_mysql.o -> cdr_mysql.so
   [CC] format_mp3.c -> format_mp3.o
format_mp3.c:39:24: fatal error: mp3/mpg123.h: Нет такого файла или каталога
 #include "mp3/mpg123.h"
                        ^
compilation terminated.
make[1]: *** [format_mp3.o] Ошибка 1
make: *** [addons] Ошибка 2

Для её устранения, вводим требуемую команду.

sudo contrib/scripts/get_mp3_source.sh

Запускаем опять команду make

sudo make

Далее вводим команды

sudo make install
sudo make samples
sudo make config

Перезагружаем сервер

sudo reboot

Проверяем работоспособность Asterisk. Вводим команду

sudo rasterisk

Далее автор предлагает обезопасить систему путем ввода и передачи брозд правления новому пользователю. Я этого не делал, но все же приведу цитату.
Если необходимо обезопасить систему, можем задать пользователя для управления Asterisk. Создаем пользователя, его каталог и пароль. Далее даем ему права для работы с Asterisk.

sudo adduser asterisk
sudo mkdir /home/username
sudo passwd username
sudo chown -R asterisk. /var/run/asterisk
sudo chown -R asterisk. /etc/asterisk
sudo chown -R asterisk. /var/{lib,log,spool}/asterisk
sudo chown -R asterisk. /usr/lib/asterisk

Перезагружаем сервер

sudo reboot

Заходим под пользователем asterisk

su asterisk

Проверяем работоспособность Asterisk. Вводим команду

rasterisk

И попадаем в консоль управления Asterisk.
Сделаем некоторую настройку для MySQL. Заходим в MySQL.

mysql -uusername -ppassword -hlocalhost

Здесь сокращения:
-h host
-u user
-p password
Пробел после них отсутствует
Или mysql –u username -p
После ввода пароля мы окажемся в консоле mysql. Создадим пользователя asterisk с localhost и паролем ‘password’.

create user 'asterisk'@'localhost' identified by 'password';

Пользователь создан. Для проверки посмотрим список пользователей:

select user,host,password from mysql.user;

Создадим базу данных asteriskcdrdb, asterisk.

create database asterisk;
create database asteriskcdrdb;

Далее определяем владельца базы данных

GRANT ALL PRIVILEGES ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asterisk@localhost IDENTIFIED BY 'password';
flush privileges;