Ubuntu 14.04 + Asterisk 11 + CDR-Stats

в 10:30, , рубрики: asterisk, руководство, системное администрирование

Предлагаю пошаговое руководство по установке и настройке сервера Ubuntu, телефонной станции Asterisk и системы обработки и аналитики звонков CDR-STATS.

Установка Ubuntu

Ставим Ubuntu server 14.04 (LTS), скачав дистрибутив с официального сайта. Во время установки я указал SSH + LAMP + SAMBA во избежание потом долгого процесса установки нужных компонентов.

Логинимся на сервер. Первым делом я поставил midnight commander (люблю DOS-интерфейс, да и удобно):

sudo apt-get install mc -y

Следующий шаг вы можете пропустить, если вам не нужен GUI для сервера.

Для большего удобства и ввиду некоторых особенностей будущего сервера я накатил GUI:
sudo apt-get install --no-install-recommends lubuntu-desktop

После установки:
sudo reboot

По окончании загрузки видим классический графический интерфейс пользователя.

Настраиваем все необходимые сетевые интерфейсы, имена сервера и его Alias. (Примеры настроек не буду приводить, дабы не вводить людей в заблуждение).

Следующим шагом будет установка webmin на сервер. Я воспользовался официальной документацией с сайта webmin.com:

Using the Webmin APT repository
If you like to install and update Webmin via APT, edit the /etc/apt/sources.list file on your system and add the lines:
deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib
You should also fetch and install my GPG key with which the repository is signed, with the commands:
cd /root
wget http://www.webmin.com/jcameron-key.asc
apt-key add jcameron-key.asc
Возможно, потребуется запустить данную команду от root
sudo apt-key add jcameron-key.asc
You will now be able to install with the commands:
sudo apt-get update
sudo apt-get install webmin
All dependencies should be resolved automatically.

После выполнения всех шагов webmin будет доступен по адресу: your-server-ip-or-name:10000

Настало время настроить правила для iptables. На просторах сети я нашел очень хорошую статью по защите сервера Asterisk с помощью iptables. Источник: blog.ls20.com/securing-your-asterisk-voip-server-with-iptables. Статья на английском, но все достаточно просто для понимания.

Теперь очень важный момент! Не импортируйте правила в iptables стандартным способом! Это не сработает:

iptables-restore < filename <= Не сработает

Необходимо выполнить следующие действия:

Найти файл /etc/iptables.up.rules и скопировать его куда-либо (так сказать, сделайте бэкап), а файл etc/iptables.up.rules заменить полученным вами в результате предыдущих действий.
Если вы все сделали правильно, то в webmin Networking/Linux Firewall вы увидите все необходимые правила. Ставлю доступные обновления для установленных компонентов:

sudo apt-get update && sudo apt-get upgrade –y && sudo reboot

Итак, сервер установлен, настроен и обновлен

Установка Asterisk

Настало время для установки asterisk. В текущей конфигурации я буду использовать Asterisk 11:
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz

Распакуем все это:
tar -zxvf asterisk-11-current.tar.gz
tar -zxvf dahdi-linux-complete-current.tar.gz
tar -zxvf libpri-1.4-current.tar.gz
Поставим некоторые пакеты, буде таковые не были установлены ранее:
sudo apt-get install build-essential libncurses5-dev openssl libxml2-dev

Дальше есть два пути:

1-й путь:

запустить скрипт установки зависимых пакетов для работы сервера Asterisk:
sudo /usr/src/asterisk-11.12.0/contrib/scripts/install_prereq install
Скрипт ставит все необходимые зависимости и пакеты, но очень много ненужного.

2-й путь:

Установка из исходников
Перед этим действием я сделал checkpoint на моем hyper-v сервере, во избежание так сказать:
sudo apt-get install libncurses5-dev openssl libssl-dev zlib1g zlib1g-dev mpg123 linux-headers-`uname -r` build-essential mysql-server libmysqlclient15-dev php5 php5-cli php5-mysql php5-gd php-pear apache2 curl sox bison flex cpp g++ gcc make libauthen-pam-perl libio-pty-perl libnet-ssleay-perl libxml2 libxml2-dev libaudiofile-dev subversion libsqlite3-dev

Ок. пакеты установили. Теперь самое время разобраться с установкой самого Asterisk.

Ставим DAHDI:
cd /usr/src/dahdi-linux-complete-2.10.0+2.10.0
sudo make all
sudo make install
sudo make config
Ставим LibPRI:
cd /usr/src/libpri-1.4.15
sudo make
sudo make install

Ну и сам Asterisk:
cd /usr/src/asterisk-11.12.0
./configure
sudo make menuselect

Выбираем нужные компоненты. Поскольку я собираюсь хранить CDR в базе MySQL и прикрутить web-интерфейс CDR-STATS, отмечаю, что включил модули format_mp3, app_mysql, cdr_mysql и res_config_mysql.

