Делаем простой скрипт резервного копирования с помощью Объектного хранилища Selectel

Суть скрипта очень простая. Объектное хранилище рассматривает каждый файл или папку как объект. Так почему бы не создать скрипт модульного резервного копирования, который помог бы сразу сбрасывать на хранилище нужные нам файлы и папки? Именно этим сейчас мы и займемся. Наш скрипт также будет работать по командам. Предупреждаю что скрипт сделан несколько топорно и некоторые могут фырчать на этой основе, но я делал все главным образом под себя.

Сперва напишем шебанг и описание.
#!/bin/bash
#===============================================
# Backup/restore script v1.0
# Mikhail Gubin
# ms_gubin@protek.ru
#===============================================

Шебанг — это такая штука, которая в языке bash указывает скрипту на нужную для выполнения команд оболочку. В данном случая это оболочка Bash.

Теперь нам надо определить нужные параметры. Давайте зададим параметры программ и некоторые другие.
rsync="rsync"
zip="zip"
sudo="sudo"
sshpass="sshpass"
sshfs="sshfs"
bc="bc"
ipp="iptables-persistent"
IP=$(hostname -I)

В данном случае параметр IP определяет адрес сервера, он нам пригодится чуть позже.

Следом мы опишем нужные нам файлы сетевых настроек для себя, чтобы не забыть их.
# Networking file names:
#
# CentOS
#/etc/sysconfig/network-scripts
#
#Debian, Ubuntu
#/etc/network/interfaces

Как только мы написали справку про сетевые настройки, приступаем к функциям. Первой пойдет функция помощи, через echo мы выведем все известные параметры.

Все функции в bash начинаются с function, после названия заканчиваются круглыми скобками, а после них идут фигурные с телом функции.
function help_fn () {
echo "--update - update current backup"
echo "--backup - make new backup"
}

Следом идет функция поиска программного обеспечения и непосредственно копирования. Она называется у нас backup_fn.
Мы создадим для нее вот такой код для поиска программного обеспечения.
if [ -x "$sudo" ]; then
echo "==============================================="
echo "[sudo] not found. Please install it after starting backup/restore."
echo "Run: [apt-get install sudo -y] by root user."
echo "Exiting..."
echo "==============================================="
return 0;
else
echo "[sudo]..........OK"
fi

Код не единичен, поиск идет на все программы, которые мы указали в начале. Если программы не будет, скрипт ее установит.

Следом мы запихнем в архивы нужные нам папки и файлы. Опция -x помогает игнорировать нужные нам имена папок и файлов.
sudo zip -r home.zip /home -x "vsftpd"
sudo zip -r hosts.zip /etc/hosts
sudo zip -r shadow.zip /etc/shadow
sudo zip -r passwd.zip /etc/passwd
sudo zip -r interfaces.zip /etc/network/interfaces

Теперь передадим файлы архивов по FTP на Объектное хранилище Selectel, в свой контейнер с автоматическим созданием папки с хостнеймом и IP сервера, для каждого сервера он будет уникален.
HOST='ftp.selcdn.ru'
USER='фтп юзер'
PASSWD='фтп пароль'
DIR='имя контейнера'
LDIR='локальная папка где архивы лежат'
ftp -n $HOST <<EOF
user $USER $PASSWD
passive
cd $DIR
mkd $(hostname)_$IP
cd $(hostname)_$IP
lcd $LDIR
put home.zip
put hosts.zip
put shadow.zip
put passwd.zip
put interfaces.zip
bye
EOF

Удалим архивы после их передачи, они нам больше не нужны.
rm -rf *.zip

Как только разобрались с этой функцией, создаем функцию обновления. Она почти идентична бэкапу, но FTP скрипт будет немного другим. В нем мы удалим старые архивы.
HOST='ftp.selcdn.ru'
USER='фтп юзер'
PASSWD='фтп пароль'
DIR='имя контейнера'
LDIR='локальная папка где архивы лежат'
ftp -n $HOST <<EOF
user $USER $PASSWD
passive
cd $DIR
cd $(hostname)_$IP
delete *.zip
lcd $LDIR
put home.zip
put hosts.zip
put shadow.zip
put passwd.zip
put interfaces.zip
bye
EOF

И теперь мы укажем команды для выполнения с скриптом.
while getopts b:u:h: flag
do
    case "${flag}" in
        b|--backup) backup_fn;;
        u|--update) update_fn;;
	h|--help) help_fn;;
    esac
done

У вас должен получиться такой скрипт.
#!/bin/bash
#===============================================
# Backup/restore script v1.0
# Mikhail Gubin
# ms_gubin@protek.ru
#===============================================
rsync="rsync"
zip="zip"
sudo="sudo"
sshpass="sshpass"
sshfs="sshfs"
bc="bc"
ipp="iptables-persistent"
IP=$(hostname -I)

# Networking file names:
#
# CentOS
#/etc/sysconfig/network-scripts
#
#Debian, Ubuntu
#/etc/network/interfaces

function help_fn () {
echo "--update - update current backup"
echo "--backup - make new backup"
}

