git / index.html
VHSgunzo
v0.78.2.5
332d66d
Raw History Blame
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 $?