В остальном, за исключением звуков (а мне нужны en, en-gb и ru) все остается стандартным:
sudo make install

В процессе установки при выборе format_mp3 нужно выполнить:
contrib/scripts/get_mp3_source.sh

Продолжаем установку:
sudo make install

Здесь может быть ваша реклама. Пьем кофе, чай, печеньки и ожидаем окончания процесса установки.

Следующий шаг samples и config. Тестовые конфиги:
sudo make samples

Для несочинения скрипта автозапуска:
sudo make config

Ффуухх! Поставили. Стартуем:
sudo asterisk start

Подключаемся:
sudo rasterisk

Проверяем версию DAHDI:
*CLI>dahdi show version

Проверяем версию LibPRI:
*CLI>pri show version
*CLI>exit

Так, поставили, посмотрели. На текущий момент asterisk запускается от пользователя root, что, как бы, не комильфо. Поэтому делаем следующее:

sudo service asterisk stop

Создаем пользователя asterisk и добавляем его в группу asterisk:

sudo adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk PBX" asterisk

Создали, меняем права на нужные каталоги:
sudo chown -R asterisk:asterisk /var/lib/asterisk
sudo chown -R asterisk:asterisk /var/log/asterisk
sudo chown -R asterisk:asterisk /var/run/asterisk
sudo chown -R asterisk:asterisk /var/spool/asterisk
sudo chown -R asterisk:asterisk /usr/lib/asterisk
sudo chown -R asterisk:asterisk /dev/dahdi
sudo chmod -R u=rwX,g=rX,o= /var/lib/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/log/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/run/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/spool/asterisk
sudo chmod -R u=rwX,g=rX,o= /usr/lib/asterisk
sudo chmod -R u=rwX,g=rX,o= /dev/dahdi
sudo chown -R root:asterisk /etc/asterisk
sudo chmod -R u=rwX,g=rX,o= /etc/asterisk

В файле /etc/default/asterisk раскомментируем две строчки:
AST_USER=«asterisk»
AST_GROUP=«asterisk»

Запускаем asterisk:
sudo service asterisk start

Смотрим, от какого пользователя запустился Asterisk:
ps aux|grep aster

И должны увидеть подобное:

asterisk 2793 3.0 0.8 2539536 26540? Ssl 20:21 0:00 /usr/sbin/asterisk -U asterisk -G asterisk

Увидели? Значит все ок.
Теперь научим asterisk писать CDR в MySQL.

Ставим для начала:
sudo apt-get install mysql-client

Логинимся в mysql:
sudo mysql -p

Enter password:
Welcome to the MySQL monitor. Commands end with; or g.
mysql>

Создаем базу:

mysql> create database asteriskcdrdb;

Создаем в базе “asteriskcdrdb” таблицу “cdr”, вот с такой структурой:

