bn3t/bn3t.sh

323 lines
9.4 KiB
Bash

#!/bin/bash
## Copyright © 2018 Bret Human
## https://cynicaloptimist.me/
##
## Documentation at:
## https://mage.cynicaloptimist.me/en/bn3t
## https://psi.cynicaloptimist.me/Caffarius/bn3t/
##
## For questions or comments write:
## info@cynicaloptimist.me
#####################################################################
# bn3t
script_ver="0.2"
page="https://mage.cynicaloptimist.me/en/bn3t"
# author: Bret Human
# date: Dec 6, 2018
#
#####################################################################
#
# A wrapper for wrappers, used to install/manage/own a Battle.net
# installation within Wine in a Linux environment.
#
# Extra handy for running Battle.net under a secondary account for
# added security. Can be used for lots of zany wine needs, like
# spawning a multitude of Wine prefixes and installing Battle.net in
# all of them.
#
# This is the first of two scripts. It is meant to be the sanitizer
# crew and the firing squad for bn3t-run. bn3t-run must be installed.
#
# Install bn3t-run for your desired user with:
# ./bn3t.sh -u username -i
#
# Then you can prep the environment and install Battle.net via:
# ./bn3t.sh -u username -bxs
#
# Or I guess you could manually download the script from:
dl_addr="https://psi.cynicaloptimist.me/Caffarius/bn3t/raw/branch/master/bn3t-run.sh"
#####################################################################
#
# This is free software; you are free to change and redistribute it.
# There is NO WARRANTY of any kind.
#
#####################################################################
runas_user="`whoami`"
app_name="Battle.net"
run_cmd="bn3t-run.sh"
check_wait="3"
usage="bn3t, version ${script_ver}
Usage: ./`basename ${0}` -g (game) -u (user) -p (prefix) -a (arch) -dvksbwtnchxi
-g | Launches the game of your choice
-u | Runs ${app_name} as the user specified
-p | Selects the location of the Wine prefix
-a | Selects the architecture to run as (32 | 64)
-d | Debug messages on (turns verbose on)
-v | Verbose messages on
-k | Kill all processes for a user (not current user or root)
-s | Runs ${app_name} setup
-b | Runs wineboot
-w | Runs winetricks
-m | Runs Twitch Client (for /M/ods - I'm running out of letters)
-t | Attempts to launch to the system tray
-n | No BS mode - doesn't launch an app (for boot/tricks/console safety)
-c | Launch a console session as specified user (can launch Xapps)
-h | Help (this message)
-x | Force upgrade DXVK
-i | Install the bn3t-run script for the specified user - mandantory
See more documentation at: ${page}"
# Catch CTRL+C and cleanup
trap "echo '' && inform '---------------------------------' && inform 'Caught CTRL+C' && check" 2
## Define our functions
function refresh {
app_dir="/home/${runas_user}/.script/"
app_check="ps -ef | grep ${runas_user} | grep Battle.net.exe | grep -v grep"
}
function debug () {
if [ "${app_debug}" ]; then
echo "-D- ${1}"
fi
}
function inform () {
if [ "${app_verbose}" ]; then
echo "--- ${1}"
fi
}
function clean {
debug "Clean"
# Var
unset script_ver
unset page
unset runas_user
unset app_name
unset run_cmd
unset check_wait
unset usage
unset app_dir
unset app_check
unset app_debug
unset app_verbose
unset launch_opt
unset nobs_mode
unset dl_addr
# Func
unset refresh
unset debug
unset inform
unset check
}
function die () {
debug "die"
echo "Cleaning up..."
if [ "`whoami`" == "${runas_user}" ]; then
debug "Launched as original user, not killing processes"
else
if [ "${runas_user}" == "root" ]; then
debug "Root? Madness. Just removing xhost then..."
inform "`xhost -SI:localuser:"${runas_user}"`"
else
debug "Launched as ${runas_user}, killing processes"
sudo -u "${runas_user}" -- bash -c "kill -9 -1"
inform "`xhost -SI:localuser:"${runas_user}"`"
fi
fi
clean
unset clean
unset fizzle
if [ "$1" ]; then
unset die && exit $1
else
echo "...what?"
unset die && exit 5
fi
exit 5
}
function fizzle () {
debug "fizzle" # https://mtg.gamepedia.com/Fizzle
echo "Exiting..."
clean
unset clean
unset die
if [ "$1" ]; then
unset fizzle && exit $1
else
echo "...what?"
unset fizzle && exit 5
fi
exit 5
}
function check {
debug "check"
i="0"
while [ "${i}" -lt "${check_wait}" ]; do
if [ "$(eval ${app_check})" ]; then
inform "${app_name} is still running. Waiting to see if we need to murder... $[ ${check_wait} - ${i} ]"
sleep 1
else
unset i
die 0
fi
i=$[ $i + 1 ]
done
unset i
}
## Pick up any arguments provided
# None are required, we'll use default values.
launch_opt=""
while getopts ":g:G:u:U:p:P:a:A:dDvVkKsSbBwWtTnNcChHxXiImM" option; do
case "${option}" in
"k"|"K") die 0;;
"g"|"G") launch_opt="${launch_opt} -g ${OPTARG}";;
"p"|"P") launch_opt="${launch_opt} -p ${OPTARG}";;
"a"|"A") launch_opt="${launch_opt} -a ${OPTARG}";;
"d"|"D")
if [ ! "${app_debug}" ]; then # Let's not do this too much...
app_debug="y"
launch_opt=" -d${launch_opt}"
debug "Debug enabled"
if [ ! "${app_verbose}" ]; then
debug "`realpath "${0}"` version ${script_ver} running as `whoami`"
fi
app_verbose="y"
debug ""
debug "This is free software; you are free to change and redistribute it."
debug "There is NO WARRANTY of any kind."
debug ""
debug "Documentation at: ${page}"
debug ""
fi
;;
"w"|"W")
inform "Winetricks mode"
launch_opt="${launch_opt} -w"
;;
"s"|"S")
inform "Setup mode"
nobs_mode="y"
launch_opt="${launch_opt} -s"
;;
"x"|"X")
inform "Force upgrading dxvk"
launch_opt="${launch_opt} -x"
;;
"b"|"B")
inform "Wineboot mode"
launch_opt="${launch_opt} -b"
;;
"m"|"M")
inform "Twitch mode"
launch_opt="${launch_opt} -m"
;;
"n"|"N")
inform "No BS mode"
nobs_mode="y"
launch_opt="${launch_opt} -n"
;;
"c"|"C")
inform "Console requested"
nobs_mode="y"
launch_opt="${launch_opt} -c"
;;
"v"|"V")
if [ ! "${app_debug}" ]; then
if [ ! "${app_verbose}" ]; then
app_verbose="y"
inform "Verbose enabled"
inform "`realpath "${0}"` version ${script_ver} running as `whoami`"
launch_opt=" -v${launch_opt}"
fi
fi
;;
"t"|"T")
debug "Hiding to system tray"
launch_opt="${launch_opt} -t"
;;
"u"|"U")
debug "Setting user to ${OPTARG}"
runas_user="${OPTARG}"
;;
"i"|"I")
debug "User-side install requested"
refresh
if [ "`whoami`" == "${runas_user}" ]; then
debug "Running as original user, just downloading it"
mkdir -p "${app_dir}" ||
(echo "Failed to make directory ${app_dir}" && fizzle 1)
wget "${dl_addr}" -O "${app_dir}${run_cmd}" ||
(echo "Failed to download script from ${dl_addr}" && fizzle 1)
chmod 700 "${app_dir}${run_cmd}" ||
(echo "Failed to change permissions on ${app_dir}${run_cmd}" && fizzle 1)
else
debug "Running as ${runas_user}, switching and downloading"
sudo -u "${runas_user}" -- mkdir -p "${app_dir}" ||
(echo "Failed to make directory ${app_dir}" && fizzle 1)
sudo -u "${runas_user}" -- wget "${dl_addr}" -O "${app_dir}${run_cmd}" ||
(echo "Failed to download script from ${dl_addr}" && fizzle 1)
sudo -u "${runas_user}" -- chmod 700 "${app_dir}${run_cmd}" ||
(echo "Failed to change permissions on ${app_dir}${run_cmd}" && fizzle 1)
fi
echo "Installed successfully."
fizzle 0
;;
"h"|"H")
echo "${usage}"
fizzle 0
;;
* ) echo "Unknown option: -${OPTARG}"
echo "${usage}"
fizzle 1
;;
esac
done
debug "launch_opt:${launch_opt}"
## Pass our knowledge on.
refresh
debug "run_app"
if [ "`whoami`" == "${runas_user}" ]; then
debug "Launching as original user, going native"
${app_dir}${run_cmd}${launch_opt}
else
debug "Launching as ${runas_user}, checking xhost"
if [ ! "`xhost | grep ${runas_user}`" ]; then
inform "`xhost +SI:localuser:"${runas_user}"`"
fi
sudo -u "${runas_user}" -- dbus-launch ${app_dir}${run_cmd}${launch_opt}
fi
## If we still exist, clean up.
debug "Final Notice"
if [ "${app_check}" ]; then
check
fizzle 0
fi