diff --git a/ArchiSteamFarm/Program.cs b/ArchiSteamFarm/Program.cs index cabf319fd..161b57c09 100644 --- a/ArchiSteamFarm/Program.cs +++ b/ArchiSteamFarm/Program.cs @@ -417,16 +417,33 @@ namespace ArchiSteamFarm { foreach (string arg in args) { switch (arg) { case "": + break; case "--path": + if (cryptKeyNext) { + goto default; + } + // Not handled in PostInit break; case "--cryptkey": + if (cryptKeyNext) { + goto default; + } + cryptKeyNext = true; break; case "--server": + if (cryptKeyNext) { + goto default; + } + IPC.Start(); break; case "--service": + if (cryptKeyNext) { + goto default; + } + ServiceMode = true; break; default: @@ -455,12 +472,21 @@ namespace ArchiSteamFarm { foreach (string arg in args) { switch (arg) { case "": + break; case "--cryptkey": case "--server": case "--service": + if (pathNext) { + goto default; + } + // Not handled in PreInit break; case "--path": + if (pathNext) { + goto default; + } + pathNext = true; break; default: diff --git a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm-Service.sh b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm-Service.sh index c36568765..ffea96a2e 100755 --- a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm-Service.sh +++ b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm-Service.sh @@ -5,31 +5,65 @@ CONFIG_PATH="config/ASF.json" cd "$(dirname "$(readlink -f "$0")")" -if [[ -z "${ASF_ARGS-}" ]]; then - ASF_ARGS="" +SCRIPT_DIR="$(pwd)" +SCRIPT_PATH="${SCRIPT_DIR}/${0}" + +BINARY="${SCRIPT_DIR}/ArchiSteamFarm.dll" +BINARY_ARGS=() + +PATH_NEXT=0 + +PARSE_ARG() { + BINARY_ARGS+=("$1") + + case "$1" in + --cryptkey|--server|--service) ;; + --path) PATH_NEXT=1 ;; + --path=*) cd "$(echo "$1" | cut -d '=' -f 2-)" ;; + *) + if [[ "$PATH_NEXT" -eq 1 ]]; then + PATH_NEXT=0 + cd "$1" + fi + esac +} + +if [[ -n "${ASF_ARGS-}" ]]; then + for ARG in $ASF_ARGS; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi + done fi -ASF_ARGS+=" $*" - -for ARG in $ASF_ARGS; do - case "$ARG" in - --path=*) CONFIG_PATH="$(echo "$ARG" | cut -d '=' -f 2-)/${CONFIG_PATH}" ;; - esac +for ARG in "$@"; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi done +CONFIG_PATH="$(pwd)/${CONFIG_PATH}" + # Kill underlying ASF process on shell process exit trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM +if ! hash dotnet 2>/dev/null; then + echo "ERROR: dotnet CLI tools are not installed!" + exit 1 +fi + +dotnet --info + while :; do if [[ -f "$CONFIG_PATH" ]] && grep -Eq '"Headless":\s+?true' "$CONFIG_PATH"; then # We're running ASF in headless mode so we don't need STDIN - dotnet ArchiSteamFarm.dll $ASF_ARGS & # Start ASF in the background, trap will work properly due to non-blocking call + dotnet "$BINARY" "${BINARY_ARGS[@]}" & # Start ASF in the background, trap will work properly due to non-blocking call wait $! # This will forward dotnet error code, set -e will abort the script if it's non-zero else # We're running ASF in non-headless mode, so we need STDIN to be operative - dotnet ArchiSteamFarm.dll $ASF_ARGS # Start ASF in the foreground, trap sadly won't work until process exit + dotnet "$BINARY" "${BINARY_ARGS[@]}" # Start ASF in the foreground, trap sadly won't work until process exit fi - chmod +x "$0" # If ASF exited by itself, we need to ensure that our script is still set to +x after auto-update + chmod +x "$SCRIPT_PATH" # If ASF exited by itself, we need to ensure that our script is still set to +x after auto-update sleep 1 done diff --git a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.cmd b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.cmd index 81681892f..05fc58eac 100755 --- a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.cmd +++ b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.cmd @@ -4,4 +4,6 @@ pushd %~dp0 SETLOCAL SET ASF_ARGS=%ASF_ARGS% %* +dotnet --info + dotnet ArchiSteamFarm.dll %ASF_ARGS% diff --git a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.sh b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.sh index 19a36e719..62af659d6 100755 --- a/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.sh +++ b/ArchiSteamFarm/scripts/generic/ArchiSteamFarm.sh @@ -5,28 +5,62 @@ CONFIG_PATH="config/ASF.json" cd "$(dirname "$(readlink -f "$0")")" -if [[ -z "${ASF_ARGS-}" ]]; then - ASF_ARGS="" +SCRIPT_DIR="$(pwd)" +SCRIPT_PATH="${SCRIPT_DIR}/${0}" + +BINARY="${SCRIPT_DIR}/ArchiSteamFarm.dll" +BINARY_ARGS=() + +PATH_NEXT=0 + +PARSE_ARG() { + BINARY_ARGS+=("$1") + + case "$1" in + --cryptkey|--server|--service) ;; + --path) PATH_NEXT=1 ;; + --path=*) cd "$(echo "$1" | cut -d '=' -f 2-)" ;; + *) + if [[ "$PATH_NEXT" -eq 1 ]]; then + PATH_NEXT=0 + cd "$1" + fi + esac +} + +if [[ -n "${ASF_ARGS-}" ]]; then + for ARG in $ASF_ARGS; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi + done fi -ASF_ARGS+=" $*" - -for ARG in $ASF_ARGS; do - case "$ARG" in - --path=*) CONFIG_PATH="$(echo "$ARG" | cut -d '=' -f 2-)/${CONFIG_PATH}" ;; - esac +for ARG in "$@"; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi done +CONFIG_PATH="$(pwd)/${CONFIG_PATH}" + # Kill underlying ASF process on shell process exit trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM +if ! hash dotnet 2>/dev/null; then + echo "ERROR: dotnet CLI tools are not installed!" + exit 1 +fi + +dotnet --info + if [[ -f "$CONFIG_PATH" ]] && grep -Eq '"Headless":\s+?true' "$CONFIG_PATH"; then # We're running ASF in headless mode so we don't need STDIN - dotnet ArchiSteamFarm.dll $ASF_ARGS & # Start ASF in the background, trap will work properly due to non-blocking call + dotnet "$BINARY" "${BINARY_ARGS[@]}" & # Start ASF in the background, trap will work properly due to non-blocking call wait $! # This will forward dotnet error code, set -e will abort the script if it's non-zero else # We're running ASF in non-headless mode, so we need STDIN to be operative - dotnet ArchiSteamFarm.dll $ASF_ARGS # Start ASF in the foreground, trap won't work until process exit + dotnet "$BINARY" "${BINARY_ARGS[@]}" # Start ASF in the foreground, trap won't work until process exit fi -chmod +x "$0" # If ASF exited by itself, we need to ensure that our script is still set to +x after auto-update +chmod +x "$SCRIPT_PATH" # If ASF exited by itself, we need to ensure that our script is still set to +x after auto-update diff --git a/run.sh b/run.sh index d540368dc..711bfed89 100755 --- a/run.sh +++ b/run.sh @@ -1,25 +1,48 @@ #!/bin/bash set -eu -PROJECT="ArchiSteamFarm" -OUT="out/source" - CONFIG_PATH="config/ASF.json" cd "$(dirname "$(readlink -f "$0")")" -if [[ -z "${ASF_ARGS-}" ]]; then - ASF_ARGS="" +SCRIPT_DIR="$(pwd)" + +BINARY="${SCRIPT_DIR}/$ArchiSteamFarm/out/source/$ArchiSteamFarm.dll" +BINARY_ARGS=() + +PATH_NEXT=0 + +PARSE_ARG() { + BINARY_ARGS+=("$1") + + case "$1" in + --cryptkey|--server|--service) ;; + --path) PATH_NEXT=1 ;; + --path=*) cd "$(echo "$1" | cut -d '=' -f 2-)" ;; + *) + if [[ "$PATH_NEXT" -eq 1 ]]; then + PATH_NEXT=0 + cd "$1" + fi + esac +} + +if [[ -n "${ASF_ARGS-}" ]]; then + for ARG in $ASF_ARGS; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi + done fi -ASF_ARGS+=" $*" - -for ARG in $ASF_ARGS; do - case "$ARG" in - --path=*) CONFIG_PATH="$(echo "$ARG" | cut -d '=' -f 2-)/${CONFIG_PATH}" ;; - esac +for ARG in "$@"; do + if [[ -n "$ARG" ]]; then + PARSE_ARG "$ARG" + fi done +CONFIG_PATH="$(pwd)/${CONFIG_PATH}" + # Kill underlying ASF process on shell process exit trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM @@ -30,13 +53,11 @@ fi dotnet --info -cd "${PROJECT}/${OUT}" - if [[ -f "$CONFIG_PATH" ]] && grep -Eq '"Headless":\s+?true' "$CONFIG_PATH"; then # We're running ASF in headless mode so we don't need STDIN - dotnet exec "${PROJECT}.dll" $ASF_ARGS & # Start ASF in the background, trap will work properly due to non-blocking call + dotnet exec "$BINARY" "${BINARY_ARGS[@]}" & # Start ASF in the background, trap will work properly due to non-blocking call wait $! # This will forward dotnet error code, set -e will abort the script if it's non-zero else # We're running ASF in non-headless mode, so we need STDIN to be operative - dotnet exec "${PROJECT}.dll" $ASF_ARGS # Start ASF in the foreground, trap won't work until process exit + dotnet exec "$BINARY" "${BINARY_ARGS[@]}" # Start ASF in the foreground, trap won't work until process exit fi