mysql> use asteriskcdrdb;
mysql>CREATE TABLE `cdr` (
`acctid` int(11) NOT NULL AUTO_INCREMENT, 
`src` varchar(80) DEFAULT NULL, 
`dst` varchar(80) DEFAULT NULL,  
`calldate` datetime NOT NULL, 
`clid` varchar(80) DEFAULT NULL, 
`dcontext` varchar(80) DEFAULT NULL, 
`channel` varchar(80) DEFAULT NULL, 
`dstchannel` varchar(80) DEFAULT NULL, 
`lastapp` varchar(80) DEFAULT NULL, 
`lastdata` varchar(80) DEFAULT NULL, 
`duration` int(10) unsigned DEFAULT NULL, 
`billsec` int(10) unsigned DEFAULT NULL, 
`disposition` varchar(80) NOT NULL DEFAULT '', 
`amaflags` varchar(80) DEFAULT NULL, 
`accountcode` int(10) unsigned DEFAULT NULL, 
`uniqueid` varchar(32) DEFAULT NULL, 
`userfield` varchar(80) DEFAULT NULL, 
`import_cdr` tinyint(4) NOT NULL DEFAULT '0', 
PRIMARY KEY (`acctid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Создаем пользователя asterisk с паролем 'asterisk':

mysql> CREATE USER asterisk_user IDENTIFIED BY 'asterisk_password';

Теперь даем доступ для пользователя “asterisk” с паролем “asterisk″ к базе “asteriskcdrdb” только с localhost:

mysql> grant all on asteriskcdrdb.* to 'asterisk'@'localhost' identified by 'asterisk';
mysql> flush privileges;

Теперь укажем нашему Астериску писать CDR в базу. Для этого в файле “/etc/asterisk/cdr_mysql.conf” раскомментируем и меняем строчки:

[global]
hostname=localhost
dbname=asteriskcdrdb
table=cdr
password=asterisk
user=asterisk
sock=/var/lib/mysqld/mysqld.sock

Для применения изменений перезагружаем модуль cdr_mysql.so:
sudo rasterisk
*CLI>module unload cdr_mysql.so

Unloaded cdr_mysql.so
  == Unregistered 'mysql' CDR backend

*CLI> module load cdr_mysql.so

Loaded cdr_mysql.so
  == Parsing '/etc/asterisk/cdr_mysql.conf': Found
    -- Found alias start for column calldate
 Loaded cdr_mysql.so => (MySQL CDR Backend)

Чтобы убедиться, что мы все сделали правильно, в консоли Астериска вводим:
*CLI> cdr mysql status

Connected to asterisk on socket file /var/lib/mysql/mysql.sock using table cdr for 0 hours, 2 minutes, 7 seconds.
Wrote 0 records since last restart.

Если у вас такое же сообщение, то все настроено верно.

Установка CDR-STATS

Воспользуемся инструкцией: www.cdr-stats.org/documentation/beginners-guide/howto-installing-on-standalone-asterisk
Все казалось бы просто:
wget –no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/master/install/install-cdr-stats-asterisk.sh -O install-cdr-stats-asterisk.sh
bash ./install-cdr-stats-asterisk.sh

Но, дьявол, как обычно, кроется в деталях. У вас не получится установить CDR-stats подобным образом, потому что скрипт вывалится со следующей ошибкой:

bash ./install-cdr-stats-asterisk.sh
./install-cdr-stats-asterisk.sh: line 1: $'r': command not found
./install-cdr-stats-asterisk.sh: line 2: !DOCTYPE: No such file or directory
./install-cdr-stats-asterisk.sh: line 3: html: No such file or directory
./install-cdr-stats-asterisk.sh: line 4: head: No such file or directory
./install-cdr-stats-asterisk.sh: line 5: title: No such file or directory
./install-cdr-stats-asterisk.sh: line 6: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 7: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 8: $'r': command not found
./install-cdr-stats-asterisk.sh: line 9: $'r': command not found
./install-cdr-stats-asterisk.sh: line 10: $'r': command not found
./install-cdr-stats-asterisk.sh: line 11: $'r': command not found
./install-cdr-stats-asterisk.sh: line 12: $'r': command not found
./install-cdr-stats-asterisk.sh: line 13: $'r': command not found
./install-cdr-stats-asterisk.sh: line 14: $'r': command not found
./install-cdr-stats-asterisk.sh: line 15: $'r': command not found
./install-cdr-stats-asterisk.sh: line 16: $'r': command not found
./install-cdr-stats-asterisk.sh: line 17: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 18: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 19: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 20: base: No such file or directory
./install-cdr-stats-asterisk.sh: line 21: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 22: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 23: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 24: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 25: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 26: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 27: syntax error near unexpected token `<'
./install-cdr-stats-asterisk.sh: line 27: `

Как мы можем увидеть, приведенный текст содержит в себе глупости вроде !DOCTYPE. Я открыл сей скрипт и увидел разное непонятное. Зато в конце сам скрипт целехонький. Выпиливаем все ненужное, оставляя только тело скрипта. Вот его текст:

Не изменяйте нижеследующий текст во избежание проблем!

#!/bin/bash
#
# CDR-Stats License
# http://www.cdr-stats.org
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (C) 2011-2012 Star2Billing S.L.
#
# The Initial Developer of the Original Code is
# Arezqui Belaid <info@star2billing.com>
#
# To download and run the script on your server :
# cd /usr/src/ ; rm install-cdr-stats-asterisk.sh ; wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/master/install/install-cdr-stats-asterisk.sh -O install-cdr-stats-asterisk.sh; bash install-cdr-stats-asterisk.sh
#
BRANCH='master'
INSTALL_DIR='/usr/share/cdr_stats'
#INSTALL TYPE (ASTERISK or FREESWITCH)
INSTALL_TYPE='ASTERISK'
INSTALLMODE='GENTLE' # Set to FULL to update Selinux, Firewall, etc if not Set to GENTLE
echo ""
echo ""
echo "> > > This is only to be installed on a fresh new installation of CentOS 6.2 or Ubuntu LTS 10.04 / 12.04! < < <"
echo ""
echo "It will install CDR-Stats on your server"
echo "Press Enter to continue or CTRL-C to exit"
echo ""
read TEMP
#Get Scripts dependencies
cd /usr/src/
wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/$BRANCH/install/bash-common-functions.sh -O bash-common-functions.sh
wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/$BRANCH/install/cdr-stats-functions.sh -O cdr-stats-functions.sh
#Include general functions
source bash-common-functions.sh
source cdr-stats-functions.sh
#Identify the OS
func_identify_os
#Request the user to accept the license
func_accept_license_mplv2
#run install menu
run_menu_cdr_stats_install

Запускаем:

bash install-cdr-stats-asterisk.sh

Cкрипт опять валится с ошибкой:

This script is only intended to run on Ubuntu LTS 10.04 / 12.04 or CentOS 6.X

Ковыряние интернета ни на секунду не приблизило меня к решению этого вопроса, поэтому я пошел другим путем. Вдумчивое курение скрипта и веществ (кофе и сигареты) навели меня на следующее решение:
cd /etc/

Открываем файл lsb-release и видим:

DISTRIB_CODENAME=trusty

Запомнили. Теперь:
cd /usr/src/

Открываем файл bash-common-functions.sh. И в нем смотрим на функцию:

func_identify_os() {

    if [ -f /etc/debian_version ] ; then
        DIST='DEBIAN'
        if [ "$(lsb_release -cs)" != "lucid" ] && [ "$(lsb_release -cs)" != "precise" ]; then
            echo "This script is only intended to run on Ubuntu LTS 10.04 / 12.04 or CentOS 6.X"
            exit 255

Видим два варианта: lucid и precise. Я выбрал precise (Ubuntu 12.04 LTS). И делаем следующее:

В файле:

/etc/lsb-release меняем trusty на precise

Далее:
cd /usr/src
bash install-cdr-stats.sh

It will install CDR-Stats on your server
Press Enter to continue or CTRL-C to exit

Жмем Enter
На вопрос:

I agree to be bound by the terms of the license — [YES/NO]

Говорим:
YES
Запускается установщик.

> CDR-Stats Installation Menu
=====================================
1) Install All
2) Install CDR-Stats Web Frontend
3) Install CDR-Stats Backend / CDR-Stats-Celery
4) Install MongoDB
0) Quit
(0-4): 1

Выбираем пункт меню номер 1. И ждем пока установится. В процессе установки будет установлена mongodb и postgresql. Далее нам будет предложено сконфигурировать подключение к MySQL:

Enter database settings for Asterisk…
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Configure Mysql Settings to connect to the Asterisk CDR database…
Enter Mysql hostname (default:localhost)
localhost
Enter Mysql port (default:3306)
3306
Enter Mysql Username (default:root)
asterisk
Enter Mysql Password (default:password)
asterisk
Enter Database name (default:asteriskcdrdb)
asteriskcdrdb
We will now add a Primary Key to your CDR database
We advice you to first backup your database prior continuing

Далее будет предложено создать супер админа для cdr-stats:

Create a super admin user…
Username (leave blank to use 'root'):
E-mail address: your-email@server.com
Password:
Password (again):
Superuser created successfully.

Завершаем установку кнопкой 0.
И ура!
your-server-ip-or-name:8008
Доступен. Заходим и любуемся.
Возможно появление следующей ошибки:

No data can be found in your collections, please make sure the import of data is working correctly.

Что делаем? Останавливаем CDR-stats:
sudo service cdr-stats-celeryd stop
Заходим в mongo:
mongo
Выполняем следующие действия:
use cdr-stats;
db.monthly_analytic.remove({});
db.daily_analytic.remove({});
db.aggregate_world_report.remove({});
db.aggregate_result_cdr_view.remove({});
db.aggregate_hourly_country_report.remove({});
db.cdr_common.remove({});
Выходим: Ctrl+D
Заходим в mysql:
sudo mysql -p

mysql> use asteriskcdrdb;
mysql> update cdr SET import_cdr = 0;

Query OK, 0 rows affected (0.24 sec)
Rows matched: 3 Changed: 0 Warnings: 0

У меня на текущий момент было 3 записи в CDR.
Выходим из mysql: Ctrl+C
cd /usr/share/cdr-stats
Открываем файл settings_local.py и ищем строку:
LOCAL_SWITCH_IP = "некое значение"
Меняем его на 'localhost':
LOCAL_SWITCH_IP = 'localhost'
Сохраняем изменения и запускаем cdr-stats:
sudo service cdr-stats-celeryd start
your-server-ip-or-name:8008

И все начинает работать.

Еще один важный момент! Если у вас несколько провайдеров телефонии или вы используете нестандартные префиксы выхода на городскую или международную линию, то необходимо в cdr-stats указать их. Делается это вот тут:
/usr/share/cdr-stats/setting_local.py
Строка

PREFIX_TO_IGNORE = "+,00,000,0000,00000,011,55555,99999"

Не изменяйте текущие значения, оставьте как есть, и добавьте ваши в конец строки
Например, вот так:
PREFIX_TO_IGNORE = "+,00,000,0000,00000,011,55555,99999,8,810,9,910"
Сохраните изменения в файле и перезапустите cdr-stats:
sudo service cdr-stats-celeryd restart

Теперь CDR-STATS будет корректно обрабатывать все звонки, в чем вы сможете убедиться, посетив соответствующий пункт меню.

Автор: Gilligan

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js