#!/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.1" 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 -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:dDvVkKsSbBwWtTnNcChHxXiI" 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" ;; "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