|
#!/usr/bin/bash |
|
# Lux Wine wrapper for RunImage container |
|
|
|
shopt -s extglob |
|
|
|
RED='\033[1;91m' |
|
BLUE='\033[1;94m' |
|
GREEN='\033[1;92m' |
|
YELLOW='\033[1;33m' |
|
RESETCOLOR='\033[1;00m' |
|
|
|
LW_DIR="$HOME/.local/share/LuxWine" |
|
MENU_APPS_DIR="$HOME/.local/share/applications" |
|
LW_CFG="$LW_DIR/luwine.wcfg" |
|
LWBIN_DIR="$LW_DIR/bin" |
|
LWSRC='/opt/lwrap/bin/lux-wine' |
|
HOME_ICONS="$HOME/.local/share/icons" |
|
HOME_DESK_DIRS="$HOME/.local/share/desktop-directories" |
|
HSTEAM_DESKF="$MENU_APPS_DIR/steam-lw.desktop" |
|
HBIN_DIR="$HOME/.local/bin" |
|
LWRUN_LN="$HBIN_DIR/lwrun" |
|
OLDLWRAP="$LWBIN_DIR/lwrap" |
|
LWRUN="$LWBIN_DIR/lwrun" |
|
RUNIMAGE_LW="$LWBIN_DIR/runimage-lw" |
|
PKGUPDFL="$LWBIN_DIR/.update" |
|
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' |
|
) |
|
|
|
CFG_CHK_UPDATE="$(grep '^CHK_UPDATE=.*$' "$LW_CFG" 2>/dev/null)" |
|
[ -n "$CFG_CHK_UPDATE" ] && \ |
|
eval "$CFG_CHK_UPDATE"||\ |
|
CHK_UPDATE='3' |
|
|
|
[[ ! "$(LANG= tty|grep -v 'not a')" =~ tty|pts ]] && \ |
|
NOT_TERM=1||NOT_TERM=0 |
|
|
|
error_msg() { |
|
echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR" 1>&2 |
|
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" 1>&2 |
|
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" 1>&2 |
|
if [[ "$NOT_TERM" == 1 && "$NO_NOTIFY" != 1 ]] |
|
then notify-send -a 'Lux Wine Warning' "$@" 2>/dev/null & |
|
fi |
|
fi |
|
} |
|
|
|
make_install() { |
|
add_path() { |
|
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 |
|
} |
|
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 |
|
} |
|
F_RC="$HOME/.config/fish/config.fish" |
|
B_RC="$HOME/.bashrc" |
|
Z_RC="$HOME/.zshrc" |
|
if [ "$1" == "force" ] |
|
then QUIET_MODE=1 uninstall_lw force |
|
else QUIET_MODE=1 uninstall_lw update |
|
fi |
|
grep -m1 '^Exec=".*"' -lr ./*|\ |
|
xargs -d'\n' sed -i "s|^Exec=\".*\"|Exec=\"$LWRUN\"|g" 2>/dev/null |
|
install -Dm644 LuxWine.menu "$HOME/.config/menus/applications-merged/LuxWine.menu" |
|
if [ "$KDE_SESSION_VERSION" == 6 ] |
|
then install -Dm755 LuxWineService.desktop "$HOME/.local/share/kio/servicemenus/LuxWineService.desktop" |
|
elif [ "$KDE_SESSION_VERSION" == 5 ] |
|
then install -Dm755 LuxWineService.desktop "$HOME/.local/share/kservices5/ServiceMenus/LuxWineService.desktop" |
|
fi |
|
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/" |
|
RSTEAM_DESKF="$RUNROOTFS/usr/share/applications/steam.desktop" |
|
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" |
|
sed -i '/RunOnDiscreteGpu/d;/PrefersNonDefaultGPU/d' "$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 |
|
[ "$INSIDE_RUNIMAGE" == 1 ] && \ |
|
local INSTALL_SHELL="$(hostexec printenv 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 |
|
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/" |
|
LWRUNTIME="/opt/lwrap/runtime.tar.zst" |
|
if [ -f "$LWRUNTIME" ] |
|
then |
|
TMP_LW_CFG="$LW_DIR/tmp/luwine.wcfg" |
|
tar -xf "$LWRUNTIME" -C "$LW_DIR" && \ |
|
[[ ! -f "$LW_CFG" && -f "$TMP_LW_CFG" ]] && \ |
|
cp -f "$TMP_LW_CFG" "$LW_CFG" |
|
fi |
|
grep "$OLDLWRAP" -lr "$MENU_APPS_DIR"|\ |
|
xargs -d'\n' sed -i "s|$OLDLWRAP|$LWRUN|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 |
|
} |
|
|
|
try_install_lwrun() { |
|
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 |
|
} |
|
ln_lwrun() { |
|
mkdir -p "$HBIN_DIR" |
|
if [ "$(readrealpath "$LWRUN_LN")" != "$LWRUN" ] |
|
then |
|
info_msg "Update lwrun link..." |
|
ln -sf "$LWRUN" "$LWRUN_LN" |
|
fi |
|
for steam in {steam,steam-runtime,steam-native} |
|
do |
|
STEAM_LN="$HBIN_DIR/$steam" |
|
if [ "$(readrealpath "$STEAM_LN")" != "$LWRUN" ] |
|
then |
|
info_msg "Update $steam link..." |
|
ln -sf "$LWRUN" "$STEAM_LN" |
|
fi |
|
done |
|
if [ "$(readrealpath "$RUNIMAGE_LW")" != "$LWRUN" ] |
|
then |
|
info_msg "Update runimage link..." |
|
mkdir -p "$LWBIN_DIR" |
|
ln -sf "$LWRUN" "$RUNIMAGE_LW" |
|
ln -sf "$LWRUN" "$HBIN_DIR/runimage-lw" |
|
fi |
|
XTERM_LN="$LWBIN_DIR/xterm" |
|
if [ "$(readrealpath "$XTERM_LN")" != "$LWRUN" ] |
|
then |
|
mkdir -p "$LWBIN_DIR" |
|
ln -sf "$LWRUN" "$XTERM_LN" |
|
fi |
|
LWRAP_LN="$LWBIN_DIR/lwrap" |
|
if [ "$(readrealpath "$LWRAP_LN")" != "$LWRUN" ] |
|
then |
|
mkdir -p "$LWBIN_DIR" |
|
ln -sf "$LWRUN" "$LWRAP_LN" |
|
fi |
|
} |
|
if [[ "$RUNSRC" =~ "lwrun" && -f "$REALRUNSRC" && "$LWLN_ONLY" != 1 && \ |
|
"$REALRUNSRC" != "$LWRUN" && ! "${REALRUNSRC,,}" =~ .*/(run$|cdrom/lwrun|sr[0-9]/lwrun)$ && \ |
|
! "$REALRUNSRC" =~ ^/(usr/bin|bin|opt)/lwrun$ ]] |
|
then |
|
info_msg "Installing lwrun..." |
|
mkdir -p "$LWBIN_DIR" |
|
if mv_lwrun "$REALRUNSRC" "$LWRUN" |
|
then |
|
ln_lwrun |
|
info_msg "lwrun installed!" |
|
try_shutdown_lw && \ |
|
return 0||return 1 |
|
else |
|
error_msg "Failed to install lwrun!" |
|
is_lwrun && \ |
|
return 1||exit 1 |
|
fi |
|
elif [[ "$REALRUNSRC" != "$(readrealpath "$LWRUN")" ]] && \ |
|
[[ "${REALRUNSRC,,}" =~ .*/(run|cdrom.*/lwrun|sr[0-9]/lwrun)$ ||\ |
|
"$REALRUNSRC" =~ ^/(usr/bin|bin|opt)/lwrun$ ||\ |
|
"$RUNSRC" =~ .*/RunDir/lwrun$ || "$LWLN_ONLY" == 1 ]] |
|
then |
|
mkdir -p "$LWBIN_DIR" |
|
ln -sf "$REALRUNSRC" "$LWRUN" |
|
ln_lwrun |
|
[ "$LWLN_ONLY" != 1 ] && \ |
|
return 0||exit |
|
fi |
|
} |
|
|
|
uninstall_lw() { |
|
if [ "$1" == "force" ] || is_lw || is_lwrun |
|
then |
|
info_msg "Removing Lux Wine..." |
|
rm -f "$HSTEAM_DESKF" |
|
rm -rf "$MENU_APPS_DIR/LuxWine" |
|
rm -rf "$HOME_DESK_DIRS/LuxWine"* |
|
rm -f "$HOME/.config/menus/applications-merged/LuxWine.menu" |
|
rm -rf "$HOME/.local/share/kservices5/ServiceMenus/LuxWine"* |
|
rm -rf "$HOME/.local/share/kio/servicemenus/LuxWine"* |
|
rm -f "$OLDLWRAP" |
|
rm -f "$LWBIN_DIR/lux-wine" |
|
rm -f "$LWBIN_DIR/bash" |
|
rm -f "$LWBIN_DIR/lwexec" |
|
rm -f "$HBIN_DIR/lwrap" |
|
if [ "$1" == "update" ] |
|
then |
|
rm -rf "$LW_DIR/db" |
|
rm -rf "$LW_DIR/gif" |
|
rm -rf "$LW_DIR/icons" |
|
rm -rf "$LW_DIR/themes" |
|
rm -f "$LW_DIR/LICENSE" |
|
rm -f "$LW_DIR/.lwcfgchksum" |
|
rm -rf "$LW_DIR/registry_patch" |
|
else |
|
chmod u+rw -R "$LWBIN_DIR/overlayfs/lux-wine/workdir" 2>/dev/null |
|
rm -rf "$LW_DIR" |
|
rm -rf "$HOME/LuxWine" |
|
rm -rf "$LWRUN_LN" |
|
rm -rf "$HBIN_DIR/runimage-lw" |
|
rm -rf "$MENU_APPS_DIR/LuxWine"* |
|
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 |
|
} |
|
|
|
is_lw() { [ -f "$MENU_APPS_DIR/LuxWine/LuxWine.desktop" ] ; } |
|
|
|
is_old_lw() { [ -x "$LWBIN_DIR/lux-wine" ] ; } |
|
|
|
is_lwrun() { [ -x "$LWRUN" ] ; } |
|
|
|
install_lw() { |
|
TMP_LW="/tmp/lux-wine.$RANDOM" |
|
if [ -d "/opt/lwrap" ] |
|
then |
|
info_msg "Installing Lux Wine..." |
|
(mkdir -p "$TMP_LW" && \ |
|
cp -rf "/opt/lwrap"/!(runtime.tar.zst|prefix_backups) "$TMP_LW" && \ |
|
cd "$TMP_LW" && \ |
|
make_install "$1" |
|
[ -d "$TMP_LW" ] && rm -rf "$TMP_LW") |
|
fi |
|
if is_lw |
|
then info_msg "Lux Wine installed!" |
|
else |
|
error_msg "Failed to install Lux Wine!" |
|
exit 1 |
|
fi |
|
} |
|
|
|
try_dl_lwrun() { |
|
try_dllwrun_mirror() { |
|
local GIT_LWRUN_VERSION='continuous' |
|
local GIT_LWRUN="https://github.com/VHSgunzo/lwrun/releases" |
|
local GIT_HF_LWRUN="https://huggingface.co/lux-wine/lwrun/resolve/main/releases" |
|
local YC_LWRUN="https://storage.yandexcloud.net/lwrun" |
|
local lwrunurl=( |
|
"$YC_LWRUN/releases/$GIT_LWRUN_VERSION/lwrun" |
|
"$GIT_HF_LWRUN/$GIT_LWRUN_VERSION/lwrun" |
|
"$GIT_LWRUN/download/$GIT_LWRUN_VERSION/lwrun" |
|
) |
|
for url in "${lwrunurl[@]}" |
|
do |
|
try_dl "$url" "$TMP_LWRUN" && \ |
|
return 0 |
|
done |
|
return 1 |
|
} |
|
local ret=1 |
|
TMP_LWRUN="$LW_DIR/tmp/lwrun" |
|
info_msg "Downloading lwrun..." |
|
if try_dllwrun_mirror |
|
then |
|
info_msg "lwrun downloaded!" |
|
chmod +x "$TMP_LWRUN" |
|
exec "$TMP_LWRUN" |
|
ret=0 |
|
else |
|
error_msg "Failed to download lwrun!" |
|
[ -f "$TMP_LWRUN" ] && \ |
|
rm -rf "$TMP_LWRUN"* |
|
exit 1 |
|
fi |
|
return $ret |
|
} |
|
|
|
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 lux-wine|grep -E "$LWSRC|$LW_DIR/bin/lux-wine"|grep -v grep)" ] |
|
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 |
|
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_lwrun() ( |
|
local ret=1 |
|
if is_update "RunImage" "Do you want to check updates for RunImage packages?" |
|
then |
|
mkdir -p "$LWBIN_DIR" |
|
date '+%y.%m.%d.%H%M%S' > "$PKGUPDFL" |
|
[ "$NOT_TERM" == 1 ] && \ |
|
IN_TERM=( |
|
"xterm" "-fa" "Monospace" |
|
"-fs" "11" "-geometry" "130x45" |
|
"-bg" "black" "-fg" "white" \ |
|
"-T" "Updating RunImage packages..." "-e" |
|
)||unset IN_TERM |
|
HOSTEXEC_ARGS=(hostexec env RIM_RUN_IN_ONE=0) |
|
"${HOSTEXEC_ARGS[@]}" ls "$RUNIMAGE_LW" &>/dev/null||\ |
|
"${HOSTEXEC_ARGS[@]}" LWLN_ONLY=1 "$RUNSRC" |
|
if mountpoint -q /usr/share/icons |
|
then HOSTEXEC_ARGS+=(LWRUN_UPDATE=1 "$RUNIMAGE_LW") |
|
else unset HOSTEXEC_ARGS |
|
fi |
|
"${HOSTEXEC_ARGS[@]}" "${IN_TERM[@]}" rim-update |
|
ret="$?" |
|
fi |
|
return $ret |
|
) |
|
|
|
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 |
|
WGET_ARGS=(--no-check-certificate --content-disposition -t 3 -T 5 -w 0.5 "$URL" -O "$FILEDIR/$FILENAME") |
|
[ ! -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 |
|
} |
|
dl_progress_pulsate() { |
|
local ret=1 |
|
[[ "$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 |
|
local yad_args=( |
|
--progress --pulsate --text="Download:\t$FILENAME\n$URL" |
|
--width=650 --height=40 --undecorated --skip-taskbar |
|
--no-buttons --text-align center --auto-close --auto-kill |
|
--center --fixed --on-top --no-escape --selectable-labels |
|
) |
|
"$@" & |
|
local exec_pid="$!" |
|
if [[ -n "$exec_pid" && -d "/proc/$exec_pid" ]] |
|
then |
|
(while [ -d "/proc/$exec_pid" ] |
|
do echo -e "#\n" ; sleep 0.1 2>/dev/null |
|
done)|yad "${yad_args[@]}" &>/dev/null & |
|
local yad_pid="$!" |
|
wait "$exec_pid" &>/dev/null |
|
ret="$?" |
|
kill "$yad_pid" &>/dev/null |
|
fi |
|
elif is_exe_exist zenity |
|
then |
|
"$@"|zenity --progress --pulsate --text="$URL" --width=650 --height=40 \ |
|
--auto-close --no-cancel --title="Download: $FILENAME" |
|
ret="$?" |
|
fi |
|
return "$ret" |
|
} |
|
if [ "$NO_ARIA2C" != 1 ] && \ |
|
is_exe_exist aria2c |
|
then |
|
aria2c --no-conf -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 curl |
|
then |
|
curl -R --progress-bar --insecure --fail -L "$URL" -o \ |
|
"$FILEDIR/$FILENAME" |& tr '\r' '\n'|sed '0,/100/{/100/d;}'|\ |
|
sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g'|\ |
|
dl_progress |
|
elif is_exe_exist wget2 |
|
then |
|
dl_progress_pulsate wget2 "${WGET_ARGS[@]}" |
|
elif is_exe_exist wget |
|
then |
|
wget "${WGET_ARGS[@]}"|& 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 |
|
else |
|
err_no_downloader |
|
fi |
|
dl_ret "${PIPESTATUS[0]}"||return 1 |
|
else |
|
if [ "$NO_ARIA2C" != 1 ] && is_exe_exist aria2c |
|
then |
|
aria2c --no-conf -R -x 13 -s 13 --allow-overwrite -d "$FILEDIR" -o "$FILENAME" "$URL" |
|
elif is_exe_exist curl |
|
then |
|
curl -R --progress-bar --insecure --fail -L "$URL" -o "$FILEDIR/$FILENAME" |
|
elif is_exe_exist wget2 |
|
then |
|
wget2 -q --force-progress "${WGET_ARGS[@]}" |
|
elif is_exe_exist wget |
|
then |
|
wget -q --show-progress "${WGET_ARGS[@]}" |
|
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 |
|
} |
|
|
|
rm_broken_link() { find -L "$1" -type l -exec rm -rf {} \; 2>/dev/null ; } |
|
|
|
try_update_old_lwrun() { |
|
if [ "$RUNIMAGE_VERSION" == '0.39.1' ] |
|
then |
|
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" |
|
) |
|
"${HOSTEXEC_IN_TERM[@]}" hostexec ptyspawn importenv '$RUNPID' \ |
|
env DONT_NOTIFY=1 NO_RPIDSMON=1 RIM_CMPRS_LVL=22 RIM_UPDATE_CLEANUP=1 \ |
|
"$RUNIMAGE_LW" "$@" |
|
} |
|
info_msg "Checking the lwrun update..." |
|
if runimage_lw --rU |
|
then FORCE_UPDATE=1 try_shutdown_lw |
|
fi |
|
date '+%y.%m.%d.%H%M%S' > "$PKGUPDFL" |
|
return 1 |
|
fi |
|
} |
|
|
|
print_help() { |
|
echo -e " |
|
${RED}Usage: |
|
$RED┌──[$GREEN$RUNUSER$YELLOW@$BLUE${RUNHOSTNAME}$RED]─[$GREEN$PWD$RED] |
|
$RED└──╼ \$$GREEN lwrap ${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 |
|
" |
|
} |
|
|
|
case "$1" in |
|
--lwrap-help) print_help ; exit ;; |
|
--uninstall ) uninstall_lw "$2" ; exit $? ;; |
|
esac |
|
|
|
if [ "$INSIDE_RUNIMAGE" == 1 ] |
|
then |
|
case "$1" in |
|
--install ) try_install_lwrun |
|
install_lw "$2" |
|
try_update_old_lwrun |
|
exit $? ;; |
|
--update ) FORCE_UPDATE=1 |
|
update_lwrun |
|
exit $? ;; |
|
esac |
|
try_install_lwrun |
|
(! is_lw || is_old_lw) && install_lw |
|
if [[ "$CHK_UPDATE" != 0 || "$FORCE_UPDATE" == 1 ]] && \ |
|
is_net_conn |
|
then |
|
if [[ ! -f "$(find "$PKGUPDFL" -mtime -$CHK_UPDATE \ |
|
-print 2>/dev/null)" || "$FORCE_UPDATE" == 1 ]] |
|
then update_lwrun && exit $? |
|
fi |
|
fi |
|
exec "$LWSRC" "$@" |
|
else |
|
if [ -x "$LWRUN" ] |
|
then exec "$LWRUN" "$@" |
|
elif is_net_conn |
|
then try_dl_lwrun |
|
else |
|
error_msg "lwrun not found, download and install it first!" |
|
exit 1 |
|
fi |
|
fi |
|
exit $? |
|
|