function backup_fn () {
echo "Starting software checks."
if [ -x "$sudo" ]; then
echo "==============================================="
echo "[sudo] not found. Please install it after starting backup/restore."
echo "Run: [apt-get install sudo -y] by root user."
echo "Exiting..."
echo "==============================================="
return 0;
else
echo "[sudo]..........OK"
fi

if [ -x "$zip" ]; then
echo "==============================================="
echo "[zip] not found. Installing it..."
echo "==============================================="
sudo apt-get install $zip -y;
else
echo "[zip]..........OK";
fi

if [ -x "$rsync" ]; then
echo "==============================================="
echo "[rsync] not found. Installing it..."
echo "==============================================="
sudo apt-get install $rsync -y;
else
echo "[rsync]..........OK";
fi

if [ -x "$sshpass" ]; then
echo "==============================================="
echo "[sshpass] not found. Installing it..."
echo "==============================================="
sudo apt-get install $sshpass -y;
else
echo "[sshpass]..........OK";
fi

if [ -x "$sshfs" ]; then
echo "==============================================="
echo "[sshfs] not found. Installing it..."
echo "==============================================="
sudo apt-get install $sshfs -y;
else
echo "[sshfs]..........OK";
fi

if [ -x "$bc" ]; then
echo "==============================================="
echo "[bc] not found. Installing it..."
echo "==============================================="
sudo apt-get install $bc -y;
else
echo "[bc]..........OK";
fi

if [ -x "$ipp" ]; then
echo "==============================================="
echo "[iptables-persistent] not found. Installing it..."
echo "==============================================="
sudo apt-get install $ipp -y;
else
echo "[iptables-persistent]..........OK";
fi

sudo zip -r home.zip /home -x "vsftpd"
sudo zip -r hosts.zip /etc/hosts
sudo zip -r shadow.zip /etc/shadow
sudo zip -r passwd.zip /etc/passwd
sudo zip -r interfaces.zip /etc/network/interfaces

HOST='ftp.selcdn.ru'
USER='фтп юзер'
PASSWD='фтп пароль'
DIR='имя контейнера'
LDIR='локальная папка где архивы лежат'
ftp -n $HOST <<EOF
user $USER $PASSWD
passive
cd $DIR
mkd $(hostname)_$IP
cd $(hostname)_$IP
lcd $LDIR
put home.zip
put hosts.zip
put shadow.zip
put passwd.zip
put interfaces.zip
bye
EOF

rm -rf *.zip
}

function update_fn () {
echo "Starting software checks."
if [ -x "$sudo" ]; then
echo "==============================================="
echo "[sudo] not found. Please install it after starting backup/restore."
echo "Run: [apt-get install sudo -y] by root user."
echo "Exiting..."
echo "==============================================="
return 0;
else
echo "[sudo]..........OK"
fi

if [ -x "$zip" ]; then
echo "==============================================="
echo "[zip] not found. Installing it..."
echo "==============================================="
sudo apt-get install $zip -y;
else
echo "[zip]..........OK";
fi

if [ -x "$rsync" ]; then
echo "==============================================="
echo "[rsync] not found. Installing it..."
echo "==============================================="
sudo apt-get install $rsync -y;
else
echo "[rsync]..........OK";
fi

if [ -x "$sshpass" ]; then
echo "==============================================="
echo "[sshpass] not found. Installing it..."
echo "==============================================="
sudo apt-get install $sshpass -y;
else
echo "[sshpass]..........OK";
fi

if [ -x "$sshfs" ]; then
echo "==============================================="
echo "[sshfs] not found. Installing it..."
echo "==============================================="
sudo apt-get install $sshfs -y;
else
echo "[sshfs]..........OK";
fi

if [ -x "$bc" ]; then
echo "==============================================="
echo "[bc] not found. Installing it..."
echo "==============================================="
sudo apt-get install $bc -y;
else
echo "[bc]..........OK";
fi

if [ -x "$ipp" ]; then
echo "==============================================="
echo "[iptables-persistent] not found. Installing it..."
echo "==============================================="
sudo apt-get install $ipp -y;
else
echo "[iptables-persistent]..........OK";
fi

HOST='ftp.selcdn.ru'
USER='фтп юзер'
PASSWD='фтп пароль'
DIR='имя контейнера'
LDIR='локальная папка где архивы лежат'
ftp -n $HOST <<EOF
user $USER $PASSWD
passive
cd $DIR
cd $(hostname)_$IP
delete *.zip
lcd $LDIR
put home.zip
put hosts.zip
put shadow.zip
put passwd.zip
put interfaces.zip
bye
EOF
}

while getopts b:u:h: flag
do
    case "${flag}" in
        b|--backup) backup_fn;;
        u|--update) update_fn;;
	h|--help) help_fn;;
    esac
done

Сохраняем все под именем backup.sh.

Вот и все. Теперь осталось заполнить поля переменных в скрипте своим содержимым и можно работать. Например для копирования делаем так:
bash backup.sh --backup

Обезличенный пример скрипта я кинул на свою хранилку, можете посмотреть как там все устроено.
Поделиться:

Похожие публикации

Тут ничего нет

Нет комментариев