FreePBX. Как удалить записи разговоров.
Чистота-залог здоровья. Чистим CDR.
В процессе эксплуатации сервера телефонии накапливаются файлы записей, хранить которые бесконечно не имеет смысла. В сегодняшней статье опишу способ удаления старых записей разговоров и очистки базы CDR.
Файлы записей звонков хранятся в директории /var/spool/asterisk/monitor/%год%/%месяц%/%день%, а данные Call Detail Records(CDR) в базе asteriskcdrdb.
Этот способ основан на скрипте, который удаляет файлы записей в формате .wav старше определенной даты, удаляет пустые папки, оптимизирует базу asteriskcdrdb и отправляет на почту письмо с отчетом о проделанной работе.
Сразу хочется поблагодарить автора статьи на Хабре, который и разместил скрипт, вошедший, с небольшими доработками, в эту статью.
Итак, к делу. Давайте, я сначала размещу сам скрипт, а потом немного расскажу о нюансах, с которыми столкнулся.
Скрипт для удаления старых записей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#!/bin/bash # Задаём переменные (Specify variables) MYSQL_USER="db_user" # Имя пользователя MySQL (MySQL username) MYSQL_PASSWORD="db_password" # Пароль пользователя MySQL (MySQL password) MYSQL="/usr/bin/mysql" # Расположение MySQL (whereis mysql) MYSQLCHECK="/usr/bin/mysqlcheck" # Расположение MySQLcheck (whereis mysqlcheck) EMAIL="admins@your.mail" # Почтовый адрес для уведомлений (Email address for notification) TYPE="month" # Интервал времени (SECOND,MINUTE,HOUR,DAY,MONTH,YEAR) NUMBER="5" # Количество (5 месяца) (the number 5 months) LOG="/var/log/cdr-temp.log" # Лог файл перезаписываемый и отсылаемый на почту(A temporary log file is sent on email as a report) LOG1="/var/log/cdr-clean.log" # Лог файл постоянный (The log file permanent) data="`date`" # Чистим лог от старых записей (Clean old log records from) echo > $LOG # Делаем запись даты в лог (The date recorded in the log) echo >> $LOG1 echo "---------=$data=---------" >> $LOG1 echo >> $LOG1 # Чистим asteriskcdrdb.cdr (clean asterisksdrdb.cdr) if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "delete from asteriskcdrdb.cdr where calldate < DATE_SUB(NOW(), interval $NUMBER $TYPE);"; then echo >> $LOG1 echo Старые записи из asteriskcdrdb.cdr успешно удалены >> $LOG1 echo >> $LOG1 else echo Не удалось удалить старые записи из asteriskcdrdb.cdr >> $LOG1 echo >> $LOG1 exit 0 fi # Чистим asteriskcdrdb.cel (clean asteriskcdrdb.cel) if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "delete from asteriskcdrdb.cel where eventtime < DATE_SUB(NOW(), interval $NUMBER $TYPE);"; then echo Старые записи из asteriskcdrdb.cel успешно удалены >> $LOG1 echo >> $LOG1 else echo Не удалось удалить старые записи из asteriskcdrdb.cel >> $LOG1 echo >> $LOG1 exit 0 fi # Оптимизируем asteriskcdrdb (optimize asteriskcdrdb table) if $MYSQLCHECK -u$MYSQL_USER -p$MYSQL_PASSWORD --optimize asteriskcdrdb; then echo База asteriskcdrdb успешно оптимизирована >> $LOG1 echo >> $LOG1 else echo Не удалось оптимизировать базу asteriskcdrdb >> $LOG1 echo >> $LOG1 exit 0 fi echo >> $LOG1 echo "----------Были удалены следующие файлы и папки----------" >> $LOG1 # Чистим папки от файлов записи (Records you want to delete, and empty folders) find /var/spool/asterisk/monitor/ -name "*.wav*" -type f -mtime +153 -print -delete >> $LOG1 find /var/spool/asterisk/monitor/ -type d -empty -print -delete >> $LOG1 # Выводим последние 10 000 записей из постоянного лога и копируем их во временный (Get the last 10,000 records from the permanent log file and copy it to temporary ) grep -A 10000 "$data" $LOG1 > $LOG # Отсылаем письмо с логами очистки в теле письма (Send email with progress report) echo "Отчёт об очистке старых записей" | mail -s PBX-CDR-CLEANER $EMAIL < $LOG |
В данном скрипте удаляются записи разговоров старше 153 дней и данные из таблиц asteriskcdrdb.cdr и asteriskcdrdb.cel старше 5 месяцев. Разместите его на сервере и создайте задачу в crontab на выполнение с нужной периодичностью.
Теперь о нюансах.
У меня не получилось заставить работать скрипт с пустым паролем пользователя root для mysql, поэтому я использовал учетку пользователя freepbxuser, которая есть во FreePBX и имеет доступ к нужной нам базе asteriskcdrdb. Пароль от этой учетки можно посмотреть в файле /etc/asterisk/res_odbc_additional.conf
Если хочется использовать другого пользователя для доступа к БД, можно создать нового пользователя mysql и предоставить ему права на необходимые базы данных. Для этого короткое описание некоторых команд mysql:
Посмотреть имеющихся пользователей mysql можно командой:
1 |
select host, user, password from mysql.user; |
(Перед этим не забываем подключиться к mysql введя: mysql -uroot -p)
Для создания пользователя:
1 |
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'user_password'; |
Посмотреть права пользователя:
1 |
SHOW GRANTS FOR 'database_user'@'localhost'; |
Предоставить определенные разрешения :
1 |
GRANT permission1, permission2 ON database_name.table_name TO 'database_user'@'localhost'; |
(Разрешения могут быть: CREATE, DROP, DELETE, INSERT, SELECT, UPDATE),
либо предоставить все права на базу:
1 |
GRANT ALL PRIVILEGES ON database_name.* TO 'database_user'@'localhost'; |
Ну и, на всякий случай, отобрать права можно так:
1 |
REVOKE ALL PRIVILEGES ON database_name.* FROM 'database_user'@'localhost'; |
а удалить пользователя так:
1 |
DROP USER 'user'@'localhost' |
Ну, вот, наверное, и всё о том как удалить записи разговоров и очистить CDR в FreePBX. Не забудьте добавить этот скрипт в crontab для выполнения его по расписанию.
Возможно будет полезен, более универсальный вариант.
https://github.com/vixfree/clear_asterisk-db
не на что не претендую, просто сам убил кучу времени для автоматизации процесса и если честно нормальных решений не нашел.
Спасибо. Возможно, и этот вариант будет кому-то полезен.
Здравствуйте!
Запустил данный скрипт, по концовке выдал сообщения и по факту в папках ничего не удалил:
asteriskcdrdb.cdr
note : Table does not support optimize, doing recreate + analyze instead
status : OK
asteriskcdrdb.cel
note : Table does not support optimize, doing recreate + analyze instead
status : OK
У меня FreePBX 15.0.17.37 распберипи крутится (RasPBX).
Помогите с решением, если не сложно.
Спасибо.
Здравствуйте! Проверьте, отрабатывает ли команда удаления записей без скрипта. Если всё нормально, проверьте правильность команд в скрипте(иногда, при копировании с сайта могут меняться кавычки, например). Также, возможно, нет записей старше того количества дней, которое Вы указали(в скрипте из статьи это 153 дня). В любом случае, начните с выполнения команды
find /var/spool/asterisk/monitor/ -name "*.wav*" -type f -mtime +153
и посмотрите, найдутся ли файлы записей.Здравствуйте! Никто не пробовал https://asterisk-system.ru/freepbx/udalenie-zapisej-razgovorov-v-freepbx.html
Хотелось бы знат мнение.