Новий web-інтерфейс статистики і прослуховування викликів для IP PBX Asterisk

Ідея написання web-інтерфейсу статистики і прослуховування викликів для IP PBX Asterisk не покидала мене ось уже кілька років. Рішення, знайдені в Інтернет, не влаштовували по тим чи іншим критеріям — десь не вистачало функціоналу, якісь з них зовсім не радували око.

І от, озброївшись стеком технологій і осідлавши бойового коня, наданого компанією ServerClub, я вирушив у путь.

Результатом моєї подорожі став новий інтерфейс, з діаграмами, графіками і можливістю завантажувати і прослуховувати дзвінки.
Не стану далі втомлювати вас словесами, ось пару скріншотів:



А під катом вас чекає відео-гайд по інтерфейсу, необхідні налаштування і докладний опис усього доступного функціоналу.


Інтерфейс.
Щоб пост не виглядав як простирадло з скріншотів, я зробив невелике слайдшоу, де ви можете ознайомитися з інтерфейсом.


Опис. Що вже готове, плани.
На поточний момент реалізований наступний функціонал:

Вхідні дзвінки:
  • Звіт — Кількість дзвінків в черзі за період (всього/пропущені/телефону/не дочекалися відповіді)
  • Діаграма — Прийняті набрані Неприйняті
  • Діаграма — Прийняті, розподіл по операторам
  • Діаграма — Відповіді, розподіл по операторам
  • Звіт — Статистика по операторам. Хто і скільки прийняв/не прийняв викликів
  • Звіт — Причина роз'єднання (оператор/клієнт)
  • Звіт — Виклики. Скільки на дату Надійшло/Прийнятих/Пропущених
  • Пошук записів в БД. Прослуховування і скачування записів разговров
Вихідні виклики:
  • Звіт — Всього дзвінків, виклики/телефону/зайнято(помилка виклику), загальна тривалість і розподіл дзвінків по тривалості (див. слід. пункт).
  • Діаграма — Розподіл дзвінків по тривалості: до 30с, від 30с до 90с, від 90с
  • Діаграма — Кількість дзвінків, розподіл за менеджерам
  • Звіт — розподіл дзвінків по тривалості між менеджерами/операторами
  • Звіт — Виклики. Скільки було скоєно викликів на дату (вважаємо тільки телефону*)
  • Пошук записів в БД. Прослуховування і скачування записів разговров
*звіти щодо вихідних будуються тільки по дзвінках у світ, тобто внутрішні дзвінки між співробітниками не враховуються

Так само доступні кілька налаштувань, де вказується використовує Asterisk черги* і шлях до файлів записів розмов на сервері.
*реалізовано в налаштуваннях, але поки немає в інтерфейсі

У найближчих планах додати:
  • можливість групувати менеджерів/операторів і будувати звіти по групам
  • можливість створювати користувачів і розмежовувати їх права в перегляді звітів по групах
  • побудова звітів, якщо на Asterisk не використовуються черзі
  • пошук, прослуховування і скачування записів у всій БД, без фільтрів «Вхідні/Вихідні» (щоб бачити і внутрішні дзвінки)


Asterisk. Налаштування
Для роботи з описуваним інтерфейсом потрібно Asterisk версії 1.8 і вище.
На АТС повинно бути налагоджено ведення записів CDR і queue_log в БД MySQL. Якщо ви це ще не зробили, то я розповім як.
Так само я наведу приклад налаштування диалплана Asterisk, для організації збереження записів розмов.

Налаштовуємо Asterisk для роботи з MySQL1. Встановлюємо необхідні пакети (для прикладу в Debian/Ubuntu)
aptitude install unixodbc-dev libmyodbc

2. Asterisk повинен бути зібраний з наступними опціями


3. Далі редагуємо кілька конфіг-файли
невеликий хінт, якщо odbc-коннектор не чіпляєтьсяЗловив на одній з систем баг, при якому коннектор чомусь перестав чіплятися і астер звалювався в кірку:

