Бекап локальный и в облачное хранилище, контроль изменений файлов в системе

Автономное резервное копирование базы, файлов и каталогов системы

Быстрая установка
mkdir /home/backup
cd /home/backup
wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh
wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf
chmod +x SYS_backup.sh
wget https://github.com/mikbill/design/raw/master/backup/tar.include.list
wget https://github.com/mikbill/design/raw/master/backup/tar.exclude.list 


Что делает скрипт:

- резервные копии базы mysql

- резервные копии любых файлов и директорий из списка с возможностью исключений

- копии делаются локально в настраиваемый каталог в системе и если настроено, то еще и в облако

- Поддержка облачных хранилищ с описанием настройки каждого:

   все, что поддерживают WedDAV в Linux
   Dropbox Client                                              - 2 GB, журнал версий
   Dropbox uploader                                          - 2 GB, журнал версий
   Yandex.Disk WebDAV                                  - 10 GB
   Yandex.Disk Client                                        - 10 GB
   pCloud WebDAV                                           - 12 GB, журнал версий
   Mega Client                                                    - 50 GB
   ownCloud Client                                            - частное хранилище
   Google drive через Gdrive                            - 15 GB

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

- проверка конца дампа базы. Если дамп не полный, то в лог запишется соответствующая запись

- ведение лога операций, лог сохраняется и на облаке.

-  поддержка - CentOS, Debian, Ubuntu. Настройка на этих системах практически не отличается. Установка в примере идет для CentOS, для Debian/Ubuntu делать тоже самое с заменой установщика пакетов yum на apt-get 

- настройка ротации файлов в локальном каталоге и в облаке.

- возможность работы с почтой. Настройка отправки лога на почту при каждом действии, так и отправка только при изменениях в системе.

- настройка логики работы с облачными хранилищами с историей версий (DrobBox, pCloud). Можно настроить, чтобы каждый раз файлы перезаписывались, предыдущие же версии файлов можно вытянуть с таких хранилищ в журнале версий.

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

- интегрирован с работой Mikbill. Подтягивает учетные данные с конфигов. Уже готовые листы для сохранения каталога Mikbill с исключениями ненужных файлов в бекапе. Такие же листы есть для сервера Accel и для IPTV сервера с установленным Stalker-Portal, Carbon Reductor. В тоже время скрипт не привязан к Mikbill или еще к чему-либо, может использоваться с любым другим функционалом.

- проверка подключения облачного диска перед самым вызовом создания бекапа. Не нужно настраивать подключение облачного диска при запуске системы. Скрипт сам проверит и запустит. В случае с WebDAV можно и отмонтировать диск после операции.

Установка

Для закачки скрипта нужен wget
Для CentOS:
  • yum install wget
Или для Debian/Ubuntu:
  • apt-get install wget
Создать каталог в любом удобном месте, например в /home/backup (далее этот каталог будет использован для примера установки)
  • mkdir /home/backup
Переходим в каталог
  • cd /home/backup
Основная рабочая часть состоит из двух частей:
SYS_backup.sh - вся логика. Тут ничего не менять, если не знаете, что делаете.
SYS_backup.conf - файл конфигурации. Все настройки будут тут. Далее просто конфиг.
Качаем файлы
  • wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh
  • wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf
Даем права на запуск файлу SYS_backup.sh
  • chmod +x /home/backup/SYS_backup.sh
Настройка автозапуска из крона (в примере ежедневный бекап в 6 утра)
  • mcedit /etc/crontab
# Mikbill backup
00 06 * * * root /home/backup/SYS_backup.sh

Настройка функционала

Сам делаю и рекомендую бекап на дропбокс через Dropbox-uploader (настройка ниже)

Для работы Yandex Disk WebDAV 

Регистрация яндекс диска (+1 ГБ по реферальной системе)
Плюс идет акция +32 GB, подробности по ссылке

Добавляем epel репозиторий для davfs2 
  • yum install epel-release
Ставим davfs
  • yum install davfs2
Настраиваем учетку
  • nano /etc/davfs2/secrets
Вводим наш логин пароль (логин без @yandex)
https://webdav.yandex.ru login password
настроить davfs2
  • mcedit /etc/davfs2/davfs2.conf
use_locks 0 # Увеличит скорость работы
delay_upload 0 # Уменьшит задержку перед загрузкой файла
cache_size 5000 # Размер кеша
#cache_dir /var/cache/davfs2 # Тут будет кеш по умолчанию, можно изменить по желанию
Создаем каталог, куда будет примонтировано облако 
  • mkdir /home/backup/webdisk 
