Обеспечение поддержки русских символов в CDR Asterisk

Дмитрий Аверин
3 июля 2020
access_time3 минуты
remove_red_eye5077
Компания «Ланкрафт»
Компания «Ланкрафт»

Борьба с «багами» FreePBX в некоторых запущенных случаях может вывести из себя даже опытного администратора. Проблема эта глубока и многогранна, но это вовсе не означает, что с ней нельзя справиться. Так, сегодня мы разберем один из самых неприятных и надоедливых «багов», который мигрирует из одной версии FreePBX в другую, благополучно сохраняясь и мешая пользователям. Да, тяготение к кириллице не обходится без последствий. Если для задания имен внутренних номеров IP-АТС хочется использовать русские буквы, настоятельно рекомендуем изучить сначала этот текст. Он точно будет для вас полезен и убережет от многих ошибок.

Рассматриваемый «баг» был присущ FreePBX версии 13, но проблема никуда не делась и в 14, и в 15 релизах. Итак, узнаем, как бороться с неверным отображением русской кодировки в модуле CDR. Ошибка больше известна в народных кругах как «кракозябры в CDR».

Погружаясь в проблему

Итак, устанавливаем актуальную версию FreePBX, добавляем 2 внутренних номера, для которых указываем имена на русском языке. Допустим, это будут Семен Волжский и Иван Петров. Регистрируем для двух добавленных софтфоны и производим тестовый звонок. Что же, вполне успешно, ведь так? Проследуем в Reports → CDR Reports, где наблюдаем пресловутые кракозябры, которые совсем не походят на имена вышеуказанных абонентов.

Знакомая многим ситуация. Попробуем выйти из нее вместе. Начинаем с проверки таблицы CDR в базе asteriskcdrdb и убеждаемся, что там наблюдается аналогичная картина.

Решение

Важно! Перед практическим применением руководства необходимо создать Backup системы либо Snapshot Virtual Machine. Помните, что ответственность за все происходящее с вашей IP-АТС лежит на вас. Если какие-то шаги будут выполнены неверно, FreePBX и Asterisk могут полностью утратить работоспособность. Учтите это!

В глобальной паутине представлено множество рекомендаций, призванных помочь решить проблему. Так, кто-то рекомендует выставлять значение charset = utf8 в файле /etc/asterisk/cdr_mysql.conf. Другие говорят, что следует выполнить core reload после очередного инцидента со слетевшими записями. Продвинутые умы советуют написать скрипт для регулярного обязательного перекодирования записей. Но эти рекомендации в лучшем случае являются костылями, а часто не приносят результата вообще.

На официальном портале Freepbx.org по этой проблеме даже завели Official Bug FREEPBX-15268. До сих пор, чтобы вы понимали, он находится в статусе Unresolved (не решен). Не шибко-то разработчики торопятся справляться с собственными ошибками.

Сравнительно эффективный метод лечения – удаление действующего ODBC-коннектора MySQL и инсталляция ODBC-коннектора версии а 5.3.9 (ANSI Driver) с последующим редактированием файла odbc.ini. Изменения должны выглядеть следующим образом:

[MySQL-asteriskcdrdb]

driver=MySQL ODBC 8.0 ANSI Driver

Выполнив эти действия, нам удастся добиться корректного отображения записей в CDR, зато логи будут пестрить предупреждениями. И этот бардак вряд ли хоть кому-то доставит удовольствие.

Любопытно, что непосредственно в таблице Cel, вызывающей негодование у сервера, все вполне нормально.

Получается, мы вроде бы решили проблему. CDR корректен, но в лог лучше не заглядывать, чтобы не портить настроение. Смотреть без эмоций на поток предупреждений просто невозможно.

Что же, решим проблему более элегантным способом. Обеспечим чистоту логов и одновременно отсутствие «кракозябр». Итак, переходим к фигурам высшего пилотажа.

Начинаем с удаления действующего ODBC-коннектора. Из-за существующих зависимостей за компанию в небытие уйдет и сам Asterisk. По этой причине необходимо уточнить, какой коннектор у нас инсталлирован. После удаляем его, прописав в консоли:

rpm -qa | grep mysql-connector-odbc

Выполнив вышеуказанные шаги, наблюдаем, что у нас используется версия 8.0. Необходимо выполнить его удаление, игнорируя при этом наличные связи. Для деинсталляции исключительно коннектора выполним специальную команду.

rpm -e --nodeps mysql-connector-odbc-8.0.13-1.el7.x86_64

В данной команде укажите название пакета, обнаруженного на предыдущем шаге.

На следующем этапе устанавливаем новый Connector. Но использовать мы будем теперь не продукт MySQL, а коннектор от MariaDB. Чтобы инсталлировать коннектор, указываем команду:

yum install mariadb-connector-odbc

Важно! Перед использованием этой команды обязательно необходимо снести старый коннектор. Игнорирование этого требования приводит к отказу модуля CDR.

Проверяем файл /etc/odbcinst.ini. Там должна находиться аналогичная запись, имеющая заголовок “[MySQL ODBC 8.0 ANSI Driver]” и подтверждающая наличие коннектора ANSI от MariaDB.

Остается перезагрузиться (fwconsole restart), после чего процедуру можно считать практически завершенной. Остается выполнить несколько тест-звонков и проверить модуль CDR FreePBX. Не забудем также заглянуть в таблицу CDR asteriskcdrdb

На этой позитивной ноте мы завершаем настройку. Хочется надеяться, что статья принесла вам пользу. Сведений, представленных в ней, вполне достаточно, чтобы поставить точку в войне с надоевшим и коварным багом. Можно гордиться собой, ведь с ним отказались бороться даже сами разработчики. Благодарим, что дочитали статью до конца.