diff --git a/README.asciidoc b/README.asciidoc index ad81caa..a6a68e3 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -211,6 +211,10 @@ instances. Downloads the update but does not apply it. Only has effect if a staging directory is set. +`cancelshutdown`:: + Cancels a pending update / shutdown / restart that was run with + the `--warn` option + `checkupdate`:: Checks if an ARK server update is available diff --git a/tools/arkmanager b/tools/arkmanager index 898dcf8..2629212 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -831,7 +831,9 @@ doStop() { done if [[ -n "$dowarn" ]]; then - doWarn "$1" "$warnreason" + if ! doWarn "$1" "$warnreason"; then + return 1 + fi fi if [[ -n "$dosave" ]]; then doSaveWorld @@ -910,6 +912,20 @@ doInstall() { getCurrentVersion } + +# +# Cancels a pending shutdown +# +doCancelShutdown(){ + if [ -f "${arkserverroot}/.ark-warn.lock" ]; then + local lockpid="$(<"${arkserverroot}/.ark-warn.lock")" + if [ -n "$lockpid" ]; then + kill "$lockpid" + rm -f "${arkserverroot}/.ark-warn.lock" + fi + fi +} + # # Formats a warning message based on replacement strings # @@ -1028,11 +1044,27 @@ doWarn(){ cd "$arkserverroot" ( + echo "$$" >"${arkserverroot}/.ark-warn.lock.$$" 2>/dev/null + while true; do + if ! ln "${arkserverroot}/.ark-warn.lock.$$" "${arkserverroot}/.ark-warn.lock" 2>/dev/null; then + local lockpid="$(<"${arkserverroot}/.ark-warn.lock")" + if [ -n "$lockpid" ] && [ "$lockpid" != "$$" ] && kill -0 "$lockpid" 2>/dev/null; then + echo "Shutdown warning already in progress (PID: $lockpid)" + rm -f "${arkserverroot}/.ark-warn.lock.$$" 2>/dev/null + exit 1 + fi + rm -f "${arkserverroot}/.ark-warn.lock" + else + break + fi + done + rm -f "${arkserverroot}/.ark-warn.lock.$$" + update_cancelled(){ if [ -n "$msgUpdateCancelled" ]; then msg="${msgUpdateCancelled//%s/$1}" else - msg="Update cancelled by operator ($1)" + msg="Shutdown cancelled by operator ($1)" fi doBroadcastWithEcho "${msg}" } @@ -1056,6 +1088,7 @@ doWarn(){ for warninterval in "${warnintervals[@]}"; do if [ "`getServerPID`" != "$pid" ]; then echo "Server has stopped. Aborting $1" + rm -f "${arkserverroot}/.ark-warn.lock" return 1 fi if (( warnminutes >= warninterval )); then @@ -1067,6 +1100,7 @@ doWarn(){ echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then doBroadcastWithEcho "Nobody is connected. Shutting down immediately" + rm -f "${arkserverroot}/.ark-warn.lock" return 0 fi wait $sleeppid @@ -1086,6 +1120,7 @@ doWarn(){ sleeppid=$! if [ "`getServerPID`" != "$pid" ]; then echo "Server has stopped. Aborting update" + rm -f "${arkserverroot}/.ark-warn.lock" return 1 fi printWarnMessage "$1" "$2" "seconds" "$warnseconds" @@ -1094,6 +1129,7 @@ doWarn(){ echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then doBroadcastWithEcho "Nobody is connected. Shutting down immediately" + rm -f "${arkserverroot}/.ark-warn.lock" return 0 fi fi @@ -1102,6 +1138,8 @@ doWarn(){ done fi + rm -f "${arkserverroot}/.ark-warn.lock" + if [ "`getServerPID`" != "$pid" ]; then echo "Server has stopped. Aborting $1" return 1 @@ -2204,6 +2242,9 @@ while true; do doStop restart "${options[@]}" echo "`timestamp`: stop" >> "$logdir/$arkmanagerLog" ;; + cancelshutdown) + doCancelShutdown "${options[@]}" + ;; install) doInstall ;;