Примонтировать без перезагрузки (должно без запроса логина пароля, если спрашивает, значит что-то не так с davfs)
  • mount -t davfs https://webdav.yandex.ru /home/backup/webdisk
проверить
  • df -h /home/backup/webdisk
для проверки передачи можно в момент передачи открыть вторую консоль и смотреть передачу iftop-ng
установка c epel
  • yum install iftop
Еще проверка сетевого подключения
  • sudo netstat -nap | grep davfs
ошибка /sbin/mount.davfs: can't open fuse device (у меня была на vps)
ядро скомпилено без поддержки fuse 
попробовать включить 
  • modprobe fuse
и проверить
  • lsmod | grep fuse
Включить в скрипте
BACKUP_TO_WEBDISK=1
Размонтирование яндекс диска после выполнения скрипта (монтирование происходит автоматически)
UMOUNT_DISK=0
Размонтирование не сработает если открыт mc в каталоге webdisk

Для шифрования файлов на webdisk

Включаем в конфиге
ENCRYPTION=1
Создаем ключ
  • gpg --gen-key
 Отвечаем
RSA and RSA (жмем enter)
2048 (жмем enter)
Срок дейсвия ключа: 0
Real name: admin(если имя создаете другое поменяйте и в конфиге ENCRYPTION_ID_USER="admin" )
Email address: (жмем enter)Comment: (жмем enter)
Создаем публичный ключ
Enter passphrase:

После сообщения:
Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 215 more bytes)
Ждем пока сгенерирутся приватный ключ (по времени по разному, бывало и минут 30 генерировался)

Экспорт и импорт ключей
Экспорт открытого ключа (gpg id=admin)в файл
  • gpg --export -a admin > public.asc
Экспорт приватного ключа в файл.
  • gpg --export-secret-keys -a admin > secret.asc
Импорт открытого ключа из файла.
  • gpg --import public.asc
Импорт закрытого ключа из файла.
  • gpg --allow-secret-key-import --import secret.asc
Для расшифровки на другом компьютере
Импортируем секретный ключ 
(у меня пошло и так)
  • gpg --import secret.asc
и расшифровываем
  • gpg --decrypt-files FILENAME.gpg
Также нужно будет ввести пароль от секретного ключа

Для подключения других файловых хранилищ поддерживающих WebDAV

прописать в /etc/davfs2/secrets ссылку на webdav и логин пароль по примеру яндекс диска
настроить точку монтирования в скрипте MOUNT_POINT=

Добавить точку монтирования и свои учетные данные в /etc/davfs2/secrets своего хранилища.
Точку монтирования WebDAV можно узнать на сайте своего облака.
Пример подключения pCloud
  • mcedit /etc/davfs2/secrets
Заносим свои данные
https://webdav.pcloud.com LOGIN PASSWORD
в скрипте SYS_backup.conf закомментировать настроенную по умолчанию точку монтирования
#MOUNT_POINT=https://webdav.yandex.ru
и занести свою
MOUNT_POINT=https://webdav.pcloud.com

Для работы с клиентом яндекс диска

(Подразумевается синхронизация каталога files с Я.диском)
Установка
https://yandex.ru/support/disk/cli-clients.html
  • nano /etc/yum.repos.d/yandex.repo
[yandex]
name=Yandex
failovermethod=priority
baseurl=http://repo.yandex.ru/yandex-disk/rpm/stable/$basearch/
enabled=1
metadata_expire=1d
gpgcheck=1
gpgkey=http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
  • rpm --import http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
  • yum install yandex-disk
Запускаем настройку
  • yandex-disk setup
Отвечаем на вопросы
Would you like to use a proxy server?: n
Enter username:Ваш логин
Enter password:Ваш пароль
Enter path to Yandex.Disk folder: /home/backup/files
Would you like Yandex.Disk to launch on startup?: y (скрипт включает если выключен демон)

В конфиге включить
BACKUP_TO_YANDEX_CLIENT=1
Для проверки работы
  • yandex-disk status
отобразит статус работы демона (состояние синхронизации, ошибки синхронизации, список синхронизированных файлов, общее и свободное пространство на Диске).

Для работы с клиентом Owncloud

Установка клиента - Ссылка
  • cd /etc/yum.repos.d/ 
  • wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/CentOS_6/isv:ownCloud:desktop.repo 
  • yum install owncloud-client
В конфиге включаем
BACKUP_TO_OWNCLOUD=1
В следующей строке в адресе меняем "address" на IP своего сервера (или домен)
Owncloud_address=https://address/owncloud/remote.php/webdav/backup
где backup каталог на owncloud который будет синхронизироваться.

