Чистка 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 мой пост практически бесполезен, но Хабр читают и такие неучи, как я. Надеюсь, кому-нибудь, да пригодится.

ссылка на оригинал статьи http://habrahabr.ru/post/266993/


Комментарии

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

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