pankovea-patch-1 #1
83
zfs_send.zsh
83
zfs_send.zsh
@ -4,20 +4,75 @@ backup_server="192.168.0.162" # Сервер для резервирования
|
|||||||
backup_user="root" # Пользователь на сервере
|
backup_user="root" # Пользователь на сервере
|
||||||
inc_snapshot="manual-$(date +%Y%m%d)" # Новый создаваемый снисмок
|
inc_snapshot="manual-$(date +%Y%m%d)" # Новый создаваемый снисмок
|
||||||
incremental=false
|
incremental=false
|
||||||
|
silent=false
|
||||||
|
stop=false
|
||||||
|
progress=true
|
||||||
|
check=true
|
||||||
|
LOGFILE="log_bak_${inc_snapshot}.log"
|
||||||
|
unset local_dataset
|
||||||
|
unset remote_dataset
|
||||||
|
|
||||||
echo -ne "Обработка аргументов...\033[2K\r"
|
echo -ne "Обработка аргументов...\033[2K\r"
|
||||||
|
|
||||||
while [[ "$#" -gt 0 ]]; do
|
while [[ "$#" -gt 0 ]]; do
|
||||||
case $1 in
|
case $1 in
|
||||||
-r|--backup-server) backup_server="$2"; shift ;;
|
-rs|--remote-server) backup_server="$2"; shift ;;
|
||||||
-г|--baсkup-user) backup_user="$2"; shift ;;
|
-гu|--remote-user) backup_user="$2"; shift ;;
|
||||||
-s|--snapshot) inc_snapshot="$2"; shift ;;
|
-s|--snapshot) inc_snapshot="$2"; shift ;;
|
||||||
|
-ld|--local-dataset) local_dataset="$2"; shift ;;
|
||||||
|
-rd|--remote-dataset) remote_dataset="$2"; shift ;;
|
||||||
|
-l|--log-file) LOGFILE="$2"; shift ;;
|
||||||
-i|--incremental) incremental=true ;;
|
-i|--incremental) incremental=true ;;
|
||||||
|
--no-progress) progress=false ;;
|
||||||
|
--no-check) check=false ;;
|
||||||
|
--stop) stop=true ;;
|
||||||
|
-h|--help) echo "Использование: ./zfs_send.zsh [OPTIONS]";
|
||||||
|
echo "-rs | --remote-server <ip/dns>";
|
||||||
|
echo "-гu | --remote-user <user>";
|
||||||
|
echo "-s | --snapshot <snapshot_name>";
|
||||||
|
echo "-ld | --local-dataset <local/dataset>";
|
||||||
|
echo "-rd | --remote-dataset <remote/dataset>";
|
||||||
|
echo "-l | --log-file <path/filename";
|
||||||
|
echo " --no-progress";
|
||||||
|
echo " --no-check";
|
||||||
|
echo " --stop";
|
||||||
|
echo "-i | --incremental" ;;
|
||||||
*) echo "Неизвестные параметры: $1"; exit 1 ;;
|
*) echo "Неизвестные параметры: $1"; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Завершение запущенного процесса резервирования
|
||||||
|
if [[ $stop = true ]]; then
|
||||||
|
pids=$(ps -t $(tty | sed 's|/dev/||') -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- '--stop') # Список PIDs с командой запуска
|
||||||
|
|
||||||
|
if [[ $pids = "" ]]; then
|
||||||
|
echo "Нет запущенного процесса резервирования в этом терминале."
|
||||||
|
read "srch?Икать во всех процессах системы? (y/N) "
|
||||||
|
if [[ $srch = y ]]; then
|
||||||
|
pids=$(ps -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- '--stop' )
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Подтверждение
|
||||||
|
if [[ $pids = "" ]]; then
|
||||||
|
echo "Нет запущенного процесса резервирования"
|
||||||
|
else
|
||||||
|
echo "Будут остановлены следующие процессы:"
|
||||||
|
echo $pids
|
||||||
|
read "work? Продолжать (y/N)"
|
||||||
|
if [[ $work = y ]]; then
|
||||||
|
pids=$(echo $pids | awk '{print $1}')
|
||||||
|
kill $pids
|
||||||
|
echo "ok"
|
||||||
|
else
|
||||||
|
echo "Операция прервана"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
echo -n "Резервирование на "
|
echo -n "Резервирование на "
|
||||||
# Проверка соединения
|
# Проверка соединения
|
||||||
if ssh $backup_user@$backup_server 'exit'; then;
|
if ssh $backup_user@$backup_server 'exit'; then;
|
||||||
@ -33,6 +88,8 @@ case $incremental in
|
|||||||
false) echo "Режим полной копии";;
|
false) echo "Режим полной копии";;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
echo "Дополнительные опции: -h|--help"
|
||||||
|
|
||||||
# --------- Собираем данные ----------
|
# --------- Собираем данные ----------
|
||||||
|
|
||||||
echo -ne "Собираю данные...\033[2K\r"
|
echo -ne "Собираю данные...\033[2K\r"
|
||||||
@ -45,6 +102,10 @@ backup_datasets=(${=backup_datasets}) # Конвертирование в мас
|
|||||||
|
|
||||||
declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере
|
declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере
|
||||||
|
|
||||||
|
# Если заданы local_dataset & remote_dataset
|
||||||
|
if [[ -v local_dataset && -v remote_dataset ]]; then
|
||||||
|
work_datasets[$local_dataset]=$remote_dataset
|
||||||
|
else # Если нет, то вычислить
|
||||||
if [[ $incremental = true ]]; then
|
if [[ $incremental = true ]]; then
|
||||||
# Высчитать что на что резервировать
|
# Высчитать что на что резервировать
|
||||||
for ((i = 1; i <= ${#local_datasets}; i++)); do
|
for ((i = 1; i <= ${#local_datasets}; i++)); do
|
||||||
@ -105,7 +166,7 @@ else # Если не инкрементная копия, то запросит
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
fi # Конец блока запроса места резервирования
|
fi # Конец блока запроса места резервирования
|
||||||
|
fi # Конец блока наличия переданных параметров датасетов в скрипт
|
||||||
|
|
||||||
|
|
||||||
# Словарь со списком последких снапшотов для датасетов
|
# Словарь со списком последких снапшотов для датасетов
|
||||||
@ -173,6 +234,7 @@ fi
|
|||||||
|
|
||||||
# --------- Выбор датасетов ----------
|
# --------- Выбор датасетов ----------
|
||||||
|
|
||||||
|
if [[ $check = true ]]; then
|
||||||
read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : '
|
read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : '
|
||||||
if [[ $work = *[[:digit:]]* ]]; then
|
if [[ $work = *[[:digit:]]* ]]; then
|
||||||
indx_list=(${=work})
|
indx_list=(${=work})
|
||||||
@ -192,14 +254,15 @@ if [[ ${#indx_list} > 0 ]]; then
|
|||||||
work="N"
|
work="N"
|
||||||
read "work?В работу (y/N) "
|
read "work?В работу (y/N) "
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
work="y"
|
||||||
|
fi
|
||||||
|
|
||||||
# --------- Резервирование ----------
|
# --------- Резервирование ----------
|
||||||
|
|
||||||
if [[ $work = "y" || $work = "Y" ]]; then
|
if [[ $work = "y" || $work = "Y" ]]; then
|
||||||
TS0=$(date +%s)
|
TS0=$(date +%s)
|
||||||
echo $TS0 > /dev/shm/backup_time_stamp # Сохраняем отметку о времени начала
|
echo $TS0 > /dev/shm/backup_time_stamp # Сохраняем отметку о времени начала
|
||||||
LOGFILE="log_bak_${inc_snapshot}.log"
|
|
||||||
echo "Результат работы записываю в файл $LOGFILE"
|
echo "Результат работы записываю в файл $LOGFILE"
|
||||||
|
|
||||||
# Функция для записи сообщения в файл и на экран
|
# Функция для записи сообщения в файл и на экран
|
||||||
@ -220,10 +283,10 @@ if [[ $work = "y" || $work = "Y" ]]; then
|
|||||||
echo_log
|
echo_log
|
||||||
echo_log "--- Резервирую данные ---"
|
echo_log "--- Резервирую данные ---"
|
||||||
i_task=0 # Выполненных зачач
|
i_task=0 # Выполненных зачач
|
||||||
echo $i_task > /dev/shm/backup_i_task # Сохраняем количество готовых задач в память
|
if [[ $progress == true ]]; then echo $i_task > /dev/shm/backup_i_task; fi # Сохраняем количество готовых задач в память
|
||||||
for loc_ds bak_ds in ${(kv)work_datasets}; do
|
for loc_ds bak_ds in ${(kv)work_datasets}; do
|
||||||
TS1=$(date +%s)
|
TS1=$(date +%s)
|
||||||
echo $TS1 > /dev/shm/backup_time_stamp # Сохраняем отметку о времени начала
|
if [[ $progress == true ]]; then echo $TS1 > /dev/shm/backup_time_stamp; fi # Сохраняем отметку о времени начала
|
||||||
echo_log " * snapshot ${loc_ds}@${inc_snapshot}"
|
echo_log " * snapshot ${loc_ds}@${inc_snapshot}"
|
||||||
zfs snapshot ${loc_ds}@${inc_snapshot}; #FIXME выдаёт ошибку если мы оставили существующий снимок
|
zfs snapshot ${loc_ds}@${inc_snapshot}; #FIXME выдаёт ошибку если мы оставили существующий снимок
|
||||||
echo_log " * Start sending ${loc_ds} at $(date +'%Y.%m.%d %H:%M.%S')"
|
echo_log " * Start sending ${loc_ds} at $(date +'%Y.%m.%d %H:%M.%S')"
|
||||||
@ -233,11 +296,12 @@ if [[ $work = "y" || $work = "Y" ]]; then
|
|||||||
esac
|
esac
|
||||||
TS2=$(date +%s)
|
TS2=$(date +%s)
|
||||||
(( i_task++ ))
|
(( i_task++ ))
|
||||||
echo $i_task > /dev/shm/backup_i_task
|
if [[ $progress == true ]]; then echo $i_task > /dev/shm/backup_i_task; fi
|
||||||
echo_log "--- готово за: $(date -d@$(($TS2-$TS1)) -u '+%H:%M.%S') ---"
|
echo_log "--- готово за: $(date -d@$(($TS2-$TS1)) -u '+%H:%M.%S') ---"
|
||||||
done & # Запустить резервирование в фоне
|
done & # Запустить резервирование в фоне
|
||||||
|
|
||||||
# Выводить прогресс запрашивая список запущенныйх процессов
|
# Выводить прогресс запрашивая список запущенных процессов
|
||||||
|
if [[ $progress == true ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
last_percent=0
|
last_percent=0
|
||||||
time_changed_percent_value=$(date +%s)
|
time_changed_percent_value=$(date +%s)
|
||||||
@ -274,6 +338,7 @@ if [[ $work = "y" || $work = "Y" ]]; then
|
|||||||
# Удалить временные файлы состояний
|
# Удалить временные файлы состояний
|
||||||
rm /dev/shm/backup_i_task
|
rm /dev/shm/backup_i_task
|
||||||
rm /dev/shm/backup_time_stamp
|
rm /dev/shm/backup_time_stamp
|
||||||
|
fi
|
||||||
|
|
||||||
echo_log "\n--- Все завершено за $(date -d@$(( $(date +%s) - $TS0 )) -u '+%H:%M.%S') ---\n"
|
echo_log "\n--- Все завершено за $(date -d@$(( $(date +%s) - $TS0 )) -u '+%H:%M.%S') ---\n"
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user