После установки FreePBX возникла потребность чистить старые записи. В Asterisk 13 записи теперь складываются по папкам вида: /var/spool/asterisk/monitor/%Year%/%month%/%day%.


На просторах Интернет был найден скрипт, но он был не идеальным, отсылал по три письма, да и не удалял сами папки. Также не было никаких отчётов о том, что было удалено, а я не люблю оставаться в неведении: согласитесь, было бы не лишним знать что происходит на сервере. Вот, собственно говоря, сам скрипт. Комментарии есть возле каждого пункта на 2-х языках, у себя поставил его в cron с запуском раз в неделю:


#!/bin/bash
# Задаём переменные (Specify variables)
MYSQL_USER="pbxu$eR"                              # Имя пользователя MySQL (MySQL username)
MYSQL="/usr/bin/mysql"                            # Расположение MySQL (whereis mysql)
MYSQLCHECK="/usr/bin/mysqlcheck"                  # Расположение MySQLcheck (whereis mysqlcheck)
MYSQL_PASSWORD="xxxxxxxxxyyyyyyyyyyzzzzzzzzzzzzz" # Пароль пользователя MySQL (MySQL password)
EMAIL="admin@yourdomain.com"                      # Почтовый адрес для уведомлений (Email address for notification)
TYPE="month"                                      # Интервал времени (SECOND,MINUTE,HOUR,DAY,MONTH,YEAR)
NUMBER="3"                                        # Количество (3 месяца) (the number 3 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 (optimaze 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

# Чистим папки от файлов записи (Recording you want to delete, and empty folders)
find /var/spool/asterisk/monitor/ -name "*.*" -type f -mtime +91 -print -delete >> $LOG1
find /var/spool/asterisk/monitor/ -type d -empty -print -delete >> $LOG1

# Выводим последние 10 000 записей из временного лога и копируем их в постоянный (Get the last 100,000 records from the temporary log file and copy it to permanent)
grep -A 10000 "$data" $LOG1 >> $LOG

# Отсылаем письмо с логами чистки в теле письма (Send email with progress report)
echo "Отчёт об отчистке старых записей" | mail -s PBX-CDR-CLEANER $EMAIL < $LOG

Конструктивная критика приветствуется.


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

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


  1. Redduck119
    19.12.2023 04:29

    Я всё время откладывал написания скрипта. Всё, потом, потом.
    А так раз в месяц копировал записи в бекап и очищал руками.
    Вроде и при деле всегда.


  1. Lazhu
    19.12.2023 04:29

    /bin/sh

    для бинарников: binary=`which binary`

    и echo ВНЕЗАПНО multiline:

    echo 'something
    something else
    blahblahblah' >> FILE

    а путь к логам /var/spool/asterisk/monitor/ можно тоже загнать в переменную


  1. Krotesk
    19.12.2023 04:29

    # Выводим последние 10 000 записей из временного лога и копируем их в постоянный (Get the last 100,000 records from the temporary log file and copy it to permanent) grep -A 10000 "$data" $LOG1 >> $LOG

    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)

    Лог-файлы не перепутаны? Может лучше более информативно их назвать?