Добавляем логин и пароль от owncloud
Owncloud_login=
Owncloud_pass=
В итоге будет синхронизироваться каталог files с owncloud каталогом backup

Для работы с клиентом dropbox

Регистрация
https://www.dropbox.com/ru/login 

Проверить свободное место на аккаунте
https://www.dropbox.com/account/personal

Два варианта настройки:
- резервирование каталога files (самый простой, без лишних настроек).
Для включения этого режима включаем:
BACKUP_TO_DROPBOX_CLIENT=1
Отключаем WebDisk
BACKUP_TO_WEBDISK=0
- резерверование в каталог webdisk (плюс в поддержке шифрования, бекап в 1 файл, что актуально для dropbox,- бекапится в один файл, а старые копии можно забирать на dropbox с истории версий).
Для включения этого режима включаем:
BACKUP_TO_DROPBOX_CLIENT=1
BACKUP_TO_WEBDISK=1
Ставим клиент dropbox:
 https://www.dropbox.com/ru/install-linux
  • cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
  • ~/.dropbox-dist/dropboxd
Переходим по ссылке которую кинуло в консоль. Тут важно проверить актуальную учетку на которую будет подключаться клиент. Подтверждаем. Видим такую запись в консоли
"Этот компьютер теперь подсоединен к аккаунту Dropbox"
Прерываем работу скрипта.

На Debian ставим curl
  • apt-get install curl
Ставим Dropbox CLI
  • cd ~
  • curl -LO https://www.dropbox.com/download?dl=packages/dropbox.py
  • chmod +x ~/dropbox.py
Делаем ссылку на каталог dropbox
Тут в зависимости от того какой вариант выбрали
  • rm -Rf ~/Dropbox && ln -s /home/backup/files ~/Dropbox
или
  • rm -Rf ~/Dropbox && ln -s /home/backup/webdisk ~/Dropbox
 Все, демон или автозапуск не нужен, он будет запускаться из скрипта и закрываться после загрузки файлов


Для работы с Dropbox-uploader (не нужен демон)

В каталоге бекапа выполняем:
  • wget "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
  • rm -f dropbox_uploader.sh
  • mv dropbox_uploader.sh.1 dropbox_uploader.sh
  • chmod +x dropbox_uploader.sh
Ставим shasum
Ошибка в логе - which: no shasum in (/sbin:/bin:/usr/sbin:/usr/bin)
  • yum install perl-Digest-SHA -y
Меняем в файле расположение токена
CONFIG_FILE=/home/backup/dropbox_uploader 
Создаем токен в дропбоксе:
Выбрать
1. "Dropbox API"
2. "Full Dropbox"
3. Добавить любое имя
Жмем create app
Выбираем срок действия токена 
Access token expiration
no expiration
И далее "generated access token" жмем кнопку "Generate"
Запускаем скрипт 
  • ./dropbox_uploader.sh
Вводим полученный токен

В настройках SYS_backup.conf
BACKUP_TO_WEBDISK=0
BACKUP_TO_DROPBOX_UPLOADER=1
По желанию:
WEBDISK_ONE_FILE=1

Ошибка при заливке на dropbox 
FAILED
An error occurred requesting /commit_chunked_upload
- Закончилось место в хранилище

Настройка Gdrive (google disk)

