Cute backup :)
Простой скрипт ручного бекапа наиболее важных файлов, написан чисто для себя, но может кому ещё пригодится. Мне просто удобно хранить его дубль во вне. Так как дело касается важной вещи, а именно бекапов рекомендую использовать иные проверенные временем и опытом людей программы, а не эту портянку ::)
Использует rsync
и zip
Настройка производится внутри стрипта. Описание настройки бекапа тоже распологается внутри скрипта. Типичное использование это ручной запуск в конце дня или по завершению какой либо важной работы или перед сном :)
Использовать для бекапа, отдельный диск где нет ничего кроме бекапа!
В коде используется goto
подойдёт любая версия луа от 5.2+
или luajit2.1
Зависимости
sudo apt install zip rsync notify-send lua5.2
Установка и удаление
Этот скрипт сугубо локальный поэтому устанавливатеся только в ~/.local/bin
В текущем виде не надо его устанавливать для всех пользовтелей в систему.
make install
make uninstall
Использование
Настроить скрипт под себя отредактировав таблицу backup_rule
, в ней уже находится реальный пример того что я бекаплю у себя. После чего просто его запускать.
Поля конфигурации backup_path
и backup_pass_file
могут содержать $USER
это значение подменится на имя того пользователя который запустил скрипт. Нигде более в скрипте переменные окружения не раскрываются, кроме только этой и только для вышеуказанных полей для указания пути. Лучше вообще прописать явно имя пользователя.
- Обязательные параметры
source
каталог или файл источникdest
каталог приёмник
- Дополнительные параметры
secure
применить пароль (требуетсяzip=true
)zip
сжать в архивmirror
сделать точную копию и обновить им текущий каталог бекапа( или архив еслиzip=true
)versions
сделать точную копию и пометить датой в отдельном каталоге (или архиве еслиzip=true
)
Пример поля конфигурации:
{secure=true, zip=true, versions=true, source='~/.ssh/', dest='ssh'};
Значит что нужно сделать рекурсивный бекап каталога с ключами ssh
и расположить бекап в каталоге с именем ssh
. secure=true
означает что данные будут запаролены, а zip
что будут сжаты, versions=true
означает что каждый новый бекап будет создавать новую копию ~/.ssh
помеченную датой. Описание того какие есть ключи и как они работают друг с другом есть внутри скрипта, вместе с примерами уже готовой настройки.
Ключи можно опускать (не указывать) обязательными являются только source
и dest
Не указанные ключи считаются заданными как false
так что вот такая запись валидна
{source='~/Изображения/', dest='картинки'}
И означает сделать копию каталога ~/Изображения
в каталоге картинки
внутри общего каталога бекапа backup_path=...
при этом если это второй или последующий бекап и в каталоге ~/Изображения/
была удалена картинка, она не будет удалена в каталоге картинки
это сделано специально, дабы максимизировать сохраняемые данные. Если нужна точная копия с удалением того чего уже нет в каталоге источнике то нужно дополнительно явно указать опцию mirror=true
это же правило работает если включить флаг zip=true
будет всё тоже самое, но уже в виде архива.
На заметку
В каталоге относительно котрого исполняется скрипт будет лог бекапа, на рабочий стол будут приходить уведомление о текущем статусе выполнения, в случае ошибки будет показaн код возврата В лог попадает информация о том какая именно команда потерпела неудачу, пароль присутцвующий в команде заменяется на звёздочки. В зависимости от типа настроенного бекапа(первый бекап будет всегда долгим), а вот последующие при отсуцтвии изменений будут быстрыми исключение это mirror
и versions
оба создают точную копию с нуля, а не пытаются обновить текущее содержимое бекапа. В случае если любая программа вернёт код возврата отличный от 0
выполнение всего бекапа прерывается, и повторно он не запустится пока не будет удалён lock файл, это сделано специально, чтобы выяснить причину, исправить её и в ручном режиме удалить lock файл название котрого есть в срипте, в логах и уведомлении на рабочий стол.:
Если бекап идёт для активной программы например браузера то на время бекапа лучше браузер не трогать так как в 99% случаев бекап остановитя с ошибкой по причине изменения файла.