Добвлен вывод объёмов:
* свбодного места на резервном хранилище * объёма резервируемого пространства по каждому датасету (+итоговая сумма)
This commit is contained in:
parent
6af17fcb8e
commit
810e6ec436
87
zfs_send.zsh
87
zfs_send.zsh
@ -210,6 +210,19 @@ local_datasets=(${=local_datasets}) # Конвертирование в масс
|
|||||||
backup_datasets=$(ssh $backup_user@$backup_server zfs list -o name | grep -v -e ix-app -e boot-pool -e system-data -e jails -e NAME)
|
backup_datasets=$(ssh $backup_user@$backup_server zfs list -o name | grep -v -e ix-app -e boot-pool -e system-data -e jails -e NAME)
|
||||||
backup_datasets=(${=backup_datasets}) # Конвертирование в массив
|
backup_datasets=(${=backup_datasets}) # Конвертирование в массив
|
||||||
|
|
||||||
|
# Свободное место на бэкап-сервере
|
||||||
|
declare -A backup_pool_free # Словарь: ключ = пул, значение = свободное место
|
||||||
|
ignored_pools=(boot-pool)
|
||||||
|
|
||||||
|
# Запрашиваем данные о свободном пространстве и парсим
|
||||||
|
while read -r pool free; do
|
||||||
|
if (( ${ignored_pools[(Ie)$pool]} )); then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
backup_pool_free[$pool]="$free"
|
||||||
|
done < <(ssh "$backup_user@$backup_server" "zpool list -H -o name,free" 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере
|
declare -A work_datasets # Словарь ключ = резервируемый локальный датасет, значение = имя датасета на удалённом сервере
|
||||||
|
|
||||||
# Если заданы local_dataset & remote_dataset
|
# Если заданы local_dataset & remote_dataset
|
||||||
@ -327,25 +340,74 @@ done
|
|||||||
|
|
||||||
# --------- Запрашиваем подтверждение пользователя ----------
|
# --------- Запрашиваем подтверждение пользователя ----------
|
||||||
|
|
||||||
echo ""
|
estimate_changes_bytes() { # Рассчитать объём резервируемого пространства
|
||||||
echo "Список резервируемых датасетов:"
|
local loc_ds="$1"
|
||||||
column_widths="%-4s %-35s %-20s -> %-35s\n"
|
local base_snap="$2"
|
||||||
|
local value
|
||||||
|
if [[ -z "$base_snap" ]]; then
|
||||||
|
# Полный бэкап → used в байтах
|
||||||
|
value=$(zfs get -H -p -o value used "$loc_ds" 2>/dev/null)
|
||||||
|
else
|
||||||
|
# Инкремент → written@ в байтах
|
||||||
|
value=$(zfs get -H -p -o value "written@$base_snap" "$loc_ds" 2>/dev/null)
|
||||||
|
fi
|
||||||
|
# Если значение получено — выводим его, иначе — ничего (пусто)
|
||||||
|
if [[ -n "$value" && "$value" != "-" ]]; then
|
||||||
|
echo "$value"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
human_size() { # Перевести байты в читаемый вид
|
||||||
|
bytes="$1"
|
||||||
|
if [[ -z "$bytes" ]]; then
|
||||||
|
echo "N/A"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
local one_gib=1073741824
|
||||||
|
if (( bytes >= one_gib )); then
|
||||||
|
numfmt --to=iec --format="%.1f" "$bytes" 2>/dev/null || echo "${bytes}B"
|
||||||
|
else
|
||||||
|
numfmt --to=iec --format="%.0f" "$bytes" 2>/dev/null || echo "${bytes}B"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
declare -A est_changes # Словарь хранения необходимого объёма для резервирования. Ключ - датасет, значнеие - объём в байтах
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Список резервируемых датасетов:"
|
||||||
|
column_widths="%-4s %-35s %-20s %-10s -> %-35s\n"
|
||||||
|
printf "$column_widths" "#" "Локальный датасет" "Базовый снапшот" "Изменения" "Бэкап-датасет"
|
||||||
|
total_bytes=0
|
||||||
if [[ $incremental = true ]]; then
|
if [[ $incremental = true ]]; then
|
||||||
i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do
|
i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do
|
||||||
(( i++ ))
|
(( i++ ))
|
||||||
printf $column_widths $i $loc_ds "${last_loc_snaps[$loc_ds]}" $bak_ds
|
est_changes[$loc_ds]=$(estimate_changes_bytes "$loc_ds" "${last_loc_snaps[$loc_ds]}")
|
||||||
|
(( total_bytes += est_changes[$loc_ds] ))
|
||||||
|
printf $column_widths $i $loc_ds "${last_loc_snaps[$loc_ds]}" $(human_size "${est_changes[$loc_ds]}") $bak_ds
|
||||||
done
|
done
|
||||||
printf "%-4s %-35s %-20s\n" "" "Инкрементный снимок:" "$inc_snapshot (*)"
|
printf "%-4s %-35s %-20s\n" "" "Инкрементный снимок:" "$inc_snapshot (*)"
|
||||||
else
|
else
|
||||||
i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do
|
i=0; for loc_ds bak_ds in ${(kv)work_datasets}; do
|
||||||
(( i++ ))
|
(( i++ ))
|
||||||
printf $column_widths $i $loc_ds "$inc_snapshot (*)" "$bak_ds (*)"
|
est_changes[$loc_ds]=$(estimate_changes_bytes "$loc_ds" "")
|
||||||
|
(( total_bytes += est_changes[$loc_ds] ))
|
||||||
|
printf $column_widths $i $loc_ds "$inc_snapshot (*)" $(human_size "${est_changes[$loc_ds]}") "$bak_ds (*)"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --------- Выбор датасетов ----------
|
# Итоговая сумма
|
||||||
|
echo
|
||||||
|
echo "Общий объём изменений: $(human_size $total_bytes)"
|
||||||
|
echo
|
||||||
|
echo "Свободное место на пулах бэкап-сервера:"
|
||||||
|
# Сортируем по имени пула (опционально)
|
||||||
|
for pool in ${(ko)backup_pool_free}; do
|
||||||
|
printf " %-20s : %s\n" "$pool" "${backup_pool_free[$pool]}"
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
|
||||||
|
|
||||||
|
# --------- Выбор датасетов ----------
|
||||||
|
total_bytes=0
|
||||||
if [[ $check = true ]]; then
|
if [[ $check = true ]]; then
|
||||||
read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : '
|
read 'work?Утвердите данные. "y" в работу | "1 2.." выбрать через пробел | НЕТ по умолчанию : '
|
||||||
if [[ $work = *[[:digit:]]* ]]; then
|
if [[ $work = *[[:digit:]]* ]]; then
|
||||||
@ -356,13 +418,19 @@ if [[ $check = true ]]; then
|
|||||||
if [[ ${indx_list[(r)$i]} != $i ]]; then # Если нет $i в списке $indx_list
|
if [[ ${indx_list[(r)$i]} != $i ]]; then # Если нет $i в списке $indx_list
|
||||||
unset "work_datasets[$loc_ds]"
|
unset "work_datasets[$loc_ds]"
|
||||||
else
|
else
|
||||||
echo "$i - $loc_ds \t ${last_loc_snaps[$loc_ds]} \t -> \t${bak_ds}"
|
(( total_bytes = est_changes[$loc_ds]))
|
||||||
|
printf $column_widths $i $loc_ds "${last_loc_snaps[$loc_ds]}" $(human_size "${est_changes[$loc_ds]}") $bak_ds
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Если был выведен список, то запросить запуск в работу нового списка
|
# Если был выведен список, то запросить запуск в работу нового списка
|
||||||
if [[ ${#indx_list} > 0 ]]; then
|
if [[ ${#indx_list} > 0 ]]; then
|
||||||
|
# Итоговая сумма
|
||||||
|
total_human=$(numfmt --to=iec --format="%.2f" "$total_bytes" 2>/dev/null || echo "${total_bytes}B")
|
||||||
|
echo
|
||||||
|
echo "Общий объём изменений: $total_human"
|
||||||
|
echo
|
||||||
work="N"
|
work="N"
|
||||||
read "work?В работу (y/N) "
|
read "work?В работу (y/N) "
|
||||||
fi
|
fi
|
||||||
@ -421,7 +489,7 @@ fi
|
|||||||
# Вывод прогресса
|
# Вывод прогресса
|
||||||
# Это отдельный блок программы, который не имеет прямого доступа к переменным процесса в фоне.
|
# Это отдельный блок программы, который не имеет прямого доступа к переменным процесса в фоне.
|
||||||
# Обмен переменными проивится ерез временный файл
|
# Обмен переменными проивится ерез временный файл
|
||||||
if [[ $progress == true ]]; then
|
if [[ $progress == true ]] && { (( ! ${+work} )) || [[ $work =~ ^[yY]$ ]]; }; then
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
pids=$(ps -t $(tty | sed 's|/dev/||') -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- 'grep' | grep -v -- 'progress-only' ) # Список PIDs с командой запуска
|
pids=$(ps -t $(tty | sed 's|/dev/||') -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- 'grep' | grep -v -- 'progress-only' ) # Список PIDs с командой запуска
|
||||||
@ -433,7 +501,8 @@ if [[ $progress == true ]]; then
|
|||||||
pids=$(ps a -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- 'grep' | grep -v -- 'progress-only' )
|
pids=$(ps a -o pid,args | grep -e zfs_send.zsh -e "zfs send" | grep -v -- 'grep' | grep -v -- 'progress-only' )
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo $pids
|
|
||||||
|
echo $pids
|
||||||
# Выводить прогресс запрашивая список запущенных процессов
|
# Выводить прогресс запрашивая список запущенных процессов
|
||||||
if [[ $pids = "" ]]; then
|
if [[ $pids = "" ]]; then
|
||||||
echo "Нет запущенного процесса резервирования"
|
echo "Нет запущенного процесса резервирования"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user