Для астериска, наверное, только ленивый не писал cdr viewer. Таких решений полно: asterisk cdr viewer, agcdr,  asterisk cdr viewer mod (статья на Хабре), cdr-stats и еще много других, которых я не знаю.

Но не требовалась функциональность крутых фильтров, сортировок-группировок, а нужен просто просмотр данных по звонкам за день, возможность прослушивать запись разговора и защита паролем. Чтобы бизнес-тетушка, сидя на заднем кресле автомобиля, пока ее муж, объезжая вечерние пробки, везет ее домой, могла взять планшет и посмотреть данные по звонкам своих сотрудников и быстро прослушать записи разговоров.

Недолго поискав по гитхабу, я наткнулся на webcdr. Немного обработал его напильником: убрал лишнее, добавил http basic авторизацию и получил необходимый вариант cdr viewer'а. C привычным тетушке веб-интерфейсом в стиле Twitter Bootstrap. Тетушка довольна.

image

Далее немного деталей.



Ryo CDR

У нас на хосте с Ubuntu 14 есть asterisk 11, БД mysql 5.6. Asterisk записывает разговоры, данные о звонках складывает в БД. Также нам потребуется установленные node.js, npm и bower.

Установка

wget https://github.com/antirek/ryocdr/archive/v0.0.11.tar.gz
tar -xzf v0.0.11.tar.gz
cd ryocdr-0.0.11
npm install
bower install   // добавьте опцию --allow-root, если устанавливаете под root
npm run build


Конфигурационный файл

{
  tz:"+0400",
  port: 9030,  // порт веб-интерфейса Ryo CDR
  recordspath:"/var/records",   //базовый путь к записям разговоров
  db: {
    client: "mysql",
    connection: {
      host: "127.0.0.1",
      user: "user",
      password: "password",
      database: "cdr",
      charset:"utf8"
    }
  },
  cdr: {
    table: "cdr"
  },
  auth: true,  // авторизация basic по паролю
  username: 'admin',
  password: 'password'
};


Запуск

Запускаем app.js

node app.js


Или воспользуемся менеджером pm2

pm2 start app.js  --name "ryocdr-app"


Также путь к конфигурационному файлу можно указать через переменную окружения RYOCDR_CONFIG, тогда приложение будет использовать указанный конфиг, а не расположенный в локальной директории. Это, например, удобно, когда вы используете Ryo CDR в docker контейнере.
export RYOCDR=/etc/ryocdr/config


Хранение путей записей в БД

Путь к файлу записи хранится в поле БД record. Например, у нас может быть такой диалплан (lua):

    local basePath = '/var/records';
    local date = os.date("*t");
    local uniqueid = channel.UNIQUEID:get();

    local fname = string.format("%s_%s-%s-%s_%s:%s:%s", uniqueid, date.year, date.month, date.day, date.hour, date.min, date.sec);
    local WAV = "/wav/";
    local MP3 = string.format("/mp3/%s-%s-%s/", date.year, date.month, date.day);

    local recordCommand = "/usr/bin/nice -n 19 mkdir -p %s && /usr/bin/lame -b 16 --silent %s%s.wav %s%s.mp3";
    local options = string.format(recordCommand, basePath..MP3, basePath..WAV, fname, basePath..MP3, fname);

    app.mixmonitor(string.format("%s%s.wav,b,%s", basePath..WAV, fname, options));
    channel["CDR(record)"]:set(string.format("%s%s.mp3", MP3, fname));


Т.е. файл записан mixmonitor'ом в wav, сконвертирован командой в mp3, а путь сконвертированного файла в папке с mp3-шками сохранено в БД приложением диалплана CDR.

В конфигурационном файле Ryo CDR можно указать базовый путь расположения записей разговоров в параметре recordspath. А в самой БД хранить только путь относительно этого базового пути.

Структура БД CDR

Структура таблицы cdr традиционная, дополненная полем record для записей разговоров (структура таблицы).

Видео установки Ryo CDR

Осторожно, видео без бубнящих комментариев по установке, зато с музыкой.



Возможно, кому-нибудь еще пригодится. Баги, пожелания, конструктивная критика — пожалуйста, сообщайте.

Ссылки
Ryo CDR: https://github.com/antirek/ryocdr

P.S. Отдельная благодарность Ивану за webcdr, мне пришлось немного адаптировать для своих нужд.

P.P.S. Одним из запросов тетушки было голосовое управление прослушиванием записей разговоров: «Так это нормально, следующая, промотать, промотать, так нормально, следующая». WebAudio надо попробовать добавить.

Комментарии (0)