pankovea-patch-1 #1

Merged
pankovea merged 11 commits from pankovea-patch-1 into main 2025-07-14 15:22:41 +00:00
Showing only changes of commit 2541094bdf - Show all commits

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,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"