Freepbx как удалить записи разговоров
Перейти к содержимому

Freepbx как удалить записи разговоров

  • автор:

Удаление записей и старых каталогов из FreePBX

После установки 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

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

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

Удаления записи разговоров

Но мне нужна помощь ГУРУ, как удалять в сдр отчетах ярлык на запись разговора если она старше 14 дней ?

Да совершенно верно, мне не нужно удалять записи сдр, мне нужно удалять ярлык на звуковой файл, дайте карму что-бы мог комментировать=)

спросил 2013-06-07 14:59:19 +0400

Comments

Дело не в карме - сайт глючит.

Спасибо, будем ждать когда сделается =)

насколько я помню после удаления файлы в freepbx уже не показывает микрофончик. там просто проверка есть ли файл. или что за ярлычек вам надо удалить?

показывает =( и ссылается на не существующий файл

у меня стоит * + отдельно накатил фрипбх

5 Ответов

Мой вариант на удаление старых файлов - удаляет по проверке занятого места внимательно проверяйте как отдается свободное место перед запуском - должно быть в процентах - меняйте на $4 на $5 по необходимости в 2 местах

df -l df -l | grep ' /$' | awk '' | awk -F'%' '' Сам скрипт #!/bin/sh logfile=/var/log/mesto.log dir=/var/spool/asterisk/monitor/ cd $dir date=`date +%Y.%m.%d' '%H:%M:%S` olddate=`stat -c%y $(ls -t | tail -n 1) | awk -F' ' ''` mesto=`df -l | grep ' /$' | awk '' | awk -F'%' ''` zanyato=80 echo $date' Зaнято места на диске: '$mesto'%' >> $logfile ################# if [ "$mesto" -ge "$zanyato" ]; then echo $date' Удаляются файлы за '$olddate >> $logfile ################## fi nmax=9 n=0 while [ "$mesto" -ge "$zanyato" ] && [ "$n" -lt "$nmax" ]; do for FILE in `ls -lR --time-style=full-iso $dir | grep $olddate | awk ` do echo $date' Удаляется файл '$FILE >> $logfile ################## rm $FILE done # Конец for n=$(( $n + 1 )) mesto=`df -l| grep ' /$' | awk '' | awk -F'%' ''` done # Конец while if [ "$n" -lt "$nmax" ]; then echo $date' Места достаточно. Скрипт выполнен '$n' раз' >> $logfile ################# else echo $date' Скрипт выполнен максимальное число раз' >> $logfile ############## fi exit 0 

ответил 2015-07-12 14:18:08 +0400

Comments

рекомендую добавить в цикл sleep 1

Вот тут я написал скрипт для удаления записей из MySQL.

#!/bin/bash # by adm@smirupobitu.ru MYSQL_USER="root" # Имя пользователя MySQL MYSQL=/usr/bin/mysql # Расположение MySQL (whereis mysql) MYSQLCHECK=/usr/bin/mysqlcheck # Расположение MySQLcheck (whereis mysqlcheck) MYSQL_PASSWORD="mysqlpassword" # Пароль пользователя MySQL EMAIL="info@smirupobitu.ru" # Почтовый адрес для уведомлений TYPE="month" # Интервал времени (SECOND,MINUTE,HOUR,DAY,MONTH,YEAR) NUMBER="6" # Количество (6 месяцев) # Чистим asteriskcdrdb.cdr if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "delete from asteriskcdrdb.cdr where calldate < DATE_SUB(NOW(), interval $NUMBER $TYPE);"; then echo "Старые записи из asteriskcdrdb.cdr успешно удалены" | mail -s "MySQL" $EMAIL else echo "Не удалось удалить старые записи из asteriskcdrdb.cdr" | mail -s "MySQL" $EMAIL exit 0 fi # Чистим 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 успешно удалены" | mail -s "MySQL" $EMAIL else echo "Не удалось удалить старые записи из asteriskcdrdb.cel" | mail -s "MySQL" $EMAIL exit 0 fi # Оптимизируем asteriskcdrdb if $MYSQLCHECK -u$MYSQL_USER -p$MYSQL_PASSWORD --optimize asteriskcdrdb; then echo "asteriskcdrdb успешно оптимизирована" | mail -s "MySQL" $EMAIL else echo "Не удалось оптимизировать базу asteriskcdrdb" | mail -s "MySQL" $EMAIL exit 0 fi 

ответил 2015-04-25 14:01:04 +0400

Comments

и что конкретно в нем хорошего? вы проверяли ваш "скрипт" с базой на 1млн записей? а на 10млн? вы вообще в курсе что делает команда optimize с innodb базой?

При обслуживании базы надо еще предусмотреть ротацию/удаление mysql.log, иначе он растет бесконечно, например: mv mysql.log mysql.old; mysqladmin flush-logs

mysql -e 'SELECT * INTO OUTFILE "/tmp/cdr.csv" FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '\'\"\'' LINES TERMINATED BY "\n" FROM cdr ORDER BY calldate LIMIT 100000;' --user="asteriskuser" --password="4nccnuQcYbD4VZRc" asteriskcdrdb |sed 's/^/[clean-cdr] /' >> $logfile mysql -e "DELETE FROM cdr ORDER BY calldate LIMIT 100000" --user="asteriskuser" --password="4nccnuQcYbD4VZRc" asteriskcdrdb |sed 's/^/[clean-cdr] /' >> $logfile mysql -e "DELETE FROM recordings ORDER BY uniqueid LIMIT 20000" --user="asteriskuser" --password="4nccnuQcYbD4VZRc" asteriskcdrdb |sed 's/^/[clean-cdr] /' >> $logfile 

ответил 2013-06-07 16:11:11 +0400

Comments

хороший совет - ничего не скажешь пароль к бд и сразу в крон. лучше на сокеты не ставить проверку пароля а поставить аутентификацию по пиру (системному пользователю) а внешние скрипты типа phpmyadmin вязать по порту. не знаю если в mysql есть такая возможность - давно на постгресе. но это уже как-то глубоко в оффтопик 🙂

у mysql уже фиг знает сколько присутсвует возможность ставить разных пользователей разным адресам и хорошим тоном является запрет для пользователя рут доступа извне сервера. а если злоумышленик получил доступ к РУТОВОМУ кронтабу, то вас уже ничего не спасет, поверьте. хотя четсно говоря удаление 100000 записей на системах гед это 100000 больше чем сумарное число немного не радуют. я обычно удаляю по calldate>date_sub(now(),interval 6 month)

>>хороший совет - ничего не скажешь пароль к бд и сразу в крон.

А PHP скрипты веб интерфейса у вас пароли к БД спрашивают непосредственно перед исполнением?

скрипт надо не от рута запускать а из от униховского пользователя asterisk. Как это у меня - только юникс пользователи "asterisk" и "www-api" имеют доступ непосредственно к базе данных Астериска (так настроены pgident и pghba.conf). www-api - это пользователь для отдельного API контроллера (гальваническая развязка через JSON-RPC), который проксирует запросы от вебморды к базе и соответственно имеет к доступ к базе Астера. Если на сервере появились вредноносные веб скрипты то им нужно знать интерфейс между гальванической развязкой и вебмордой чтобы навредить базе Астера. Пароль в этом случае не нужен - api-контроллер коннектится к базе через сокет. Астер тоже через сокет может. если уже есть unix идентификация - зачем еще одна? без ident идентификации и с открытым паролем в /etc/crontab может быть весело. особенно если права для чтения для "other". от рута по идее вообще в системе ничего запускаться не должно.

на сервере телефонии имхо пофигу от какого пользователя. ибо кроме телефонии нчего нет. и если есть доступ к пользователю астриск - то уже можно всю инфу удалить.и смысл? ваши идеи какието сильно теоритические. много вы систем создали?

если кто-то получил физический доступ к вашей системе - это уже не ваша система. Если кто-то подключился к эластику и клонам через любую учетку, то он имеет доступ ко всему. В общем можно долго и нудно зарабатывать геморрой мозга устраняя потенциальные проблемы внутренней безопасности, а можно просто никого не пускать внутрь. И потом: если сокет пускает без пароля, то нахрен вся остальная псевдозащита?

Elastix в глаза не видел - только Vanilla. Делаю с нуля на ZF2 обе части + marcelog/PAGI (для AGIшной части использую только некоторые компоненты фреймворка, но оказалось весьма кстатьи - но это уже к поднятой теме безопасности не имеет отношение вроде как 🙂 ). Далеко не на нулевом этапе. До этого долго изучал вопрос. Почему Вы думаете что все системы обязательно должны быть клонами Эластикса? Если создавать тиражируемую систему то вопрос размещения на разных серверах - не обязательно в компетенции разработчика. Как получат доступ к пользователю "asterisk" без взлома рута расскажите мне - при /sbin/nologin? Код Астера вроде небезопасными функциями не страдает насколько мне известно. Лучшая защита - изоляция объектов. Когда доступ к базе может быть от любого пользователя юникс - это не есть гуд. вот что я хотел сказать да и только. чем больше уровней защиты, тем лучше теоретически. если никого не пускать на сервер - это хорошо, но может не продлиться вечно.

тоесть месье теоретик. ну ок,че.

Записи разговоров asterisk переполнили диск.

Гугленье дало следующие варианты:
1
#!/bin/bash
# Указываем директорию где расположены файлы
RECORDINGS=/var/spool/asterisk/monitor
# Указываем период за какой срок удалять файлы записи
RECORDINGEXPIRY=14
# Указываем за какой срок хранить логи
LOGEXPIRY=365
# Дата
DATE=`date`
# Удаляем записи старше $RECORDINGEXPIRY дней
find $RECORDINGS -mtime +$RECORDINGEXPIRY -exec rm -rfv > removal-$DATE.log
# Удаляем логи старше $LOGEXPRY
find . -mtime +$LOGEXPIRY -exec rm -rf

В ответ получаем:
find: отсутствует аргумент у `-exec'

2
попроще:
bash /usr/bin/find /var/spool/asterisk/monitor/*.wav -mtime 365 -delete
Ответ после нескольких минут:"-bash: /bin/bash: Слишком длинный список аргументов"

3
find /var/spool/asterisk/monitor/* -mtime +365 -exec rm <> \;
Аналогичный ответ: "-bash: /usr/bin/find: Слишком длинный список аргументов"

Как вычистить эти файлики?

Asterisk. Freepbx. Удаление записей разговоров старше … дней

После установки Freepbx диск начинает заполняться записями разговоров. Научим систему удалять их.

Переписано для удобства

Файл скрипта удаления старых записей

Создаем файл скрипта, он написан на PHP:

mkdir /scripts
nano /scripts/cleanup_cdr.php

Вставляем код, правим переменные $days, $username, $password, $file (см. комментарии):

 \;'); $current = "DELETE :: $adate :: $number records were deleted from CDR\n"; file_put_contents($file, $current, FILE_APPEND | LOCK_EX); //записываем запись в лог файл; ?>

Настройка MySql на сервере FreePBX

Далее, создаем пользователя базы данных (см. выше, в файле мы уже задали имя пользователя delete и его пароль) с доступом к записям разговоров, от имени которого и будем удалять записи:

mysql
mysql> CREATE USER 'delete'@'localhost' IDENTIFIED BY '333jIje45';

Даем нужные права:

mysql> GRANT DELETE, SELECT ON asteriskcdrdb.cdr TO 'delete';
mysql> quit

Добавление задания в планировщик

Чтобы однократно выполнить скрипт, запускаем:

/usr/bin/php /scripts/cleanup_cdr.php

Чтобы скрипт запускался регулярно и автоматически, добавим его в планировщик:

nano crontab -e
0 0 * * 7 root /usr/bin/php /scripts/cleanup_cdr.php

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *