Compare commits

...

13 Commits
0.4.0 ... 0.4.3

3 changed files with 280 additions and 92 deletions

View File

@ -1,5 +1,18 @@
История изменений:
0.4.3:
* исправлено обновление префикса при первом запуске
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

View File

@ -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

View File

@ -23,14 +23,30 @@ 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 #####
@ -115,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
@ -345,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\""
@ -369,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"
@ -384,14 +407,19 @@ create_desktop () {
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/"
# добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
if [[ -f "$WINEPREFIX/desktop.list" ]] \
&& grep -qe "^${name_desktop}=" "$WINEPREFIX/desktop.list"
then sed -i "/^$name_desktop=/d" "$WINEPREFIX/desktop.list"
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
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 "$WINEPREFIX/icons"
try_copy_file "$icon_file" "$WINEPREFIX/icons/"
echo "$name_desktop=${exe_file//$WINEPREFIX/}=$(basename "$icon_file")" >> "$WINEPREFIX/desktop.list"
# создаем файл категории для меню
create_new_dir "$HOME/.local/share/desktop-directories"
@ -679,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"
}
@ -842,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")"
@ -850,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
}
@ -917,6 +923,12 @@ init_wineprefix () {
then try_force_link_dir "$DRIVE_C/users/$USER" "$DRIVE_C/users/xuser"
fi
if [[ ! -f "$WINEPREFIX/.update-timestamp" ]] ; then
print_info "Обновление префикса $WINEPREFIX."
"$WINELOADER" wineboot -u
wait_wineserver
fi
if [[ ! -L "$WINEPREFIX/dosdevices/h:" ]]
then try_force_link_dir "$HOME" "$WINEPREFIX/dosdevices/h:"
fi
@ -1139,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
}
@ -1210,25 +1224,18 @@ run_autoinstall () {
}
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 " - Удалению всех программ, установленных в этом префиксе"
@ -1241,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
@ -1255,7 +1261,7 @@ remove_prefix() {
return 0
else
print_error "Не удалось удалить префикс "$prefix_name"."
print_error "Не удалось удалить префикс "$PREFIX_NAME"."
return 1
fi
}
@ -1316,23 +1322,183 @@ 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 list список возможных установочных скриптов
install [скрипт] запустить скрипт установки программы
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
installed список установленных программ
run [программа.exe] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
installed список установленных программ
run [программа.exe] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резерную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
Параметры:
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--debug [команда] включить режим логирования работы WINE
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--debug [команда] включить режим логирования работы WINE
"
}
@ -1348,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 ;;
@ -1356,18 +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" ;;
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" "$@" ;;
@ -1375,8 +1549,9 @@ case "${1,,}" in
*) fatal "Тип файла не поддерживается." ;;
esac
else
print_error "Команды $arg1 не существует."
wh_info
exit 1
fi
;;
;;
esac