From 53fc21806e70c40b66279f981be2313c6da0ee4c Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 17 Jun 2025 19:14:09 +0300 Subject: [PATCH] updated backup and recovery pfx --- winehelper | 230 +++++++++++++++++++++++++---------------------------- 1 file changed, 108 insertions(+), 122 deletions(-) diff --git a/winehelper b/winehelper index 573f792..3716cd4 100755 --- a/winehelper +++ b/winehelper @@ -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 " }