forked from CastroFidel/winehelper
Compare commits
17 Commits
backup_pfx
...
0.4.2
Author | SHA1 | Date | |
---|---|---|---|
fe8f384681 | |||
b46728e2e2 | |||
8ba7c99b45 | |||
37f4f26495 | |||
499260b5dc | |||
3033f6022a | |||
f7d189fa53 | |||
53fc21806e | |||
5d3fe940d2 | |||
c5538b4c14 | |||
0ee9b42d1f | |||
98902bd8f2 | |||
17afd90e93 | |||
19af68332b | |||
a2a63cf1ff | |||
858507fc8d | |||
68870f8307 |
18
CHANGELOG
18
CHANGELOG
@ -1,5 +1,20 @@
|
||||
История изменений:
|
||||
|
||||
0.4.2:
|
||||
* исправлено создание и восстановление резервных копий с разными именами пользователей
|
||||
|
||||
0.4.1:
|
||||
* добавлена возможность создания резервной копии префикса:
|
||||
winehelper backup-prefix [имя_префикса]
|
||||
* добавлена возможность восстановления резервной копии префикса:
|
||||
winehelper restore-prefix "путь/до/резервной_копии.whpack"
|
||||
* создание и восстановление резервной копии префикса включает в себя требуемую версиею WINE и информацию для создания .desktop файлов (ярлыков), что дает возможность переноса префикса на ПК без доступа к интернету
|
||||
|
||||
0.4.0:
|
||||
* добавлена автоматическая установка и настройка wine-cpcsp_proxy при
|
||||
использовании переменной WH_USE_CPCSP_PROXY=1
|
||||
* подготовка функций для создания бэкапов префикса
|
||||
|
||||
0.3.9:
|
||||
* обновлен скрипт установки scadoffice
|
||||
* добавлена автоустановка:
|
||||
@ -8,7 +23,8 @@
|
||||
* добавлена возможность удаления префикса
|
||||
|
||||
0.3.8:
|
||||
* добавлена возможность ассоциации и запуска файлов из WINE в нативном Linux приложении
|
||||
* добавлена возможность ассоциации и запуска файлов из WINE в нативном Linux
|
||||
приложении с помощью перемененной. Пример: WH_XDG_OPEN="rtf txt doc"
|
||||
* добавлен выбор префикса, если переменная WINEPREFIX не объявлена
|
||||
* добавлено сохранение последней конфигурации использования префикса
|
||||
* добавлено сохранение скписка создаваемых ярлыков для приложений
|
||||
|
@ -19,11 +19,11 @@ apt-repo | grep -q "x86_64-i586" || fatal "Репозиторий x86_64-i586 н
|
||||
windows приложения. Подробнее по ссылке: https://www.altlinux.org/Biarch"
|
||||
|
||||
##### INSTALL DEPENDENCIES #####
|
||||
# fonts-ttf-ms
|
||||
|
||||
apt-get install {i586-,}{glibc-core,libstdc++6,glibc-pthread,glibc-nss,\
|
||||
libOSMesa,libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\
|
||||
libgnutls30,libGL,libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,\
|
||||
libvulkan1,libcups} || fatal "Не удалось установить зависимости."
|
||||
|
||||
apt-get install {i586-,}wine
|
||||
|
||||
# yad zenity
|
||||
|
@ -3,6 +3,7 @@
|
||||
3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f wine_x_tkg_10-0_i586.tar.xz
|
||||
71d6fdfd23d7988471d345c68e81699b8af931352b03dd216424b398f63c7b12 wine_x_tkg_10-0_amd64.tar.xz
|
||||
fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-alt1-i586-spravkibk.tar.xz
|
||||
e0a84bb4908c3927954d7eef6b8ac7212e442b8c107d000c6890fec340f96183 wine-9.0.14-alt1-amd64.tar.xz
|
||||
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
|
||||
|
||||
##### DXVK #####
|
||||
|
548
winehelper
548
winehelper
@ -12,21 +12,41 @@ print_warning () { printf "\E[33m%s Предупреждение: $@ %s\e[0m\n"
|
||||
print_info () { printf "\E[36m%s Информация: \"$@\" %s\e[0m\n" ;}
|
||||
print_ok () { printf "\E[35m%s Успех: $@ %s\e[0m\n" ;}
|
||||
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
||||
fatal () { print_error "$@" ; exit 1 ;}
|
||||
fatal () {
|
||||
print_error "$@"
|
||||
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
||||
exit 1
|
||||
}
|
||||
|
||||
##### CHECK VARIABLES #####
|
||||
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
|
||||
|
||||
##### CHECK DEBUG #####
|
||||
if [[ "$1" == "--debug" ]] ; then
|
||||
export DEBUG="full"
|
||||
export LOG_FILE="$HOME/winehelper.log"
|
||||
check_variables WINEDEBUG "+loaddll,+seh"
|
||||
export DXVK_LOG_LEVEL="error"
|
||||
export VKD3D_DEBUG "error"
|
||||
export WINE_MONO_TRACE "E:System.NotImplementedException"
|
||||
export VK_LOADER_DEBUG "error"
|
||||
export VKBASALT_LOG_LEVEL "error"
|
||||
export DXVK_NVAPI_LOG_LEVEL "error"
|
||||
shift
|
||||
print_warning "Включен режим подробного логирования работы WINE."
|
||||
else
|
||||
check_variables WINEDEBUG "-all"
|
||||
check_variables DXVK_LOG_LEVEL "none"
|
||||
check_variables VKD3D_SHADER_DEBUG "none"
|
||||
check_variables VKD3D_DEBUG "none"
|
||||
check_variables DXVK_LOG_PATH "none"
|
||||
check_variables VKBASALT_LOG_LEVEL "none"
|
||||
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
||||
fi
|
||||
|
||||
if [[ $WINEDEBUG != "-all" ]] ; then
|
||||
export LOG_FILE="$HOME/winehelper.log"
|
||||
date > "$LOG_FILE"
|
||||
print_warning "Включен режим логирования работы WINE."
|
||||
print_warning "Лог будет сохранен по пути: $LOG_FILE"
|
||||
sleep 3
|
||||
else
|
||||
check_variables DEBUG "0"
|
||||
fi
|
||||
|
||||
##### WINETRICKS VERSION #####
|
||||
@ -111,6 +131,8 @@ su_run () {
|
||||
}
|
||||
|
||||
##### CHECK DEPENDENCIES #####
|
||||
# fonts-ttf-ms
|
||||
|
||||
if ! rpm -q {i586-,}{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,libOSMesa,\
|
||||
libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,libgnutls30,libGL,\
|
||||
libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} 1>/dev/null
|
||||
@ -299,9 +321,9 @@ var_winedlloverride_update () {
|
||||
fi
|
||||
}
|
||||
|
||||
var_vkd3d_config_update () {
|
||||
var_dxvk_config_update () {
|
||||
if [[ -n "${DXVK_CONFIG}" ]]
|
||||
then export DXVK_CONFIG="${1}; ${DXVK_CONFIG}"
|
||||
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
||||
else export DXVK_CONFIG="${1}"
|
||||
fi
|
||||
}
|
||||
@ -341,7 +363,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\""
|
||||
@ -365,7 +393,6 @@ create_desktop () {
|
||||
|
||||
# создаем .desktop файл
|
||||
create_new_dir "$WH_MENU_DIR"
|
||||
[[ ! -f "$icon_file" ]] && icon_file=wine
|
||||
{
|
||||
echo "[Desktop Entry]"
|
||||
echo "Name=$name_desktop"
|
||||
@ -380,12 +407,19 @@ create_desktop () {
|
||||
|
||||
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/"
|
||||
|
||||
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] ; then
|
||||
print_info "Пропускаем обновление desktop.list (режим восстановления из бэкапа)"
|
||||
else
|
||||
# добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
|
||||
if [[ -f "$WINEPREFIX/desktop.list" ]] \
|
||||
&& grep -qe "^${name_desktop}=" "$WINEPREFIX/desktop.list"
|
||||
then sed -i "/^$name_desktop=/d" "$WINEPREFIX/desktop.list"
|
||||
fi
|
||||
echo "$name_desktop=${exe_file//$WINEPREFIX/}" >> "$WINEPREFIX/desktop.list"
|
||||
create_new_dir "$WINEPREFIX/icons"
|
||||
try_copy_file "$icon_file" "$WINEPREFIX/icons/"
|
||||
echo "$name_desktop=${exe_file//$WINEPREFIX/}=$(basename "$icon_file")" >> "$WINEPREFIX/desktop.list"
|
||||
fi
|
||||
|
||||
|
||||
# создаем файл категории для меню
|
||||
create_new_dir "$HOME/.local/share/desktop-directories"
|
||||
@ -673,27 +707,6 @@ init_wine_ver () {
|
||||
export WINESERVER="wineserver"
|
||||
fi
|
||||
|
||||
check_variables DXVK_LOG_LEVEL "none"
|
||||
check_variables VKD3D_SHADER_DEBUG "none"
|
||||
check_variables VKD3D_DEBUG "none"
|
||||
check_variables DXVK_LOG_PATH "none"
|
||||
check_variables VKBASALT_LOG_LEVEL "none"
|
||||
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
||||
|
||||
if [[ $DEBUG == "0" ]] ; then
|
||||
check_variables WINEDEBUG "-all"
|
||||
elif [[ $DEBUG == "full" ]] ; then
|
||||
check_variables WINEDEBUG "+loaddll,+seh"
|
||||
export DXVK_LOG_LEVEL="error"
|
||||
export VKD3D_DEBUG "error"
|
||||
export WINE_MONO_TRACE "E:System.NotImplementedException"
|
||||
export VK_LOADER_DEBUG "error"
|
||||
export VKBASALT_LOG_LEVEL "error"
|
||||
export DXVK_NVAPI_LOG_LEVEL "error"
|
||||
else
|
||||
check_variables WINEDEBUG "err+all"
|
||||
fi
|
||||
|
||||
print_info "Используется версия wine: $WH_WINE_USE"
|
||||
}
|
||||
|
||||
@ -836,7 +849,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")"
|
||||
@ -844,26 +857,25 @@ 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 "Неверный выбор."
|
||||
fi
|
||||
|
||||
print_info "Выбран префикс: $WINEPREFIX"
|
||||
fi
|
||||
|
||||
if echo "$WINEPREFIX" | grep -qv '/' ; then
|
||||
export WINEPREFIX="$WH_PREFIXES_DIR/$WINEPREFIX"
|
||||
fi
|
||||
|
||||
export PREFIX_NAME="$(basename "$WINEPREFIX")"
|
||||
print_info "Выбран префикс: $PREFIX_NAME"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -877,6 +889,11 @@ init_wineprefix () {
|
||||
|
||||
export DRIVE_C="$WINEPREFIX/drive_c"
|
||||
|
||||
create_new_dir "$WINEPREFIX/dosdevices/"
|
||||
if [[ ! -L "$WINEPREFIX/dosdevices/h:" ]]
|
||||
then try_force_link_dir "$HOME" "$WINEPREFIX/dosdevices/h:"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$WINEPREFIX/.firstboot" ]] ; then
|
||||
create_new_dir "$WINEPREFIX"
|
||||
if [[ "$CLEAR_PREFIX" == "1" ]]
|
||||
@ -911,8 +928,9 @@ init_wineprefix () {
|
||||
then try_force_link_dir "$DRIVE_C/users/$USER" "$DRIVE_C/users/xuser"
|
||||
fi
|
||||
|
||||
if [[ ! -L "$WINEPREFIX/dosdevices/h:" ]]
|
||||
then try_force_link_dir "$HOME" "$WINEPREFIX/dosdevices/h:"
|
||||
if [[ ! -f "$WINEPREFIX/.update-timestamp" ]] ; then
|
||||
"$WINELOADER" wineboot -u
|
||||
wait_wineserver
|
||||
fi
|
||||
|
||||
try_remove_file "$DRIVE_C/windows/system32/winemenubuilder.exe"
|
||||
@ -977,13 +995,27 @@ init_wineprefix () {
|
||||
else cpcsp_proxy_cmd=("${WINELOADER}64" "cpcsp_proxy_setup.exe")
|
||||
fi
|
||||
|
||||
print_info "Запускаем настройку cpcsp_proxy:"
|
||||
echo "${cpcsp_proxy_cmd[*]}"
|
||||
if "${cpcsp_proxy_cmd[@]}"
|
||||
then print_info "Настройка cpcsp_proxy успешно завершена."
|
||||
else fatal "Ошибка во время настройки cpcsp_proxy."
|
||||
print_info "Запускаем настройку cpcsp_proxy..."
|
||||
unset CPCSP_PROXY_OK
|
||||
set -o pipefail
|
||||
for ((i=2; i < 6; i++)) ; do
|
||||
"${cpcsp_proxy_cmd[@]}" | tee "$WINEPREFIX/cpcsp_setup.log"
|
||||
local CPCSP_EXIT_STATUS="${PIPESTATUS[0]}"
|
||||
if grep -q "failed to load /opt/cprocsp/" "$WINEPREFIX/cpcsp_setup.log" ; then
|
||||
fatal "Проверьте правильность установки CryptoPro в системе.\n Инструкция: https://www.altlinux.org/CryptoPro"
|
||||
fi
|
||||
|
||||
if [[ $CPCSP_EXIT_STATUS == "0" ]] ; then
|
||||
print_info "Настройка cpcsp_proxy успешно завершена."
|
||||
CPCSP_PROXY_OK="1"
|
||||
break
|
||||
fi
|
||||
print_warning "Попытка $i из 5..."
|
||||
wait_wineserver
|
||||
done
|
||||
wait_wineserver
|
||||
try_remove_file "$WINEPREFIX/cpcsp_setup.log"
|
||||
[[ $CPCSP_PROXY_OK != "1" ]] && fatal "Ошибка во время настройки cpcsp_proxy."
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -1021,10 +1053,6 @@ use_winetricks () {
|
||||
USE_WT_FROM_DB=0
|
||||
[[ ! -f "$WINEPREFIX/winetricks.log" ]] && touch "$WINEPREFIX/winetricks.log"
|
||||
for need_install_dll_to_pfx in $WH_DLL_INSTALL "isolate_home" ; do
|
||||
if [[ "$need_install_dll_to_pfx" == vcrun201[5-9] ]] ; then
|
||||
sed -i "/${need_install_dll_to_pfx}/d" "$WINEPREFIX/winetricks.log"
|
||||
need_install_dll_to_pfx="vcrun2022"
|
||||
fi
|
||||
if ! grep "$need_install_dll_to_pfx" "$WINEPREFIX/winetricks.log" &>/dev/null ; then
|
||||
if [[ -z "$WH_DLL_NEED_INSTALL" ]]
|
||||
then WH_DLL_NEED_INSTALL="$need_install_dll_to_pfx"
|
||||
@ -1123,13 +1151,15 @@ wine_run () {
|
||||
WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")"
|
||||
[[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH"
|
||||
|
||||
if [[ $DEBUG == "0" ]] ; then
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
||||
else
|
||||
print_var WH_WINE_USE WINEARCH WINEPREFIX WINEDLLOVERRIDES WH_WINDOWS_VER | tee "$LOG_FILE"
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
|
||||
fi
|
||||
if [[ -n $LOG_FILE ]] && [[ -f "$LOG_FILE" ]] ; then
|
||||
echo "##### Основные переменные #####" | tee -a "$LOG_FILE"
|
||||
env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$LOG_FILE"
|
||||
|
||||
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
|
||||
else
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
||||
fi
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
@ -1193,203 +1223,19 @@ 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"
|
||||
|
||||
if [[ -z "$prefix_name" ]]; then
|
||||
print_error "Не указано имя префикса для удаления."
|
||||
echo "Использование: $SCRIPT_NAME remove-prefix [имя_префикса]"
|
||||
echo "Доступные префиксы:"
|
||||
ls -1 "$WH_PREFIXES_DIR"
|
||||
return 1
|
||||
export WINEPREFIX="$1"
|
||||
if [[ -z "$WINEPREFIX" ]]
|
||||
then print_error "Не указано имя префикса для удаления!"
|
||||
fi
|
||||
|
||||
if [[ ! -d "$prefix_path" ]]; then
|
||||
print_error "Префикс "$prefix_name" не найден."
|
||||
return 1
|
||||
check_prefix_var
|
||||
if [[ ! -d "$WINEPREFIX" ]]
|
||||
then fatal "Префикса \"$PREFIX_NAME\" не существует!"
|
||||
fi
|
||||
|
||||
if [[ ! $2 =~ --force|-y ]] ; then
|
||||
echo "======================================================"
|
||||
print_warning "Вы собираетесь удалить префикс "$prefix_name"."
|
||||
print_warning "Вы собираетесь удалить префикс "$PREFIX_NAME"."
|
||||
echo "Это приведёт к:"
|
||||
echo " - Полному удалению всех данных префикса"
|
||||
echo " - Удалению всех программ, установленных в этом префиксе"
|
||||
@ -1402,13 +1248,12 @@ remove_prefix() {
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
try_remove_dir "$prefix_path"
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
print_ok "Префикс "$prefix_name" успешно удален."
|
||||
if try_remove_dir "$WINEPREFIX" ; then
|
||||
print_ok "Префикс "$PREFIX_NAME" успешно удален."
|
||||
|
||||
for desktop_file in "$WH_MENU_DIR"/*.desktop; do
|
||||
if grep -q "$prefix_path" "$desktop_file"; then
|
||||
if grep -q "$WINEPREFIX" "$desktop_file"; then
|
||||
desktop_name=$(basename "$desktop_file")
|
||||
remove_desktop "${desktop_name%.*}"
|
||||
fi
|
||||
@ -1416,7 +1261,7 @@ remove_prefix() {
|
||||
|
||||
return 0
|
||||
else
|
||||
print_error "Не удалось удалить префикс "$prefix_name"."
|
||||
print_error "Не удалось удалить префикс "$PREFIX_NAME"."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@ -1477,20 +1322,178 @@ remove_winehelper () {
|
||||
fi
|
||||
}
|
||||
|
||||
backup_prefix() {
|
||||
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_dest_path="$backup_base_dir/$backup_archive_name"
|
||||
local temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%Y.%m.%d)"
|
||||
local temp_prefix_dir="$temp_backup_dir/prefixes/$PREFIX_NAME"
|
||||
local temp_users_dir="$temp_prefix_dir/drive_c/users"
|
||||
|
||||
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 "$WINEPREFIX" "$temp_prefix_dir" ; then
|
||||
try_remove_dir "$temp_prefix_dir/dosdevices"
|
||||
try_remove_file "$temp_prefix_dir/.update-timestamp"
|
||||
if [[ -d "$temp_users_dir/$USER" ]] \
|
||||
&& [[ ! -L "$temp_users_dir/$USER" ]]
|
||||
then
|
||||
if [[ -L "$temp_users_dir/xuser" ]]
|
||||
then try_remove_dir "$temp_users_dir/xuser"
|
||||
fi
|
||||
create_new_dir "$temp_users_dir/xuser"
|
||||
cp -fr "$temp_users_dir/$USER"/* "$temp_users_dir/xuser/"
|
||||
fi
|
||||
try_remove_dir "$temp_users_dir/$USER"
|
||||
print_ok "Директория префикса подготовлена."
|
||||
else
|
||||
print_error "Не удалось подготовить директорию префикса."
|
||||
try_remove_dir "$temp_backup_dir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ -f "$WINEPREFIX/last.conf" ]]; then
|
||||
source "$WINEPREFIX/last.conf"
|
||||
|
||||
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/$WH_WINE_USE" "$temp_backup_dir/dist/"
|
||||
then print_ok "WINE скопирован."
|
||||
else fatal "Не удалось скопировать WINE."
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
print_info "Создание squashfs архива..."
|
||||
if mksquashfs "$temp_backup_dir" "$backup_dest_path" -comp zstd ; then
|
||||
echo -e "\n# PREFIX_NAME=$PREFIX_NAME" >> "$backup_dest_path"
|
||||
print_ok "Архив префикса $PREFIX_NAME успешно создан по пути:\n$backup_dest_path"
|
||||
else
|
||||
print_error "Не удалось создать архив префикса $PREFIX_NAME."
|
||||
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 temp_extract_dir prefix_name
|
||||
|
||||
|
||||
if [[ -z "$backup_archive_path" ]] ; then
|
||||
read -e -p "Укажите путь к архиву резервной копии (/путь/к/архиву.whpack): " backup_archive_path
|
||||
backup_archive_path=$(echo "$backup_archive_path" | sed "s/'//g; s/\"//g")
|
||||
if [[ -z "$backup_archive_path" ]] ; then
|
||||
fatal "Путь к архиву не указан. Восстановление отменено."
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -f "$backup_archive_path" ]]
|
||||
then fatal "Файл архива не найден: $backup_archive_path"
|
||||
fi
|
||||
|
||||
print_info "Восстановление из резервной копии: $backup_archive_path"
|
||||
|
||||
prefix_name="$(tail -n1 "$backup_archive_path" | sed -e 's/.*PREFIX_NAME=//')"
|
||||
|
||||
if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then
|
||||
fatal "Префикс $prefix_name уже существует!
|
||||
Удалите его, если действительно желаете восстановить префикс заново.
|
||||
Команда для удаления: $SCRIPT_NAME remove-prefix $prefix_name"
|
||||
fi
|
||||
|
||||
temp_extract_dir="$WH_TMP_DIR/restore_$(basename "$backup_archive_path" .whpack)"
|
||||
create_new_dir "$temp_extract_dir"
|
||||
|
||||
print_info "Распаковка архива..."
|
||||
if unsquashfs -f -d "$temp_extract_dir" "$backup_archive_path" ; then
|
||||
print_ok "Архив успешно распакован."
|
||||
else
|
||||
try_remove_dir "$temp_extract_dir"
|
||||
fatal "Не удалось распаковать архив."
|
||||
fi
|
||||
|
||||
if [[ -d "$temp_extract_dir/prefixes" ]] ; then
|
||||
local prefix_name
|
||||
prefix_name="$(ls -1 "$temp_extract_dir/prefixes")"
|
||||
local prefix_dir="$temp_extract_dir/prefixes/$prefix_name"
|
||||
|
||||
print_info "Восстановление префикса: $prefix_name"
|
||||
|
||||
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 "Полное восстановление префикса $prefix_name завершено."
|
||||
return 0
|
||||
}
|
||||
|
||||
wh_info () {
|
||||
echo "Использование: $SCRIPT_NAME [команда]
|
||||
|
||||
Команды:
|
||||
install list список возможных установочных скриптов
|
||||
install [скрипт] запустить скрипт установки программы
|
||||
install [скрипт] --clear-pfx не использовать подготовленный префикс для установки ПО
|
||||
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
|
||||
|
||||
installed список установленных программ
|
||||
run [программа.exe] запуск программы (отладка)
|
||||
backup-prefix [имя_префикса] создать резервную копию префикса
|
||||
restore-prefix восстановить резервную копию префикса
|
||||
remove-all удалить WineHelper и все связанные данные
|
||||
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
||||
backup-prefix [имя_префикса] создать резерную копию префикса
|
||||
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
|
||||
|
||||
Параметры:
|
||||
--help показать эту справку и выйти
|
||||
@ -1511,7 +1514,14 @@ if [[ -d "$HOME/.local/share/$SCRIPT_NAME" ]] \
|
||||
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
|
||||
fi
|
||||
|
||||
case "${1,,}" in
|
||||
if [[ -n "$1" ]] ; then
|
||||
arg1="$1"
|
||||
shift
|
||||
else
|
||||
arg1="--help"
|
||||
fi
|
||||
|
||||
case "$arg1" in
|
||||
--version) rpm -qi "$SCRIPT_NAME" ; exit 0 ;;
|
||||
--help) wh_info ; exit 0 ;;
|
||||
killall) kill_wine ;;
|
||||
@ -1519,20 +1529,19 @@ case "${1,,}" in
|
||||
winereg|regedit) prepair_wine ; wine_run "regedit" ;;
|
||||
winefile|explorer) prepair_wine ; wine_run "winefile" ;;
|
||||
wineconsole|cmd) prepair_wine ; wine_run "wineconsole" ;;
|
||||
winetricks) shift ; prepair_wine ; "$WINETRICKS" -q "$@" ;;
|
||||
desktop) shift ; create_desktop "$@" ; exit 0 ;;
|
||||
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 "$@" ;;
|
||||
winetricks) prepair_wine ; "$WINETRICKS" -q "$@" ;;
|
||||
desktop) create_desktop "$@" ; exit 0 ;;
|
||||
install|-i) run_autoinstall "$@" ;;
|
||||
installed) check_installed_programs "$1" ;;
|
||||
run|-r) run_installed_programs "$1" ;;
|
||||
backup-prefix) backup_prefix "$@" ;;
|
||||
restore-prefix) restore_prefix "$@" ;;
|
||||
remove-all) remove_winehelper "$@" ;;
|
||||
remove-prefix) remove_prefix "$@" ;;
|
||||
*)
|
||||
if [[ -f "$1" ]] ; then
|
||||
WIN_FILE_EXEC="$(readlink -f "$1")"
|
||||
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
||||
shift
|
||||
if [[ -f "$arg1" ]] ; then
|
||||
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
||||
WIN_FILE_NAME="$(basename "$arg1")"
|
||||
case "${WIN_FILE_NAME,,}" in
|
||||
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;
|
||||
*.msi) prepair_wine ; wine_run msiexec /i "$WIN_FILE_EXEC" "$@" ;;
|
||||
@ -1540,6 +1549,7 @@ case "${1,,}" in
|
||||
*) fatal "Тип файла не поддерживается." ;;
|
||||
esac
|
||||
else
|
||||
print_error "Команды $arg1 не существует."
|
||||
wh_info
|
||||
exit 1
|
||||
fi
|
||||
|
Reference in New Issue
Block a user