[Из песочницы] Чистка Dropbox backup-storage по cron'у
Довелось мне сейчас настраивать Akeeba Backup Pro на удалённое хранение резервных копий в Dropbox. И по ходу процесса оказалось, что Akeeba умеет только захламлять тот самый Dropbox, а вот подчищать старьё после него придётся вручную. Но вручную — не комильфо, да и архивы по гигабайту с небольшим. Следовательно, нужно как-то избавляться от устаревших без помощи рук.
Итак, дано — полные бэкапы аплоадятся в папку "full" каждые три часа. Базы Mysql — в папку "mysql" каждые полчаса. Так хозяину сайта хочется, он под это дело Dropbox Pro оплатил.
Надо — удалить все старые полные архивы, оставив по одному за день (а чтоб был!), и все бэкапы Mysql, кроме сегодняшних.
Предупрежу сразу — CentOS я пользуюсь недавно, меньше года. Установлен он на виртуалке в качестве тестового веб-сервера (LAMP), в консоли бываю от силы раз в месяц, а «батники» писал еще под старый добрый MS-DOS 6.22, потому всё нижеописанное родилось буквально за пару часов «с нуля» и не блещет изяществом.
Первым делом я озадачился вопросом — чем же достучаться до Dropbox из консоли? После непродолжительного поиска в интернетах обнаружился чудный bash-скрипт Dropbox_Uploader, который, как оказалось, умеет не только закачивать, но и другие жизненно необходимые команды, включая list и delete. Вот только незадача — я так и не понял сходу, обучен ли он удалять «по списку», потому оформил банально циклом (к тому же «поштучно» проще отладить).
Устанавливается dropbox_uploader просто — скачиваем его командой
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
даём всем права на чтение и исполнение
chmod +rx dropbox_uploader.sh
затем запускаем
./dropbox_uploader.sh
настраиваем доступ в Dropbox, следуя подсказкам на экране (создать на сайте Dropbox новое приложение и скормить скрипту APP key и APP secret) и переносим скрипт в /usr/bin/, чтобы он был доступен всем, а главное — крону.
Dropbox_uploder по команде list full (напомню, "full" у меня — имя папки) выдаёт примерно следующее
> Listing "/full"... DONE
[F] 1218610223 site-sitename.com-20150908-000001.jpa
[F] 1218610223 site-sitename.com-20150908-030001.jpa
[F] 1218610223 site-sitename.com-20150908-060001.jpa
[F] 1218610223 site-sitename.com-20150908-090001.jpa
[F] 1218610223 site-sitename.com-20150908-120001.jpa
[F] 1218610223 site-sitename.com-20150908-150001.jpa
[F] 1218610223 site-sitename.com-20150908-180001.jpa
[F] 1218610223 site-sitename.com-20150908-210001.jpa
... и т.п. ...
[F] 1218610223 site-sitename.com-20150915-150001.jpa
[F] 1218610223 site-sitename.com-20150915-180001.jpa
[F] 1218610223 site-sitename.com-20150915-210001.jpa
Cоздаем свой собственный скрипт clean_dropbox.sh сразу в /usr/bin (почему бы и нет?), c теми же правами 755, а в нём:
1. Формируем список ненужных архивов
dropbox_uploader.sh list full *.jpa | cut -d ' ' -f4 | grep -v $(date +%Y%m%d) | grep -v -e '-00' | grep -v 'full' > todel.txt
в котором полученный список файлов *.jpa из папки full фильтруется cut и несколькими grep и сохраняется в файл.
Cut оставляет только имена файлов (-d ' ' — разделитель пробел, -f4 — 4-е поле). Да-да, четвертое, т.к. строка начинается с пробела.
Первым grep отбрасываются сегодняшние архивы, второй исключает созданные в течение часа после полуночи, а третий убирает строку с названием самой папки "/full"… из начала списка.
2. Полученный файл считываем в переменную (массив строк)
files=$(<todel.txt)
3. Циклом проходимся по массиву и удаляем каждый файл
for file in $files
do
dropbox_uploader.sh delete /full/"$file" >> /var/log/cleanup.log
done
Учитывая, что скрипт будет работать в кроне, на всякий случай пишем вывод в лог-файл.
На этом обработку полных архивов можно считать завершенной, остались архивы mysql.
Тут всё по накатанной колее. Cписок файлов с упрощённым grep — нам вообще не нужны старые бэкапы, а стопку за сутки можно и потерпеть, благо их размеры вполне приемлемы.
dropbox_uploader.sh list mysql *.sql | cut -d ' ' -f4 | grep -v $(date +%Y%m%d) | grep -v 'mysql' > todel.txt
Аналогично удаляем ненужные в цикле
dropbox_uploader.sh delete /mysql/"$file" >> /var/log/cleanup.log
и напоследок убираем за собой отработанный список файлов
rm todel.txt
Вот собственно и всё, теперь достаточно создать крон вида50 23 * * * clean_dropbox.sh
Вуаля!
Понимаю, что для гуру Linux мой пост практически бесполезен, но Хабр читают и такие неучи, как я. Надеюсь, кому-нибудь, да пригодится.