Compare commits

..

24 Commits

Author SHA1 Message Date
ea621f0402 updated creation and restoration of a prefix backup 2025-07-31 09:24:41 +06:00
d65e4dc74d fixed variables for winehelper_gui.py 2025-07-30 12:15:57 +03:00
45062a252d added support winehelper_gui.py 2025-07-29 13:07:39 +03:00
978ef09597 added WH icons 2025-07-29 10:49:04 +03:00
5006817fed fixed and updated AIS LPU Client 2025-07-28 12:38:45 +03:00
c781374979 Merge branch 'minergenon-ais' 2025-07-28 10:52:39 +03:00
2ff5056c8a Merge branch 'minergenon-extract_icon' 2025-07-28 10:50:54 +03:00
6c0afe5dc7 Merge branch 'minergenon-changelog_auto_completion' 2025-07-28 10:50:36 +03:00
5fac6c25c2 Merge branch 'minergenon-swnd' 2025-07-28 10:49:43 +03:00
a1097b9ecc added manualinstall: ais 2025-07-26 15:42:12 +06:00
394ad6e891 added extract_icon function 2025-07-18 13:04:17 +06:00
b122128b0b added changelog auto_completion 2025-07-18 09:29:36 +06:00
674a499c5e wine_run: added check arch for *.exe files 2025-07-17 15:50:31 +03:00
a3de3240b6 print_confirmation: added return 0 2025-07-17 15:35:02 +03:00
f985c8d92e added args: --changelog to help 2025-07-17 15:02:33 +03:00
cd934bab1c added args: changelog 2025-07-17 14:59:35 +03:00
f67c9ca3ec updated changelog to 0.5.0 2025-07-14 18:01:07 +03:00
9304a5e19f dependencies.sh: dropped libOSMesa 2025-07-14 17:42:04 +03:00
a0be9e7ce1 try_download: always display a license agreement 2025-07-14 17:17:54 +03:00
93b8b41fcc replaced read answer to print_confirmation 2025-07-14 14:04:05 +03:00
d3df605806 strict consent to the continuation of the installation of components 2025-07-14 13:46:26 +03:00
a6ee4a80ee testinstall: added swnd and swnd_x 2025-07-14 10:48:32 +06:00
3ea3fb5e53 Merge branch 'minergenon-fix_ui_remove_winehelper' 2025-07-11 11:21:07 +03:00
80a425f421 fix(ui): display y/N prompt on same line as question in remove-winehelper function 2025-07-11 10:24:44 +06:00
13 changed files with 463 additions and 85 deletions

View File

@ -1,5 +1,13 @@
История изменений:
0.5.0:
* добавлен явный вывод отказа от ответственности и соглашения с ним
* обновлены все скрипты для установки t-flex-*
* добавлен wine_wh_tflex_10-9 с патчами для t-flex-*
* добавлена поддержка новых версий wine 10.3 и выше
* удален пакет libOSMesa из проверки на зависимости
* другие небольшие улучшения и оптимизации скриптов
0.4.9:
* добавлено автодопонение команд для zsh (zsh_completion)

View File