(ссылку на разные системы смотреть тут https://github.com/prasmussen/gdrive)
  • wget -O /usr/sbin/gdrive https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
  • chmod 755 /usr/sbin/gdrive
Авторизируемся
  • gdrive about
Полученную строку в консоли вставляем в адресную строку браузера и разрешаем доступ к диску

В конфиге разрешаем резервное копирование на Gdrive
Backup_to_Gdrive=1
Добавляем токен. Его берем из файла /root/.gdrive/token_v2.json (переменная access_token) и прописываем переменной Gdrive_access_token. Это очень важно, иначе Gdrive не сможет получить доступ к хранилищу из крона
Gdrive_access_token=
Смотрим чтобы webdisk был отключен
BACKUP_TO_WEBDISK=0
Удаления старых файлов пока в этой технологии нет, но планируется

Для работы бекапа файлов и каталогов 

создать файл с путями к файлам в каталоге с скриптом
  • nano /home/backup/tar.include.list
Комменты # и ; не работают

Пример файла для биллинга:
#/etc/unbound/unbound.conf
#/usr/local/etc/raddb/sites-enabled/dhcp
/etc/sysconfig/network-scripts
/var/www/mikbill
/etc/rc.d/rc.local
/etc/my.cnf
/etc/nginx/conf.d
/etc/crontab
/etc/cron.d
/etc/resolv.conf
/etc/sysctl.conf
/home/backup/SYS_backup.conf
Пример файла для биллинга Debian:
/etc/network/interfaces
/var/www/mikbill
/etc/rc.local
/etc/mysql/my.cnf
/etc/nginx/conf.d
/etc/crontab
/etc/cron.d
/etc/resolv.conf
/etc/sysctl.conf
/home/backup/SYS_backup.conf
Пример файла для сервера BRAS accel:
/etc/accel-ppp.conf
/etc/accel-ppp.lua
/etc/init.d/firewall
/etc/network/interfaces
/etc/rc.local
/etc/nginx/conf.d
/var/www/mikbill/user_pages
/etc/resolv.conf
/etc/sysctl.conf
/etc/modules
/home/backup/SYS_backup.conf
/etc/dhcp/dhcpd.conf
/etc/unbound/unbound.conf
/etc/quagga
/etc/default/grub
/etc/modules
/etc/init.d/accel
/usr/local/share/accel-ppp/radius/dictionary
/etc/default/isc-dhcp-relay
/etc/default/isc-dhcp-server

Включить
BACKUP_FILES=1
Также возможен лист для исключения из архива
создать файл с путями к файлам в каталоге с скриптом
  • nano /home/backup/tar.exclude.list
 пример файла
/var/www/mikbill/admin/sys/mrtg_users
/var/www/mikbill/admin/res/help
/var/www/mikbill/admin/res/speedtest
/var/www/mikbill/admin/res/speedtest2
/var/www/mikbill/stat/app/log
/var/www/mikbill/stat/res/distr
/var/www/mikbill/stat/res/player
/var/www/mikbill/admin/res/mon2/img
В результате эти каталоги будут исключены из архива

Для работы отправки логов на почту 

Настроить postfix
  • mcedit /etc/postfix/main.cf
inet_interfaces = localhost
inet_protocols = all
заменить на
inet_interfaces =127.0.0.1inet_protocols = ipv4
  • service postfix start 
  • chkconfig postfix on
проверяем
  • traceroute -n -T -p 25 alt4.gmail-smtp-in.l.google.com
  • netstat -an | grep 25
Включить в скрипте
SEND_EMAIL=1
Указать почту
EMAIL=mailname@gmail.com
Указать сервис для отправки почты (по умолчанию postfix, еще проверялся exim)
EMAIL_SERVICE=postfix

Указать имя сервера от которого будут приходить логи
SERVER_NAME=servername
Вторая почта используется для отправки логов только при изменении файлов (DIFF_FILES=1).
Работают независимо друг от друга
Включить
SEND_EMAIL_2=1
Указать почту
EMAIL_2=mailname@gmail.com
Для подключения почты по альтернативным портам (postfix)

  • mcedit /etc/postfix/master.cf
это комментируем
  • smtp inet n - n - - smtpd
Раскомментировать и проверить строчку
smtps inet n - n - - smtpd
проверить
  • service postfix restart
cмотрим как поменялся порт
  • netstat -lnpt | grep master
отправляем тестовое письмо
  • echo "test"| sendmail -F "test" mail@gmail.com
и смотрим лог /var/log/maillog

почта тестировалась на почтах google и yandex

Для слежения за изменениями файлов

Логика работы подробнее: в подкаталоге diff/old создается копия всех файлов зарегистрированных в листе diff.conf. При следующем запуске скрипта файлы с сервера будут скопированы в подкаталог diff/new и сверены с diff/old. Изменения (имя файла, номер строки и сами строки) будут занесены в лог и при желании отправлены на почту. После этого каталог diff/old архивируется и удаляется и в него переносятся данные с каталога diff/new.

Настройка

Создать файл в каталоге скрипта
  • nano diff.include.list 
Пример содержания
(может включать в себя каталоги)
/etc/rc.d/rc.local
/etc/my.cnf
/etc/php-fpm.d/www.conf
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/crontab
/etc/php.ini
/etc/resolv.conf
/etc/sudoers
/etc/sysctl.conf
/etc/yum.repos.d
/etc/fstab
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/ssh/sshd_config
/etc/passwd
/var/www/mikbill/admin/app/etc/config.xml
/var/www/mikbill/admin/sys/update/mikbill_current
/usr/local/etc/raddb/radiusd.conf
/usr/local/etc/raddb/sites-enabled/dhcp
/etc/raddb/radiusd.conf
/root/.bash_history
Включить в скрипте
DIFF_FILES=1
Если нужны исключения
  • nano diff.exclude.list 
пример содержания
/etc/dhcp/dhcpd.conf
/etc/mrtg/
Файлы diff.include.list и diff.exclude.list поддерживают комментарии "#" и ";" . В общем это делает rsync, так что читать мануал по нему, например http://wiki.dieg.info/rsync

ДОПОЛНИТЕЛЬНО

Пример проверки файлов для сервера Carbon Reductor

diff.include.list
/etc/
/root/.ssh
/root/.bash_history
/usr/local/Reductor
diff.exclude.list
/usr/local/Reductor/lists
/usr/local/Reductor/reductor_container
/usr/local/Reductor/cache/
Пример проверки файлов для debian accel

 diff.include.list
/etc/
/var/www/
/root/.ssh
/root/.bash_history
diff.exclude.list
/etc/ppp/downlog.txt
/etc/ppp/uplog.txt
Лог в консоль (дебаг)
при ручном запуске включается
LOG_IN_TERMINAL=0
Также некоторое описание настроек смотреть в файле SYS_backup.conf


Скрипты

SYS_backup.conf
# version 19
# wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf
SERVER_NAME="ServerName"
LOG=/var/log/backup.log
HOME_DIR=$(cd $(dirname $0)&& pwd)
#HOME_DIR=/home/backup
#----------------------------------------------
BACKUP_MYSQL=1
BACKUP_FILES=0
BACKUP_TO_WEBDISK=1
BACKUP_TO_YANDEX_CLIENT=0
BACKUP_TO_DROPBOX_CLIENT=0
DIFF_FILES=0
LOG_IN_TERMINAL=0 # Настройка дебаг режима
#-BACKUP TO DISK-------------------------------------
#Путь для бекапа на диске
PACH_FOR_BACKUP_TO_DISK=$HOME_DIR/files
#Количество дней для ротации файлов
LIFE_TIME_FILE_ON_DISk=20
# MySQL (На сервере с биллингом логин/пароль можно не указывать тут)-------
PATH_MIKBILL=/var/www/mikbill/admin/
DB_USER=""
DB_PASSWORD=""
DB_NAME="mikbill"
# Шифрование------------------------------------------
ENCRYPTION=0
ENCRYPTION_ID_USER="admin"
#-WEBDISK---------------------------------------------
#Точка монтирования
#Yandex
MOUNT_POINT=https://webdav.yandex.ru
#Pcloud
#MOUNT_POINT=https://webdav.pcloud.com
#Mega
#MOUNT_POINT=mega
#MEGA_CONF=$HOME_DIR/megafs.ini
# CloudDav (google.drive for webdav)
#MOUNT_POINT=https://webdaveu.storagemadeeasy.com
# OWNCLOUD----------------------------------------------
BACKUP_TO_OWNCLOUD=0
Owncloud_address=https://address/owncloud/remote.php/webdav/backup
Owncloud_login=
Owncloud_pass=
# Копирование одного файла (для хранилищ с историей версий)
WEBDISK_ONE_FILE=0
#Путь для WEBDISK
PACH_FOR_WEBDISK=$HOME_DIR/webdisk
DIR_BACKUP_FOR_WEBDISK=backups
#Время ротации файлов на облаке
LIFE_TIME_FILE_ON_WEBDISK=14
#Удаление старых файлов при нехватке места для новых файлов
FREESPACE_WEBDISK=0
#Размонтирование диска после выполнения действий (UMOUNT_WEBDISK=0 не размонтировать)
UMOUNT_WEBDISK=0
#-FILES---------------------------------------------
TAR_INCLUDE_LIST=$HOME_DIR/tar.include.list
TAR_EXCLUDE_LIST=$HOME_DIR/tar.exclude.list
#-DIFF---------------------------------------------
DIFF_BACKUP=$HOME_DIR/diff-$SERVER_NAME.tar.gz
DIFF_INCLUDE_LIST=$HOME_DIR/diff.include.list
DIFF_EXCLUDE_LIST=$HOME_DIR/diff.exclude.list
DIFF_DIR_NEW=$HOME_DIR/diff.new
DIFF_DIR_OLD=$HOME_DIR/diff.old
DIFF_DIR_TEMP=$HOME_DIR/diff.temp
#-EMAIL---------------------------------------------
SEND_EMAIL=0
EMAIL=mail@mail.com
EMAIL_SERVICE=postfix
SEND_EMAIL_2=0
EMAIL_2=mail@mail.com
#----------------------------------------------------
DATE=`date +%Y-%m-%d_%Hh%Mm`
LOG_LINK=$HOME_DIR/backup.log
# Secret:
# mcedit /etc/davfs2/secrets
# Mount:
# mount -t davfs https://webdav.yandex.ru /home/backup/webdisk
# Umount:
# umount /home/backup/webdisk


SYS_backup.sh

#!/bin/bash
# Version 18
# wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh
HOME_DIR=$(cd $(dirname $0)&& pwd)
source $HOME_DIR/SYS_backup.conf
echo "----------------$DATE $SERVER_NAME-----------------" >>$LOG
set $(wc -l $LOG);LOGSTART=$1
echo -e "Свободное место на диске \n" "$(df -h $HOME_DIR)" >>$LOG
#Создаем ссылку на лог в рабочем каталоге
if ! ([ -e $LOG_LINK ])then
{
ln -s $LOG $LOG_LINK
}
fi
if !([ -d "$PACH_FOR_BACKUP_TO_DISK" ])then
{
mkdir $PACH_FOR_BACKUP_TO_DISK
}
fi
if [ "$SEND_EMAIL" -ne 0 -o "$SEND_EMAIL_2" -ne 0 ];then
{
service $EMAIL_SERVICE start
}
fi
#----------------------------------------------
FUNC_EMAIL()
{
set $(wc -l $LOG);LOGEND=$1"p"
(echo "Subject:$SERVER_NAME"; sed -n $LOGSTART,$LOGEND $LOG;) | sendmail -F "BACKUP" $EMAIL_TMP
echo "отправка письма на почту $EMAIL_TMP" >>$LOG
}
FUNC_RM_OLDFILES_WEBDISK()
{
find $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK -mtime +$LIFE_TIME_FILE_ON_WEBDISK |sort|xargs rm -f
STATUS=$?
if [ $STATUS -ne 0 ]
then
sleep 10
FUNC_RM_OLDFILES_WEBDISK
fi
}
FUNC_RM_FILE_WEBDISK()
{
rm -f $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME
STATUS=$?
if [ $STATUS -ne 0 ]
then
sleep 10
FUNC_RM_FILE_WEBDISK
fi
}
Create_folder_webdisk(){
if !([ -d "$PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK" ])
then
echo "Каталог $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK не существует или был удален. Создание каталога" >>$LOG
mkdir -p $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK
fi
}
FUNC_COPY_TO_WEBDISK()
{
if [ "$BACKUP_TO_WEBDISK" -ne 0 ];then
{
if !([ -e "$PACH_FOR_WEBDISK" ])then
{
echo "$PACH_FOR_WEBDISK каталог не найден, создание каталога" >>$LOG
mkdir $PACH_FOR_WEBDISK
}
fi
if [ "$BACKUP_TO_DROPBOX_CLIENT" -ne 0 ]
then
Create_folder_webdisk
~/dropbox.py start >>$LOG
else
if ! ( mount -v | grep -q $PACH_FOR_WEBDISK ) then
if [ "$MOUNT_POINT" = "mega" ];then
megafs --disable-previews --config $MEGA_CONF $PACH_FOR_WEBDISK
else
mount -t davfs $MOUNT_POINT $PACH_FOR_WEBDISK
fi
fi
if ! ( mount -v | grep -q $PACH_FOR_WEBDISK ) then
{
echo "! Ошибка монтирование диска $MOUNT_POINT в $PACH_FOR_WEBDISK !" >>$LOG
}
else
{
Create_folder_webdisk
}
fi
fi
#Удаляем самые старые файлы пока не хватит места для нового бекапа
if [ $FREESPACE_WEBDISK -ne 0 ];then
{
SIZEFILE=`du -sm $PACH_FOR_BACKUP_TO_DISK/$FILENAME | awk '{print$1}'`
let FREESPACE=`df -m | grep "$PACH_FOR_WEBDISK" | awk '{print $3}'`-$SIZEFILE
while [$FREESPACE<0]
do
find $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK -name "*.tar.gz" -and -type f | sort -r | tail -n1 | xargs -i rm '{}'
let FREESPACE=`df -m | grep "$PACH_FOR_WEBDISK" | awk '{print $3}'`-$SIZEFILE
done
}
fi
if [ "$MOUNT_POINT" = "mega" ];then
megaput --config=$MEGA_CONF --path /$DIR_BACKUP_FOR_WEBDISK/ $PACH_FOR_BACKUP_TO_DISK/$FILENAME
else
if [ "$ENCRYPTION" -ne 0 ]
then
gpg --homedir /root/.gnupg -o $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK.gpg --yes -e -r $ENCRYPTION_ID_USER $PACH_FOR_BACKUP_TO_DISK/$FILENAME
else
cp $PACH_FOR_BACKUP_TO_DISK/$FILENAME $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK 2>>$LOG
fi
STATUS=$?
fi
if [ $STATUS -ne 0 -a ! -e "$PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK" ];then
echo "! Ошибка $STATUS создания файла $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK !" >>$LOG
else
echo "Файл $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK создан успешно" >>$LOG
fi
}
fi
}
#----------------------------------------------
FILENAME="log*tar.gz*"
rm -f $PACH_FOR_BACKUP_TO_DISK/$FILENAME
if [ "$BACKUP_TO_WEBDISK" -ne 0 ]
then
FUNC_RM_FILE_WEBDISK
if [ "$WEBDISK_ONE_FILE" -eq 0 ]
then
FUNC_RM_OLDFILES_WEBDISK
fi
fi
# Yandex client--------------------------------
if [ "$BACKUP_TO_YANDEX_CLIENT" -ne 0 ]
then
yandex-disk start >>$LOG
fi
#----------------------------------------------
if [ "$BACKUP_MYSQL" -ne 0 ]; then
{
if [ "$DB_USER" = "" ]
then
DB_USER=$(cat $PATH_MIKBILL'app/etc/config.xml'| grep username | awk '{ gsub("<username>"," "); print }' | awk '{ gsub("</username>"," "); print }' | awk '{print $1}')
fi
if [ "$DB_PASSWORD" = "" ]
then
DB_PASSWORD=$(cat $PATH_MIKBILL'app/etc/config.xml'| grep password | awk '{ gsub("<password>"," "); print }' | awk '{ gsub("</password>"," "); print }' | awk '{print $1}')
fi
FILENAME=sql-"$SERVER_NAME"-"$DATE".sql.gz
mysqldump --single-transaction -u $DB_USER -p$DB_PASSWORD $DB_NAME 2>/dev/null | gzip > $PACH_FOR_BACKUP_TO_DISK/$FILENAME
find $PACH_FOR_BACKUP_TO_DISK -mtime +$LIFE_TIME_FILE_ON_DISk |sort|xargs rm -f
echo "бекап $PACH_FOR_BACKUP_TO_DISK/$FILENAME создан успешно" >>$LOG
if [ "$WEBDISK_ONE_FILE" -ne 0 ]
then
FILENAME_WEBDISK=sql-"$SERVER_NAME".sql.gz
else
FILENAME_WEBDISK=$FILENAME
fi
FUNC_COPY_TO_WEBDISK
}
fi
#----------------------------------------------
if [ "$BACKUP_FILES" -ne 0 ];then
{
if !([ -e "$TAR_EXCLUDE_LIST" ])then
{
echo "Создание файла исключений для бекапа файлов $TAR_EXCLUDE_LIST "
touch $TAR_EXCLUDE_LIST
}
fi
if !([ -e "$TAR_INCLUDE_LIST" ])then
{
echo "! бекап файлов включен, но конфигурационный файл $TAR_INCLUDE_LIST не найден. Создание файла. Заполните его !" >>$LOG
touch $TAR_INCLUDE_LIST
}
else
{
FILENAME=files-"$SERVER_NAME"-"$DATE".tar.gz
tar -X $TAR_EXCLUDE_LIST -T $TAR_INCLUDE_LIST -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME 2>>$LOG
STATUS=$?
if [ $STATUS -ne 0 ];then
echo "! Ошибка создания архива $STATUS $PACH_FOR_BACKUP_TO_DISK/$FILENAME !" >>$LOG
else
echo "Архив $PACH_FOR_BACKUP_TO_DISK/$FILENAME создан успешно" >>$LOG
fi
if [ "$WEBDISK_ONE_FILE" -ne 0 ]
then
FILENAME_WEBDISK=files-"$SERVER_NAME".tar.gz
else
FILENAME_WEBDISK=$FILENAME
fi
FUNC_COPY_TO_WEBDISK
}
fi
}
fi
# Owncloud ------------------------------------
if [ "$BACKUP_TO_OWNCLOUD" -ne 0 ]
then
owncloudcmd -u $Owncloud_login -p $Owncloud_pass $PACH_FOR_BACKUP_TO_DISK $Owncloud_address
fi
# DropBox -------------------------------------
if [ "$BACKUP_TO_DROPBOX_CLIENT" -ne 0 -a "$BACKUP_TO_WEBDISK" -eq 0 ]
then
~/dropbox.py start >>$LOG
fi
#----------------------------------------------
FUNC_TAR_DIFF()
{
#бекап предыдущей проверки
rm -f $DIFF_BACKUP
tar -czf $DIFF_BACKUP $FILENAME 2>>$LOG
if [ $? -ne 0 ];then
{
echo "Ошибка создания резервной копии каталога $DIFF_DIR_NEW" >>$LOG
}
fi
}
if [ "$DIFF_FILES" -ne 0 ];then
{
echo "----------Проверка DIFF...----------" >>$LOG
if !([ -e "$DIFF_INCLUDE_LIST" ])then
{
echo "! Проверка DIFF включена, но файл $DIFF_INCLUDE_LIST не найден !" >>$LOG
}
else
{
if [ `ls $DIFF_DIR_NEW | wc -l` -eq 0 ];then
{
echo "Каталог $DIFF_DIR_NEW пустой или не существует (копируются файлы для последующей проверки)" >>$LOG
rsync -rptgoq --exclude-from=$DIFF_EXCLUDE_LIST --files-from=$DIFF_INCLUDE_LIST / $DIFF_DIR_NEW
#Делаем резервную копию
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
}
else
{
rsync -rptgo $DIFF_DIR_NEW/* $DIFF_DIR_OLD
#Снапшот системы
rsync -rptgoq --delete --delete-excluded --exclude-from=$DIFF_EXCLUDE_LIST --files-from=$DIFF_INCLUDE_LIST / $DIFF_DIR_NEW
#Сравниваем
if diff -r $DIFF_DIR_OLD $DIFF_DIR_NEW >>$LOG;then
{
echo "Отличий нет" >>$LOG
#Если нет резервной копии, делаем
if !([ -e "$DIFF_BACKUP" ])then
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
fi
}
else
{
#Делаем резервную копию
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
#Делаем инкрементную копию файлов
rsync -rptgo --delete -b --backup-dir=$DIFF_DIR_TEMP $DIFF_DIR_NEW/* $DIFF_DIR_OLD
#Если есть измененные файлы делаем архив предыдущей версии
if ([ -d "$DIFF_DIR_TEMP" ])then
{
FILENAME=configs-"$SERVER_NAME"-"$DATE".tar.gz
tar -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME $DIFF_DIR_TEMP 2>>$LOG
STATUS=$?
if [ $STATUS -ne 0 ];then
echo "! Ошибка создания архива ($STATUS) $PACH_FOR_BACKUP_TO_DISK/$FILENAME из каталога $DIFF_DIR_OLD !" >>$LOG
else
echo "Архив $PACH_FOR_BACKUP_TO_DISK/$FILENAME каталога $DIFF_DIR_OLD создан успешно" >>$LOG
rm -rf $DIFF_DIR_TEMP
fi
if [ "$WEBDISK_ONE_FILE" -ne 0 ]
then
FILENAME_WEBDISK=configs-"$SERVER_NAME".tar.gz
else
FILENAME_WEBDISK=$FILENAME
fi
FUNC_COPY_TO_WEBDISK
}
else
{
echo "Изменения есть, но старые файлы изменены не были, архив создан не будет" >>$LOG
}
fi
#Отправляем на почту лог изменений
if [ "$SEND_EMAIL_2" -ne 0 ];then
{
EMAIL_TMP=$EMAIL_2
FUNC_EMAIL
}
fi
}
fi
}
fi
}
fi
#Удаляем временный каталог
rm -rf $DIFF_DIR_OLD
}
fi
#----------------------------------------------
if [ "$SEND_EMAIL" -ne 0 ];then
{
EMAIL_TMP=$EMAIL
FUNC_EMAIL
}
fi
if [ "$SEND_EMAIL" -ne 0 -o "$SEND_EMAIL_2" -ne 0 ];then
{
sleep 20
service $EMAIL_SERVICE stop
}
fi
#-----------------------------------------------
if [ "$BACKUP_TO_WEBDISK" -ne 0 ];then
{
echo -e "Свободное место на диске \n" "$(df -h $PACH_FOR_WEBDISK)" >>$LOG
FILENAME="log-"$DATE".tar.gz"
tar -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME $LOG
if [ "$WEBDISK_ONE_FILE" -ne 0 ]
then
FILENAME_WEBDISK=log.tar.gz
else
FILENAME_WEBDISK=$FILENAME
fi
FUNC_COPY_TO_WEBDISK
if [ "$UMOUNT_WEBDISK" -ne 0 ];then
{
umount -l $PACH_FOR_WEBDISK
}
fi
}
fi
#-----------------------------------------------
if [ "$LOG_IN_TERMINAL" -ne 0 ];then
{
set $(wc -l $LOG);LOGEND=$1"p"
sed -n $LOGSTART,$LOGEND $LOG
}
fi
#END SCRIPT




Комментарии

Популярные сообщения из этого блога

Accel-ppp команды

mikbill расшифровка завершений сессий

Zabbix agent установка и настройка