#!/bin/bash ####################################################################################################################### # Этот скрипт делает резервную копию сервера ioBroker # Скрипт бекапирует: # перепакованые родные резервные копии ioBroker # живые файлы objects и states ioBroker # файлы zigbee драйвера (теоретически должен сам разобраться установлен ли драйвер и сколько их, но плохо тестировано) # базу данных MySQL (опционально) # Сохраняет zip архив в папку $backup_path и (если настроено) отправляет на сервер резеревных копий SCP # # Ничего изменять в этом файле не надо (если конечно вы не отдаете отчет своим действиям) # Параметры подключения и прочие конфигурации прописываются в конфигурационном файле. # Если конфигурационного файла нет, то при запуске будет создан шаблон конфигурационного файла # # Автор: SvC # Версия: 1.3.2.7 от 11.01.2021 # ####################################################################################################################### IFS_old=$IFS IFS="" # я не знаю что это за магический костыль, но благодаря ему перестали съедаться переносы строк true_script_name='iob_backup' script_name=`basename $0` settings_path=`dirname $0` settings_name=$script_name.conf settings_fullname=$settings_path/$settings_name script_fullname=$settings_path/$script_name # проверка на наличие файла конфигурации if [ -e $settings_fullname ]; then settings_out=`/bin/cat $settings_fullname` check_update=`echo $settings_out | grep -P 'check_update' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` script_token=`echo $settings_out | grep -P 'script_token' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` iob_path=`echo $settings_out | grep -P 'iob_path' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_server=`echo $settings_out | grep -P 'mysql_server' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_user=`echo $settings_out | grep -P 'mysql_user' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_pass=`echo $settings_out | grep -P 'mysql_pass' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_sid=`echo $settings_out | grep -P 'mysql_sid' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_local_path=`echo $settings_out | grep -P 'backup_local_path' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_server=`echo $settings_out | grep -P 'backup_server' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_user=`echo $settings_out | grep -P 'backup_user' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_path=`echo $settings_out | grep -P 'backup_path' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` ya2m_path=`echo $settings_out | grep -P 'ya2m_path' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` # проверка обновлений if [ "$check_update" == "true" ]; then current_ver=`cat $script_fullname | grep -P '# Версия:' | head -1 | awk '{print $3}'` update_url="ss.svcserv.ru/update.php?script_name=$true_script_name¤t_ver=$current_ver&script_token=$script_token" update_ver=`curl -sL $update_url` if ((`echo $update_ver | cut -d '.' -f 4` > `echo $current_ver | cut -d '.' -f 4`)); then echo -e "\e[01;33mДоступно обновление ($current_ver -> $update_ver)\e[0m" echo 'Чтобы скачать напишите:' echo '' if [ "$script_name" == "$true_script_name" ]; then echo -e " rm $true_script_name && wget http://ss.svcserv.ru/$true_script_name && chmod ugo+x $true_script_name\e[0m" else echo -e " rm $script_name && wget http://ss.svcserv.ru/$true_script_name && chmod ugo+x $true_script_name && mv $true_script_name $script_name\e[0m" fi echo '' fi fi ####################################################################################################################### # тело скрипта # проверка существования временной папки для сборки бекапа if ! [ -d $backup_local_path/tmp ]; then mkdir $backup_local_path/tmp fi # расспаковка имеющихся архивов json_gzips=`ls -1 $iob_path/iobroker-data/backup-objects | grep .json.gz` IFS=" " for jg in ${json_gzips[@]}; do gunzip $iob_path/iobroker-data/backup-objects/$jg j=${jg/%.gz/} mv $iob_path/iobroker-data/backup-objects/$j $backup_local_path/tmp/$j done # сопирование текущих файлов cp $iob_path/iobroker-data/objects.json $backup_local_path/tmp/objects.json cp $iob_path/iobroker-data/objects.json.bak $backup_local_path/tmp/objects.json.bak cp $iob_path/iobroker-data/states.json $backup_local_path/tmp/states.json cp $iob_path/iobroker-data/states.json.bak $backup_local_path/tmp/states.json.bak # файлы zigbee драйвера zigbees=`ls -1 $iob_path/iobroker-data | grep zigbee_` zigbees_count=`echo ${zigbees[@]} | wc -w` if (( zigbees_count > 1)); then for z in ${zigbees[@]}; do cp $iob_path/iobroker-data/$z/shepherd.db $backup_local_path/tmp/${z/#zigbee_/z}_shepherd.db if [ -f $iob_path/iobroker-data/$z/nvbackup.json ]; then cp $iob_path/iobroker-data/$z/nvbackup.json $backup_local_path/tmp/${z/#zigbee_/z}_nvbackup.json fi done else cp $iob_path/iobroker-data/$zigbees/shepherd.db $backup_local_path/tmp/shepherd.db if [ -f $iob_path/iobroker-data/$zigbees/nvbackup.json ]; then cp $iob_path/iobroker-data/$zigbees/nvbackup.json $backup_local_path/tmp/nvbackup.json fi fi # создание дампа MySQL if [ "$mysql_server" ]; then mysqldump -u${mysql_user} -p${mysql_pass} ${mysql_sid} > $backup_local_path/tmp/${mysql_sid}_dump.sql fi # файлы yandex2mqtt if [ "$ya2m_path" ]; then cp $ya2m_path/config.js $backup_local_path/tmp/config.js fi # запаковка в архив filename=iob_`date +%Y.%m.%d_%H.%M`.zip zip -jr $backup_local_path/${filename} $backup_local_path/tmp/* > /dev/null # удаление временной папки rm -R $backup_local_path/tmp # выгрузка файла на удаленный сервер if [ "$backup_server" ]; then scp -C $backup_local_path/${filename} $backup_user@$backup_server:$backup_path fi # конец тела скрипта ####################################################################################################################### # если конфигурационного файла нет else script_token=`< /dev/urandom tr -dc A-Za-z0-9 | head -c32` echo "" echo "Файл $settings_name отсутствует" echo "Cоздан шаблон файла, заполните его и запустите команду заново" echo "# это файл настроек для скрипта $settings_name # скрипт и файл настроек должны иметь одинаковое имя, если вы переименовываете скрипт, то файл настроек должен быть так же переименован check_update=true # проверять ли обновления скрипта script_token=$script_token # токен позволяющий однозначно идентифицировать скрипт iob_path=/opt/iobroker # папка с родными бекапами ioBroker mysql_server=127.0.0.1 # адрес сервера MySQL. Если не используется, нужно оставить поле пустым mysql_user=myuser # имя пользователя MySQL mysql_pass=mypass # пароль пользователя MySQL mysql_sid=mysid # имя базы данных MySQL backup_local_path=/home/pi/iob_backups # локальная папка куда складывать бекапы backup_server=127.0.0.1 # адрес сервера для бекапов SCP. Если не используется, нужно оставить поле пустым backup_user=backuper # имя пользователя для сервера бекапов backup_path=/home/backuper/backups # папка на удаленном сервере бекапов ya2m_path=/mnt/data/root/yandex2mqtt # путь до yandex2mqtt. Если не используется, нужно оставить поле пустым " > $settings_fullname fi