forked from CastroFidel/winehelper
adedd backup_pfx
This commit is contained in:
181
winehelper
181
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 "$@" ;;
|
||||
*)
|
||||
|
Reference in New Issue
Block a user