Core was generated by `asterisk -cvvvvvvvgd'.

Program terminated with signal 8, Arithmetic exception.

#0 0x00007ff4cc77a61b in sqlchar_as_sqlwchar () from /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so

вирішив тим, що скачав останню версію з сайту MySQL — dev.mysql.com/downloads/file/?id=461779

розпакував либы в /usr/lib/x86_64-linux-gnu/odbc/

і трохи підправив конфіг

/etc/odbcinst.ini 
 

[MySQL] Descripti driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc5w.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmy5S.so 
CPTimeout =
CPReuse =


/etc/asterisk/res_odbc.conf
 

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk_user
password => 232d2edxse3e

cdr_adaptive_odbc.conf
 

[cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate
# раскоментируй, якщо хочеш бачити реальний номер, накоторый прийшов виклик, а не номер оператора черги
#alias dst => does_not_exist
#alias realdst => dst

/etc/odbc.ini
 

[MySQL-asterisk]
Description = MySQL database Asterisk
;Trace = Off
;TraceFile = stderr
Driver = MySQL
Server = localhost
User = asterisk_user
Password = 232d2edxse3e
;Port = 3306
Socket = /var/run/mysqld/mysqld.sock
Database = asterisk
Charset = utf8

/etc/odbcinst.ini
 

[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =

*для x64
[MySQL]
Description = MySQL driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
CPTimeout =
CPReuse =

4. Створимо таблицю БД і cdr в MYSQL
mysql> create database asterisk;
mysql> use asterisk;
mysql> 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 ",
`тривалість` 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 ",
`filename` 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=0 DEFAULT CHARSET=utf8;
mysql> grant all on asterisk.* to 'asterisk_user'@'localhost' identified by '232d2edxse3e';


5. Тепер створимо табличку queue_log
mysql> CREATE TABLE IF NOT EXISTS `queue_log` (
`time` varchar(32) DEFAULT NULL,
`callid` char(64) DEFAULT NULL,
`queuename` char(64) DEFAULT NULL,
`agent` char(64) DEFAULT NULL,
`event` char(32) DEFAULT NULL,
`data` char(64) DEFAULT NULL,
`data1` char(64) DEFAULT NULL,
`data2` char(64) DEFAULT NULL,
`data3` char(64) DEFAULT NULL,
`data4` char(64) DEFAULT NULL,
`data5` char(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> \q
Bye

6. Внесемо в
/etc/asterisk/extconfig.conf
 

рядок
queue_log => odbc,asterisk

7. Перезавантажуємо Asterisk і перевіряємо підключення
*CLI> odbc show asterisk 
ODBC DSN Settings
-----------------
Name: asterisk
DSN: MySQL-asterisk
Last connection attempt: 1970-01-01 07:00:00
Pooled: No
Connected: Yes

8. Так само варто зателефонувати і перевірити потрапляють дані в БД

Диалплан Asterisk — витяг з /etc/asterisk/extensions.ael
globals {
WAV=/var/calls; //Тимчасовий каталог WAV
MP3=/var/calls; //Куди вивантажувати файли mp3
RECORDING=1; // Запис, 1 - включено.
};

macro recording (calling,called) {
if ("${RECORDING}" = "1"){
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
System(mkdir -p ${MP3}/${datedir});
System(mkdir -p ${WAV}/${datedir});
Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
Set(CDR(filename)=${fname}.mp3);
Set(CDR(recordingfile)=${fname}.wav);
Set(CDR(realdst)=${called});
MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});

};
};

_XXXXXX => {
&recording(${CALLERID(number)},${РОЗШИРЕННЯМИ});
Dial(SIP/83843${РОЗШИРЕННЯМИ}@multifon,180,tT);
HangUP();
} // end of _XXXXXX


Файли записів розмов потрапляють прямиков в
/var/calls
 

де мають наступну ієрархію
ls /var/calls/2016/ -l
total 24
drwxr-xr-x 19 asterisk asterisk 4096 May 31 10:10 05
drwxr-xr-x 30 asterisk asterisk 4096 Jun 30 10:02 06
drwxr-xr-x 31 asterisk asterisk 4096 Jul 31 10:18 07
drwxr-xr-x 31 asterisk asterisk 4096 Aug 31 09:00 08
drwxr-xr-x 26 asterisk asterisk 4096 Sep 26 09:51 09



Asterisk. Підключення до інтерфейсу статистики
Настав час розвіяти деякі сумніви, або ж підтвердити деякі здогадки.
Так, на поточний момент сервіс надається за моделлю SAAS, тобто на вашу АТС встановлюється клієнт для синхронізації БД і записів дзвінків.

Після реєстрації (не думаю, що варто на ній докладно зупинятися — там все як зазвичай), потрібно зайти в особистий кабінет за адресою stat.vistep.ru, перейти в налаштування, вказати шлях до файлів записів і натиснути «Зберегти».
Після чого буде доступна посилання на скачування скрипта-клієнта.

Для установки скрипта потрібно виконати наступні кроки:
1. Встановити на сервер
nodejs
і менеджер пакунків
npm
, якщо вони ще не встановлені (з допомогою
yum
або
apt/aptitude/apt-get
)
2. Встановити
pm2

npm install -g pm2

3. Створити і перейти в теку
/opt/stat.vistep.ru

mkdir /opt/stat.vistep.ru
cd /opt/stat.vistep.ru

4. Помістити архів зі скриптом у папку, створену кроком раніше, і розпакувати його
unzip skript_name.zip

5. Редагувати скрипт, внісши зміни до рядка 393 — 397 (і 398 — опціонально, якщо вам знайомі regexp), а саме:
"dbhost":"localhost",
"dbuser":"asterisk_user",
"dbpassword":"232w2edxse3e",
"db":"asterisk", 
"timezone":"Asia/Novokuznetsk", // <--- годинний пояс
"fileMask": /\.*/ // 

6. Запустити скрипт на виконання:
pm2 start stat.vistep.ru.js --name "ViStep.RU stat"

7. Налаштувати автозапуск/зупинка скрипта синхронізації разом з ОС:
pm2 startup ubuntu #або centos, gentoo
pm2 save


З налаштуваннями на цьому все.
Залишилося дочекатися завантаження даних на сервер статистики і почати користуватися!

Висновок
Ось і завершився мій оповідь про подорож і його результати. Але тільки оповідь, не сама подорож — воно ще тільки починається. Вірю, що чекають мене ще багато звершення, захоплюючі шляхи-дороги і цікаві квести.

За допомогу в налаштуванні Asterisk милості прошу писати нам на support@vistep.ru
Якщо питання щодо співпраці, умовам надання сервісу або ще якась оказія, то чекаю листів на sales@vistep.ru

Так само всі мої контакти є в профілі і, звичайно, я з задоволенням відповім на ваші питання в коментарях.

За сим дозвольте закінчити.
Дякую за увагу!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.