updated backup and recovery pfx

This commit is contained in:
Mikhail Tergoev
2025-06-17 19:14:09 +03:00
parent 5d3fe940d2
commit 53fc21806e

View File

@ -361,7 +361,13 @@ create_desktop () {
local name_desktop="$1"
local exe_file="$2"
local desktop_filename="$(basename "$exe_file" .exe | sed "s| |_|")"
local icon_file="$WH_IMAGE_PATH/$3.png"
local icon_file
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] && [[ -f "$3" ]]
then icon_file="$3"
elif [[ -f "$WH_IMAGE_PATH/$3.png" ]]
then icon_file="$WH_IMAGE_PATH/$3.png"
else icon_file="wine"
fi
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
fatal "Used: $SCRIPT_NAME --desktop \"desktop_name\" \"path_to_exe\" \"name_png_from_image\""
@ -385,7 +391,6 @@ create_desktop () {
# создаем .desktop файл
create_new_dir "$WH_MENU_DIR"
[[ ! -f "$icon_file" ]] && icon_file=wine
{
echo "[Desktop Entry]"
echo "Name=$name_desktop"
@ -400,7 +405,7 @@ create_desktop () {
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/"
if [[ "$RESTORE_FROM_BACKUP" == "1" ]]; then
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] ; then
print_info "Пропускаем обновление desktop.list (режим восстановления из бэкапа)"
else
# добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
@ -842,7 +847,7 @@ check_prefix_var () {
local prefixes=()
local count=1
print_info "Доступные префиксы WineHelper:"
for prefix in "$WH_PREFIXES_DIR"/*; do
for prefix in "$WH_PREFIXES_DIR"/* ; do
if [[ -d "$prefix" ]]; then
prefixes+=("$prefix")
echo "$count. $(basename "$prefix")"
@ -850,14 +855,12 @@ check_prefix_var () {
fi
done
if [[ ${#prefixes[@]} -eq 0 ]]; then
fatal "Не найдено ни одного префикса!"
fi
[[ ${#prefixes[@]} -eq 0 ]] && fatal "Не найдено ни одного префикса!"
local max_choice=${#prefixes[@]}
read -p "Выберите префикс (1-$max_choice): " choice
if [[ "$choice" -ge 1 && "$choice" -le "$max_choice" ]]; then
if [[ "$choice" -ge 1 && "$choice" -le "$max_choice" ]] ; then
export WINEPREFIX="${prefixes[$choice-1]}"
else
fatal "Неверный выбор."
@ -869,6 +872,7 @@ check_prefix_var () {
if echo "$WINEPREFIX" | grep -qv '/' ; then
export WINEPREFIX="$WH_PREFIXES_DIR/$WINEPREFIX"
fi
export PREFIX_NAME="$(basename "$WINEPREFIX")"
return 0
}
@ -1319,33 +1323,21 @@ remove_winehelper () {
}
backup_prefix() {
local prefix_name="$1"
local prefix_path="$WH_PREFIXES_DIR/$prefix_name"
export WINEPREFIX="$1"
check_prefix_var
local backup_base_dir="$(xdg-user-dir DESKTOP)"
local backup_archive_name="backup_${prefix_name}_$(date +%Y.%m.%d).whpack"
local backup_archive_name="backup_${PREFIX_NAME}_$(date +%Y.%m.%d).whpack"
local backup_dest_path="$backup_base_dir/$backup_archive_name"
local temp_backup_dir="$WH_TMP_DIR/backup_${prefix_name}_$(date +%Y.%m.%d)"
local temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%Y.%m.%d)"
if [[ -z "$prefix_name" ]]; then
print_error "Не указано имя префикса для резервного копирования."
echo "Использование: $SCRIPT_NAME backup-prefix [имя_префикса]"
echo "Доступные префиксы:"
ls -1 "$WH_PREFIXES_DIR"
return 1
fi
if [[ ! -d "$prefix_path" ]]; then
print_error "Префикс \"$prefix_name\" не найден по пути $prefix_path."
return 1
fi
print_info "Начало резервного копирования префикса: $prefix_name"
print_info "Начало резервного копирования префикса: $PREFIX_NAME"
create_new_dir "$temp_backup_dir"
create_new_dir "$temp_backup_dir/prefixes/"
create_new_dir "$temp_backup_dir/dist/"
print_info "Подготовка префикса к упаковке..."
if cp -a "$prefix_path" "$temp_backup_dir/prefixes/$prefix_name"; then
if cp -a "$WINEPREFIX" "$temp_backup_dir/prefixes/$PREFIX_NAME" ; then
print_ok "Директория префикса подготовлена."
else
print_error "Не удалось подготовить директорию префикса."
@ -1353,38 +1345,33 @@ backup_prefix() {
return 1
fi
if [[ -f "$prefix_path/last.conf" ]]; then
local wine_version_to_backup
wine_version_to_backup=$( (source "$prefix_path/last.conf" && echo "$WH_WINE_USE") )
if [[ -f "$WINEPREFIX/last.conf" ]]; then
source "$WINEPREFIX/last.conf"
if [[ -n "$wine_version_to_backup" && "$wine_version_to_backup" != system* && -d "$WH_DIST_DIR/$wine_version_to_backup" ]]; then
print_info "Копирование используемой версии Wine: $wine_version_to_backup..."
if [[ -n "$WH_WINE_USE" ]] \
&& [[ $WH_WINE_USE != system* ]] \
&& [[ -d "$WH_DIST_DIR/$WH_WINE_USE" ]]
then
print_info "Копирование используемой версии WINE: $WH_WINE_USE"
if ! cp -a "$WH_DIST_DIR/$wine_version_to_backup" "$temp_backup_dir/dist/"; then
print_error "Ошибка: не удалось скопировать версию Wine."
exit 1
if cp -a "$WH_DIST_DIR/$WH_WINE_USE" "$temp_backup_dir/dist/"
then print_ok "WINE скопирован."
else fatal "Не удалось скопировать WINE."
fi
print_ok "Версия Wine скопирована."
fi
fi
print_info "Создание squashfs архива..."
if command -v mksquashfs >/dev/null; then
if mksquashfs "$temp_backup_dir" "$backup_dest_path" -comp zstd; then
print_ok "Архив успешно создан: $backup_dest_path"
else
print_error "Не удалось создать архив."
try_remove_dir "$temp_backup_dir"
return 1
fi
if mksquashfs "$temp_backup_dir" "$backup_dest_path" -comp zstd ; then
print_ok "Архив префикса $PREFIX_NAME успешно создан по пути:\n$backup_dest_path"
else
print_error "mksquashfs не установлен. Необходимо установить squashfs-tools."
print_error "Не удалось создать архив префикса $PREFIX_NAME."
try_remove_dir "$temp_backup_dir"
return 1
fi
try_remove_dir "$temp_backup_dir"
print_info "Резервное копирование завершено."
print_info "Создание резервной копии префикса завершено."
return 0
}
@ -1392,18 +1379,16 @@ restore_prefix() {
local backup_archive_path="$1"
local temp_extract_dir
if [[ -z "$backup_archive_path" ]]; then
if [[ -z "$backup_archive_path" ]] ; then
read -e -p "Укажите путь к архиву резервной копии (/путь/к/архиву.whpack): " backup_archive_path
if [[ -z "$backup_archive_path" ]]; then
print_error "Путь к архиву не указан. Восстановление отменено."
return 1
if [[ -z "$backup_archive_path" ]] ; then
fatal "Путь к архиву не указан. Восстановление отменено."
fi
fi
backup_archive_path=$(echo "$backup_archive_path" | sed "s/'//g; s/\"//g")
if [[ ! -f "$backup_archive_path" ]]; then
print_error "Файл архива не найден: $backup_archive_path"
return 1
if [[ ! -f "$backup_archive_path" ]]
then fatal "Файл архива не найден: $backup_archive_path"
fi
print_info "Восстановление из резервной копии: $backup_archive_path"
@ -1412,68 +1397,69 @@ restore_prefix() {
create_new_dir "$temp_extract_dir"
print_info "Распаковка архива..."
if ! unsquashfs -f -d "$temp_extract_dir" "$backup_archive_path"; then
print_error "Не удалось распаковать архив."
try_remove_dir "$temp_extract_dir"
return 1
fi
print_ok "Архив успешно распакован."
if [[ -d "$temp_extract_dir/dist" ]]; then
print_info "Восстановление версий Wine..."
# TODO: Нужно ли создавать директортю create_new_dir "$WH_DIST_DIR" и перезаписывать/удалять сушествующие файлы в /dist
if ! mv -n "$temp_extract_dir/dist"/* "$WH_DIST_DIR/"; then
print_warning "Не удалось восстановить версии Wine."
else
print_ok "Версии Wine восстановлены."
fi
fi
if [[ -d "$temp_extract_dir/prefixes" ]]; then
for prefix_dir in "$temp_extract_dir"/prefixes/*; do
local prefix_name=$(basename "$prefix_dir")
if [[ -d "$prefix_dir" ]]; then
print_info "Восстановление префикса: $prefix_name"
# TODO: Нужно ли удалять, перезаписывать или создавать новый префикс try_remove_dir "$WH_PREFIXES_DIR/$prefix_name"
if ! mv "$prefix_dir" "$WH_PREFIXES_DIR/"; then
print_error "Не удалось восстановить префикс $prefix_name."
else
print_ok "Префикс $prefix_name восстановлен."
print_info "Восстановление ярлыков для префикса $prefix_name..."
export RESTORE_FROM_BACKUP=1 # Устанавливаем флаг восстановления
while IFS='=' read -r line; do
local name_desktop=$(echo "$line" | cut -d'=' -f1)
local exe_path=$(echo "$line" | cut -d'=' -f2)
local icon_name=$(echo "$line" | cut -d'=' -f3)
local full_exe_path="$WH_PREFIXES_DIR/$prefix_name${exe_path}"
local full_icon_path="$WH_PREFIXES_DIR/$prefix_name/icons/${icon_name}"
if [[ -f "$full_exe_path" ]]; then
print_info "Создание ярлыка для $name_desktop"
create_desktop "$name_desktop" "$full_exe_path" "${icon_name%.*}"
else
print_warning "Исполняемый файл для ярлыка '$name_desktop' не найден: $full_exe_path"
fi
done < "$WH_PREFIXES_DIR/$prefix_name/desktop.list"
unset RESTORE_FROM_BACKUP # Снимаем флаг после завершения
print_ok "Ярлыки для префикса $prefix_name восстановлены."
fi
fi
done
if unsquashfs -f -d "$temp_extract_dir" "$backup_archive_path" ; then
print_ok "Архив успешно распакован."
else
print_error "Директория prefixes не найдена в архиве."
try_remove_dir "$temp_extract_dir"
return 1
fatal "Не удалось распаковать архив."
fi
if [[ -d "$temp_extract_dir/prefixes" ]] ; then
local prefix_name prefix_dir
prefix_name="$(ls -1 "$temp_extract_dir/prefixes")"
prefix_dir="$temp_extract_dir/prefixes/$prefix_name"
print_info "Восстановление префикса: $prefix_name"
if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then
try_remove_dir "$temp_extract_dir"
fatal "Префикс $prefix_name уже существует!
Удалите его если действительно желаете востановить префикс заново.
Команда для удаления: $SCRIPT_NAME remove-prefix $prefix_name"
fi
if [[ -d "$temp_extract_dir/dist" ]] ; then
print_info "Восстановление версий WINE"
if cp -fr "$temp_extract_dir/dist"/* "$WH_DIST_DIR/"
then print_ok "Версии WINE восстановлены."
else print_warning "Не удалось восстановить версии WINE."
fi
try_remove_dir "$temp_extract_dir/dist"
fi
if ! mv "$prefix_dir" "$WH_PREFIXES_DIR/" ; then
try_remove_dir "$temp_extract_dir"
fatal "Не удалось восстановить префикс $prefix_name."
else
print_ok "Префикс $prefix_name восстановлен."
print_info "Восстановление ярлыков для префикса $prefix_name..."
export RESTORE_FROM_BACKUP="1" # Устанавливаем флаг восстановления
while IFS='=' read -r line; do
local name_desktop=$(echo "$line" | cut -d'=' -f1)
local exe_path=$(echo "$line" | cut -d'=' -f2)
local icon_name=$(echo "$line" | cut -d'=' -f3)
local full_exe_path="$WH_PREFIXES_DIR/$prefix_name${exe_path}"
local full_icon_path="$WH_PREFIXES_DIR/$prefix_name/icons/$icon_name"
if [[ -f "$full_exe_path" ]]; then
print_info "Создание ярлыка для $name_desktop"
create_desktop "$name_desktop" "$full_exe_path" "$full_icon_path"
else
print_warning "Исполняемый файл для ярлыка '$name_desktop' не найден: $full_exe_path"
fi
done < "$WH_PREFIXES_DIR/$prefix_name/desktop.list"
unset RESTORE_FROM_BACKUP # Снимаем флаг после завершения
print_ok "Ярлыки для префикса $prefix_name восстановлены."
fi
else
try_remove_dir "$temp_extract_dir"
fatal "Директория prefixes не найдена в архиве."
fi
try_remove_dir "$temp_extract_dir"
print_ok "Полное восстановление завершено."
print_ok "Полное восстановление префикса $prefix_name завершено."
return 0
}
@ -1481,21 +1467,21 @@ wh_info () {
echo "Использование: $SCRIPT_NAME [команда]
Команды:
install list список возможных установочных скриптов
install [скрипт] запустить скрипт установки программы
install [скрипт] --clear-pfx не использовать подготовленный префикс для установки ПО
install list список возможных установочных скриптов
install [скрипт] запустить скрипт установки программы
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
installed список установленных программ
run [программа.exe] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резерную копию префикса
restore-prefix [имя_префикса] восстановить префикс из резервной копии
installed список установленных программ
run [программа.exe] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резерную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
Параметры:
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--debug [команда] включить режим логирования работы WINE
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--debug [команда] включить режим логирования работы WINE
"
}