diff --git a/winehelper b/winehelper index d480914..060948e 100755 --- a/winehelper +++ b/winehelper @@ -1193,6 +1193,183 @@ run_autoinstall () { echo } +backup_prefix() { + local prefix_name="$1" + local prefix_path="$WH_PREFIXES_DIR/$prefix_name" + local backup_base_dir="$(xdg-user-dir DESKTOP)" + local timestamp + timestamp=$(date +%Y.%m.%d) + local backup_archive_name="backup_${prefix_name}_${timestamp}.whpack" + local backup_dest_path="$backup_base_dir/$backup_archive_name" + local temp_backup_dir="$WH_TMP_DIR/backup_${prefix_name}_${timestamp}" + + 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" + create_new_dir "$backup_base_dir" + try_remove_dir "$temp_backup_dir" + create_new_dir "$temp_backup_dir" + + # создание файла с информацией о бэкапе + local backup_info_file="$temp_backup_dir/backup_info.txt" + { + echo "Информация о резервном копировании" + echo "------------------" + echo "Имя префикса: $prefix_name" + echo "Дата копирования: $(date)" + echo "Исходный путь префикса: $prefix_path" + echo "" + echo "Содержимое $prefix_name/last.conf:" + if [[ -f "$prefix_path/last.conf" ]]; then + cat "$prefix_path/last.conf" + else + echo " - $prefix_path/last.conf не найдено." + fi + echo "------------------" + } > "$backup_info_file" + + # копирование префикса во временную директорию + print_info "Подготовка префикса к упаковке..." + if cp -a "$prefix_path" "$temp_backup_dir/${prefix_name}"; then + print_ok "Директория префикса подготовлена." + else + print_error "Не удалось подготовить директорию префикса." + try_remove_dir "$temp_backup_dir" + return 1 + fi + + # упаковка префикса с помощью mksquashfs + 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 + else + print_error "mksquashfs не установлен. Необходимо установить squashfs-tools." + try_remove_dir "$temp_backup_dir" + return 1 + fi + + try_remove_dir "$temp_backup_dir" + print_info "Резервное копирование завершено." + return 0 +} + +restore_prefix() { + local backup_archive_path="$1" + local new_prefix_name="$2" + local temp_extract_dir + local original_prefix_name_from_info + local new_prefix_path + + if [[ -z "$backup_archive_path" ]]; then + read -e -p "Укажите путь к архиву резервной копии (.whpack): " backup_archive_path + if [[ -z "$backup_archive_path" ]]; then + print_error "Путь к архиву не указан. Восстановление отменено." + return 1 + 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 + fi + + print_info "Восстановление из резервной копии: $backup_archive_path" + + temp_extract_dir="$WH_TMP_DIR/restore_$(basename "$backup_archive_path" .whpack)_$(date +%s)" + 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 + + local backup_info_file="$temp_extract_dir/backup_info.txt" + if [[ ! -f "$backup_info_file" ]]; then + print_error "Файл backup_info.txt не найден в архиве." + try_remove_dir "$temp_extract_dir" + return 1 + fi + + original_prefix_name_from_info=$(grep "Имя префикса:" "$backup_info_file" | cut -d':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + + if [[ -z "$original_prefix_name_from_info" ]]; then + print_error "Не удалось определить имя оригинального префикса." + try_remove_dir "$temp_extract_dir" + return 1 + fi + + [[ -z "$new_prefix_name" ]] && new_prefix_name="$original_prefix_name_from_info" + new_prefix_path="$WH_PREFIXES_DIR/$new_prefix_name" + + if [[ -d "$new_prefix_path" ]]; then + read -p "Префикс \"$new_prefix_name\" уже существует. Перезаписать? (y/N): " answer + if [[ ! "$answer" =~ ^[YyДд]$ ]]; then + print_info "Восстановление отменено." + try_remove_dir "$temp_extract_dir" + return 0 + fi + try_remove_dir "$new_prefix_path" + fi + + # восстановление префикса + local extracted_prefix_dir="$temp_extract_dir/$original_prefix_name_from_info" + if [[ ! -d "$extracted_prefix_dir" ]]; then + print_error "Директория префикса не найдена в архиве." + try_remove_dir "$temp_extract_dir" + return 1 + fi + + print_info "Восстановление директории префикса..." + if mv "$extracted_prefix_dir" "$new_prefix_path"; then + print_ok "Директория префикса восстановлена." + else + print_error "Не удалось восстановить директорию префикса." + try_remove_dir "$temp_extract_dir" + return 1 + fi + + # восстановление ярлыков из desktop.list + if [[ -f "$new_prefix_path/desktop.list" ]]; then + print_info "Восстановление ярлыков из desktop.list..." + while IFS='=' read -r name_desktop relative_exe_path || [[ -n "$name_desktop" ]]; do + relative_exe_path=$(echo "$relative_exe_path" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + if [[ -n "$relative_exe_path" ]]; then + local full_exe_path="$new_prefix_path/$relative_exe_path" + if [[ -f "$full_exe_path" ]]; then + local png_name="$(basename "$full_exe_path" .exe | tr '[:upper:]' '[:lower:]')" + create_desktop "$name_desktop" "$full_exe_path" "$png_name" + else + print_warning "Файл $full_exe_path не найден, пропускаем создание ярлыка" + fi + fi + done < "$new_prefix_path/desktop.list" + fi + + try_remove_dir "$temp_extract_dir" + print_ok "Восстановление префикса \"$new_prefix_name\" завершено." + return 0 +} + remove_prefix() { local prefix_name="$1" local prefix_path="$WH_PREFIXES_DIR/$prefix_name" @@ -1310,6 +1487,8 @@ wh_info () { installed список установленных программ run [программа.exe] запуск программы (отладка) + backup-prefix [имя_префикса] создать резервную копию префикса + restore-prefix восстановить резервную копию префикса remove-all удалить WineHelper и все связанные данные remove-prefix [имя_префикса] удалить префикс и все связанные данные @@ -1345,6 +1524,8 @@ case "${1,,}" in install|-i) shift ; run_autoinstall "$@" ;; installed) shift ; check_installed_programs "$1" ;; run|-r) shift ; run_installed_programs "$1" ;; + backup-prefix) shift ; backup_prefix "$@" ;; + restore-prefix) shift ; restore_prefix "$@" ;; remove-all) shift ; remove_winehelper "$@ ";; remove-prefix) shift ; remove_prefix "$@" ;; *)