Изменены ключи запуска

Изменены
-rs | --remote-server
-гu | --remote-user
-ld | --local-dataset
-rd | --remote-dataset
Добавлены:
-l | --log-file
--no-progress
--no-check
--stop

#FIXME работоспособность не протестирована
This commit is contained in:
pankovea 2024-11-08 19:52:00 +00:00
parent 7658041e3d
commit 2541094bdf

View File

@ -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,7 +102,11 @@ backup_datasets=(${=backup_datasets}) # Конвертирование в мас
declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере
if [[ $incremental = true ]]; then # Если заданы local_dataset & remote_dataset
if [[ -v local_dataset && -v remote_dataset ]]; then
work_datasets[$local_dataset]=$remote_dataset
else # Если нет, то вычислить
if [[ $incremental = true ]]; then
# Высчитать что на что резервировать # Высчитать что на что резервировать
for ((i = 1; i <= ${#local_datasets}; i++)); do for ((i = 1; i <= ${#local_datasets}; i++)); do
for ((j = 1; j <= ${#backup_datasets}; j++)); do for ((j = 1; j <= ${#backup_datasets}; j++)); do
@ -56,7 +117,7 @@ if [[ $incremental = true ]]; then
fi fi
done done
done done
else # Если не инкрементная копия, то запросить мео для резервирования else # Если не инкрементная копия, то запросить мео для резервирования
# Вывести на экран запрос # Вывести на экран запрос
column_widths="| %-4s%-35s | %-4s%-35s\n" column_widths="| %-4s%-35s | %-4s%-35s\n"
i_max=$(( ${#local_datasets} > ${#backup_datasets} ? ${#local_datasets} : ${#backup_datasets} )) # Максимальное количество элементов i_max=$(( ${#local_datasets} > ${#backup_datasets} ? ${#local_datasets} : ${#backup_datasets} )) # Максимальное количество элементов
@ -104,8 +165,8 @@ else # Если не инкрементная копия, то запросит
else; exit 1; fi ;; else; exit 1; fi ;;
esac esac
done done
fi # Конец блока запроса места резервирования fi # Конец блока запроса места резервирования
fi # Конец блока наличия переданных параметров датасетов в скрипт
# Словарь со списком последких снапшотов для датасетов # Словарь со списком последких снапшотов для датасетов
@ -173,8 +234,9 @@ fi
# --------- Выбор датасетов ---------- # --------- Выбор датасетов ----------
read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : ' if [[ $check = true ]]; then
if [[ $work = *[[:digit:]]* ]]; then read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : '
if [[ $work = *[[:digit:]]* ]]; then
indx_list=(${=work}) indx_list=(${=work})
# Если нет индекса в списке, то удалить из словаря для резервирования # Если нет индекса в списке, то удалить из словаря для резервирования
i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do
@ -185,21 +247,22 @@ if [[ $work = *[[:digit:]]* ]]; then
echo "$i - $loc_ds \t ${last_loc_snaps[$loc_ds]} \t -> \t${bak_ds}" echo "$i - $loc_ds \t ${last_loc_snaps[$loc_ds]} \t -> \t${bak_ds}"
fi fi
done done
fi fi
# Если был выведен список, то запросить запуск в работу нового списка # Если был выведен список, то запросить запуск в работу нового списка
if [[ ${#indx_list} > 0 ]]; then if [[ ${#indx_list} > 0 ]]; then
work="N" work="N"
read "work?В работу (y/N) " read "work?В работу (y/N) "
fi
else
work="y"
fi 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"