@ -4,7 +4,7 @@ _winehelper_completions() {
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --version --debug install installed -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix"
opts="--help --version --debug install installed -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix --changelog changelog"
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run"
case "${prev}" in

View File

@ -22,7 +22,7 @@ windows приложения. Подробнее по ссылке: https://www.
# fonts-ttf-ms
apt-get install {i586-,}{glibc-core,libstdc++6,glibc-pthread,glibc-nss,\
libOSMesa,libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\
libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\
libgnutls30,libGL,libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,\
libvulkan1,libcups} || fatal "Не удалось установить зависимости."

BIN
image/ais_lpu_client.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 109 KiB

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16px"
viewBox="0 0 16 16"
width="16px"
version="1.1"
id="svg4"
sodipodi:docname="5-symbolic.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs4" />
<sodipodi:namedview
id="namedview4"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.448931"
inkscape:cx="6.9702848"
inkscape:cy="8.8949156"
inkscape:window-width="1920"
inkscape:window-height="1128"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g3" />
<g
fill-rule="evenodd"
id="g3">
<path
d="m 0.800781 0 c -0.429687 0 -0.800781 0.371094 -0.800781 0.800781 v 5.078125 c 0 0.429688 0.371094 0.800782 0.800781 0.800782 h 1.996094 v -1.121094 h -1.675781 v -4.4375 h 4.4375 v 1.675781 h 1.121094 v -1.996094 c 0 -0.429687 -0.371094 -0.800781 -0.800782 -0.800781 z m 9.328125 0 c -0.425781 0 -0.800781 0.371094 -0.800781 0.800781 v 1.996094 h 1.121094 v -1.675781 h 4.441406 v 4.4375 h -1.675781 v 1.121094 h 1.992187 c 0.429688 0 0.804688 -0.375 0.804688 -0.800782 v -5.078125 c 0 -0.429687 -0.375 -0.800781 -0.804688 -0.800781 z m -9.328125 9.328125 c -0.429687 0 -0.800781 0.371094 -0.800781 0.800781 v 5.082032 c 0 0.425781 0.371094 0.800781 0.800781 0.800781 h 5.078125 c 0.429688 0 0.800782 -0.375 0.800782 -0.800781 v -1.996094 h -1.121094 v 1.675781 h -4.4375 v -4.441406 h 1.675781 v -1.121094 z m 12.414063 0 v 1.121094 h 1.675781 v 4.441406 h -4.441406 v -1.675781 h -1.121094 v 1.996094 c 0 0.425781 0.375 0.800781 0.800781 0.800781 h 5.078125 c 0.429688 0 0.804688 -0.375 0.804688 -0.800781 v -5.082032 c 0 -0.429687 -0.375 -0.800781 -0.804688 -0.800781 z m 0 0"
id="path1" />
<path
id="path2"
d="M 7.9277344 4.515625 C 7.8097448 4.5185061 7.6899414 4.527832 7.5703125 4.5429688 C 5.6601565 4.7812497 4.3007808 6.527344 4.5429688 8.4375 C 4.7812497 10.351562 6.527344 11.710938 8.4375 11.46875 C 10.351562 11.230469 11.710938 9.4843755 11.46875 7.5703125 C 11.245362 5.7795413 9.6975779 4.4724088 7.9277344 4.515625 z M 8.0039062 6.3535156 C 8.9197403 6.3535156 9.6542969 7.0918241 9.6542969 8.0039062 C 9.6542969 8.9205649 8.920565 9.6542969 8.0039062 9.6542969 C 7.0918241 9.6542969 6.3535156 8.9197403 6.3535156 8.0039062 C 6.3535156 7.0926517 7.0926517 6.3535156 8.0039062 6.3535156 z " />
<path
d="m 6.765625 3.570312 l 1.265625 -0.164062 l 0.410156 1.664062 l -1.601562 0.246094 z m -2.773437 2.175782 l 0.78125 -1.011719 l 1.464843 0.890625 l -0.957031 1.304688 z m -0.421876 3.496094 l -0.164062 -1.261719 l 1.664062 -0.410157 l 0.246094 1.601563 z m 2.175782 2.773437 l -1.011719 -0.777344 l 0.890625 -1.464843 l 1.304688 0.957031 z m 3.496094 0.425781 l -1.261719 0.164063 l -0.410157 -1.664063 l 1.601563 -0.246094 z m 2.773437 -2.175781 l -0.777344 1.011719 l -1.464843 -0.890625 l 0.957031 -1.304688 z m 0.425781 -3.5 l 0.164063 1.265625 l -1.664063 0.410156 l -0.246094 -1.601562 z m -2.175781 -2.773437 l 1.011719 0.78125 l -0.890625 1.464843 l -1.304688 -0.957031 z m 0 0"
id="path3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

47
image/gui/winehelper.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 55 KiB

BIN
image/swnd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
# info_ru: автоматизация установки МИС Витакарта (AIS LPU Client)
########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_i586"
export WINEPREFIX="ais-lpu-client"
export PROG_NAME="AIS LPU Client"
export PROG_ICON="ais_lpu_client"
export BASE_PFX="ais-lpu-client_pfx_x86_v01"
export WH_WINDOWS_VER="7"
export WINEARCH="win32"
export INSTALL_DLL="dotnet40 dotnet20sp2 7zip vcrun2005 vcrun2008 mfc42"
export WH_USE_EXTRA_FONTS="1"
if [[ -f "$2" ]] ; then
prepair_wine
wine_run_install "$2" # /q
WIN_FILE_EXEC="$DRIVE_C/Program Files/Vitacore/AIS LPU Client/Update/AKUZ.UpdateUtility.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
else
fatal "Не найден файл установки для $PROG_NAME. Перезапустите по примеру:
winehelper install $1 \"/путь/до/установочногоайла\""
fi

View File

@ -87,3 +87,7 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
# + addons with ODBC, SSH, *.reg
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client_pfx_x86_v01.tar.xz
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip

21
testinstall/swnd Normal file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# info_ru: Программный комплекс СуперОкна для фабрик по изготовлению окон и дверей.
########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="swnd"
export PROG_NAME="СуперОкна 8"
export PROG_ICON="swnd"
export WH_WINDOWS_VER="10"
export WINEARCH="win32"
# export INSTALL_DLL=""
AUTOINSTALL_EXE="${WH_TMP_DIR}/Swnd8_setup.exe"
prepair_wine
if try_download "https://kctsoft.ru/download/superokna8/Swnd8_setup.exe" "${AUTOINSTALL_EXE}" ; then
wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
try_remove_file "$AUTOINSTALL_EXE"
WIN_FILE_EXEC="$DRIVE_C/Program Files/Kct/Swnd8/Swnd8.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
fi

21
testinstall/swnd_x Normal file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# info_ru: Бесплатная версия программы СуперОкна для небольших предприятий.
########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="swnd"
export PROG_NAME="СуперОкна 8 бесплатная"
export PROG_ICON="swnd"
export WH_WINDOWS_VER="10"
export WINEARCH="win32"
# export INSTALL_DLL=""
AUTOINSTALL_EXE="${WH_TMP_DIR}/Swnd8x_setup.exe"
prepair_wine
if try_download "https://kctsoft.ru/download/superokna8/Swnd8x_setup.exe" "${AUTOINSTALL_EXE}" ; then
wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
try_remove_file "$AUTOINSTALL_EXE"
WIN_FILE_EXEC="$DRIVE_C/Program Files/Kct/Swnd8x/Swnd8x.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
fi

View File

@ -7,17 +7,25 @@ if [[ $(id -u) -eq 0 ]] ; then
fi
##### DEFAULT PATH #####
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE
SCRIPT_NAME="$(basename "$0")"
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
# переменные для установленного WineHelper в систему
USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME"
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
DATA_PATH="/usr/share/$SCRIPT_NAME"
CHANGELOG_FILE="$(realpath "/usr/share/doc/winehelper"-*/CHANGELOG)"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg"
LICENSE_FILE="$(realpath "/usr/share/doc/winehelper"-*/LICENSE)"
else
# переменные для тестового запуска WineHelper из репозитория
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
RUN_SCRIPT="$(realpath "$0")"
DATA_PATH="$(dirname "$RUN_SCRIPT")"
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
LICENSE_FILE="$DATA_PATH/LICENSE"
# минимальная проверка синтаксиса скриптов
for self_check_script in "$RUN_SCRIPT" \
@ -28,18 +36,43 @@ else
done
fi
if [[ $1 == "gui" ]] ; then
export WH_USE_GUI="1"
/usr/bin/env python3 "$DATA_PATH/winehelper_gui.py" &
exit 0
fi
##### MESSAGES FUNCTIONS #####
print_error () { printf "\E[31m%s Ошибка: $@ %s\e[0m\n" ;}
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" ;}
if [[ $WH_USE_GUI != "1" ]] ; then
print_error () { printf "\E[31m%s Ошибка: $@ %s\e[0m\n" ;}
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" ;}
else
print_error () { echo -e "Ошибка: $@" ;}
print_warning () { echo -e "Предупреждение: $@" ;}
print_info () { echo -e "Информация: \"$@\"" ;}
print_ok () { echo -e "Успех: $@" ;}
fi
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
fatal () {
print_error "$@"
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
exit 1
}
print_confirmation () {
local answer
read -p "$@ (y/N): " answer
if [[ ! "$answer" =~ ^[Yy]$ ]] ; then
print_info "Отменено пользователем."
return 1
fi
return 0
}
##### CHECK VARIABLES #####
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
@ -135,6 +168,11 @@ check_variables VKD3D_VER "1.1-2602"
export CLOUD_URL="https://cloud.linux-gaming.ru/portproton"
if env | grep license_agreement_file
then fatal "Обнаружена подмена переменной license_agreement_file!"
else readonly license_agreement_file="$(mktemp -d)/$((RANDOM % RANDOM))"
fi
##### CHECK NOEXEC FOR /HOME #####
if mount -l | grep -E "[[:space:]]/home[[:space:]]" | grep -q "noexec" ; then
fatal "/home примонтирован в /etc/fstab с аргументом noexec.\nЗапуск портативной версии wine не возможен из домашнего каталога."
@ -154,7 +192,7 @@ su_run () {
##### CHECK DEPENDENCIES #####
# fonts-ttf-ms
if ! rpm -q {i586-,}{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,libOSMesa,\
if ! rpm -q {i586-,}{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,\
libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,libgnutls30,libGL,\
libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} 1>/dev/null
then
@ -315,11 +353,50 @@ check_file_sum () {
return 0
else
try_remove_file "$check_file_path"
fatal "Хэш-сумма файла $check_file_name не совпадает!"
fatal "Хэш-сумма файла $check_file_name не совпадает!\n Попробуйте перезапустить установку."
fi
}
print_license_agreement () {
if [[ -f "$license_agreement_file" ]] \
&& [[ "$(stat -c %a "$license_agreement_file" 2>/dev/null)" == "600" ]]
then return 0
fi
echo
print_warning "Лицензионные соглашения использования сторонних компонентов:
Некоторые компоненты, установленные в префикс и необходимые для запуска приложений, могут
быть защищены авторским правом или лицензионными соглашениями. Вы обязаны самостоятельно
убедиться в законности использования этих компонентов в вашей юрисдикции.
Мы не несём ответственности за нарушение лицензионных соглашений, связанное с использованием
подготовленного префикса, а так же за программное обеспечение поставляемого из сторонних источников.
Подтверждая продолжение установки, вы соглашаетесь что ознакомились с данным отказом от
ответственности и принимаете все риски, связанные с использованием программного обеспечения.
"
if print_confirmation "Подтвердите продолжение установки" ; then
touch "$license_agreement_file"
chmod 600 "$license_agreement_file"
cleanup_laf () {
local cleanup_laf_dir="$(dirname "$license_agreement_file")"
rm -r "$cleanup_laf_dir" || echo "Не удалось удалить каталог $cleanup_laf_dir"
}
trap "cleanup_laf" EXIT
return 0
else
exit 1
fi
}
try_download () {
if [[ $WH_USE_GUI == "1" ]] \
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
then print_ok "Соглашения приняты из графического интерфейса."
else print_license_agreement
fi
local download_file_url output_file output_file_name
download_file_url="${1// /%20}"
output_file="$2"
@ -432,6 +509,41 @@ var_ld_library_path_update () {
return 0
}
extract_icon() {
check_prefix_var
local exe_file="$1"
local ico_name="$(basename "$exe_file" .exe).ico"
local png_name="$(basename "$exe_file" .exe).png"
local tmp_ico_dir="$WH_TMP_DIR/icons"
local user_icons="$WINEPREFIX/icons"
create_new_dir "$tmp_ico_dir"
if ! wrestool -x -t 14 "$exe_file" -o "$tmp_ico_dir/$ico_name" ; then
print_warning "Не удалось извлечь иконку из $exe_file"
try_remove_file "$tmp_ico_dir"
return 1
fi
if ! icotool -x -i 1 "$tmp_ico_dir/$ico_name" -o "$tmp_ico_dir/$png_name" ; then
print_warning "Не удалось извлечь иконку из $ico_name"
try_remove_file "$tmp_ico_dir"
return 1
fi
create_new_dir "$user_icons"
if ! try_copy_file "$tmp_ico_dir/$png_name" "$user_icons" ; then
print_warning "Не удалось копировать иконку в префикс"
try_remove_file "$user_icons"
return 1
fi
try_remove_dir "$tmp_ico_dir"
print_ok "Иконка сохранена: $user_icons/$png_name"
return 0
}
create_desktop () {
local name_desktop exe_file desktop_filename icon_file desktop_path
name_desktop="$1"
@ -568,6 +680,7 @@ remove_desktop () {
# Обновляем кэш desktop файлов
update-desktop-database "$HOME/.local/share/applications"
}
check_installed_programs () {
@ -1193,25 +1306,6 @@ init_database () {
}
prepair_wine () {
if [[ -n "$INSTALL_SCRIPT_NAME" ]] \
&& [[ "$FORCE_INSTALL" != "1" ]]
then
print_warning "Лицензионные соглашения использования сторонних компонентов:
Некоторые компоненты, установленные в префикс и необходимые для запуска приложений, могут
быть защищены авторским правом или лицензионными соглашениями. Вы обязаны самостоятельно
убедиться в законности использования этих компонентов в вашей юрисдикции.
Мы не несём ответственности за нарушение лицензионных соглашений, связанное с использованием
подготовленного префикса.
Продолжая использовать данное ПО вы подтверждаете, что ознакомились с данным отказом от
ответственности и принимаете все риски, связанные с его использованием.
"
print_info "Для продолжения нажмите любую клавишу на клавиатуре."
read -s -n 1
fi
var_winedlloverride_update "winemenubuilder.exe=d"
if [[ -n "$INSTALL_SCRIPT_NAME" ]]
@ -1232,6 +1326,11 @@ prepair_wine () {
}
wine_run () {
if [[ $WINEARCH == "win32" ]] \
&& file "$WIN_FILE_EXEC" | grep -q "x86-64"
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
fi
WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")"
[[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH"
@ -1344,11 +1443,8 @@ remove_prefix() {
echo " - Удалению всех программ, установленных в этом префиксе"
echo " - Удалению связанных ярлыков из меню и рабочего стола"
echo "======================================================"
read -p "Продолжить удаление? (y/N): " answer
if [[ ! "$answer" =~ ^[YyДд]$ ]]; then
print_info "Удаление префикса отменено."
return 0
if ! print_confirmation "Продолжить удаление?"
then exit 1
fi
fi
@ -1381,48 +1477,40 @@ remove_winehelper () {
echo " - Все приложения/программы, установленные через WineHelper"
echo " - Все ярлыки из меню и с рабочего стола созданные с помощью WineHelper"
echo "======================================================"
echo "Продолжить? (y/N)"
read -r answer
if [[ "$answer" =~ ^[YyДд]$ ]] ; then
# Второе подтверждение
if print_confirmation "Продолжить?" ; then
echo "----------------------------------------------"
print_warning " ВЫ ТОЧНО УВЕРЕНЫ?"
echo "----------------------------------------------"
echo "Продолжить? (y/N)"
read -r answer
if ! print_confirmation "Продолжить?"
then exit 1
fi
else
print_info "Удаление отменено."
return 1
exit 1
fi
fi
if [[ "$answer" =~ ^[YyДд]$ ]] ; then
# Удаление рабочих каталогов
try_remove_dir "$USER_WORK_PATH"
# Удаление рабочих каталогов
try_remove_dir "$USER_WORK_PATH"
# Удаление файлов меню
try_remove_dir "$WH_MENU_DIR"
try_remove_file "$WH_MENU_CATEGORY"
try_remove_file "$WH_MENU_CONFIG"
# Удаление файлов меню
try_remove_dir "$WH_MENU_DIR"
try_remove_file "$WH_MENU_CATEGORY"
try_remove_file "$WH_MENU_CONFIG"
# Удаление desktop-файлов
for desktop_file in "$(xdg-user-dir DESKTOP)"/*.desktop; do
if grep -q "Exec=env \"$RUN_SCRIPT\"" "$desktop_file"; then
try_remove_file "$desktop_file"
fi
done
# Удаление desktop-файлов
for desktop_file in "$(xdg-user-dir DESKTOP)"/*.desktop; do
if grep -q "Exec=env \"$RUN_SCRIPT\"" "$desktop_file"; then
try_remove_file "$desktop_file"
fi
done
# Обновление кэша desktop-файлов
update-desktop-database "$HOME/.local/share/applications"
# Обновление кэша desktop-файлов
update-desktop-database "$HOME/.local/share/applications"
# Удаление символических ссылок
try_remove_file "$HOME/.winehelper"
# Удаление символических ссылок
try_remove_file "$HOME/.winehelper"
print_info "WineHelper и все связанные данные успешно удалены."
else
print_info "Удаление отменено."
fi
print_info "WineHelper и все связанные данные успешно удалены."
}
create_base_pfx () {
@ -1480,12 +1568,13 @@ 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"
local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir
backup_base_dir="$(xdg-user-dir DESKTOP)"
backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack"
backup_dest_path="$backup_base_dir/$backup_archive_name"
temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)"
temp_prefix_dir="$temp_backup_dir/prefixes/$PREFIX_NAME"
temp_users_dir="$temp_prefix_dir/drive_c/users"
print_info "Начало резервного копирования префикса: $PREFIX_NAME"
create_new_dir "$temp_backup_dir"
@ -1529,9 +1618,11 @@ backup_prefix() {
fi
fi
# Сохраняем метаданные внутри временной директории
echo "$PREFIX_NAME" > "$temp_backup_dir/prefix_name.whmeta"
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."
@ -1548,6 +1639,7 @@ 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")
@ -1562,15 +1654,7 @@ restore_prefix() {
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)"
temp_extract_dir="$WH_TMP_DIR/restore_$(basename "$backup_archive_path" .whpack)_$$"
create_new_dir "$temp_extract_dir"
print_info "Распаковка архива..."
@ -1581,9 +1665,32 @@ restore_prefix() {
fatal "Не удалось распаковать архив."
fi
if [[ -d "$temp_extract_dir/prefixes" ]] ; then
local prefix_name
prefix_name="$(ls -1 "$temp_extract_dir/prefixes")"
# Определяем имя префикса
if [[ -f "$temp_extract_dir/prefix_name.whmeta" ]]; then
prefix_name="$(cat "$temp_extract_dir/prefix_name.whmeta")"
try_remove_file "$temp_extract_dir/prefix_name.whmeta"
elif grep -q "PREFIX_NAME=" "$backup_archive_path" ; then
# Обратная совместимость со старыми бэкапами (с приписанной строкой)
prefix_name="$(tail -n1 "$backup_archive_path" | sed -e 's/.*PREFIX_NAME=//')"
elif [[ -d "$temp_extract_dir/prefixes" ]] && [[ $(find "$temp_extract_dir/prefixes" -mindepth 1 -maxdepth 1 -type d | wc -l) -eq 1 ]]; then
# Обратная совместимость со старыми бэкапами (по имени каталога)
prefix_name="$(basename "$(find "$temp_extract_dir/prefixes" -mindepth 1 -maxdepth 1 -type d)")"
else
try_remove_dir "$temp_extract_dir"
fatal "Не удалось определить имя префикса в архиве (метаданные не найдены)."
fi
if [[ -z "$prefix_name" ]]; then
try_remove_dir "$temp_extract_dir"
fatal "Не удалось определить имя префикса в архиве."
fi
if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then
try_remove_dir "$temp_extract_dir"
fatal "Префикс $prefix_name уже существует!\n Удалите его, если действительно желаете восстановить префикс заново.\n Команда для удаления: $SCRIPT_NAME remove-prefix $prefix_name"
fi
if [[ -d "$temp_extract_dir/prefixes/$prefix_name" ]] ; then
local prefix_dir="$temp_extract_dir/prefixes/$prefix_name"
print_info "Восстановление префикса: $prefix_name"
@ -1622,7 +1729,7 @@ restore_prefix() {
fi
else
try_remove_dir "$temp_extract_dir"
fatal "Директория prefixes не найдена в архиве."
fatal "Директория префикса '$prefix_name' не найдена в архиве."
fi
try_remove_dir "$temp_extract_dir"
@ -1642,12 +1749,13 @@ wh_info () {
run [программа] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резерную копию префикса
backup-prefix [имя_префикса] создать резервную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
Параметры:
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--changelog показать историю изменений
--debug [команда] включить режим логирования работы WINE
"
@ -1672,8 +1780,9 @@ else
fi
case "$arg1" in
--version) rpm -qi "$SCRIPT_NAME" ; exit 0 ;;
--help) wh_info ; exit 0 ;;
--version|version) rpm -qi "$SCRIPT_NAME" ; exit 0 ;;
--help|help) wh_info ; exit 0 ;;
--changelog|changelog) less "$CHANGELOG_FILE" ; exit 0 ;;
killall) kill_wine ;;
winecfg) prepair_wine ; wine_run "winecfg" ;;
winereg|regedit) prepair_wine ; wine_run "regedit" ;;