2023-12-25 05:00:08 +08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
EXE="" #"./hl2.sh"
|
|
|
|
APP_ID="" #480
|
|
|
|
EXE_RUN_DIR="" #"$(dirname ${0})"
|
|
|
|
STEAM_RUNTIME="" #"./steam_runtime/run.sh"
|
|
|
|
EXE_COMMAND_LINE=()
|
|
|
|
|
|
|
|
LDR_FILE_EXE="ldr_exe.txt"
|
|
|
|
LDR_FILE_APP_ID="ldr_appid.txt"
|
|
|
|
LDR_FILE_EXE_RUN_DIR="ldr_cwd.txt"
|
|
|
|
LDR_FILE_STEAM_RUNTIME="ldr_steam_rt.txt"
|
|
|
|
LDR_FILE_EXE_COMMAND_LINE="ldr_cmd.txt"
|
|
|
|
|
|
|
|
# MUST be beside this script
|
|
|
|
STEAM_CLIENT_SO=steamclient.so
|
|
|
|
STEAM_CLIENT64_SO=steamclient64.so
|
|
|
|
|
|
|
|
script_dir=$( cd -- "$( dirname -- "${0}" )" &> /dev/null && pwd )
|
|
|
|
steam_base_dir="$( echo ~/.steam )"
|
|
|
|
|
|
|
|
function help_page () {
|
|
|
|
echo;
|
|
|
|
echo "Command line arguments:"
|
|
|
|
echo " -exe: path to the executable"
|
|
|
|
echo " -appid: numeric app ID"
|
|
|
|
echo " -cwd: (optional) working directory to switch to when running the executable"
|
|
|
|
echo " -rt: (optional) path to Steam runtime script"
|
|
|
|
echo " ex1: $steam_base_dir/debian-installation/ubuntu12_64/steam-runtime-heavy.sh"
|
|
|
|
echo " ex2: $steam_base_dir/debian-installation/ubuntu12_64/steam-runtime-heavy/run.sh"
|
|
|
|
echo " ex3: $steam_base_dir/debian-installation/ubuntu12_32/steam-runtime/run.sh"
|
|
|
|
echo " ex4: $steam_base_dir/steam_runtime/run.sh"
|
|
|
|
echo " --: everything after these 2 dashes will be passed directly to the executable"
|
|
|
|
echo;
|
|
|
|
echo "note that any unknown args will be passed to the executable"
|
|
|
|
echo;
|
|
|
|
echo "Additionally, you can set these values in the equivalent configuration files, everything on a single line for each file:"
|
|
|
|
echo " "$LDR_FILE_EXE": specify the executable path in this file"
|
|
|
|
echo " "$LDR_FILE_APP_ID": specify the app ID in this file"
|
|
|
|
echo " "$LDR_FILE_EXE_RUN_DIR": specify the working directory of the executable path in this file"
|
|
|
|
echo " "$LDR_FILE_STEAM_RUNTIME": specify the path of the Steam runtime script in this file"
|
|
|
|
echo " "$LDR_FILE_EXE_COMMAND_LINE": specify aditional arguments that will be passed to the executable in this file,"
|
|
|
|
echo " this file has the exception that the arguments must be specified on separate lines"
|
|
|
|
echo;
|
|
|
|
echo "Command line arguments will override the values in the configuration files,"
|
|
|
|
echo "with an exception for the arguments passed to the executable, both specified"
|
|
|
|
echo "in the cofiguration file and via command line will be passed to the executable"
|
|
|
|
echo;
|
|
|
|
}
|
|
|
|
|
|
|
|
# mandatory checks
|
|
|
|
if [[ ! -f "$script_dir/${STEAM_CLIENT_SO}" ]]; then
|
|
|
|
echo "'$STEAM_CLIENT_SO' must be placed beside this script"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
if [ ! -f "$script_dir/${STEAM_CLIENT64_SO}" ]; then
|
|
|
|
echo "'$STEAM_CLIENT64_SO' must be placed beside this script"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# no args = help page
|
|
|
|
if [[ $# = 0 ]]; then
|
2023-12-27 05:53:50 +08:00
|
|
|
echo "[?] No arguments provided"
|
2023-12-25 05:00:08 +08:00
|
|
|
help_page
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
# try to load from config files first
|
|
|
|
# unfortunately we need eval to expand stuff like ~/my_path
|
|
|
|
if [[ -f "$script_dir/$LDR_FILE_EXE" ]]; then
|
|
|
|
read -r -s EXE < "$script_dir/$LDR_FILE_EXE"
|
|
|
|
[[ ! -z "$EXE" ]] && EXE="$(eval echo "$EXE")"
|
|
|
|
fi
|
|
|
|
if [[ -f "$script_dir/$LDR_FILE_APP_ID" ]]; then
|
|
|
|
read -r -s APP_ID < "$script_dir/$LDR_FILE_APP_ID"
|
|
|
|
fi
|
|
|
|
if [[ -f "$script_dir/$LDR_FILE_EXE_RUN_DIR" ]]; then
|
|
|
|
read -r -s EXE_RUN_DIR < "$script_dir/$LDR_FILE_EXE_RUN_DIR"
|
|
|
|
[[ ! -z "$EXE_RUN_DIR" ]] && EXE_RUN_DIR="$(eval echo "$EXE_RUN_DIR")"
|
|
|
|
fi
|
|
|
|
if [[ -f "$script_dir/$LDR_FILE_STEAM_RUNTIME" ]]; then
|
|
|
|
read -r -s STEAM_RUNTIME < "$script_dir/$LDR_FILE_STEAM_RUNTIME"
|
|
|
|
[[ ! -z "$STEAM_RUNTIME" ]] && STEAM_RUNTIME="$(eval echo "$STEAM_RUNTIME")"
|
|
|
|
fi
|
|
|
|
if [[ -f "$script_dir/$LDR_FILE_EXE_COMMAND_LINE" ]]; then
|
|
|
|
EXTRA_EXE_COMMAND_LINE=()
|
|
|
|
readarray -t EXTRA_EXE_COMMAND_LINE < "$script_dir/$LDR_FILE_EXE_COMMAND_LINE"
|
|
|
|
for arg in "${EXTRA_EXE_COMMAND_LINE[@]}"; do
|
|
|
|
arg="$(eval echo "$arg")"
|
|
|
|
EXE_COMMAND_LINE+=("$arg")
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
# then read command line args
|
|
|
|
i=1 # 0 is script path
|
|
|
|
for (( ; i<=$#; i++ )); do
|
|
|
|
var="${!i}"
|
|
|
|
if [[ "$var" = "-exe" ]]; then
|
|
|
|
i=$((i+1))
|
|
|
|
EXE="${!i}"
|
|
|
|
elif [[ "$var" = "-appid" ]]; then
|
|
|
|
i=$((i+1))
|
|
|
|
APP_ID="${!i}"
|
|
|
|
elif [[ "$var" = "-cwd" ]]; then
|
|
|
|
i=$((i+1))
|
|
|
|
EXE_RUN_DIR="${!i}"
|
|
|
|
elif [[ "$var" = "-rt" ]]; then
|
|
|
|
i=$((i+1))
|
|
|
|
STEAM_RUNTIME="${!i}"
|
|
|
|
elif [[ "$var" = "--" ]]; then # stop processing args, everything else is passed to app
|
|
|
|
i=$((i+1))
|
|
|
|
break
|
|
|
|
else # pass unknown args to app
|
|
|
|
EXE_COMMAND_LINE+=("$var")
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# extra args after '--' will be processed here
|
|
|
|
for (( ; i<=$#; i++ )); do
|
|
|
|
EXE_COMMAND_LINE+=("${!i}")
|
|
|
|
done
|
|
|
|
|
|
|
|
# sanity checks
|
|
|
|
# prepending the script dir helps sudo users when for example EXE=./mygame
|
|
|
|
[[ -f "$EXE" ]] || EXE="$script_dir/$EXE"
|
|
|
|
if [[ ! -f "$EXE" ]]; then
|
2023-12-27 05:53:50 +08:00
|
|
|
echo "[X] executable '$EXE' is invalid" >&2
|
2023-12-25 05:00:08 +08:00
|
|
|
help_page
|
|
|
|
exit 1
|
|
|
|
fi
|
2023-12-27 05:53:50 +08:00
|
|
|
# change to absolute path
|
|
|
|
EXE="$( cd -- "$( dirname "$EXE" )" 2> /dev/null && pwd )/$( basename "$EXE" )"
|
|
|
|
|
|
|
|
if [[ ! "$APP_ID" =~ ^[0-9]+$ ]]; then
|
|
|
|
echo "[X] app ID '$APP_ID' is invalid" >&2
|
2023-12-25 05:00:08 +08:00
|
|
|
help_page
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
# use the exe's dir if non-specified
|
|
|
|
[[ -z "$EXE_RUN_DIR" ]] && EXE_RUN_DIR="$(dirname "$EXE")"
|
|
|
|
if [[ ! -d "$EXE_RUN_DIR" ]]; then
|
2023-12-27 05:53:50 +08:00
|
|
|
echo "[X] executable working directory '$EXE_RUN_DIR' is invalid" >&2
|
2023-12-25 05:00:08 +08:00
|
|
|
help_page
|
|
|
|
exit 1
|
|
|
|
fi
|
2023-12-27 05:53:50 +08:00
|
|
|
if [[ ! -z "$STEAM_RUNTIME" ]]; then
|
|
|
|
if [[ ! -f "$STEAM_RUNTIME" ]]; then
|
|
|
|
echo "[X] Steam runtime script was set '$STEAM_RUNTIME', but the file was not found" >&2
|
|
|
|
help_page
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
# change to absolute path
|
|
|
|
STEAM_RUNTIME="$( cd -- "$( dirname "$STEAM_RUNTIME" )" 2> /dev/null && pwd )/$( basename "$STEAM_RUNTIME" )"
|
2023-12-25 05:00:08 +08:00
|
|
|
fi
|
|
|
|
|
|
|
|
# print everything
|
|
|
|
echo EXE = "'$EXE'"
|
|
|
|
echo APP_ID = $APP_ID
|
|
|
|
echo EXE_RUN_DIR = "'$EXE_RUN_DIR'"
|
|
|
|
|
|
|
|
if [[ -z "$STEAM_RUNTIME" ]]; then
|
|
|
|
echo "STEAM_RUNTIME was not set"
|
|
|
|
else
|
|
|
|
echo STEAM_RUNTIME = "'$STEAM_RUNTIME'"
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo EXE_COMMAND_LINE = "${EXE_COMMAND_LINE[@]}"
|
|
|
|
|
|
|
|
# prepare the required dirs
|
|
|
|
if [[ ! -d "$steam_base_dir/sdk32" ]]; then
|
|
|
|
mkdir -p "$steam_base_dir/sdk32"
|
|
|
|
fi
|
|
|
|
if [[ ! -d "$steam_base_dir/sdk64" ]]; then
|
|
|
|
mkdir -p "$steam_base_dir/sdk64"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# restore earlier backup, we do this here because the user may have crashed the script in an earlier run
|
|
|
|
# before it could restore the backup at the last stage
|
|
|
|
if [ -f "$steam_base_dir/steam.pid.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/steam.pid.orig" "$steam_base_dir/steam.pid"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk32/steamclient.so.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk32/steamclient.so.orig" "$steam_base_dir/sdk32/steamclient.so"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk64/steamclient.so.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk64/steamclient.so.orig" "$steam_base_dir/sdk64/steamclient.so"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# make a backup of original files
|
|
|
|
if [ -f "$steam_base_dir/steam.pid" ]; then
|
|
|
|
mv -f "$steam_base_dir/steam.pid" "$steam_base_dir/steam.pid.orig"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk32/steamclient.so" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk32/steamclient.so" "$steam_base_dir/sdk32/steamclient.so.orig"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk64/steamclient.so" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk64/steamclient.so" "$steam_base_dir/sdk64/steamclient.so.orig"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# copy our files
|
|
|
|
cp -f "$script_dir/$STEAM_CLIENT_SO" "$steam_base_dir/sdk32/steamclient.so"
|
|
|
|
cp -f "$script_dir/$STEAM_CLIENT64_SO" "$steam_base_dir/sdk64/steamclient.so"
|
|
|
|
echo ${$} > "$steam_base_dir/steam.pid"
|
|
|
|
|
|
|
|
# set variables and run the app
|
|
|
|
pushd "${EXE_RUN_DIR}"
|
|
|
|
|
2023-12-27 05:53:50 +08:00
|
|
|
TARGET_EXE="$EXE"
|
|
|
|
if [ ! -z "${STEAM_RUNTIME}" ]; then
|
|
|
|
TARGET_EXE="$STEAM_RUNTIME"
|
|
|
|
EXE_COMMAND_LINE=(
|
|
|
|
"$EXE"
|
|
|
|
"${EXE_COMMAND_LINE[@]}"
|
|
|
|
)
|
2023-12-25 05:00:08 +08:00
|
|
|
fi
|
|
|
|
|
2023-12-27 05:53:50 +08:00
|
|
|
SteamAppPath="${EXE_RUN_DIR}" SteamAppId=$APP_ID SteamGameId=$APP_ID SteamOverlayGameId=$APP_ID "$TARGET_EXE" "${EXE_COMMAND_LINE[@]}"
|
|
|
|
|
2023-12-25 05:00:08 +08:00
|
|
|
popd
|
|
|
|
|
|
|
|
#restore backup
|
|
|
|
if [ -f "$steam_base_dir/steam.pid.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/steam.pid.orig" "$steam_base_dir/steam.pid"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk32/steamclient.so.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk32/steamclient.so.orig" "$steam_base_dir/sdk32/steamclient.so"
|
|
|
|
fi
|
|
|
|
if [ -f "$steam_base_dir/sdk64/steamclient.so.orig" ]; then
|
|
|
|
mv -f "$steam_base_dir/sdk64/steamclient.so.orig" "$steam_base_dir/sdk64/steamclient.so"
|
|
|
|
fi
|
|
|
|
|