Compare commits
2 Commits
0.4.0
...
backup_and
Author | SHA1 | Date | |
---|---|---|---|
c5538b4c14 | |||
0ee9b42d1f |
243
winehelper
243
winehelper
@ -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 #####
|
||||
@ -384,14 +400,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 +700,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"
|
||||
}
|
||||
|
||||
@ -1139,13 +1139,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
|
||||
}
|
||||
|
||||
@ -1316,6 +1318,165 @@ remove_winehelper () {
|
||||
fi
|
||||
}
|
||||
|
||||
backup_prefix() {
|
||||
local prefix_name="$1"
|
||||
local prefix_path="$WH_PREFIXES_DIR/$prefix_name"
|
||||
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)"
|
||||
|
||||
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 "$temp_backup_dir"
|
||||
create_new_dir "$temp_backup_dir/prefixes/"
|
||||
create_new_dir "$temp_backup_dir/dist/"
|
||||
|
||||
print_info "Подготовка префикса к упаковке..."
|
||||
if cp -a "$prefix_path" "$temp_backup_dir/prefixes/$prefix_name"; then
|
||||
print_ok "Директория префикса подготовлена."
|
||||
else
|
||||
print_error "Не удалось подготовить директорию префикса."
|
||||
try_remove_dir "$temp_backup_dir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ -f "$prefix_path/last.conf" ]]; then
|
||||
local wine_version_to_backup
|
||||
wine_version_to_backup=$( (source "$prefix_path/last.conf" && echo "$WH_WINE_USE") )
|
||||
|
||||
if [[ -n "$wine_version_to_backup" && "$wine_version_to_backup" != system* && -d "$WH_DIST_DIR/$wine_version_to_backup" ]]; then
|
||||
print_info "Копирование используемой версии Wine: $wine_version_to_backup..."
|
||||
|
||||
if ! cp -a "$WH_DIST_DIR/$wine_version_to_backup" "$temp_backup_dir/dist/"; then
|
||||
print_error "Ошибка: не удалось скопировать версию Wine."
|
||||
exit 1
|
||||
fi
|
||||
print_ok "Версия Wine скопирована."
|
||||
fi
|
||||
fi
|
||||
|
||||
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 temp_extract_dir
|
||||
|
||||
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)"
|
||||
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
|
||||
print_ok "Архив успешно распакован."
|
||||
|
||||
if [[ -d "$temp_extract_dir/dist" ]]; then
|
||||
print_info "Восстановление версий Wine..."
|
||||
|
||||
# TODO: Нужно ли создавать директортю create_new_dir "$WH_DIST_DIR" и перезаписывать/удалять сушествующие файлы в /dist
|
||||
|
||||
if ! mv -n "$temp_extract_dir/dist"/* "$WH_DIST_DIR/"; then
|
||||
print_warning "Не удалось восстановить версии Wine."
|
||||
else
|
||||
print_ok "Версии Wine восстановлены."
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -d "$temp_extract_dir/prefixes" ]]; then
|
||||
for prefix_dir in "$temp_extract_dir"/prefixes/*; do
|
||||
local prefix_name=$(basename "$prefix_dir")
|
||||
if [[ -d "$prefix_dir" ]]; then
|
||||
print_info "Восстановление префикса: $prefix_name"
|
||||
|
||||
# TODO: Нужно ли удалять, перезаписывать или создавать новый префикс try_remove_dir "$WH_PREFIXES_DIR/$prefix_name"
|
||||
|
||||
if ! mv "$prefix_dir" "$WH_PREFIXES_DIR/"; then
|
||||
print_error "Не удалось восстановить префикс $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" "${icon_name%.*}"
|
||||
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
|
||||
fi
|
||||
done
|
||||
else
|
||||
print_error "Директория prefixes не найдена в архиве."
|
||||
try_remove_dir "$temp_extract_dir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
try_remove_dir "$temp_extract_dir"
|
||||
print_ok "Полное восстановление завершено."
|
||||
return 0
|
||||
}
|
||||
|
||||
wh_info () {
|
||||
echo "Использование: $SCRIPT_NAME [команда]
|
||||
|
||||
@ -1328,6 +1489,8 @@ wh_info () {
|
||||
run [программа.exe] запуск программы (отладка)
|
||||
remove-all удалить WineHelper и все связанные данные
|
||||
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
||||
backup-prefix [имя_префикса] создать резерную копию префикса
|
||||
restore-prefix [имя_префикса] восстановить префикс из резервной копии
|
||||
|
||||
Параметры:
|
||||
--help показать эту справку и выйти
|
||||
@ -1361,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