#!/bin/bash ## Copyright © 2018-2021 Bret Human ## https://cynop.me/ ## ## Documentation at: ## https://mage.cynop.me/en/st34m ## https://psi.cynop.me/Caffarius/st34m/ ## ## For questions or comments write: ## info@cynop.me ##################################################################### # st34m script_ver="1.0.2" page="https://mage.cynop.me/en/st34m" # author: Bret Human # date: Dec 10, 2018 # ##################################################################### # # A wrapper for wrappers, used to manage Steam and Proton in a Linux # environment. # # Extra handy for running Steam under a secondary account for # added security. Can be used for lots of zany wine/proton needs. # # This is the first of two scripts. It is meant to be the sanitizer # crew and the firing squad for st34m-run. st34m-run must be installed. # # Install st34m-run for your desired user with: # ./st34m.sh -u username -i # # Then you can launch steam via: # ./st34m.sh -u username # # Or I guess you could manually download the script from: dl_addr="https://psi.cynop.me/Caffarius/st34m/raw/branch/master/st34m-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="Steam" run_cmd="st34m-run.sh" check_wait="3" usage="st34m, version ${script_ver} Usage: ./`basename ${0}` -g (game) -u (user) -dvkptcrhi -g | Launches the game of your choice -u | Runs ${app_name} as the user specified -d | Debug messages on (turns verbose on) -v | Verbose messages on -k | Kill all processes for a user (not current user or root) -p | Runs protontricks -t | Attempts to launch to the system tray -c | Launch a console session as specified user (can launch Xapps) -r | Launch steam-runtime instead of steam-native -h | Help (this message) -i | Install the st34m-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 # Don't allow crash reports mkdir -p /tmp/dumps sudo chown root: /tmp/dumps sudo chmod 700 /tmp/dumps ## Define our functions function refresh { app_dir="/home/${runas_user}/.script/" app_check="ps -ef | grep ${runas_user} | grep steam | 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 dl_addr unset runas_user unset app_name unset app_check unset app_debug unset app_verbose unset app_dir unset run_cmd unset check_wait unset usage unset launch_opt # 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 sudo rm -rf /tmp/dumps 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 } function check { debug "check" refresh 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:dDvVkKpPtTnNcCrRhHiI" option; do case "${option}" in "k"|"K") die 0;; "g"|"G") launch_opt="${launch_opt} -g ${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 ;; "p"|"P") inform "Protontricks mode" launch_opt="${launch_opt} -p" ;; "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") inform "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 ;; "r"|"R") inform "Runtime mode requested" launch_opt="${launch_opt} -r" ;; "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