Здравствуйте
Написал скрипт:
#!/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
Запускаю вот так:
0 8 * * * /srv/sh/atc/recordingdeletion.sh
мб кому мое решение полностью подойдет =) пользуйтесь
Но мне нужна помощь ГУРУ, как удалять в сдр отчетах ярлык на запись разговора если она старше 14 дней ?
Заранее благодарен!
Да совершенно верно, мне не нужно удалять записи сдр, мне нужно удалять ярлык на звуковой файл, дайте карму что-бы мог комментировать=)
Мой вариант на удаление старых файлов - удаляет по проверке занятого места внимательно проверяйте как отдается свободное место перед запуском - должно быть в процентах - меняйте на $4 на $5 по необходимости в 2 местах
df -l
df -l | grep ' /$' | awk '{print $4}' | awk -F'%' '{print $1}'
Сам скрипт
#!/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' ' '{print $1}'`
mesto=`df -l | grep ' /$' | awk '{print $4}' | awk -F'%' '{print $1}'`
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 {'print $9'}`
do
echo $date' Удаляется файл '$FILE >> $logfile ##################
rm $FILE
done # Конец for
n=$(( $n + 1 ))
mesto=`df -l| grep ' /$' | awk '{print $4}' | awk -F'%' '{print $1}'`
done # Конец while
if [ "$n" -lt "$nmax" ]; then
echo $date' Места достаточно. Скрипт выполнен '$n' раз' >> $logfile #################
else
echo $date' Скрипт выполнен максимальное число раз' >> $logfile ##############
fi
exit 0
Вот тут я написал скрипт для удаления записей из MySQL.
http://smirupobitu.ru/udalenie-iz-bazy-asterisk-staryx-zvonkov/
#!/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
и что конкретно в нем хорошего? вы проверяли ваш "скрипт" с базой на 1млн записей? а на 10млн? вы вообще в курсе что делает команда optimize с innodb базой?
meral ( 2015-04-25 17:54:02 +0400 )редактироватьПри обслуживании базы надо еще предусмотреть ротацию/удаление mysql.log, иначе он растет бесконечно, например: mv mysql.log mysql.old; mysqladmin flush-logs
yks ( 2015-07-14 10:21:33 +0400 )редактироватькак-то так:
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
хороший совет - ничего не скажешь пароль к бд и сразу в крон... лучше на сокеты не ставить проверку пароля а поставить аутентификацию по пиру (системному пользователю) а внешние скрипты типа phpmyadmin вязать по порту... не знаю если в mysql есть такая возможность - давно на постгресе. но это уже как-то глубоко в оффтопик :-)
octopas ( 2013-06-07 17:43:48 +0400 )редактироватьу mysql уже фиг знает сколько присутсвует возможность ставить разных пользователей разным адресам и хорошим тоном является запрет для пользователя рут доступа извне сервера. а если злоумышленик получил доступ к РУТОВОМУ кронтабу, то вас уже ничего не спасет, поверьте. хотя четсно говоря удаление 100000 записей на системах гед это 100000 больше чем сумарное число немного не радуют. я обычно удаляю по calldate>date_sub(now(),interval 6 month)
meral ( 2013-06-08 15:17:56 +0400 )редактировать>>хороший совет - ничего не скажешь пароль к бд и сразу в крон...
А PHP скрипты веб интерфейса у вас пароли к БД спрашивают непосредственно перед исполнением?
switch ( 2013-06-08 15:50:34 +0400 )редактироватьскрипт надо не от рута запускать а из от униховского пользователя asterisk. Как это у меня - только юникс пользователи "asterisk" и "www-api" имеют доступ непосредственно к базе данных Астериска (так настроены pgident и pghba.conf). www-api - это пользователь для отдельного API контроллера (гальваническая развязка через JSON-RPC), который проксирует запросы от вебморды к базе и соответственно имеет к доступ к базе Астера. Если на сервере появились вредноносные веб скрипты то им нужно знать интерфейс между гальванической развязкой и вебмордой чтобы навредить базе Астера. Пароль в этом случае не нужен - api-контроллер коннектится к базе через сокет. Астер тоже через сокет может. если уже есть unix идентификация - зачем еще одна? без ident идентификации и с открытым паролем в /etc/crontab может быть весело... особенно если права для чтения для "other"... от рута по идее вообще в системе ничего запускаться не должно.
octopas ( 2013-06-08 18:40:02 +0400 )редактироватьна сервере телефонии имхо пофигу от какого пользователя. ибо кроме телефонии нчего нет. и если есть доступ к пользователю астриск - то уже можно всю инфу удалить.и смысл? ваши идеи какието сильно теоритические. много вы систем создали?
meral ( 2013-06-08 19:03:48 +0400 )редактироватьесли кто-то получил физический доступ к вашей системе - это уже не ваша система. Если кто-то подключился к эластику и клонам через любую учетку, то он имеет доступ ко всему. В общем можно долго и нудно зарабатывать геморрой мозга устраняя потенциальные проблемы внутренней безопасности, а можно просто никого не пускать внутрь. И потом: если сокет пускает без пароля, то нахрен вся остальная псевдозащита?
switch ( 2013-06-08 19:05:34 +0400 )редактироватьElastix в глаза не видел - только Vanilla. Делаю с нуля на ZF2 обе части + marcelog/PAGI (для AGIшной части использую только некоторые компоненты фреймворка, но оказалось весьма кстатьи - но это уже к поднятой теме безопасности не имеет отношение вроде как :) ). Далеко не на нулевом этапе. До этого долго изучал вопрос. Почему Вы думаете что все системы обязательно должны быть клонами Эластикса? Если создавать тиражируемую систему то вопрос размещения на разных серверах - не обязательно в компетенции разработчика. Как получат доступ к пользователю "asterisk" без взлома рута расскажите мне - при /sbin/nologin? Код Астера вроде небезопасными функциями не страдает насколько мне известно... Лучшая защита - изоляция объектов. Когда доступ к базе может быть от любого пользователя юникс - это не есть гуд. вот что я хотел сказать да и только. чем больше уровней защиты, тем лучше теоретически. если никого не пускать на сервер - это хорошо, но может не продлиться вечно.
octopas ( 2013-06-08 23:49:17 +0400 )редактироватьот того что вы понаделали слоев защиты в виде разделения доступа локальным пользователям к БД ничего не изменится:
Ну и глупо разграничивать доступ по mysql учеткам внутри одной машины в то время когда у вас в скриптах хранится в открытом виде пароль доступа к базе. Это просто бессмысленно. Если на ваш сервер попал посторонний (ssh, telnet, etc...), то грош цена вашей паранойе.
В общем случае стоимость защиты не должна превышать стоимости последствий от ее компрометации. В подавляющем большинстве случаев защита сервера телефонии сводится к стойким паролям SIP учеток и изолированию (веб интерфейса и других сервисов) от внешнего мира. Запекать каждый раз мудреную систему - нафиг надо. Есть best practics, что нужно делать чтоб вероятность взлома была минимальной.
switch ( 2013-06-09 09:25:43 +0400 )редактироватьЗачем его удалять?
В запросе вебморды при выводе:
SELECT * FROM `cdr` WHERE `calldate`<(NOW() - INTERVAL 14 DAYS) AND `recordmarker`=false ORDER BY whatever LIMIT 20;
В диалплане разговоры которые не записываются помечайте этим полем.
Set(${CDR(recordmarker)}=unmonitored)
Соответственно в схему таблицы cdr нужно добавить поле:
ALTER TABLE `cdr` ADD COLUMN recordmarker ENUM('unmonitored','monitored') DEFAULT 'monitored' COMMENT 'маркер записи';
В линуксе есть такая прога tmpwatch ее можно по крону вызывать
и не надо скриптов (c) dobs
Задан: 2013-06-07 14:59:19 +0400
Просмотрен: 11,044 раз
Обновлен: Jul 12 '15
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
Дело не в карме - сайт глючит.
switch ( 2013-06-08 10:32:10 +0400 )редактироватьСпасибо, будем ждать когда сделается =)
DmitryK ( 2013-06-08 11:21:12 +0400 )редактироватьнасколько я помню после удаления файлы в freepbx уже не показывает микрофончик. там просто проверка есть ли файл. или что за ярлычек вам надо удалить?
meral ( 2013-06-08 15:21:26 +0400 )редактироватьпоказывает =( и ссылается на не существующий файл
DmitryK ( 2013-06-09 01:41:05 +0400 )редактироватьобновите еластикс.
meral ( 2013-06-09 05:11:47 +0400 )редактироватьу меня стоит * + отдельно накатил фрипбх
DmitryK ( 2013-06-09 23:17:09 +0400 )редактировать