Прикручиваю Asterisk CDR Viewer Mod, возникли 2 проблемы, которые никак не могу решить\найти решение, прошу Вашей помощи.
Как выглядит у меня: Как должно выглядеть: Проблема видна на картинках выше.
1. Статус выводится кодом, который получается из таблицы, такое ощущение, что не хватает куска кода, который преобразует из значения (0,8,4) в слово отвечено\занято\отклонено и и т.д.
2. Не отображаются файлы для прослушивания разговора, потому что не попадает имя файла в таблицу, почему не попадает не понимаю, собственно поэтому пишу сей пост.
3. Файлы согласно www/html/cdr/inc/config/config.php должны попадать в определенную папку (например год/месяц/число/*.mp3), но как связан этот конфиг и mixmonitor и как вообще могут быть связаны не пойму.
4. Опять же судя по конфигу, vaw в mp3 должны перекодироваться ночью, а они кодируются сразу после записи
ниже логи того, что может пригодиться.
Если еще что то надо -- скажите.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: readme Asterisk CDR Viewer Mod
===============================================
Системные требования
===============================================
- PHP 5.2 и выше
- База данных MySQL или другая, которая поддерживается PDO (PostgreSQL...)
- Веб-сервер (Nginx, Apache, Lighttpd...)
===============================================
Форматы записей разговоров
===============================================
Используется HTML5 плеер для воспроизведения записей разговоров.
Доступные форматы аудио: MP3, WAV, OGG, AAC...
Проверенные форматы аудио. Проверялось в Internet Explorer 11, Chrome 56, Firefox 52:
- MP3. Поддерживаются все браузеры
- WAV. Не работает в Internet Explorer
- OGG. Не работает в Internet Explorer
Формат GSM не поддерживается для воспроизведения ни одним браузером.
===============================================
Проверка обновлений
===============================================
Начиная с версии 2.3 доступна проверка обновлений. Чтобы проверить доступность новой версии, нужно щелкнуть на стрелочку в самом низу веб-интерфейса (подвал), рядом с надписью "Asterisk CDR Viewer Mod v[версия]".
Проверяется только доступность новой версии, но автоматического обновления не происходит. Обновлять необходимо вручную.
Если доступна новая версия, то будут отображены: текущая версия, новая версия, изменения в последнем релизе.
===============================================
Редактирование базы данных
===============================================
С базой данных MySQL удобнее всего работать через PHPMYADMIN. Официальный сайт: https://www.phpmyadmin.net/
Если у вас используется не база данных MySQL (а например PostgreSQL), или PHPMYADMIN не установлен, то следует использовать ADMINER. Официальный сайт: https://www.adminer.org/
===============================================
Создание таблицы в базе
===============================================
Имя файла записи разговора будет храниться в базе MySQL (можно также выбрать, например, PostgreSQL).
Для MySQL можно использовать файл импорта "mysql_cdr.sql", можно найти в папке docs. Если импортировать этот файл в базу, то в базе будет создана таблица "cdr" со всем необходимыми для Asterisk полями.
Имя колонки для файла записи звонка будет "filename". Также будут созданы необходимые индексы и триггер, о котором можно прочитать ниже.
В дополнение ко всему, файл импорта создаст новые колонки в базе для Asterisk 12+.
Если имя таблицы "cdr" (или имя колонки для файла записи звонка) не устраивает, после импорта сами сможете переименовать. Например, с помощью PHPMYADMIN или ADMINER.
Если НЕ использовали файл импорта в базу
==
Допустим мы настроили Asterisk для работы с базой и уже создали таблицу, например "cdr". Теперь нам необходимо добавить с нашу таблицу новую колонку, например "filename", в которой будет
имя файла с записью, удобнее это сделать через PHPMYADMIN или ADMINER (смотреть здесь: https://www.adminer.org). Название колонки можно задать в конфиге. / `filename` varchar(255) DEFAULT 'none' /
Более подробно о том, как настроить Asterisk для работы с MySQL можно найти в интернете.
===============================================
Настройка Asterisk
===============================================
Для того, чтобы Asterisk смог взаимодействовать с новыми столбцами в таблице, необходимо в файле cdr_mysql.conf создать их алиасы.
Добавим в конец этого файла ( секция [columns] ) строчки:
alias realdst => realdst
alias remoteip => remoteip
alias start => calldate
alias название_столбца => название_столбца
Вместо "название_столбца" вставьте название столбца, в котором хранится название записи звонка, например "filename".
Алиас "remoteip" нужен для записи IP адреса клиента Asterisk. Это НЕОБЯЗАТЕЛЬНО.
Все изменения производим в extensions.ael, либо в extensions.conf. В зависимости от того, в какой файле у нас написан диалплан.
Если название столбца, в котором хранится название записи звонка у вас отличается от "filename", то необходимо внести соответствующие изменения в диалплан.
Необходимо изменить строку "Set(CDR(filename)=${fname}.mp3);", на "Set(CDR(название_столбца)=${fname}.mp3);"
==
Для extensions.ael, extensions.conf
==
В "globals" добавим пару переменных:
===
// Если 0, запись разговоров отключена
// Если 1, запись разговоров включена с одновременной конвертацией в MP3
// Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
// Путь к папке с записями разговоров
DIR_RECORDS=/var/calls/;
===
Добавим макрос.
Сразу уточним, что в этом макросе, если RECORDING=1 запись прямо во время разговора конвертируется в MP3. т.е. существует некоторая нагрузка на сервер.
Если же RECORDING=2, то нагрузка на сервер минимальная, т.к. запись выполняется в родной формат Asterisk - WAV. Конвертирование в MP3 должно быть выполнено
с помощью скрипта "proc_records.sh", который можно найти в папке docs. В скрипте написаны подробные комментарии по его настройке
==
Для extensions.ael
==
// MixMonitor
macro recording(calling,called) {
if ("${RECORDING}" = "1") {
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(monopt=nice -n 19 /usr/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");
Set(CDR(filename)=${fname}.mp3);
Set(CDR(realdst)=${called});
Set(CDR(remoteip)=${CHANNEL(recvip)});
MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
} else if ("${RECORDING}" = "2") {
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(CDR(filename)=${fname}.wav);
Set(CDR(realdst)=${called});
Set(CDR(remoteip)=${CHANNEL(recvip)});
MixMonitor(${DIR_RECORDS}${fname}.wav,b);
}
return;
};
Пример вызова макроса:
context internal {
_X. => {
&recording(${CALLERID(num)},${EXTEN});
Dial(SIP/${EXTEN},60);
Hangup();
};
};
==
Для extensions.conf
==
; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3:no)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/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,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
Пример вызова макроса:
[internal]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _X.,n,Dial(SIP/${EXTEN},60)
exten => _X.,n,Hangup()
====
Дополнительно (необязательно). Если НЕ использовали файл импорта в базу "cdr_mysql.sql"
====
В Asterisk если используется макрос, то звонок совершается с экстеншеном s. Чтобы Номер назначения был действительным, а не s или ~~s~~, то сделаем следующее:
Через PHPMYADMIN или ADMINER (смотреть здесь: https://www.adminer.org). В таблицу нужно добавить новое поле "realdst" с типом "varchar" и размером "80". Теперь нужно добавить триггер на таблицу.
Для этого зайдем в Триггеры - Добавить триггер. Назначаем имя триггеру, остальное оставляем без изменений. В поле "Определение" вставляем текст ниже (то, что начинается на // - не вставлять):
//-- Начало --//
BEGIN
IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.realdst != '') THEN
SET NEW.dst = NEW.realdst;
END IF;
END
//-- / Конец --//
Для того, чтобы в поле "realdst" записывался правильный Номер назначения, нужно отредактировать диалплан. Макрос выше в редактировании не нуждается.
В используемом у вас макросе необходимо добавить строчку, это только пример. Задайте правильные имена параметров (${number}, ${ARG1}).
==
Для extensions.ael
==
Set(CDR(realdst)=${number});
==
Для extensions.conf
==
exten => s,n,Set(CDR(realdst)=${ARG1});
===============================================
Настройка папки со звонками
===============================================
Записи разговоров будут складываться в папку "/var/calls/" из примера выше.
Есть два варианта хранения файлов записей.
1. Все записи разговоров хранятся в одной папке.
2. Записи разговоров должны распределяться по папкам в соответствии с датой.
Также есть возможность настройки "отложенной конвертации записей разговоров".
Когда днем выполняется запись в формат WAV, а ночью необходимо по CRON запустить скрипт для преобразования файлов из WAV в MP3.
"Отложенную конвертацию записей разговоров" и распределение по папкам в соответствии с датой можно использовать вместе, а можно что-то одно.
За распределение файлов записей по папкам, преобразование файлов из WAV в MP3 отвечает скрипт "proc_records.sh" из папки docs.
==
Для 2 варианта
==
Каждый день в 00.01 часов записи из папки "/var/calls/" по CRON должны распределяться по дате
в соответствующие папки.
Для распределения файлов по папкам в соответствии с датой нужно использовать скрипт "proc_records.sh" из папки docs.
Формат хранения записей (пример):
1. /var/calls/2014/2014-09/2014-09-29
2. /var/calls/2014/09/29
Настройки скрипта "proc_records.sh" для соответствующего формата:
1.
===
DIR_DST="/var/calls/$Y/$YM/$YMD/"
MOVE_BY_DATE=true
===
2.
===
DIR_DST="/var/calls/$Y/$M/$D/"
MOVE_BY_DATE=true
===
Настройки скрипта "proc_records.sh" для преобразования файлов из WAV в MP3:
--
За включение преобразования файлов из WAV в MP3 в скрипте отвечает переменная "CONV_TO_MP3". Необходимо установить ее значение в true или false.
Также можно настроить уровень вложенности поиска WAV файлов для их преобразования в переменной "DEPTH". Примеры значений для переменной
1 - это все файлы в папке /var/calls/
2 - это все файлы в /var/calls/, /var/calls/2017/ ...
3 - это все файлы в /var/calls/, /var/calls/2017/, /var/calls/2017/04 ...
...
==
Для вариантов, когда Asterisk сам распределяет записи по папкам в соответствии с датой.
==
Если у вас Asterisk сам распределяет записи звонков по папкам в соответствии с датой, тогда необходимости запуска скрипта по CRON нет.
Если только у вас не настроена "отложенная конвертация записей разговоров"
Возможные форматы хранения записей:
1. /var/calls/2014/2014-09/2014-09-29
2. /var/calls/2014/09/29
===============================================
Удаление старых записей звонков
===============================================
Для удаления старых записей звонков нужно использовать скрипт "proc_records.sh" из папки docs. В нем есть подробные комментарии по настройке.
Можно удалять только старые записи звонков, но будут оставаться пустые папки. Можно включить удаление пустых папок, тогда все пустые папки в директории,
которая задана в "DIR_SOURCE" будут удалены.
Чтобы все работало, для начала нужно определиться с форматом хранения записей звонков и правильно зададь значение переменной "DEPTH".
Если все файлы хранятся в одной папке, то значение переменной можно установить в "DEPTH=1". Если записи звонков распределяются по папкам в соответствии с датой, то
значение переменной можно установить в "DEPTH=3". Более подробно смотреть комментарии в скрипте.
Чтобы включить удаление старых записей звонков, в скрипте следует задать:
===
CLEAN_OLD=true
===
В переменной "CLEAN_OLD_AFTER" задается количество дней хранения файлов записей звонков. Например: Если задано "CLEAN_OLD_AFTER=365", то все файлы, старше 365 дней будут удалены.
Берется время изменения файла, расширение файла при удалении НЕ учитывается. Т.е. если в папке, например, есть "*.txt" файл старше этого срока, он также будет удален.
В переменной "CLEAN_OLD_EMPTYDIR" можно включить удаление пустых папок. Чтобы это включить, в скрипте следует задать:
===
CLEAN_OLD_EMPTYDIR=true
===
===============================================
Настройка
===============================================
Пример конфиг файла находится в "inc/config/config.php.sample". Перед началом использования этот файл нужно переименовать в "config.php".
Все настройки находятся в файле "inc/config/config.php" с подробными комментариями, тут не должно возникнуть сложностей.
Можно использовать "пользовательский" конфиг. Это значит, что будет использоваться альтернативный конфиг файл с настройками.
Для этого нужно создать еще один файл с конфигом, например: "inc/config/config-anotherconfig.php". Формат имени файла конфига: config-[уникальное_имя_конфига].php
Чтобы использовать созданный "пользовательский" конфиг - config-anotherconfig.php, нужно к адресу сайта с установленным скриптом (Например: http://example.com/cdr/index.php) добавить параметр ?config=anotherconfig.
Получается адрес: http://example.com/cdr/index.php?config=anotherconfig
===
Кратко:
1. Скачать ZIP архив с GitHub или выполнить git clone https://github.com/prog-it/Asterisk-CDR-Viewer-Mod.git
2. Распаковать или Перенести файлы в нужную папку на сервере
3. Переименовать файл "inc/config/config.php.sample" в "config.php". Т.е. будет файл "inc/config/config.php"
4. Настроить параметры в "inc/config/config.php"
5. Почти готово. Если необходим доступ только для определенных пользователей, то необходимо создать файл .htpasswd.
Создание .htpasswd файла
===
htpasswd -c /path/to/.htpasswd admin
===
Пример конфига для Nginx:
===
location /path/to/script {
auth_basic "CDR Viewer Mod";
auth_basic_user_file /path/to/.htpasswd;
}
===
Пример конфига для Apache:
===
<Location "/path/to/script">
AuthName "CDR Viewer Mod"
AuthType Basic
AuthUserFile /path/to/.htpasswd
require valid-user
</Location>
===
5. Прописать в конфиге скрипта имена пользователей в виде массива, которым разрешен доступ
===
'admins' => array(
'admin1',
'admin2',
'admin3',
),
===
Если массив пустой, то разрешен доступ всем пользователям
===
'admins' => array(
),
===
===============================================
Настройка тарифов на звонки
===============================================
Тарифы на звонки задаются в файле "my_callrates.csv" (inc/plugins/my_callrates.csv). Путь к этому файлу можно изменить в конфиге.
Формат задания тарифы в CSV файле:
Код_региона,стоимость_минуты[,Направление,Тип_тарификации,Доп_тариф]
-- То, что в фигурных скобках - необязательно
Пример для Мегафона, с поминутной тарификацией, стоимость первой минуты 90 коп., после первой минуты 10 коп (доп. тариф).
===
8922,0.90,Мегафон,m,0.10
===
Типы тарификации:
s - посекундно (нет доп. тарифа)
m - поминутно (есть доп. тариф)
c - за весь звонок (нет доп. тарифа)
1m+s - посекундно со 2 минуты (есть доп. тариф)
30s+s - посекундно после 30 секунды
30s+6s - округление интервалами до 6 сек. по истечении первых 30 сек. разговора (Skype Connect)
===============================================
Остальное можно прочитать с файле "Старый Readme.txt"
Системные требования
===============================================
- PHP 5.2 и выше
- База данных MySQL или другая, которая поддерживается PDO (PostgreSQL...)
- Веб-сервер (Nginx, Apache, Lighttpd...)
===============================================
Форматы записей разговоров
===============================================
Используется HTML5 плеер для воспроизведения записей разговоров.
Доступные форматы аудио: MP3, WAV, OGG, AAC...
Проверенные форматы аудио. Проверялось в Internet Explorer 11, Chrome 56, Firefox 52:
- MP3. Поддерживаются все браузеры
- WAV. Не работает в Internet Explorer
- OGG. Не работает в Internet Explorer
Формат GSM не поддерживается для воспроизведения ни одним браузером.
===============================================
Проверка обновлений
===============================================
Начиная с версии 2.3 доступна проверка обновлений. Чтобы проверить доступность новой версии, нужно щелкнуть на стрелочку в самом низу веб-интерфейса (подвал), рядом с надписью "Asterisk CDR Viewer Mod v[версия]".
Проверяется только доступность новой версии, но автоматического обновления не происходит. Обновлять необходимо вручную.
Если доступна новая версия, то будут отображены: текущая версия, новая версия, изменения в последнем релизе.
===============================================
Редактирование базы данных
===============================================
С базой данных MySQL удобнее всего работать через PHPMYADMIN. Официальный сайт: https://www.phpmyadmin.net/
Если у вас используется не база данных MySQL (а например PostgreSQL), или PHPMYADMIN не установлен, то следует использовать ADMINER. Официальный сайт: https://www.adminer.org/
===============================================
Создание таблицы в базе
===============================================
Имя файла записи разговора будет храниться в базе MySQL (можно также выбрать, например, PostgreSQL).
Для MySQL можно использовать файл импорта "mysql_cdr.sql", можно найти в папке docs. Если импортировать этот файл в базу, то в базе будет создана таблица "cdr" со всем необходимыми для Asterisk полями.
Имя колонки для файла записи звонка будет "filename". Также будут созданы необходимые индексы и триггер, о котором можно прочитать ниже.
В дополнение ко всему, файл импорта создаст новые колонки в базе для Asterisk 12+.
Если имя таблицы "cdr" (или имя колонки для файла записи звонка) не устраивает, после импорта сами сможете переименовать. Например, с помощью PHPMYADMIN или ADMINER.
Если НЕ использовали файл импорта в базу
==
Допустим мы настроили Asterisk для работы с базой и уже создали таблицу, например "cdr". Теперь нам необходимо добавить с нашу таблицу новую колонку, например "filename", в которой будет
имя файла с записью, удобнее это сделать через PHPMYADMIN или ADMINER (смотреть здесь: https://www.adminer.org). Название колонки можно задать в конфиге. / `filename` varchar(255) DEFAULT 'none' /
Более подробно о том, как настроить Asterisk для работы с MySQL можно найти в интернете.
===============================================
Настройка Asterisk
===============================================
Для того, чтобы Asterisk смог взаимодействовать с новыми столбцами в таблице, необходимо в файле cdr_mysql.conf создать их алиасы.
Добавим в конец этого файла ( секция [columns] ) строчки:
alias realdst => realdst
alias remoteip => remoteip
alias start => calldate
alias название_столбца => название_столбца
Вместо "название_столбца" вставьте название столбца, в котором хранится название записи звонка, например "filename".
Алиас "remoteip" нужен для записи IP адреса клиента Asterisk. Это НЕОБЯЗАТЕЛЬНО.
Все изменения производим в extensions.ael, либо в extensions.conf. В зависимости от того, в какой файле у нас написан диалплан.
Если название столбца, в котором хранится название записи звонка у вас отличается от "filename", то необходимо внести соответствующие изменения в диалплан.
Необходимо изменить строку "Set(CDR(filename)=${fname}.mp3);", на "Set(CDR(название_столбца)=${fname}.mp3);"
==
Для extensions.ael, extensions.conf
==
В "globals" добавим пару переменных:
===
// Если 0, запись разговоров отключена
// Если 1, запись разговоров включена с одновременной конвертацией в MP3
// Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
// Путь к папке с записями разговоров
DIR_RECORDS=/var/calls/;
===
Добавим макрос.
Сразу уточним, что в этом макросе, если RECORDING=1 запись прямо во время разговора конвертируется в MP3. т.е. существует некоторая нагрузка на сервер.
Если же RECORDING=2, то нагрузка на сервер минимальная, т.к. запись выполняется в родной формат Asterisk - WAV. Конвертирование в MP3 должно быть выполнено
с помощью скрипта "proc_records.sh", который можно найти в папке docs. В скрипте написаны подробные комментарии по его настройке
==
Для extensions.ael
==
// MixMonitor
macro recording(calling,called) {
if ("${RECORDING}" = "1") {
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(monopt=nice -n 19 /usr/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");
Set(CDR(filename)=${fname}.mp3);
Set(CDR(realdst)=${called});
Set(CDR(remoteip)=${CHANNEL(recvip)});
MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
} else if ("${RECORDING}" = "2") {
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(CDR(filename)=${fname}.wav);
Set(CDR(realdst)=${called});
Set(CDR(remoteip)=${CHANNEL(recvip)});
MixMonitor(${DIR_RECORDS}${fname}.wav,b);
}
return;
};
Пример вызова макроса:
context internal {
_X. => {
&recording(${CALLERID(num)},${EXTEN});
Dial(SIP/${EXTEN},60);
Hangup();
};
};
==
Для extensions.conf
==
; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3:no)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/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,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
Пример вызова макроса:
[internal]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _X.,n,Dial(SIP/${EXTEN},60)
exten => _X.,n,Hangup()
====
Дополнительно (необязательно). Если НЕ использовали файл импорта в базу "cdr_mysql.sql"
====
В Asterisk если используется макрос, то звонок совершается с экстеншеном s. Чтобы Номер назначения был действительным, а не s или ~~s~~, то сделаем следующее:
Через PHPMYADMIN или ADMINER (смотреть здесь: https://www.adminer.org). В таблицу нужно добавить новое поле "realdst" с типом "varchar" и размером "80". Теперь нужно добавить триггер на таблицу.
Для этого зайдем в Триггеры - Добавить триггер. Назначаем имя триггеру, остальное оставляем без изменений. В поле "Определение" вставляем текст ниже (то, что начинается на // - не вставлять):
//-- Начало --//
BEGIN
IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.realdst != '') THEN
SET NEW.dst = NEW.realdst;
END IF;
END
//-- / Конец --//
Для того, чтобы в поле "realdst" записывался правильный Номер назначения, нужно отредактировать диалплан. Макрос выше в редактировании не нуждается.
В используемом у вас макросе необходимо добавить строчку, это только пример. Задайте правильные имена параметров (${number}, ${ARG1}).
==
Для extensions.ael
==
Set(CDR(realdst)=${number});
==
Для extensions.conf
==
exten => s,n,Set(CDR(realdst)=${ARG1});
===============================================
Настройка папки со звонками
===============================================
Записи разговоров будут складываться в папку "/var/calls/" из примера выше.
Есть два варианта хранения файлов записей.
1. Все записи разговоров хранятся в одной папке.
2. Записи разговоров должны распределяться по папкам в соответствии с датой.
Также есть возможность настройки "отложенной конвертации записей разговоров".
Когда днем выполняется запись в формат WAV, а ночью необходимо по CRON запустить скрипт для преобразования файлов из WAV в MP3.
"Отложенную конвертацию записей разговоров" и распределение по папкам в соответствии с датой можно использовать вместе, а можно что-то одно.
За распределение файлов записей по папкам, преобразование файлов из WAV в MP3 отвечает скрипт "proc_records.sh" из папки docs.
==
Для 2 варианта
==
Каждый день в 00.01 часов записи из папки "/var/calls/" по CRON должны распределяться по дате
в соответствующие папки.
Для распределения файлов по папкам в соответствии с датой нужно использовать скрипт "proc_records.sh" из папки docs.
Формат хранения записей (пример):
1. /var/calls/2014/2014-09/2014-09-29
2. /var/calls/2014/09/29
Настройки скрипта "proc_records.sh" для соответствующего формата:
1.
===
DIR_DST="/var/calls/$Y/$YM/$YMD/"
MOVE_BY_DATE=true
===
2.
===
DIR_DST="/var/calls/$Y/$M/$D/"
MOVE_BY_DATE=true
===
Настройки скрипта "proc_records.sh" для преобразования файлов из WAV в MP3:
--
За включение преобразования файлов из WAV в MP3 в скрипте отвечает переменная "CONV_TO_MP3". Необходимо установить ее значение в true или false.
Также можно настроить уровень вложенности поиска WAV файлов для их преобразования в переменной "DEPTH". Примеры значений для переменной
1 - это все файлы в папке /var/calls/
2 - это все файлы в /var/calls/, /var/calls/2017/ ...
3 - это все файлы в /var/calls/, /var/calls/2017/, /var/calls/2017/04 ...
...
==
Для вариантов, когда Asterisk сам распределяет записи по папкам в соответствии с датой.
==
Если у вас Asterisk сам распределяет записи звонков по папкам в соответствии с датой, тогда необходимости запуска скрипта по CRON нет.
Если только у вас не настроена "отложенная конвертация записей разговоров"
Возможные форматы хранения записей:
1. /var/calls/2014/2014-09/2014-09-29
2. /var/calls/2014/09/29
===============================================
Удаление старых записей звонков
===============================================
Для удаления старых записей звонков нужно использовать скрипт "proc_records.sh" из папки docs. В нем есть подробные комментарии по настройке.
Можно удалять только старые записи звонков, но будут оставаться пустые папки. Можно включить удаление пустых папок, тогда все пустые папки в директории,
которая задана в "DIR_SOURCE" будут удалены.
Чтобы все работало, для начала нужно определиться с форматом хранения записей звонков и правильно зададь значение переменной "DEPTH".
Если все файлы хранятся в одной папке, то значение переменной можно установить в "DEPTH=1". Если записи звонков распределяются по папкам в соответствии с датой, то
значение переменной можно установить в "DEPTH=3". Более подробно смотреть комментарии в скрипте.
Чтобы включить удаление старых записей звонков, в скрипте следует задать:
===
CLEAN_OLD=true
===
В переменной "CLEAN_OLD_AFTER" задается количество дней хранения файлов записей звонков. Например: Если задано "CLEAN_OLD_AFTER=365", то все файлы, старше 365 дней будут удалены.
Берется время изменения файла, расширение файла при удалении НЕ учитывается. Т.е. если в папке, например, есть "*.txt" файл старше этого срока, он также будет удален.
В переменной "CLEAN_OLD_EMPTYDIR" можно включить удаление пустых папок. Чтобы это включить, в скрипте следует задать:
===
CLEAN_OLD_EMPTYDIR=true
===
===============================================
Настройка
===============================================
Пример конфиг файла находится в "inc/config/config.php.sample". Перед началом использования этот файл нужно переименовать в "config.php".
Все настройки находятся в файле "inc/config/config.php" с подробными комментариями, тут не должно возникнуть сложностей.
Можно использовать "пользовательский" конфиг. Это значит, что будет использоваться альтернативный конфиг файл с настройками.
Для этого нужно создать еще один файл с конфигом, например: "inc/config/config-anotherconfig.php". Формат имени файла конфига: config-[уникальное_имя_конфига].php
Чтобы использовать созданный "пользовательский" конфиг - config-anotherconfig.php, нужно к адресу сайта с установленным скриптом (Например: http://example.com/cdr/index.php) добавить параметр ?config=anotherconfig.
Получается адрес: http://example.com/cdr/index.php?config=anotherconfig
===
Кратко:
1. Скачать ZIP архив с GitHub или выполнить git clone https://github.com/prog-it/Asterisk-CDR-Viewer-Mod.git
2. Распаковать или Перенести файлы в нужную папку на сервере
3. Переименовать файл "inc/config/config.php.sample" в "config.php". Т.е. будет файл "inc/config/config.php"
4. Настроить параметры в "inc/config/config.php"
5. Почти готово. Если необходим доступ только для определенных пользователей, то необходимо создать файл .htpasswd.
Создание .htpasswd файла
===
htpasswd -c /path/to/.htpasswd admin
===
Пример конфига для Nginx:
===
location /path/to/script {
auth_basic "CDR Viewer Mod";
auth_basic_user_file /path/to/.htpasswd;
}
===
Пример конфига для Apache:
===
<Location "/path/to/script">
AuthName "CDR Viewer Mod"
AuthType Basic
AuthUserFile /path/to/.htpasswd
require valid-user
</Location>
===
5. Прописать в конфиге скрипта имена пользователей в виде массива, которым разрешен доступ
===
'admins' => array(
'admin1',
'admin2',
'admin3',
),
===
Если массив пустой, то разрешен доступ всем пользователям
===
'admins' => array(
),
===
===============================================
Настройка тарифов на звонки
===============================================
Тарифы на звонки задаются в файле "my_callrates.csv" (inc/plugins/my_callrates.csv). Путь к этому файлу можно изменить в конфиге.
Формат задания тарифы в CSV файле:
Код_региона,стоимость_минуты[,Направление,Тип_тарификации,Доп_тариф]
-- То, что в фигурных скобках - необязательно
Пример для Мегафона, с поминутной тарификацией, стоимость первой минуты 90 коп., после первой минуты 10 коп (доп. тариф).
===
8922,0.90,Мегафон,m,0.10
===
Типы тарификации:
s - посекундно (нет доп. тарифа)
m - поминутно (есть доп. тариф)
c - за весь звонок (нет доп. тарифа)
1m+s - посекундно со 2 минуты (есть доп. тариф)
30s+s - посекундно после 30 секунды
30s+6s - округление интервалами до 6 сек. по истечении первых 30 сек. разговора (Skype Connect)
===============================================
Остальное можно прочитать с файле "Старый Readme.txt"
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: extensions.conf
[general]
static=yes
writeprotect=yes
[globals]
RECORDING=1
DIR_RECORDS=/records/callrecords/
[default]
[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _x.,2, answer()
exten => _xxxx,3,Dial(SIP/${EXTEN},,t&m)
exten => _8xxxxxxxxxx,3,Dial(SIP/ntel/${EXTEN})
exten => _7xxxxxxxxxx,3,Dial(SIP/zadarma/${EXTEN})
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.
exten => _x.,n,hangup()
[incoming]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
;exten => _x.,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
;exten => _x.,2,MixMonitor(/records/callrecords/${fname}.wav)
exten => _x.,n,Answer()
exten => _x.,n,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню. Благодаря этой строчки нет необходимости для проверки звонить постоянно с внешки
;exten => _x.4,1,dial(SIP/1207,5,t&m)
;exten => _x,5,Goto(autoanswer,s,1) ;перевод на автоответчик
exten => _x.,n,hangup()
[menu]
exten => s,1,Background(/var/lib/asterisk/moh/voicemail/sagamenu2) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => 1,1,Dial(SIP/1103&SIP/1108&SIP/1113&SIP/1209&SIP/1210&SIP/1110&SIP/1218&SIP/1115&SIP/1206&SIP/1227&SIP/1122&SIP/1126,,Tt&m) ; 1 нажал, в отдел продаж попал
exten => 2,1,Dial(SIP/1203&SIP/1208&SIP/1202&SIP/1205&SIP/1200&SIP/1229&SIP/1204,,Tt&m) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Dial(SIP/1105&SIP/1215&SIP/1109,,Tt&m) ; 3 нажал, в логистику и закупки попал
exten => 4,1,Dial(SIP/1114,,t&m) ; 4 нажал, к юристу попал
exten => 5,1,Dial(SIP/1101&SIP/1118&SIP/1223,,Tt&m) ; 5 нажал, в фин.отдел попал
exten => 6,1,Dial(SIP/1207,,Tt&m) 6 нажал, в IT-отдел попал
;exten => 9,1,Dial(SIP/,,Tt&m) ; 9 нажал, на факс попал
exten => 0,1,Dial(SIP/1102&SIP/1101,,Tt&m) ; 0 нажал, на секретаря попал
exten => _XXXX,1,Dial(SIP/${EXTEN},,Tt&m) ; набор трехзначного внутреннего номера
exten => s,2,WaitExten(7) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,3,Dial(SIP/1102&SIP/1207,20,Tt&m) ; переводим на секретаря, ожидание 20 сек
exten => s,n,Hangup()
;exten => s,n,Goto(autoanswer,s,1) ;перевод на автоответчик
[autoanswer]
exten => s,1,Background(/var/lib/asterisk/moh/voicebox/avtootvet) ;проигрывается наше записанное приветствие.
exten => s,2,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN}) ;определяется имя файла (fname)
exten => s,3,Record(/records/voicemail/${fname}.wav,0,,X) ;теперь записывается сам файл после бип...
exten => s,n,WaitExten(15)
exten => #,n,Hangup
exten => s,n,Hangup ;кладем трубку
[messages]
exten => _XXX,1,MessageSend(sip:${EXTEN},"${CALLERID(name)}"${MESSAGE(from)})
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3:no)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/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,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
static=yes
writeprotect=yes
[globals]
RECORDING=1
DIR_RECORDS=/records/callrecords/
[default]
[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _x.,2, answer()
exten => _xxxx,3,Dial(SIP/${EXTEN},,t&m)
exten => _8xxxxxxxxxx,3,Dial(SIP/ntel/${EXTEN})
exten => _7xxxxxxxxxx,3,Dial(SIP/zadarma/${EXTEN})
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.
exten => _x.,n,hangup()
[incoming]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN})
;exten => _x.,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
;exten => _x.,2,MixMonitor(/records/callrecords/${fname}.wav)
exten => _x.,n,Answer()
exten => _x.,n,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню. Благодаря этой строчки нет необходимости для проверки звонить постоянно с внешки
;exten => _x.4,1,dial(SIP/1207,5,t&m)
;exten => _x,5,Goto(autoanswer,s,1) ;перевод на автоответчик
exten => _x.,n,hangup()
[menu]
exten => s,1,Background(/var/lib/asterisk/moh/voicemail/sagamenu2) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => 1,1,Dial(SIP/1103&SIP/1108&SIP/1113&SIP/1209&SIP/1210&SIP/1110&SIP/1218&SIP/1115&SIP/1206&SIP/1227&SIP/1122&SIP/1126,,Tt&m) ; 1 нажал, в отдел продаж попал
exten => 2,1,Dial(SIP/1203&SIP/1208&SIP/1202&SIP/1205&SIP/1200&SIP/1229&SIP/1204,,Tt&m) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Dial(SIP/1105&SIP/1215&SIP/1109,,Tt&m) ; 3 нажал, в логистику и закупки попал
exten => 4,1,Dial(SIP/1114,,t&m) ; 4 нажал, к юристу попал
exten => 5,1,Dial(SIP/1101&SIP/1118&SIP/1223,,Tt&m) ; 5 нажал, в фин.отдел попал
exten => 6,1,Dial(SIP/1207,,Tt&m) 6 нажал, в IT-отдел попал
;exten => 9,1,Dial(SIP/,,Tt&m) ; 9 нажал, на факс попал
exten => 0,1,Dial(SIP/1102&SIP/1101,,Tt&m) ; 0 нажал, на секретаря попал
exten => _XXXX,1,Dial(SIP/${EXTEN},,Tt&m) ; набор трехзначного внутреннего номера
exten => s,2,WaitExten(7) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,3,Dial(SIP/1102&SIP/1207,20,Tt&m) ; переводим на секретаря, ожидание 20 сек
exten => s,n,Hangup()
;exten => s,n,Goto(autoanswer,s,1) ;перевод на автоответчик
[autoanswer]
exten => s,1,Background(/var/lib/asterisk/moh/voicebox/avtootvet) ;проигрывается наше записанное приветствие.
exten => s,2,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN}) ;определяется имя файла (fname)
exten => s,3,Record(/records/voicemail/${fname}.wav,0,,X) ;теперь записывается сам файл после бип...
exten => s,n,WaitExten(15)
exten => #,n,Hangup
exten => s,n,Hangup ;кладем трубку
[messages]
exten => _XXX,1,MessageSend(sip:${EXTEN},"${CALLERID(name)}"${MESSAGE(from)})
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3:no)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/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,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: cdr_mysql.conf
[global]
hostname=localhost
dbname=asterisk
table=cdr
password=***
user=asterisk
;port=3306
;sock=/tmp/mysql.sock
[columns]
static "<value>" => <column>
alias <cdrvar> => <column>
alias start => calldate
alias realdst => realdst
;alias remoteip => remoteip
alias filename => filename
alias clid => <a_field_not_named_clid>
alias src => <a_field_not_named_src>
alias dst => <a_field_not_named_dst>
alias dcontext => <a_field_not_named_dcontext>
alias channel => <a_field_not_named_channel>
alias dstchannel => <a_field_not_named_dstchannel>
alias lastapp => <a_field_not_named_lastapp>
alias lastdata => <a_field_not_named_lastdata>
alias duration => <a_field_not_named_duration>
alias billsec => <a_field_not_named_billsec>
alias disposition => <a_field_not_named_disposition>
alias amaflags => <a_field_not_named_amaflags>
alias accountcode => <a_field_not_named_accountcode>
alias userfield => <a_field_not_named_userfield>
alias uniqueid => <a_field_not_named_uniqueid>
hostname=localhost
dbname=asterisk
table=cdr
password=***
user=asterisk
;port=3306
;sock=/tmp/mysql.sock
[columns]
static "<value>" => <column>
alias <cdrvar> => <column>
alias start => calldate
alias realdst => realdst
;alias remoteip => remoteip
alias filename => filename
alias clid => <a_field_not_named_clid>
alias src => <a_field_not_named_src>
alias dst => <a_field_not_named_dst>
alias dcontext => <a_field_not_named_dcontext>
alias channel => <a_field_not_named_channel>
alias dstchannel => <a_field_not_named_dstchannel>
alias lastapp => <a_field_not_named_lastapp>
alias lastdata => <a_field_not_named_lastdata>
alias duration => <a_field_not_named_duration>
alias billsec => <a_field_not_named_billsec>
alias disposition => <a_field_not_named_disposition>
alias amaflags => <a_field_not_named_amaflags>
alias accountcode => <a_field_not_named_accountcode>
alias userfield => <a_field_not_named_userfield>
alias uniqueid => <a_field_not_named_uniqueid>
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: mysql>
+----------+
| filename |
+----------+
| none |
| none |
| none |
| none |
| none |
+----------+
mysql> describe cdr;
+-------------+--------------+------+-----+---------------------+---------------
| Field | Type | Null | Key | Default | Extra
+-------------+--------------+------+-----+---------------------+---------------
| id | int(10) | NO | PRI | NULL | auto_increment
| calldate | datetime | NO | MUL | 0000-00-00 00:00:00 |
| clid | varchar(80) | NO | MUL | |
| src | varchar(80) | NO | MUL | |
| dst | varchar(80) | NO | MUL | |
| realdst | varchar(80) | NO | | |
| dcontext | varchar(80) | NO | MUL | |
| channel | varchar(80) | NO | | |
| dstchannel | varchar(80) | NO | | |
| lastapp | varchar(80) | NO | | |
| lastdata | varchar(80) | NO | | |
| duration | int(11) | NO | | 0 |
| billsec | int(11) | NO | | 0 |
| disposition | varchar(45) | NO | | |
| amaflags | int(11) | NO | | 0 |
| remoteip | varchar(60) | NO | | |
| accountcode | varchar(20) | NO | MUL | |
| peeraccount | varchar(20) | NO | | |
| uniqueid | varchar(32) | NO | MUL | |
| userfield | varchar(255) | NO | | |
| did | varchar(50) | NO | MUL | |
| linkedid | varchar(32) | NO | | |
| sequence | int(11) | NO | | 0 |
| filename | varchar(255) | YES | | none |
+-------------+--------------+------+-----+---------------------+----
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: www/html/cdr/inc/config.php
//Mysql
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = '****';
$db_pass = '****';
$db_name = 'asterisk';
$db_table_name = 'cdr';
$db_options = array();
// $db_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
// Если др. значение, то все записи хранятся в одной папке (/var/calls)
$system_storage_format = '1';
// Папка, где находятся записи Asterisk
$system_monitor_dir = '/records/callrecords'; // без слеша на конце
// Формат аудио, в котором записываются записи звонков
// Плеер не воспроизводит WAV формат!
$system_audio_format = 'mp3';
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = '****';
$db_pass = '****';
$db_name = 'asterisk';
$db_table_name = 'cdr';
$db_options = array();
// $db_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
// Если др. значение, то все записи хранятся в одной папке (/var/calls)
$system_storage_format = '1';
// Папка, где находятся записи Asterisk
$system_monitor_dir = '/records/callrecords'; // без слеша на конце
// Формат аудио, в котором записываются записи звонков
// Плеер не воспроизводит WAV формат!
$system_audio_format = 'mp3';
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: www/html/cdr/inc/config/config.php
<?php
return array(
### Подключение к базе данных
'db' => array(
# Тип базы, который поддерживается PDO. Например: mysql, pgsql
'type' => 'mysql',
# Хост
'host' => 'localhost',
# Порт
'port' => '3306',
# Пользователь
'user' => '***',
# Имя базы
'name' => 'asterisk',
# Пароль
'pass' => '****',
# Название таблицы
'table' => 'cdr',
# Доп. опции подключения
'options' => array(
//PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
),
),
### Системное
'system' => array(
## Название столбца в БД, в котором хранится название записи звонка
'column_name' => 'filename',
## Путь к папке для временных файлов
'tmp_dir' => '/tmp',
## Путь к папке, где находятся записи Asterisk. БЕЗ слеша на конце
'monitor_dir' => '/records/callrecords',
### Формат хранения файлов записей Asterisk
## Если 1, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"
## Если 2, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/12/01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/12/01"
## Если 3, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"
## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/12/01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/12/01"
## Если др. значение, то все записи хранятся в одной папке "/var/calls"
'storage_format' => 8,
## Размер файла в Килобайтах, больше которого считается, что файл существует
'fsize_exists' => 10,
## Формат аудио, в котором записываются записи звонков
# Плеер не воспроизводит WAV в Enternet Explorer. В последних версиях Firefox и Chrome все работает
# Например: mp3, wav
'audio_format' => 'mp3',
## Отложенная конвертация записей звонков. Полезно для снижения нагрузки на сервер
# В этом режиме Asterisk должен записывать записи звонков в WAV, затем каждый день в 00.01 часов файлы из WAV должны быть конвертированы в MP3 с помощью скрипта (см. в папке docs + Readme.txt)
# Файлы за сегодняшний день хранятся в WAV, за прошедшие дни в MP3. В "audio_format" должно быть задано: mp3. В базу в поле 'filename' будет записано имя файла с расширением wav (имя_файла.wav)
# Если 0 - выключить, 1 - включить
'audio_defconv' => 1,
## Если записи звонков / факсов через некоторое время архивируются, раскомментировать строку ниже и указать формат архива (zip gz rar bz2 и т.д.)
# Имя архива должно быть "имя_файла.mp3.zip". Т.е. к имени файла из базы должно быть добавлено расширение архива, например: zip
//'archive_format' => 'zip',
## Разделитель в CSV файле отчета
# Обычно используется запятая ",". Но по умолчанию в Microsoft Office для русского языка установлен разделитель точка с запятой ";"
'csv_delim' => ';',
## Имена пользователей, которым разрешен доступ к сайту. Работает, только если настроена Basic-Auth аутентификация (htpasswd файл) на веб-сервере
# Добавлять имена пользователей в виде массива. Например: 'admins' => array( 'admin1', 'admin2', 'admin3' );
# Если массив пустой, то разрешено всем. Т.е. если задано: 'admins' => array( );
'admins' => array(
),
## Используемые плагины
# Если плагин не нужен, закомментировать соответствующую строку
# Название плагина => имя файла
'plugins' => array(
'Расход средств' => 'my_callrates',
),
),
### Тарифы на звонки
'callrate' => array(
## Включение / Отключение функционала подсчета тарифов. Если отключено, то будет работать немного быстрее при большом количестве записей в выводе
# Если 0 - выключить, 1 - включить
'enabled' => 1,
## Нетарифицируемый интервал в секундах
'free_interval' => 3,
## Путь к CSV файлу с тарифами
# Задается для расчета тарифов при поиске в базе и плагина
'csv_file' => 'inc/plugins/my_callrates.csv',
## Название валюты, которая используется при тарификации
# Например: Будет показано не "1.29", а "1.29 название_валюты"
'currency' => '',
),
### Отображение
'display' => array(
'lookup' => array(
## URL сервиса информации о номере
# Где "%n" будет заменено на номер телефона
'url' => 'https://zvonok.octo.net/number.aspx/' . '%n',
## Минимальная длина номера, для которого будет подставлен URL с инфо о номере
'num_length' => 7,
),
'main' => array(
## Количество записей для показа на странице по умолчанию
'result_limit' => 100,
## Количество показанных записей, после которых снова будет показана шапка (Дата, Статус...)
'header_step' => 30,
### Если 0 - выключить, 1 - включить
## Показ без дублирующихся записей в Asterisk 13 и выше
'duphide' => 1,
## Показ кнопки - Воспроизведение записи звонка
'rec_play' => 1,
## Показ кнопки - Удаление записи звонка
'rec_delete' => 1,
## Возможность редактировать поле "Комментарий" (userfield)
'userfield_edit' => 1,
## Показ контекстного пункта меню - Удаление строки из базы
'entry_delete' => 1,
## Показать Вх. / Исх. канал полностью
# В колонках Вх. / Исх. канал, Например, вместо "SIP" будет показано "SIP/123"
'full_channel' => 1,
## Показать при наведении на "Вх. / Исх. канал", канал полностью с его ID
# При наведении на колонки Вх. / Исх. канал, во всплывающей подсказке, Например, вместо "SIP" или "SIP/100" будет показано "SIP/123-00000025"
'full_channel_tooltip' => 0,
),
### Включение / Отключение показа фильтров поиска
# Если 0 - всегда скрывать, 1 - всегда показывать, 2 - показать при нажатии на кнопку "Дополнительные фильтры"
'search' => array(
## Кто звонил
'src' => 1,
## Куда звонили
'dst' => 1,
## Статус звонка
'disposition' => 1,
## Длительность
'duration' => 2,
## Входящий канал
'channel' => 2,
## Имя звонящего
'clid' => 1,
## DID (Внешний номер)
'did' => 2,
## Исходящий канал
'dstchannel' => 2,
## Код аккаунта
'accountcode' => 0,
## Комментарий (userfield)
'userfield' => 2,
## Приложение
'lastapp' => 2,
## Параллельные звонки
'chart_cc' => 2,
## ASR и ACD (Коэффициент отвеченных вызовов / Средняя продолжительность вызова)
'asr_report' => 0,
## CSV файл
'csv' => 2,
## График звонков
'chart' => 2,
## Расход минут
'minutes_report' => 1,
),
### Включение / Отключение показа некоторых колонок
# Если 0 - скрыть, 1 - показать
'column' => array(
## DID
'did' => 0,
## CallerID
'clid' => 1,
## Аккаунт
'accountcode' => 0,
## Тариф
'callrates' => 1,
## Направление звонка
'callrates_dst' => 0,
## Входящий канал
'channel' => 1,
## Исходящий канал
'dstchannel' => 1,
## Приложение
'lastapp' => 1,
## Файл
'file' => 1,
## Комментарий (userfield)
'userfield' => 1,
),
),
### Параметры сайта
'site' => array(
'main' => array(
## Meta - Title
'title' => 'Детализация звонков',
## Meta - Description
'desc' => 'Детализация звонков',
## Meta - Robots
'robots' => 'noindex, nofollow',
## Текст в шапке
'head' => 'Детализация звонков',
## Путь к изображению с вашим логотипом, которое будет показано в шапке вместо текста
# Если нужно оставить текст, то закомментировать строку ниже или задать значение ''
//'logo_path' => 'img/example_logo.png',
## Путь к основному разделу сайта
# Чтобы стрелка (рядом с текстом или логотипом в шапке) не показывалась, закомментировать строку ниже или задать значение ''
'main_section' => '../',
),
'js' => array(
## Автовоспроизведение записи звонка. Если 0 - выключить, 1 - включить
'player_autoplay' => 1,
## Показ даты записи звонка над плеером. Если 0 - скрыть, 1 - показать
'player_title' => 1,
## Символ, который будет добавлен в Meta - Title страницы во время воспроизведения записи звонка
'player_symbol' => '♫♫♫',
## Показ стрелок для быстрой навигации справа. Если 0 - скрыть, 1 - показать
'scroll_show' => 1,
),
),
### CDN
# Пути к некоторым CSS и JS файлам. Можно указать URL и загружать, например, jQuery с Google CDN
'cdn' => array(
'css' => array(
## Tooltips
'tooltips' => 'img/simptip.min.css',
## jQuery contextMenu
'jquery_contextmenu' => 'img/jquery-contextmenu/jquery.contextMenu.min.css',
),
'js' => array(
## Плеер
'player' => 'img/player.js',
## Скин для плеера
'player_skin' => 'img/player_skin.js',
## jQuery
'jquery' => 'img/jquery.min.js',
## jQuery query object
'jquery_object' => 'img/jquery.query-object.min.js',
## Clipboard JS
'clipboard_js' => 'img/clipboard.min.js',
## jQuery contextMenu
'jquery_contextmenu' => 'img/jquery-contextmenu/jquery.contextMenu.min.js',
## jQuery UI position
'jquery_ui_position' => 'img/jquery-contextmenu/jquery.ui.position.min.js',
),
),
);
return array(
### Подключение к базе данных
'db' => array(
# Тип базы, который поддерживается PDO. Например: mysql, pgsql
'type' => 'mysql',
# Хост
'host' => 'localhost',
# Порт
'port' => '3306',
# Пользователь
'user' => '***',
# Имя базы
'name' => 'asterisk',
# Пароль
'pass' => '****',
# Название таблицы
'table' => 'cdr',
# Доп. опции подключения
'options' => array(
//PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
),
),
### Системное
'system' => array(
## Название столбца в БД, в котором хранится название записи звонка
'column_name' => 'filename',
## Путь к папке для временных файлов
'tmp_dir' => '/tmp',
## Путь к папке, где находятся записи Asterisk. БЕЗ слеша на конце
'monitor_dir' => '/records/callrecords',
### Формат хранения файлов записей Asterisk
## Если 1, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"
## Если 2, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/12/01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/12/01"
## Если 3, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"
## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/12/01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/12/01"
## Если др. значение, то все записи хранятся в одной папке "/var/calls"
'storage_format' => 8,
## Размер файла в Килобайтах, больше которого считается, что файл существует
'fsize_exists' => 10,
## Формат аудио, в котором записываются записи звонков
# Плеер не воспроизводит WAV в Enternet Explorer. В последних версиях Firefox и Chrome все работает
# Например: mp3, wav
'audio_format' => 'mp3',
## Отложенная конвертация записей звонков. Полезно для снижения нагрузки на сервер
# В этом режиме Asterisk должен записывать записи звонков в WAV, затем каждый день в 00.01 часов файлы из WAV должны быть конвертированы в MP3 с помощью скрипта (см. в папке docs + Readme.txt)
# Файлы за сегодняшний день хранятся в WAV, за прошедшие дни в MP3. В "audio_format" должно быть задано: mp3. В базу в поле 'filename' будет записано имя файла с расширением wav (имя_файла.wav)
# Если 0 - выключить, 1 - включить
'audio_defconv' => 1,
## Если записи звонков / факсов через некоторое время архивируются, раскомментировать строку ниже и указать формат архива (zip gz rar bz2 и т.д.)
# Имя архива должно быть "имя_файла.mp3.zip". Т.е. к имени файла из базы должно быть добавлено расширение архива, например: zip
//'archive_format' => 'zip',
## Разделитель в CSV файле отчета
# Обычно используется запятая ",". Но по умолчанию в Microsoft Office для русского языка установлен разделитель точка с запятой ";"
'csv_delim' => ';',
## Имена пользователей, которым разрешен доступ к сайту. Работает, только если настроена Basic-Auth аутентификация (htpasswd файл) на веб-сервере
# Добавлять имена пользователей в виде массива. Например: 'admins' => array( 'admin1', 'admin2', 'admin3' );
# Если массив пустой, то разрешено всем. Т.е. если задано: 'admins' => array( );
'admins' => array(
),
## Используемые плагины
# Если плагин не нужен, закомментировать соответствующую строку
# Название плагина => имя файла
'plugins' => array(
'Расход средств' => 'my_callrates',
),
),
### Тарифы на звонки
'callrate' => array(
## Включение / Отключение функционала подсчета тарифов. Если отключено, то будет работать немного быстрее при большом количестве записей в выводе
# Если 0 - выключить, 1 - включить
'enabled' => 1,
## Нетарифицируемый интервал в секундах
'free_interval' => 3,
## Путь к CSV файлу с тарифами
# Задается для расчета тарифов при поиске в базе и плагина
'csv_file' => 'inc/plugins/my_callrates.csv',
## Название валюты, которая используется при тарификации
# Например: Будет показано не "1.29", а "1.29 название_валюты"
'currency' => '',
),
### Отображение
'display' => array(
'lookup' => array(
## URL сервиса информации о номере
# Где "%n" будет заменено на номер телефона
'url' => 'https://zvonok.octo.net/number.aspx/' . '%n',
## Минимальная длина номера, для которого будет подставлен URL с инфо о номере
'num_length' => 7,
),
'main' => array(
## Количество записей для показа на странице по умолчанию
'result_limit' => 100,
## Количество показанных записей, после которых снова будет показана шапка (Дата, Статус...)
'header_step' => 30,
### Если 0 - выключить, 1 - включить
## Показ без дублирующихся записей в Asterisk 13 и выше
'duphide' => 1,
## Показ кнопки - Воспроизведение записи звонка
'rec_play' => 1,
## Показ кнопки - Удаление записи звонка
'rec_delete' => 1,
## Возможность редактировать поле "Комментарий" (userfield)
'userfield_edit' => 1,
## Показ контекстного пункта меню - Удаление строки из базы
'entry_delete' => 1,
## Показать Вх. / Исх. канал полностью
# В колонках Вх. / Исх. канал, Например, вместо "SIP" будет показано "SIP/123"
'full_channel' => 1,
## Показать при наведении на "Вх. / Исх. канал", канал полностью с его ID
# При наведении на колонки Вх. / Исх. канал, во всплывающей подсказке, Например, вместо "SIP" или "SIP/100" будет показано "SIP/123-00000025"
'full_channel_tooltip' => 0,
),
### Включение / Отключение показа фильтров поиска
# Если 0 - всегда скрывать, 1 - всегда показывать, 2 - показать при нажатии на кнопку "Дополнительные фильтры"
'search' => array(
## Кто звонил
'src' => 1,
## Куда звонили
'dst' => 1,
## Статус звонка
'disposition' => 1,
## Длительность
'duration' => 2,
## Входящий канал
'channel' => 2,
## Имя звонящего
'clid' => 1,
## DID (Внешний номер)
'did' => 2,
## Исходящий канал
'dstchannel' => 2,
## Код аккаунта
'accountcode' => 0,
## Комментарий (userfield)
'userfield' => 2,
## Приложение
'lastapp' => 2,
## Параллельные звонки
'chart_cc' => 2,
## ASR и ACD (Коэффициент отвеченных вызовов / Средняя продолжительность вызова)
'asr_report' => 0,
## CSV файл
'csv' => 2,
## График звонков
'chart' => 2,
## Расход минут
'minutes_report' => 1,
),
### Включение / Отключение показа некоторых колонок
# Если 0 - скрыть, 1 - показать
'column' => array(
## DID
'did' => 0,
## CallerID
'clid' => 1,
## Аккаунт
'accountcode' => 0,
## Тариф
'callrates' => 1,
## Направление звонка
'callrates_dst' => 0,
## Входящий канал
'channel' => 1,
## Исходящий канал
'dstchannel' => 1,
## Приложение
'lastapp' => 1,
## Файл
'file' => 1,
## Комментарий (userfield)
'userfield' => 1,
),
),
### Параметры сайта
'site' => array(
'main' => array(
## Meta - Title
'title' => 'Детализация звонков',
## Meta - Description
'desc' => 'Детализация звонков',
## Meta - Robots
'robots' => 'noindex, nofollow',
## Текст в шапке
'head' => 'Детализация звонков',
## Путь к изображению с вашим логотипом, которое будет показано в шапке вместо текста
# Если нужно оставить текст, то закомментировать строку ниже или задать значение ''
//'logo_path' => 'img/example_logo.png',
## Путь к основному разделу сайта
# Чтобы стрелка (рядом с текстом или логотипом в шапке) не показывалась, закомментировать строку ниже или задать значение ''
'main_section' => '../',
),
'js' => array(
## Автовоспроизведение записи звонка. Если 0 - выключить, 1 - включить
'player_autoplay' => 1,
## Показ даты записи звонка над плеером. Если 0 - скрыть, 1 - показать
'player_title' => 1,
## Символ, который будет добавлен в Meta - Title страницы во время воспроизведения записи звонка
'player_symbol' => '♫♫♫',
## Показ стрелок для быстрой навигации справа. Если 0 - скрыть, 1 - показать
'scroll_show' => 1,
),
),
### CDN
# Пути к некоторым CSS и JS файлам. Можно указать URL и загружать, например, jQuery с Google CDN
'cdn' => array(
'css' => array(
## Tooltips
'tooltips' => 'img/simptip.min.css',
## jQuery contextMenu
'jquery_contextmenu' => 'img/jquery-contextmenu/jquery.contextMenu.min.css',
),
'js' => array(
## Плеер
'player' => 'img/player.js',
## Скин для плеера
'player_skin' => 'img/player_skin.js',
## jQuery
'jquery' => 'img/jquery.min.js',
## jQuery query object
'jquery_object' => 'img/jquery.query-object.min.js',
## Clipboard JS
'clipboard_js' => 'img/clipboard.min.js',
## jQuery contextMenu
'jquery_contextmenu' => 'img/jquery-contextmenu/jquery.contextMenu.min.js',
## jQuery UI position
'jquery_ui_position' => 'img/jquery-contextmenu/jquery.ui.position.min.js',
),
),
);
Надеюсь на вашу лояльность и хороший пинок в правильном направлении (лучше в виде ссылки )