Spaces:
Configuration error
Configuration error
Download index.html from lux-wine/git: direct link, hf CLI and curl.
- Browser
- Download file 36.7 kB
-
https://huggingface.co/spaces/lux-wine/git/resolve/223986508370cb90ef7d14d94de157d0a21fc8e3/index.html
- Command line
-
hf download hf://spaces/lux-wine/git@223986508370cb90ef7d14d94de157d0a21fc8e3/index.html
-
curl -L -o index.html https://huggingface.co/spaces/lux-wine/git/resolve/223986508370cb90ef7d14d94de157d0a21fc8e3/index.html
36.7 kB
| #!/usr/bin/env bash | |
| # Lux Wine wrapper for RunImage container | |
| CHK_UPDATE='3' | |
| shopt -s extglob | |
| RED='\033[1;91m' | |
| BLUE='\033[1;94m' | |
| GREEN='\033[1;92m' | |
| YELLOW='\033[1;33m' | |
| RESETCOLOR='\033[1;00m' | |
| GIT_REPO='https://github.com/VHSgunzo' | |
| GIT_HF_REPO='https://huggingface.co/spaces/lux-wine' | |
| LW_DIR="$HOME/.local/share/LuxWine" | |
| OLD_LW_DIR="$HOME/.local/share/LutrisWine" | |
| MENU_APPS_DIR="$HOME/.local/share/applications" | |
| LW_APPS_DIR="$MENU_APPS_DIR/LuxWineApps" | |
| OLD_LW_APPS_DIR="$MENU_APPS_DIR/LutrisWineApp" | |
| LW_CFG="$LW_DIR/luwine.wcfg" | |
| TMP_LW_CFG="$LW_DIR/tmp/luwine.wcfg" | |
| LWBIN_DIR="$LW_DIR/bin" | |
| OLD_LWBIN_DIR="$OLD_LW_DIR/bin" | |
| LWSRC="$LWBIN_DIR/lux-wine" | |
| OLD_LWSRC="$OLD_LWBIN_DIR/lutris-wine" | |
| GIT_RAW='https://raw.githubusercontent.com/VHSgunzo/lux-wine/main' | |
| GIT_LWSRC="$GIT_RAW/lux-wine" | |
| GIT_HF_LWSRC="$GIT_HF_REPO/git/resolve/main/lux-wine" | |
| GIT_LWZIP="$GIT_REPO/lux-wine/archive/refs/heads/main.zip" | |
| GIT_HF_LWZIP="$GIT_HF_REPO/git/resolve/main/main.zip" | |
| GIT_LWRAP="$GIT_RAW/lwrap/lwrap" | |
| GIT_HF_LWRAP="$GIT_HF_REPO/git/resolve/main/lwrap/lwrap" | |
| GIT_LWRUN="$GIT_REPO/lwrun/releases" | |
| GIT_HF_LWRUN="${GIT_HF_REPO//\/spaces/}/lwrun/resolve/main/releases" | |
| HOME_ICONS="$HOME/.local/share/icons" | |
| HOME_DESK_DIRS="$HOME/.local/share/desktop-directories" | |
| HSTEAM_DESKF="$MENU_APPS_DIR/steam-lw.desktop" | |
| RSTEAM_DESKF="$RUNROOTFS/usr/share/applications/steam.desktop" | |
| F_RC="$HOME/.config/fish/config.fish" | |
| B_RC="$HOME/.bashrc" | |
| Z_RC="$HOME/.zshrc" | |
| HBIN_DIR="$HOME/.local/bin" | |
| LWRUN_LN="$HBIN_DIR/lwrun" | |
| LWRAP_LN="$HBIN_DIR/lwrap" | |
| LWRAP="$LWBIN_DIR/lwrap" | |
| LWBASH="$LWBIN_DIR/bash" | |
| LWRUN="$LWBIN_DIR/lwrun" | |
| OLD_LWRUN="$OLD_LWBIN_DIR/lwrun" | |
| RUNIMAGE_LW="$LWBIN_DIR/runimage-lw" | |
| LWRAP_DIR='/opt/lwrap' | |
| LWRUNTIME="$LWRAP_DIR/runtime.tar.zst" | |
| HLWDIRLN="$HOME/LuxWine" | |
| OLD_HLWDIRLN="$HOME/LutrisWine" | |
| LWRPIDFL='/tmp/.lwrpid' | |
| LWEXEC="$LWBIN_DIR/lwexec" | |
| HICOLOR_SIZES=( | |
| "512x512" "256x256" "192x192" "128x128" | |
| "96x96" "80x80" "72x72" "64x64" "48x48" | |
| "32x32" "24x24" "16x16" | |
| ) | |
| LW_MIMETYPES=( | |
| 'application/x-ms-dos-executable' 'application/x-wine-extension-msp' | |
| 'application/x-msi' 'application/x-msdos-program' 'text/win-bat' | |
| 'application/x-ms-shortcut' 'text/x-ms-regedit' | |
| ) | |
| if [[ -n "$RUNSRC" && -d "$RUNROOTFS" ]] && \ | |
| [[ -x "$LWRAP" && "$NO_EXT_LWRAP" != 1 ]] | |
| then | |
| NO_EXT_LWRAP=1 "$LWRAP" "$@" | |
| exit $? | |
| fi | |
| unset NO_EXT_LWRAP | |
| [ ! -n "$(tty|grep -v 'not a'|grep -Eo 'tty|pts')" ] && \ | |
| NOT_TERM=1||NOT_TERM=0 | |
| error_msg() { | |
| echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR" | |
| if [ "$NOT_TERM" == 1 ] | |
| then notify-send -a 'Lux Wine Error' "$@" 2>/dev/null & | |
| fi | |
| } | |
| info_msg() { | |
| if [ "$QUIET_MODE" != 1 ] | |
| then | |
| echo -e "${GREEN}[ INFO ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR" | |
| if [[ "$NOT_TERM" == 1 && "$NO_NOTIFY" != 1 ]] | |
| then notify-send -a 'Lux Wine Info' "$@" 2>/dev/null & | |
| fi | |
| fi | |
| } | |
| warn_msg() { | |
| if [ "$QUIET_MODE" != 1 ] | |
| then | |
| echo -e "${YELLOW}[ WARNING ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR" | |
| if [[ "$NOT_TERM" == 1 && "$NO_NOTIFY" != 1 ]] | |
| then notify-send -a 'Lux Wine Warning' "$@" 2>/dev/null & | |
| fi | |
| fi | |
| } | |
| check_path() { | |
| if [ "$1" == "$F_RC" ] | |
| then grep -om1 '^set -U fish_user_paths "$HOME/.local/bin"' "$1" &>/dev/null | |
| else grep -om1 '^export PATH=.*/.local/bin' "$1" &>/dev/null | |
| fi | |
| } | |
| add_path() { | |
| if [ "$1" == "$F_RC" ] | |
| then check_path "$1"||(mkdir -p "$(dirname "$1")" && echo -e '\nset -U fish_user_paths "$HOME/.local/bin"' >> "$1") | |
| else check_path "$1"||echo -e '\nexport PATH="$HOME/.local/bin:$PATH"' >> "$1" | |
| fi | |
| } | |
| ln_lwrap() { [[ -x "$LWRAP" && -x "$LWRAP_LN" ]]||(mkdir -p "$HBIN_DIR" && ln -sfr "$LWRAP" "$LWRAP_LN") ; } | |
| make_install() { | |
| if [ "$1" == "force" ] | |
| then QUIET_MODE=1 uninstall_lw force | |
| else QUIET_MODE=1 uninstall_lw update | |
| fi | |
| [ -f 'lux-wine' ] && \ | |
| local lwf='lux-wine'||\ | |
| local lwf='bin/lux-wine' | |
| install -Dm755 "$lwf" "$LWSRC" | |
| if is_not_pts_home | |
| then | |
| grep -m1 '^Exec=".*"' -lr ./*|\ | |
| xargs -d'\n' sed -i "s|^Exec=\".*\"|Exec=\"$LWRAP\"|g" 2>/dev/null | |
| grep -m1 'Icon=/.*/lux-wine/icons/.*.png$' -lr ./*|\ | |
| xargs -d'\n' sed -i "s|Icon=/.*/lux-wine/icons/|Icon=$LW_DIR/icons/|g" 2>/dev/null | |
| if [ -f 'lwrap' ] | |
| then local lwrapf='lwrap' | |
| elif [ -f 'bin/lwrap' ] | |
| then local lwrapf='bin/lwrap' | |
| else local lwrapf='lwrap/lwrap' | |
| fi | |
| if [ -f 'lwexec' ] | |
| then local lwexecf='lwexec' | |
| elif [ -f 'bin/lwexec' ] | |
| then local lwexecf='bin/lwexec' | |
| else local lwexecf='lwrap/lwexec' | |
| fi | |
| if [ -x "$RUNSTATIC/bash" ] | |
| then | |
| sed -i "1 s|^.*$|#!$LWBASH|" "$lwrapf" | |
| sed -i "1 s|^.*$|#!$LWBASH|" "$lwexecf" | |
| install -Dm755 "$RUNSTATIC/bash" "$LWBASH" | |
| fi | |
| install -Dm755 "$lwrapf" "$LWRAP" | |
| ln_lwrap | |
| install -Dm755 "$lwexecf" "$LWEXEC" | |
| install -Dm644 LuxWine.menu "$HOME/.config/menus/applications-merged/LuxWine.menu" | |
| install -Dm644 LuxWineService.desktop "$HOME/.local/share/kservices5/ServiceMenus/LuxWineService.desktop" | |
| mkdir -p "$MENU_APPS_DIR" | |
| mkdir -p "$HOME_DESK_DIRS" | |
| cp -rf mime "$HOME/.local/share/mime" | |
| cp -rf applications "$MENU_APPS_DIR/LuxWine" | |
| cp -rf directories/* "$HOME_DESK_DIRS/" | |
| if [[ -d "$RUNROOTFS" && -f "$RSTEAM_DESKF" ]] | |
| then | |
| cp -rf "$RSTEAM_DESKF" "$HSTEAM_DESKF" | |
| sed -i "s|^Exec.*steam-runtime|Exec='$HBIN_DIR/steam-runtime'|g" "$HSTEAM_DESKF" | |
| sed -i "s|^Name=Steam (Runtime)|Name=Steam (RunImage LW)|g" "$HSTEAM_DESKF" | |
| HICNSTM="$HOME_ICONS/steam.png" | |
| for hi_icon_size in ${HICOLOR_SIZES[@]} | |
| do | |
| HICONS_DIR="$HOME_ICONS/hicolor/$hi_icon_size/apps" | |
| RSTEAM_ICON="$RUNROOTFS/usr/share/icons/hicolor/$hi_icon_size/apps/steam.png" | |
| HSTEAM_ICON="$HICONS_DIR/steam.png" | |
| if [[ -f "$RSTEAM_ICON" && ! -f "$HSTEAM_ICON" ]] | |
| then | |
| mkdir -p "$HICONS_DIR" | |
| [ -L "$HSTEAM_ICON" ] && \ | |
| rm -f "$HSTEAM_ICON" | |
| cp -rf "$RSTEAM_ICON" "$HSTEAM_ICON" | |
| fi | |
| if [[ -f "$RSTEAM_ICON" && ! -f "$HICNSTM" ]] | |
| then | |
| mkdir -p "$HOME_ICONS" | |
| [ -L "$HICNSTM" ] && \ | |
| rm -f "$HICNSTM" | |
| cp -rf "$RSTEAM_ICON" "$HICNSTM" | |
| fi | |
| done | |
| fi | |
| [ "$ENABLE_HOSTEXEC" == 1 ] && \ | |
| local INSTALL_SHELL="$(hostexec echo '$SHELL')"||\ | |
| local INSTALL_SHELL="$SHELL" | |
| case "$(basename "$INSTALL_SHELL")" in | |
| zsh) add_path "$Z_RC" ;; | |
| bash) add_path "$B_RC" ;; | |
| fish) add_path "$F_RC" ;; | |
| esac | |
| update-desktop-database -q "$MENU_APPS_DIR" &>/dev/null | |
| update-mime-database "$HOME/.local/share/mime" &>/dev/null | |
| for mimetype in "${LW_MIMETYPES[@]}" | |
| do xdg-mime default LuxWine.desktop "$mimetype" &>/dev/null | |
| done | |
| fi | |
| cp -rf registry_patch "$LW_DIR/" | |
| cp -rf LICENSE "$LW_DIR/" | |
| cp -rf themes "$LW_DIR/" | |
| cp -rf icons "$LW_DIR/" | |
| cp -rf gif "$LW_DIR/" | |
| cp -rf db "$LW_DIR/" | |
| if [ -f "$LWRUNTIME" ] | |
| then | |
| tar -xf "$LWRUNTIME" -C "$LW_DIR" && \ | |
| [[ ! -f "$LW_CFG" && -f "$TMP_LW_CFG" ]] && \ | |
| cp -f "$TMP_LW_CFG" "$LW_CFG" | |
| fi | |
| grep "$LWRUN_LN" -lr "$MENU_APPS_DIR"|\ | |
| xargs -d'\n' sed -i "s|$LWRUN_LN|$LWRAP|g" 2>/dev/null | |
| grep "$LWRUN" -lr "$MENU_APPS_DIR"|\ | |
| xargs -d'\n' sed -i "s|$LWRUN|$LWRAP|g" 2>/dev/null | |
| } | |
| mv_lwrun() { | |
| if [ -w "$1" ] | |
| then mv -f "$1" "$2" | |
| else [ -L "$2" ] && rm -f "$2" | |
| cp -f "$1" "$2" | |
| fi | |
| } | |
| is_not_pts_home() { | |
| [[ "$SANDBOX_HOME" != 1 && "$SANDBOX_HOME_DL" != 1 && ! -d "$SANDBOXHOMEDIR/lwrap" && \ | |
| "$PORTABLE_HOME" != 1 && "$TMP_HOME" != 1 && "$TMP_HOME_DL" != 1 && ! -d "$PORTABLEHOMEDIR/lwrap" ]] | |
| } | |
| try_install_lwrun() { | |
| finalize_install() { | |
| chmod u+x "$LWRUN" | |
| ln_lwrun | |
| info_msg "lwrun installed!" | |
| if [ ! -n "$TMP_LWRUN" ] && \ | |
| is_net_conn | |
| then | |
| update_lwrap | |
| LWRUN_INSTALLED=1 \ | |
| "$LWRAP" --install | |
| fi | |
| try_shutdown_lw && \ | |
| return 0||return 1 | |
| } | |
| if is_not_pts_home | |
| then | |
| REALP_LWRUN="$(readrealpath "$LWRUN")" | |
| if [[ "$RUNSRC" =~ "lwrun" && -f "$RUNSRCRPTH" && \ | |
| "$RUNSRCRPTH" != "$LWRUN" && ! "$RUNSRCRPTH" =~ "Run" && \ | |
| "$RUNSRCRPTH" != "$OLD_LWRUN" && "$LWRUN_INSTALLED" != 1 ]] | |
| then | |
| info_msg "Installing lwrun..." | |
| mkdir -p "$LWBIN_DIR" | |
| if mv_lwrun "$RUNSRCRPTH" "$LWRUN" | |
| then finalize_install | |
| else | |
| error_msg "Failed to install lwrun!" | |
| is_lwrun && \ | |
| return 1||exit 1 | |
| fi | |
| elif [[ "$RUNSRCRPTH" =~ "Run" && "$RUNSRCRPTH" != "$REALP_LWRUN" ]] | |
| then | |
| mkdir -p "$LWBIN_DIR" | |
| ln -sf "$RUNSRCRPTH" "$LWRUN" | |
| ln_lwrun | |
| return 0 | |
| elif [[ ! -n "$TMP_LWRUN" && "$LWRUN_PKG" == 1 && \ | |
| "$LWRUN_INSTALLED" != 1 ]] | |
| then finalize_install | |
| fi | |
| fi | |
| } | |
| ln_lwrun() { | |
| if is_lwrun | |
| then | |
| mkdir -p "$HBIN_DIR" | |
| REALP_LWRUN="$(readrealpath "$LWRUN")" | |
| if [ "$(readrealpath "$LWRUN_LN")" != "$REALP_LWRUN" ] | |
| then | |
| info_msg "Update lwrun link..." | |
| ln -sfr "$LWRUN" "$LWRUN_LN" | |
| fi | |
| for steam in {steam,steam-runtime,steam-native} | |
| do | |
| if [ ! -f "$HBIN_DIR/$steam" ] | |
| then | |
| info_msg "Update $steam link..." | |
| ln -sfr "$LWRUN" "$HBIN_DIR/$steam" | |
| fi | |
| done | |
| if [ "$(readrealpath "$RUNIMAGE_LW")" != "$REALP_LWRUN" ] | |
| then | |
| info_msg "Update runimage link..." | |
| mkdir -p "$LWBIN_DIR" | |
| ln -sfr "$LWRUN" "$RUNIMAGE_LW" | |
| ln -sfr "$LWRUN" "$HBIN_DIR/runimage-lw" | |
| fi | |
| fi | |
| } | |
| uninstall_lw() { | |
| if [ "$1" == "force" ] || is_lw || is_lwrun | |
| then | |
| info_msg "Removing Lux Wine..." | |
| rm -rf "$HSTEAM_DESKF" | |
| rm -rf "$MENU_APPS_DIR/LuxWine" | |
| rm -rf "$HOME_DESK_DIRS/LuxWine"* | |
| rm -rf "$HOME/.config/menus/applications-merged/LuxWine.menu" | |
| rm -rf "$HOME/.local/share/kservices5/ServiceMenus/LuxWine"* | |
| rm -rf "$MENU_APPS_DIR/LutrisWine" | |
| rm -rf "$HOME_DESK_DIRS/LutrisWine"* | |
| rm -rf "$HOME/.config/menus/applications-merged/LutrisWine.menu" | |
| rm -rf "$HOME/.local/share/kservices5/ServiceMenus/LutrisWine"* | |
| rm -rf "$HOME/Desktop/LutrisWine.desktop" | |
| if [ "$1" == "update" ] | |
| then | |
| rm -rf "$LWSRC" | |
| rm -rf "$LWRAP" | |
| rm -rf "$LWBASH" | |
| rm -rf "$OLD_LWSRC" | |
| rm -rf "$LW_DIR/db" | |
| rm -rf "$LW_DIR/gif" | |
| rm -rf "$LW_DIR/icons" | |
| rm -rf "$LW_DIR/themes" | |
| rm -rf "$LW_DIR/LICENSE" | |
| rm -rf "$LW_DIR/.lwcfgchksum" | |
| rm -rf "$LW_DIR/registry_patch" | |
| else | |
| rm -rf "$LW_DIR" | |
| rm -rf "$HLWDIRLN" | |
| rm -rf "$LWRUN_LN" | |
| rm -rf "$LWRAP_LN" | |
| rm -rf "$OLD_LW_DIR" | |
| rm -rf "$OLD_HLWDIRLN" | |
| rm -rf "$HBIN_DIR/runimage-lw" | |
| rm -rf "$MENU_APPS_DIR/LuxWine"* | |
| rm -rf "$MENU_APPS_DIR/LutrisWine"* | |
| rm -rf "$HOME/Desktop/LuxWine.desktop" | |
| rm_broken_link "$HBIN_DIR" | |
| rm_broken_link "$HOME_ICONS" | |
| fi | |
| fi | |
| info_msg "Lux Wine removed!" | |
| } | |
| is_net_conn() { | |
| if is_exe_exist nc | |
| then nc -zw1 github.com 443 &>/dev/null | |
| elif is_exe_exist ping | |
| then ping -c 1 github.com &>/dev/null | |
| elif is_exe_exist curl | |
| then curl -Ifs github.com &>/dev/null | |
| elif is_exe_exist wget | |
| then wget -q --spider github.com &>/dev/null | |
| else return 1 | |
| fi | |
| } | |
| exzip() { | |
| if is_exe_exist unzip | |
| then | |
| unzip "$1" -d "$2" &>/dev/null | |
| elif is_exe_exist 7z | |
| then | |
| 7z x "$1" -o"$2" &>/dev/null | |
| elif is_exe_exist bsdtar | |
| then | |
| mkdir -p "$2" | |
| bsdtar -x -f "$1" -C "$2" &>/dev/null | |
| else | |
| error_msg "zip archivator not found!" | |
| exit 1 | |
| fi | |
| } | |
| is_lw() { (is_not_pts_home && [[ -x "$LWSRC" && -x "$LWRAP" ]])||[ -x "$LWSRC" ] ; } | |
| is_lwrun() { [ -x "$LWRUN" ] ; } | |
| install_lw() { | |
| rm_tmplw() { [[ -d "$TMP_LW" || -f "$TMP_LW.zip" ]] && rm -rf "$TMP_LW"* ; } | |
| TMP_LW="/tmp/lux-wine.$RANDOM" | |
| info_msg "Installing Lux Wine..." | |
| if [ "$1" != "local" ] && \ | |
| (try_dl "$GIT_HF_LWZIP" "$TMP_LW.zip"||\ | |
| try_dl "$GIT_LWZIP" "$TMP_LW.zip") | |
| then | |
| (exzip "$TMP_LW.zip" "$TMP_LW" && \ | |
| cd "$TMP_LW/lux-wine-main" && \ | |
| make_install "$1" | |
| rm_tmplw) | |
| elif [ -d "/opt/lwrap" ] | |
| then | |
| (mkdir -p "$TMP_LW" && \ | |
| cp -rf "/opt/lwrap"/!(runtime.tar.zst|prefix_backups) "$TMP_LW" && \ | |
| cd "$TMP_LW" && \ | |
| make_install "$1" | |
| rm_tmplw) | |
| fi | |
| if is_lw | |
| then info_msg "Lux Wine installed!" | |
| else | |
| error_msg "Failed to install Lux Wine!" | |
| exit 1 | |
| fi | |
| } | |
| vers_parser() { grep -Po '\d+'|sed ':a;/$/N;s/\n//;ta' ; } | |
| get_lw_version() { | |
| if [ -n "$1" ] | |
| then grep -m1 'LW_VERSION' "$1" 2>/dev/null|vers_parser | |
| else grep -m1 'LW_VERSION'|vers_parser | |
| fi | |
| } | |
| update_lwrap() { | |
| info_msg "Update lwrap..." | |
| TMP_LWRAP="${LWRAP}.new$BASHPID" | |
| if (try_dl "$GIT_HF_LWRAP" "$TMP_LWRAP"||\ | |
| try_dl "$GIT_LWRAP" "$TMP_LWRAP") | |
| then | |
| mv -f "$TMP_LWRAP" "$LWRAP" | |
| chmod +x "$LWRAP" | |
| ln_lwrap | |
| else | |
| error_msg "Failed to get lwrap!" | |
| return 1 | |
| fi | |
| } | |
| update_lw() { | |
| if is_lw | |
| then | |
| info_msg "Checking the Lux Wine update..." | |
| GIT_LW_VERSION="$(NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 \ | |
| try_dl "$GIT_HF_LWSRC" /dev/stdout 2>/dev/null|get_lw_version)" | |
| [ ! -n "$GIT_LW_VERSION" ] && \ | |
| GIT_LW_VERSION="$(NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 \ | |
| try_dl "$GIT_LWSRC" /dev/stdout 2>/dev/null|get_lw_version)" | |
| LW_VERSION="$(get_lw_version "$LWSRC")" | |
| if [[ -n "$GIT_LW_VERSION" && -n "$LW_VERSION" ]] | |
| then | |
| if [ "$LW_VERSION" != "$GIT_LW_VERSION" ] | |
| then | |
| if is_update "Lux Wine" | |
| then | |
| info_msg "Lux Wine update..." | |
| if update_lwrap | |
| then "$LWRAP" --install||\ | |
| exit 1 | |
| else exit 1 | |
| fi | |
| fi | |
| else | |
| info_msg "The latest version is already installed!" | |
| touch "$LWSRC" | |
| fi | |
| else | |
| error_msg "Failed to check for updates!" | |
| return 1 | |
| fi | |
| else | |
| error_msg "Lux Wine is not installed!" | |
| exit 1 | |
| fi | |
| } | |
| get_lwrun_git_ver() { | |
| NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 try_dl "$GIT_LWRUN/latest" \ | |
| /dev/stdout 2>/dev/null|grep -m1 "Release v.*"|awk '{print$2}' | |
| } | |
| get_lwrun_hf_ver() { | |
| NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 try_dl \ | |
| "${GIT_HF_LWRUN/resolve/tree}" /dev/stdout \ | |
| 2>/dev/null|grep -Po "v\d+\.\d+\.\d+"|tail -1 | |
| } | |
| try_dl_lwrun() { | |
| TMP_LWRUN="$LWRUN.new$BASHPID" | |
| info_msg "Downloading lwrun..." | |
| [ ! -n "$GIT_LWRUN_VERSION" ] && \ | |
| GIT_LWRUN_VERSION="$(get_lwrun_hf_ver)" | |
| [ ! -n "$GIT_LWRUN_VERSION" ] && \ | |
| GIT_LWRUN_VERSION="$(get_lwrun_git_ver)" | |
| if [ -n "$GIT_LWRUN_VERSION" ] && \ | |
| (try_dl "$GIT_HF_LWRUN/$GIT_LWRUN_VERSION/lwrun" "$TMP_LWRUN"||\ | |
| try_dl "$GIT_LWRUN/download/$GIT_LWRUN_VERSION/lwrun" "$TMP_LWRUN") | |
| then | |
| info_msg "lwrun downloaded!" | |
| RUNSRCRPTH="$TMP_LWRUN" \ | |
| RUNSRC="lwrun" try_install_lwrun && | |
| return 0||return 1 | |
| else | |
| error_msg "Failed to download lwrun!" | |
| [ -f "$TMP_LWRUN" ] && \ | |
| rm -rf "$TMP_LWRUN"* | |
| exit 1 | |
| fi | |
| } | |
| runimage_lw() { | |
| [ "$NOT_TERM" != 1 ] && \ | |
| unset HOSTEXEC_IN_TERM||\ | |
| HOSTEXEC_IN_TERM=( | |
| "xterm" "-fa" "Monospace" | |
| "-fs" "11" "-geometry" "130x45" | |
| "-bg" "black" "-fg" "white" \ | |
| "-T" "Updating RunImage packages..." "-e" | |
| ) | |
| if [ "$ENABLE_HOSTEXEC" == 1 ] | |
| then "${HOSTEXEC_IN_TERM[@]}" hostexec ptyspawn importenv '$RUNPID' \ | |
| env DONT_NOTIFY=1 NO_RPIDSMON=1 "$RUNIMAGE_LW" "$@" | |
| else "$RUNIMAGE_LW" "$@" | |
| fi | |
| } | |
| yn_case() { | |
| while true | |
| do | |
| read -p "$(echo -e "${RED}$1 ${GREEN}(y/n) ${BLUE}> $RESETCOLOR")" yn | |
| case $yn in | |
| [Yy] ) return 0 ;; | |
| [Nn] ) return 1 ;; | |
| esac | |
| done | |
| } | |
| gui_question() { | |
| if is_exe_exist yad | |
| then yad --image="dialog-question" --button="NO:1" --button="YES:0" --title="$1" \ | |
| --text="$2" --center --on-top --fixed --selectable-labels | |
| elif is_exe_exist zenity | |
| then zenity --question --title="$1" --no-wrap --text="$2" | |
| else return 1 | |
| fi | |
| return $? | |
| } | |
| is_update() { | |
| [ "$FORCE_UPDATE" == 1 ] && \ | |
| return 0 | |
| local IS_UPD_TITLE="Update ${1}..." | |
| [ -n "$2" ] && \ | |
| local IS_UPD_TEXT="$2"||\ | |
| local IS_UPD_TEXT="$1 update is available!\nDo you want to update now?" | |
| if [ "$NOT_TERM" != 1 ] | |
| then yn_case "$IS_UPD_TEXT"||return 1 | |
| else gui_question "$IS_UPD_TITLE" "$IS_UPD_TEXT"||return 1 | |
| fi | |
| return $? | |
| } | |
| try_shutdown_lw() { | |
| if [[ -n "$((pgrep -fa lutris-wine||pgrep -fa lux-wine)|\ | |
| grep -Eom1 "LutrisWine/bin|LuxWine/bin")" ]] | |
| then | |
| if [ "$FORCE_UPDATE" != 1 ] | |
| then | |
| local qtext="You need to restart Lux Wine!\nDo you want to turn it off now?" | |
| if [ "$NOT_TERM" != 1 ] | |
| then yn_case "$qtext" | |
| else gui_question "Restart Lux Wine..." "$qtext" | |
| fi | |
| fi | |
| if [ "$?" == 0 ] | |
| then | |
| info_msg "Shutdown Lux Wine..." | |
| if [ -x "$LWSRC" ] | |
| then "$LWSRC" -exit | |
| elif [ -x "$OLD_LWSRC" ] | |
| then "$OLD_LWSRC" -exit | |
| else return 1 | |
| fi | |
| else return 1 | |
| fi | |
| fi | |
| return 0 | |
| } | |
| no_color() { sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g" ; } | |
| update_runimage() { | |
| if is_update "RunImage" "Do you want to check updates for RunImage packages?" | |
| then | |
| if (runimage_lw --rU && try_shutdown_lw) | |
| then return 0 | |
| else return 1 | |
| fi | |
| else return 1 | |
| fi | |
| } | |
| update_lwrun() { | |
| if is_lwrun | |
| then | |
| info_msg "Checking the lwrun update..." | |
| GIT_LWRUN_VERSION="$(get_lwrun_hf_ver)" | |
| [ ! -n "$GIT_LWRUN_VERSION" ] && \ | |
| GIT_LWRUN_VERSION="$(get_lwrun_git_ver)" | |
| GIT_LWRUN_VERSION_PARS="$(echo "$GIT_LWRUN_VERSION"|vers_parser)" | |
| [ -n "$RUNIMAGE_VERSION" ] && \ | |
| LWRUN_VERSION="$(echo "$RUNIMAGE_VERSION"|vers_parser)"||\ | |
| LWRUN_VERSION="$(runimage_lw --rV|no_color|\ | |
| grep 'RunImage version:'|awk '{print$7}'|vers_parser)" | |
| if [[ -n "$GIT_LWRUN_VERSION_PARS" && -n "$LWRUN_VERSION" ]] | |
| then | |
| local ret=1 | |
| unset dlret pkgret | |
| if [ "$LWRUN_VERSION" != "$GIT_LWRUN_VERSION_PARS" ] | |
| then | |
| if is_update "lwrun" | |
| then | |
| info_msg "lwrun update..." | |
| try_dl_lwrun && \ | |
| local dlret=0 | |
| fi | |
| else | |
| info_msg "The latest version is already installed!" | |
| touch "$LWRUN" | |
| fi | |
| if [ "$NO_RUNPKG_UPDATE" != 1 ] | |
| then | |
| update_runimage | |
| local pkgret=$? | |
| if [ "$pkgret" == 0 ] | |
| then | |
| if [ "$ENABLE_HOSTEXEC" == 1 ] | |
| then hostexec ptyspawn importenv '$RUNPID' "$LWRAP" -init | |
| else "$LWRAP" -init | |
| fi | |
| fi | |
| fi | |
| [[ "$dlret" == 0 || "$pkgret" == 0 ]] && \ | |
| local ret=0 | |
| return $ret | |
| else | |
| error_msg "Failed to check for updates!" | |
| return 1 | |
| fi | |
| else | |
| error_msg "lwrun is not installed!" | |
| exit 1 | |
| fi | |
| } | |
| is_exe_exist() { command -v "$@" &>/dev/null ; } | |
| which_exe() { command -v "$@" ; } | |
| check_url_stat_code() { | |
| if is_exe_exist curl | |
| then curl -sL -o /dev/null -I -w "%{http_code}" "$@" 2>/dev/null | |
| elif is_exe_exist wget | |
| then wget --no-check-certificate --server-response \ | |
| --spider "$@"|& awk '/^ HTTP/{print$2}'|tail -1 | |
| else return 1 | |
| fi | |
| } | |
| is_url() { | |
| [ ! -n "$1" ] && \ | |
| return 1 | |
| if [ -n "$2" ] | |
| then [ "$(check_url_stat_code "$1")" == "$2" ] | |
| else [ "$(check_url_stat_code "$1")" == "200" ] | |
| fi | |
| } | |
| try_dl() { | |
| err_no_downloader() { | |
| error_msg "Downloader not found!" | |
| exit 1 | |
| } | |
| rm_fail_dl() { | |
| [ -f "$FILEDIR/$FILENAME" ] && \ | |
| rm -rf "$FILEDIR/$FILENAME" \ | |
| "$FILEDIR/$FILENAME"*.aria2 | |
| } | |
| dl_ret() { | |
| if [ "$1" != 0 ] | |
| then | |
| rm_fail_dl | |
| dl_repeat && \ | |
| try_dl "$URL" "$FILEDIR/$FILENAME"||\ | |
| return 1 | |
| else return 0 | |
| fi | |
| } | |
| dl_repeat() { | |
| [ "$NO_DL_REPEAT" == 1 ] && \ | |
| return 1 | |
| DL_REP_TITLE="Download interrupted!" | |
| DL_REP_TEXT="Failed to download: $FILENAME from $(echo "$URL"|awk -F/ '{print$3"/"$4}') \nWould you like to repeat it?" | |
| if [[ "$NOT_TERM" != 1 || "$NO_DL_GUI" == 1 ]] | |
| then | |
| yn_case "$DL_REP_TEXT"||return 1 | |
| elif is_exe_exist yad | |
| then | |
| yad --image="dialog-error" --button="CANCEL:1" --center \ | |
| --button="REPEAT:0" --title="$DL_REP_TITLE" \ | |
| --text="$DL_REP_TEXT" --on-top --fixed | |
| elif is_exe_exist zenity | |
| then | |
| zenity --question --title="$DL_REP_TITLE" --no-wrap \ | |
| --text="$DL_REP_TEXT" | |
| else return 1 | |
| fi | |
| } | |
| if [ -n "$1" ] | |
| then | |
| URL="$1" | |
| if [ -n "$2" ] | |
| then | |
| if [ -d "$2" ] | |
| then | |
| FILEDIR="$2" | |
| FILENAME="$(basename "$1")" | |
| else | |
| FILEDIR="$(dirname "$2")" | |
| FILENAME="$(basename "$2")" | |
| fi | |
| else | |
| FILEDIR="." | |
| FILENAME="$(basename "$1")" | |
| fi | |
| if is_url "$URL" | |
| then | |
| [ ! -d "$FILEDIR" ] && \ | |
| mkdir -p "$FILEDIR" | |
| if [[ "$NOT_TERM" == 1 && "$NO_DL_GUI" != 1 ]] && \ | |
| (is_exe_exist yad||is_exe_exist zenity) | |
| then | |
| set -o pipefail | |
| dl_progress() { | |
| [[ "$URL" =~ '&key=' ]] && \ | |
| local URL="$(echo "$URL"|sed "s|\&key=.*||g")" | |
| [[ "$URL" =~ '&' && ! "$URL" =~ '&' ]] && \ | |
| local URL="$(echo "$URL"|sed "s|\&|\&|g")" | |
| if is_exe_exist yad | |
| then | |
| yad --progress --percentage=0 --text="Download:\t$FILENAME\n$URL" \ | |
| --auto-close --no-escape --selectable-labels --auto-kill \ | |
| --center --on-top --fixed --no-buttons --undecorated --skip-taskbar | |
| elif is_exe_exist zenity | |
| then | |
| zenity --progress --text="Connecting to $URL" --width=650 --height=40 \ | |
| --auto-close --no-cancel --title="Download: $FILENAME" | |
| else return 1 | |
| fi | |
| } | |
| if [ "$NO_ARIA2C" != 1 ] && \ | |
| is_exe_exist aria2c | |
| then | |
| aria2c -R -x 13 -s 13 --allow-overwrite --summary-interval=1 -o \ | |
| "$FILENAME" -d "$FILEDIR" "$URL"|grep --line-buffered 'ETA'|\ | |
| sed -u 's|(.*)| &|g;s|(||g;s|)||g;s|\[||g;s|\]||g'|\ | |
| awk '{print$3"\n#Downloading at "$3,$2,$5,$6;system("")}'|\ | |
| dl_progress | |
| elif is_exe_exist wget | |
| then | |
| wget --no-check-certificate --content-disposition -t 3 -T 5 \ | |
| -w 0.5 "$URL" -O "$FILEDIR/$FILENAME"|& tr '\r' '\n'|\ | |
| sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\ ETA: \3/; s/^20[0-9][0-9].*/#Done./'|\ | |
| dl_progress | |
| elif is_exe_exist curl | |
| then | |
| curl -R --progress-bar --insecure --fail -L "$URL" -o \ | |
| "$FILEDIR/$FILENAME" |& tr '\r' '\n'|\ | |
| sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g'|\ | |
| dl_progress | |
| else | |
| err_no_downloader | |
| fi | |
| dl_ret "${PIPESTATUS[0]}"||return 1 | |
| else | |
| if [ "$NO_ARIA2C" != 1 ] && is_exe_exist aria2c | |
| then | |
| aria2c -R -x 13 -s 13 --allow-overwrite -d "$FILEDIR" -o "$FILENAME" "$URL" | |
| elif is_exe_exist wget | |
| then | |
| wget -q --show-progress --no-check-certificate --content-disposition \ | |
| -t 3 -T 5 -w 0.5 "$URL" -O "$FILEDIR/$FILENAME" | |
| elif is_exe_exist curl | |
| then | |
| curl -R --progress-bar --insecure --fail -L "$URL" -o "$FILEDIR/$FILENAME" | |
| else | |
| err_no_downloader | |
| fi | |
| dl_ret "$?"||return 1 | |
| fi | |
| else | |
| error_msg "$FILENAME not found in $(echo "$URL"|awk -F/ '{print$3"/"$4}')" | |
| return 1 | |
| fi | |
| else | |
| error_msg "Specify download URL!" | |
| return 1 | |
| fi | |
| } | |
| try_set_lwrpid() { lwrpid="$(cat "$LWRPIDFL" 2>/dev/null)" ; } | |
| rm_broken_link() { find -L "$1" -type l -exec rm -rf {} \; 2>/dev/null ; } | |
| readrealpath() { | |
| if is_exe_exist readlink | |
| then readlink -f "$@" 2>/dev/null | |
| elif is_exe_exist realpath | |
| then realpath "$@" 2>/dev/null | |
| else return 1 | |
| fi | |
| } | |
| print_help() { | |
| HLPHOSTNAME="$(uname -a|awk '{print$2}')" | |
| [[ "$RUNSRC" =~ "lwrun" ]] && \ | |
| HLPEXENAME="lwrun"||\ | |
| HLPEXENAME="lwrap" | |
| echo -e " | |
| ${RED}Usage: | |
| $RED┌──[$GREEN$RUNUSER$YELLOW@$BLUE${RUNHOSTNAME}$RED]─[$GREEN$PWD$RED] | |
| $RED└──╼ \$$GREEN $HLPEXENAME ${BLUE}{args} | |
| ${BLUE}--lwrap-help $GREEN Show this usage info | |
| ${BLUE}--install $YELLOW{force|local}$GREEN Re/Install Lux Wine and lwrun | |
| ${BLUE}--update $GREEN Update Lux Wine, lwrun and container packages | |
| ${BLUE}--uninstall $YELLOW{force|update}$GREEN Install Lux Wine and lwrun | |
| " | |
| } | |
| if [[ -f "$OLD_LWSRC" && ! -f "$LWSRC" ]] | |
| then | |
| LW_MIGRATION=1 | |
| NO_RUNPKG_UPDATE=1 | |
| grep "$OLD_LW_DIR" -lr "$OLD_LW_DIR"/*.*|\ | |
| xargs -d'\n' sed -i "s|$OLD_LW_DIR|$LW_DIR|g" 2>/dev/null | |
| if [ -d "$OLD_LW_DIR/appcfg" ] | |
| then | |
| for wcfg in "$OLD_LW_DIR/appcfg"/* | |
| do [ -f "$wcfg" ] && \ | |
| sed -i "s|$OLD_LW_DIR|$LW_DIR|g" "$(readrealpath "$wcfg")" | |
| done | |
| fi | |
| mv -f "$OLD_LW_DIR" "$LW_DIR" | |
| ln -sfr "$LW_DIR" "$OLD_LW_DIR" | |
| rm -f "$LWRUN_LN" | |
| rm -f "$RUNIMAGE_LW" | |
| rm -f "$LWBIN_DIR/lw-tray" | |
| rm -f "$HBIN_DIR/runimage-lw" | |
| rm -f "$LW_DIR/wprefixes/defprefix/.lwtheme" | |
| ln_lwrun | |
| fi | |
| if [ -L "$OLD_HLWDIRLN" ] | |
| then | |
| rm -f "$OLD_HLWDIRLN" | |
| ln -sfr "$LW_DIR" "$HLWDIRLN" | |
| fi | |
| if [ -d "$OLD_LW_APPS_DIR" ] | |
| then | |
| mv -f "$OLD_LW_APPS_DIR" "$LW_APPS_DIR" | |
| grep '^Categories=Lutris Wine App' -lr "$MENU_APPS_DIR"|\ | |
| xargs -d'\n' sed -i "s|^Categories=.*|Categories=Lux Wine Apps|g;s|$OLD_LW_DIR|$LW_DIR|g" 2>/dev/null | |
| ln -sfr "$LW_APPS_DIR" "$LW_DIR/LuxWineApps" | |
| rm -f "$LW_DIR/LutrisWineApp" | |
| fi | |
| RUNSRCRPTH="$(readrealpath "$RUNSRC")" | |
| case "$1" in | |
| --lwrap-help) print_help | |
| exit ;; | |
| --uninstall) uninstall_lw "$2" | |
| exit $? ;; | |
| --install) try_install_lwrun | |
| is_lwrun||try_dl_lwrun | |
| install_lw "$2" | |
| if [ "$LW_MIGRATION" == 1 ] | |
| then | |
| NO_RUNPKG_UPDATE=1 \ | |
| FORCE_UPDATE=1 \ | |
| update_lwrun | |
| fi | |
| exit $? ;; | |
| --update) FORCE_UPDATE=1 | |
| update_lw | |
| update_lwrun | |
| exit $? ;; | |
| esac | |
| if [[ -n "$RUNSRC" && -d "$RUNROOTFS" ]] | |
| then | |
| try_install_lwrun | |
| is_lw||install_lw | |
| if [[ "$CHK_UPDATE" != 0 || "$FORCE_UPDATE" == 1 ]] && \ | |
| is_net_conn | |
| then | |
| if [[ ! -x "$(find "$LWSRC" -mtime -$CHK_UPDATE \ | |
| -print 2>/dev/null)" || "$FORCE_UPDATE" == 1 ]] | |
| then update_lw | |
| fi | |
| if is_not_pts_home && \ | |
| [[ ! -x "$(find "$LWRUN" -mtime -$CHK_UPDATE \ | |
| -print 2>/dev/null)" || "$FORCE_UPDATE" == 1 ]] | |
| then update_lwrun && exit $? | |
| fi | |
| fi | |
| try_set_lwrpid | |
| if ! [[ -n "$lwrpid" && -f "/tmp/.bwinf.$lwrpid" && -d "/proc/$lwrpid" ]] | |
| then | |
| LWEXECFLDIR="/tmp/.lwexec.$RUNPID" | |
| echo "$RUNPID" > "$LWRPIDFL" 2>/dev/null | |
| (JOBNUMFL="$LWEXECFLDIR/job" | |
| mkdir -p "$LWEXECFLDIR" 2>/dev/null | |
| mkfifo "$JOBNUMFL" 2>/dev/null | |
| unset jobnum | |
| while [[ -d "/proc/$RUNPID" && -d "$LWEXECFLDIR" ]] | |
| do | |
| jobnum=$(( $jobnum + 1 )) | |
| execjobdir="$LWEXECFLDIR/$jobnum" | |
| execenvfl="$execjobdir/env" | |
| execjobfl="$execjobdir/exec" | |
| execjoboutfl="$execjobdir/out" | |
| execjobstatfl="$execjobdir/stat" | |
| mkdir "$execjobdir" 2>/dev/null | |
| mkfifo "$execenvfl" 2>/dev/null | |
| mkfifo "$execjobfl" 2>/dev/null | |
| mkfifo "$execjoboutfl" 2>/dev/null | |
| mkfifo "$execjobstatfl" 2>/dev/null | |
| tee <<<"$jobnum" "$JOBNUMFL" &>/dev/null | |
| if [ -e "$execjobfl" ] | |
| then | |
| (OLD_PATH="$PATH" | |
| OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH" | |
| source "$execenvfl" && cd "$PWD" | |
| export PATH="$PATH:$OLD_PATH" | |
| export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$OLD_LD_LIBRARY_PATH" | |
| cat "$execjobfl" 2>/dev/null|"$RUNSTATIC/bash" &>"$execjoboutfl" & | |
| execjobpid=$! | |
| tee <<<"$execjobpid" "$execjobstatfl" &>/dev/null | |
| wait $execjobpid 2>/dev/null | |
| execstat=$? | |
| tee <<<"$execstat" "$execjobstatfl" &>/dev/null) & | |
| fi | |
| done) & | |
| fi | |
| "$LWSRC" "$@" | |
| [ -d "$LWEXECFLDIR" ] && \ | |
| rm -rf "$LWEXECFLDIR" | |
| [ -f "$LWRPIDFL" ] && \ | |
| rm -f "$LWRPIDFL" | |
| else | |
| if [ "$LW_MIGRATION" == 1 ] | |
| then | |
| if is_net_conn | |
| then | |
| update_lwrap | |
| FORCE_UPDATE=1 \ | |
| update_lwrun | |
| else error_msg "No internet connection!" | |
| fi | |
| fi | |
| try_set_lwrpid | |
| if [[ "$FORCE_UPDATE" != 1 && -x "$LWEXEC" && -x "$LWSRC" ]] && \ | |
| [[ -n "$lwrpid" && -f "/tmp/.bwinf.$lwrpid" && -d "/proc/$lwrpid" ]] | |
| then | |
| LWEXECFLDIR="/tmp/.lwexec.$lwrpid" \ | |
| NOT_TERM="$NOT_TERM" "$LWEXEC" "$LWSRC" "$@" | |
| elif [ -x "$LWRUN_LN" ] | |
| then "$LWRUN_LN" "$@" | |
| elif is_lwrun | |
| then "$LWRUN" "$@" | |
| elif [ -x "$(which_exe lwrun)" ] | |
| then "$(which_exe lwrun)" "$@" | |
| else | |
| if is_net_conn | |
| then | |
| update_lwrap | |
| try_dl_lwrun | |
| "$LWRUN" "$@" | |
| else | |
| error_msg "lwrun not found, download and install it first!" | |
| exit 1 | |
| fi | |
| fi | |
| fi | |
| exit $? | |