From d34f2ac3363b403671e9dd0ff96cffa0bcb8d1a6 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 10 Jul 2015 22:55:17 +1000 Subject: [PATCH 01/21] Add simple RCON client implementation --- tools/arkmanager | 81 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 0761058..a385dd1 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -90,6 +90,80 @@ checkConfig() { fi } +# +# Get server admin password +# +getAdminPassword() { + if [ -n "${ark_ServerAdminPassword}" ]; then + echo "${ark_ServerAdminPassword}" + else + sed -ne '/^\[ServerSettings\]/,/^\[.*\]/{s/^ServerAdminPassword[[:space:]]*=[[:space:]]*//p;}' "${arkserverroot}/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" + fi +} + +# +# Execute RCON command +# +rconcmd() { + perl -MSocket -e ' + sub sendpkt { + my ($sock, $reqid, $reqtype, $body) = @_; + my $packet = pack("VVV", length($body) + 10, $reqid, $reqtype) . $body . "\0\0"; + send($sock, $packet, 0) or die "Error sending command to server"; + } + + sub recvpkt { + my ($sock) = @_; + my $data = ""; + recv($sock, $data, 12, 0); + my ($pktlen, $resid, $restype) = unpack("VVV", $data); + recv($sock, $data, $pktlen - 8, 0); + return ($resid, $restype, substr($data, 0, $pktlen - 10)); + } + + sub auth { + my ($sock, $password) = @_; + my $reqid = 1; + sendpkt($sock, $reqid, 3, $password); + my ($resid, $restype, $rcvbody) = recvpkt($sock); + die "Authentication failed" if $resid == -1; + } + + my $port = $ARGV[0]; + my $password = $ARGV[1]; + my $command = $ARGV[2]; + socket(my $socket, PF_INET, SOCK_STREAM, 0); + setsockopt($socket, SOL_SOCKET, SO_RCVTIMEO, pack("i4", 30, 0, 0, 0)); + my $sockaddr = pack_sockaddr_in($port, inet_aton("127.0.0.1")); + connect($socket, $sockaddr) or die "Error connecting to server"; + auth($socket, $password); + sendpkt($socket, 2, 2, $command); + my ($resid, $restype, $rcvbody) = recvpkt($socket); + print $rcvbody, "\n"; + ' "${ark_RCONPort}" "`getAdminPassword`" "$1" +} + +# +# Save world +# +doSaveWorld() { + rconcmd saveworld +} + +# +# Exit cleanly +# +doExitServer() { + rconcmd doexit +} + +# +# Broadcast message +# +doBroadcast(){ + rconcmd "broadcast $1" +} + # # Check if a new version is available but not apply it # @@ -425,7 +499,10 @@ case "$1" in doBackup ;; broadcast) - doInfo $2 + doBroadcast "$2" + ;; + saveworld) + doSaveWorld ;; status) printStatus @@ -437,6 +514,8 @@ case "$1" in echo -e "Usage: arkmanager[OPTION]\n" echo "Option Description" echo "backup Saves a backup of your server inside the backup directory" + echo "broadcast Sends a message to all users connected to server" + echo "saveworld Saves the game world to disk" echo "checkupdate Check for a new ARK server version" echo "install Install the ARK server files from steamcmd" echo "restart Stops the server and then starts it" From 120df3d0db4d6cacd06e528adc618b6de930ac29 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 10 Jul 2015 22:55:26 +1000 Subject: [PATCH 02/21] Add server info to status output --- tools/arkmanager | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index a385dd1..c417881 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -436,10 +436,23 @@ printStatus(){ echo -e "$NORMAL" "Server online: " "$RED" "No" "$NORMAL" else echo -e "$NORMAL" "Server online: " "$GREEN" "Yes" "$NORMAL" + perl -MSocket -e ' + my $port = int($ARGV[0]); + socket(my $socket, PF_INET, SOCK_DGRAM, 0); + setsockopt($socket, SOL_SOCKET, SO_RCVTIMEO, pack("i4", 1, 0, 0, 0)); + my $sockaddr = pack_sockaddr_in($port, inet_aton("127.0.0.1")); + send($socket, "\xff\xff\xff\xffTSource Engine Query\x00", 0, $sockaddr); + my $data = ""; + recv($socket, $data, 1400, 0) or (print "Unable to query server\n" and exit(1)); + my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5); + my $players = ord(substr($rest, 2, 1)); + my $maxplayers = ord(substr($rest, 3, 1)); + print "Server Name: $servername\n"; + print "Players: $players / $maxplayers\n"; + ' "${ark_QueryPort}" fi getCurrentVersion echo -e "$NORMAL" "Server version: " "$GREEN" $instver "$NORMAL" - } doUpgrade() { From accc3d461271abda49a44af8f3175aded2d0a577 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 10 Jul 2015 23:14:58 +1000 Subject: [PATCH 03/21] Hide response to broadcast command Server responds with: Server received, But no response!! --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index c417881..18ac990 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -161,7 +161,7 @@ doExitServer() { # Broadcast message # doBroadcast(){ - rconcmd "broadcast $1" + rconcmd "broadcast $1" >/dev/null } # From 61068b203e560d9d4af86e18b9d1d3a97c1802b6 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 11 Jul 2015 21:48:26 +1000 Subject: [PATCH 04/21] Add rconcmd arkmanager command --- tools/arkmanager | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 18ac990..9fb29d2 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -517,6 +517,9 @@ case "$1" in saveworld) doSaveWorld ;; + rconcmd) + rconcmd "$2" + ;; status) printStatus ;; @@ -529,6 +532,7 @@ case "$1" in echo "backup Saves a backup of your server inside the backup directory" echo "broadcast Sends a message to all users connected to server" echo "saveworld Saves the game world to disk" + echo "rconcmd Execute RCON command on server" echo "checkupdate Check for a new ARK server version" echo "install Install the ARK server files from steamcmd" echo "restart Stops the server and then starts it" From 2171913d1d47d89a7f3e81155dc013d80a1ff22c Mon Sep 17 00:00:00 2001 From: Sispheor Date: Thu, 16 Jul 2015 22:19:12 +0200 Subject: [PATCH 05/21] update readme, add rcon --- README.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6b4b5ac..097f4c9 100644 --- a/README.md +++ b/README.md @@ -68,19 +68,19 @@ arkmanager install To get a complete list of the script commands you can run `arkmanager --help` or `arkmanager -h`. #### arkmanager install -installs arkmanager to the directory specified in `/etc/arkmanager/arkmanager.cfg` or `~/.arkmanager.cfg`. +Installs arkmanager to the directory specified in `/etc/arkmanager/arkmanager.cfg` or `~/.arkmanager.cfg`. #### arkmanager start -starts ARK server +Starts ARK server #### arkmanager stop -stops ARK server +Stops ARK server #### arkmanager restart -restarts ARK server +Restarts ARK server #### arkmanager update -manually updates ARK server if a new version is available +Manually updates ARK server if a new version is available #### arkmanager update --force Apply update without check the current version @@ -100,6 +100,22 @@ Check for a new ARK Server Tools version and upgrades it if needed #### arkmanager backup Saves a backup of your server inside the backup directory +#### arkmanager broadcast "message" +Broadcast a message to all curently connected players. Example: +``` +arkmanager broadcast "Hi, admin there" +``` + +#### arkmanager saveworld +Saves the current world. + +#### arkmanager rcon +Run a rcon command on the server. Example: +``` +arkmanager rcon "ListPlayers" +``` +Full list of available command here: https://www.streamline-servers.com/billing/knowledgebase/75/ARK-Survival-Evolved-Admin-Commands.html + ## Credits Original author of arkmanager: LeXaT From 9e23213b2d882edda691112e8a7e715f28c08444 Mon Sep 17 00:00:00 2001 From: Sispheor Date: Thu, 16 Jul 2015 22:20:52 +0200 Subject: [PATCH 06/21] remove unused variables --- tools/arkmanager | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 8f819e6..17e401a 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -31,8 +31,6 @@ if [ -x /usr/sbin/lsof ]; then fi # Local variables -info="" -thejob="" instver="" bnumber="" GREEN="\\033[1;32m" @@ -400,7 +398,7 @@ forceUpdate(){ # doSafeUpdate(){ cd "$arkserverroot" - + if isUpdateNeeded; then while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name $serverMap.ark` ]; do echo "`timestamp`: Save file older than 1 minute. Delaying update." >> "$logdir/update.log" From aec137e7bf3680058caa6be82625bee212546f51 Mon Sep 17 00:00:00 2001 From: Sispheor Date: Thu, 16 Jul 2015 23:01:15 +0200 Subject: [PATCH 07/21] fix readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 097f4c9..a092c61 100644 --- a/README.md +++ b/README.md @@ -109,10 +109,10 @@ arkmanager broadcast "Hi, admin there" #### arkmanager saveworld Saves the current world. -#### arkmanager rcon +#### arkmanager rconcmd Run a rcon command on the server. Example: ``` -arkmanager rcon "ListPlayers" +arkmanager rconcmd "ListPlayers" ``` Full list of available command here: https://www.streamline-servers.com/billing/knowledgebase/75/ARK-Survival-Evolved-Admin-Commands.html From 8339b8e6a339e1e42fd9c68e0fbdf7f3a1af7df1 Mon Sep 17 00:00:00 2001 From: Marcq Nicolas Date: Fri, 17 Jul 2015 14:37:25 +0200 Subject: [PATCH 08/21] fix admin command URL. Now use steam community --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a092c61..9cafe98 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ Run a rcon command on the server. Example: ``` arkmanager rconcmd "ListPlayers" ``` -Full list of available command here: https://www.streamline-servers.com/billing/knowledgebase/75/ARK-Survival-Evolved-Admin-Commands.html +Full list of available command here: http://steamcommunity.com/sharedfiles/filedetails/?id=454529617&searchtext=admin ## Credits From 44fa13cdc64a81a119864939ae013bda55e30cad Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 18 Jul 2015 04:53:40 +1000 Subject: [PATCH 09/21] Make backup function more robust --- tools/arkmanager | 63 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 8f819e6..2f86567 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -421,10 +421,67 @@ doBackup(){ local datestamp=`date +"%Y-%m-%d_%H.%M.%S"` local backupdir="${arkbackupdir}/${datestamp}" mkdir -p "$backupdir" + + # ARK server uses Write-Unlink-Rename + echo -ne "${NORMAL} Copying ARK world file " cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.ark" "${backupdir}/${serverMap}.ark" - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/"*.arkprofile "${backupdir}" - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/"*.arktribe "${backupdir}" - cp -p "${arkserverroot}/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" "${backupdir}" + if [ ! -f "${backupdir}/${serverMap}.ark" ]; then + sleep 2 + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.ark" "${backupdir}/${serverMap}.ark" + fi + if [ -f "${backupdir}/${serverMap}.ark" ]; then + echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" + else + echo -e "${NORMAL}[ ${RED}FAILED${NORMAL} ]" + fi + + # ARK server uses Lock-Truncate-Write-Unlock + # Unfortunately we can't lock the file, as + # ARK server uses a non-blocking lock and will + # fail to update the file if the lock fails. + echo -e "${NORMAL} Copying ARK profile files" + for f in "${arkserverroot}/ShooterGame/Saved/SavedArks/"*.arkprofile; do + echo -ne "${NORMAL} ${f##*/} " + cp -p "${f}" "${backupdir}/${f##*/}" + if [ ! -s "${backupdir}/${f##*/}" ]; then + sleep 2 + cp -p "${f}" "${backupdir}/${f##*/}" + fi + if [ -s "${backupdir}/${f##*/}" ]; then + echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" + else + echo -e "${NORMAL}[ ${RED}FAILED${NORMAL} ]" + fi + done + + # ARK server uses Lock-Truncate-Write-Unlock + echo -e "${NORMAL} Copying ARK tribe files " + for f in "${arkserverroot}/ShooterGame/Saved/SavedArks/"*.arktribe; do + echo -ne "${NORMAL} ${f##*/} " + cp -p "${f}" "${backupdir}/${f##*/}" + if [ ! -s "${backupdir}/${f##*/}" ]; then + sleep 2 + cp -p "${f}" "${backupdir}/${f##*/}" + fi + if [ -s "${backupdir}/${f##*/}" ]; then + echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" + else + echo -e "${NORMAL}[ ${RED}FAILED${NORMAL} ]" + fi + done + + # ARK server uses Lock-Truncate-Write-Unlock + echo -ne "${NORMAL} Copying GameUserSettings.ini " + cp -p "${arkserverroot}/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" "${backupdir}/GameUserSettings.ini" + if [ ! -s "${backupdir}/GameUserSettings.ini" ]; then + sleep 2 + cp -p "${f}" "${backupdir}/${f##*/}" + fi + if [ -f "${backupdir}/GameUserSettings.ini" ]; then + echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" + else + echo -e "${NORMAL}[ ${RED}FAILED${NORMAL} ]" + fi } # From a14f410fc9a0b2b02fa62c6d138cd743ff579a05 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 18 Jul 2015 08:33:19 +1000 Subject: [PATCH 10/21] Add last-ditch backup attempt --- tools/arkmanager | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 2f86567..f382c21 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -429,6 +429,11 @@ doBackup(){ sleep 2 cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.ark" "${backupdir}/${serverMap}.ark" fi + # If both attempts fail, server may have + # crashed between unlink and rename + if [ ! -f "${backupdir}/${serverMap}.ark" ]; then + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.tmp" "${backupdir}/${serverMap}.ark" + fi if [ -f "${backupdir}/${serverMap}.ark" ]; then echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" else @@ -447,6 +452,11 @@ doBackup(){ sleep 2 cp -p "${f}" "${backupdir}/${f##*/}" fi + # If both attempts fail, server may have + # crashed between truncate and write + if [ ! -s "${backupdir}/${f##*/}" ]; then + cp -p "${f%.arkprofile}.tmpprofile" "${backupdir}/${f##*/}" + fi if [ -s "${backupdir}/${f##*/}" ]; then echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" else @@ -463,6 +473,11 @@ doBackup(){ sleep 2 cp -p "${f}" "${backupdir}/${f##*/}" fi + # If both attempts fail, server may have + # crashed between truncate and write + if [ ! -s "${backupdir}/${f##*/}" ]; then + cp -p "${f%.arktribe}.tmptribe" "${backupdir}/${f##*/}" + fi if [ -s "${backupdir}/${f##*/}" ]; then echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" else From f6d402b6fe9b123d3bf62a67d58db274e84e4c7d Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 18 Jul 2015 10:28:22 +1000 Subject: [PATCH 11/21] Add support for custom modded maps --- tools/arkmanager | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index f382c21..7825bc3 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -276,7 +276,7 @@ function isTheServerUp(){ # run function # doRun() { - arkserveropts=$serverMap + arkserveropts="$serverMap" # bring in ark_... options for varname in "${!ark_@}"; do @@ -402,7 +402,7 @@ doSafeUpdate(){ cd "$arkserverroot" if isUpdateNeeded; then - while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name $serverMap.ark` ]; do + while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name ${serverMap##*/}.ark` ]; do echo "`timestamp`: Save file older than 1 minute. Delaying update." >> "$logdir/update.log" sleep 30s done @@ -424,17 +424,17 @@ doBackup(){ # ARK server uses Write-Unlink-Rename echo -ne "${NORMAL} Copying ARK world file " - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.ark" "${backupdir}/${serverMap}.ark" - if [ ! -f "${backupdir}/${serverMap}.ark" ]; then + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap##*/}.ark" "${backupdir}/${serverMap##*/}.ark" + if [ ! -f "${backupdir}/${serverMap##*/}.ark" ]; then sleep 2 - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.ark" "${backupdir}/${serverMap}.ark" + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap##*/}.ark" "${backupdir}/${serverMap##*/}.ark" fi # If both attempts fail, server may have # crashed between unlink and rename - if [ ! -f "${backupdir}/${serverMap}.ark" ]; then - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.tmp" "${backupdir}/${serverMap}.ark" + if [ ! -f "${backupdir}/${serverMap##*/}.ark" ]; then + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.tmp" "${backupdir##*/}/${serverMap##*/}.ark" fi - if [ -f "${backupdir}/${serverMap}.ark" ]; then + if [ -f "${backupdir}/${serverMap##*/}.ark" ]; then echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" else echo -e "${NORMAL}[ ${RED}FAILED${NORMAL} ]" From 2110bc7fa6ce93f03087bd036b07901aeec5cf17 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 20 Jul 2015 10:51:56 +1000 Subject: [PATCH 12/21] User SIGINT instead of SIGKILL to stop server --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 8acd5aa..e7e1fab 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -328,7 +328,7 @@ doStop() { echo "Stopping server..." # kill the server with the PID PID=`ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}'` - kill -9 $PID + kill -INT $PID tput rc; tput ed; echo "The server has been stopped" From 3759904f12f3411c3967291fba800ae8bb77cbfd Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 25 Jul 2015 16:31:08 +1000 Subject: [PATCH 13/21] Change isTheServerRunning to be consistent with doStop --- tools/arkmanager | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index e7e1fab..bc1b69c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -243,14 +243,22 @@ function getAvailableVersion(){ return $bnumber } +# +# Get the PID of the server process +# +function getServerPID(){ + ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' +} + # # Check id the server process is alive # function isTheServerRunning(){ - SERVICE="ShooterGameServer" - ps aux | grep -v grep | grep $SERVICE > /dev/null - result=$? - return $result + if [ -n "`getServerPID`" ]; then + return 0 + else + return 1 + fi } # @@ -327,7 +335,7 @@ doStop() { tput sc echo "Stopping server..." # kill the server with the PID - PID=`ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}'` + PID=`getServerPID` kill -INT $PID tput rc; tput ed; From ac41f14700639da5e130ae856ccac3b682d80e31 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 25 Jul 2015 16:33:03 +1000 Subject: [PATCH 14/21] Wait for server to stop --- tools/arkmanager | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index bc1b69c..c81b75c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -334,13 +334,27 @@ doStop() { if isTheServerRunning; then tput sc echo "Stopping server..." + echo "`timestamp`: stopping" >> "$logdir/$arkmanagerLog" # kill the server with the PID PID=`getServerPID` kill -INT $PID + for (( i = 0; i < 10; i++ )); do + sleep 1 + if ! isTheServerRunning; then + break + fi + done + + if isTheServerRunning; then + tput rc + echo "Killing server..." + kill -KILL $PID + fi + tput rc; tput ed; echo "The server has been stopped" - echo "`timestamp`: stop" >> "$logdir/$arkmanagerLog" + echo "`timestamp`: stopped" >> "$logdir/$arkmanagerLog" else echo "The server is already stopped" fi From f2ff580a90e11879a24a2b55f34fe61e467db727 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 25 Jul 2015 17:35:02 +1000 Subject: [PATCH 15/21] Reduce restart delay to 1 second --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index c81b75c..6e9c1e5 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -585,7 +585,7 @@ case "$1" in restart) doStop echo "`timestamp`: stop" >> "$logdir/$arkmanagerLog" - sleep 10 + sleep 1 doStart echo "`timestamp`: start" >> "$logdir/$arkmanagerLog" echo "`timestamp`: restart" >> "$logdir/$arkmanagerLog" From f58645cc1a260362a836c2b2c13b9b6e8218656a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 20 Jul 2015 04:39:30 +1000 Subject: [PATCH 16/21] Support special "--me" user-install --- tools/arkmanager | 6 +++++- tools/install.sh | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 6e9c1e5..f0079ff 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -553,13 +553,17 @@ printStatus(){ } doUpgrade() { + local sudo=sudo + if [ "$steamcmd_user" == "--me" ]; then + sudo= + fi echo "arkmanager v${arkstVersion}: Checking for updates..." arkstLatestVersion=`curl -s https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version` if [[ $arkstLatestVersion > $arkstVersion ]]; then read -p "A new version was found! Do you want to upgrade ARK Server Tools to v${$arkstLatestVersion}?" -n 1 -r echo -en "\n" if [[ $REPLY =~ ^[Yy]$ ]]; then - curl -s https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/netinstall.sh | sudo bash -s ${steamcmd_user} ${arkstChannel} + curl -s https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/netinstall.sh | $sudo bash -s ${steamcmd_user} ${arkstChannel} else exit 0 fi diff --git a/tools/install.sh b/tools/install.sh index fee74a2..0ccc309 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -1,8 +1,37 @@ #!/bin/bash -EXECPREFIX="${EXECPREFIX:-/usr/local}" +if [ "$1" == "--me" ]; then + PREFIX="${PREFIX:-${HOME}}" + EXECPREFIX="${EXECPREFIX:-${PREFIX}}" +else + EXECPREFIX="${EXECPREFIX:-/usr/local}" +fi if [ ! -z "$1" ]; then + if [ "$1" == "--me" -a "$UID" -ne 0 ]; then + # Copy arkmanager to ~/bin + mkdir -p "${INSTALL_ROOT}${EXECPREFIX}/bin" + cp arkmanager "${INSTALL_ROOT}${EXECPREFIX}/bin/arkmanager" + chmod +x "${INSTALL_ROOT}${EXECPREFIX}/bin/arkmanager" + + # Create a folder in ~/logs to let Ark tools write its own log files + mkdir -p "${INSTALL_ROOT}${PREFIX}/logs/arktools" + + # Copy arkmanager.cfg to ~/.arkmanager.cfg if it doesn't already exist + if [ -f "${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg" ]; then + cp -n arkmanager.cfg "${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg.NEW" + sed -i "s|^steamcmd_user=\"steam\"|steamcmd_user=\"me\"|;s|\"/home/steam|\"${PREFIX}|;s|/var/log/arktools|${PREFIX}/logs/arktools|" "${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg.NEW" + echo "A previous version of ARK Server Tools was detected in your system, your old configuration was not overwritten. You may need to manually update it." + echo "A copy of the new configuration file was included in '${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg.NEW'. Make sure to review any changes and update your config accordingly!" + exit 2 + else + cp -n arkmanager.cfg "${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg" + sed -i "s|^steamcmd_user=\"steam\"|steamcmd_user=\"me\"|;s|\"/home/steam|\"${PREFIX}|;s|/var/log/arktools|${PREFIX}/logs/arktools|" "${INSTALL_ROOT}${PREFIX}/.arkmanager.cfg" + fi + elif [ "$1" == "me" ]; then + echo "You specified the special 'me' user while running as root. This is not permitted." + exit 1 + else # Copy arkmanager to /usr/bin and set permissions cp arkmanager "${INSTALL_ROOT}${EXECPREFIX}/bin/arkmanager" chmod +x "${INSTALL_ROOT}${EXECPREFIX}/bin/arkmanager" @@ -99,9 +128,10 @@ if [ ! -z "$1" ]; then chown "$1" "${INSTALL_ROOT}/etc/arkmanager/arkmanager.cfg" sed -i "s|^steamcmd_user=\"steam\"|steamcmd_user=\"$1\"|;s|\"/home/steam|\"/home/$1|" "${INSTALL_ROOT}/etc/arkmanager/arkmanager.cfg" fi - + fi else echo "You must specify your system steam user who own steamcmd directory to install ARK Tools." + echo "Specify the special used '--me' to perform a user-install." echo "Usage: ./install.sh steam" echo echo "Environment variables affecting install:" From b52770f23616efc8176ae6d35041d7488c05947b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 20 Jul 2015 17:02:26 +1000 Subject: [PATCH 17/21] Support multiple commands in a single invocation --- tools/arkmanager | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index f0079ff..ec22c79 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -579,7 +579,8 @@ doUpgrade() { # check the configuration and throw errors or warnings if needed checkConfig -case "$1" in +while true; do + case "$1" in start) doStart ;; @@ -600,8 +601,10 @@ case "$1" in update) if [ "$2" == "--force" ]; then forceUpdate + shift elif [ "$2" == "--safe" ]; then doSafeUpdate + shift else doUpdate fi @@ -614,12 +617,14 @@ case "$1" in ;; broadcast) doBroadcast "$2" + shift ;; saveworld) doSaveWorld ;; rconcmd) rconcmd "$2" + shift ;; status) printStatus @@ -644,9 +649,16 @@ case "$1" in echo "update --force Apply update without check the current version" echo "update --safe Wait for server to perform world save and update." echo "upgrade Check for a new ARK Server Tools version and upgrades it if needed" + exit 1 ;; *) echo "arkmanager v${arkstVersion}: no command specified" echo "Try 'arkmanager -h' or 'arkmanager --help' for more information." + exit 1 ;; -esac + esac + shift + if [ $# -eq 0 ]; then + break + fi +done From 2e652286074e0d60d1a17e8f03dc14bd6ce5ee37 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 20 Jul 2015 17:11:17 +1000 Subject: [PATCH 18/21] Inform the user which command was not recognized --- tools/arkmanager | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index ec22c79..74e806d 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -652,7 +652,12 @@ while true; do exit 1 ;; *) - echo "arkmanager v${arkstVersion}: no command specified" + echo -n "arkmanager v${arkstVersion}: " + if [ $# -eq 0 ]; then + echo "no command specified" + else + echo "unknown command '$1' specified" + fi echo "Try 'arkmanager -h' or 'arkmanager --help' for more information." exit 1 ;; From 562bb9312674e994867e6042d98ed4347917665b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 20 Jul 2015 17:17:56 +1000 Subject: [PATCH 19/21] Add useconfig arkmanager command to specify config --- tools/arkmanager | 15 +++++++++++++++ tools/arkmanager.cfg | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 74e806d..1997530 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -572,6 +572,16 @@ doUpgrade() { fi } +useConfig() { + for varname in "${!configfile_@}"; do + if [ "configfile_$1" == "$varname" ]; then + source "${!varname}" + return + fi + done + source "$1" +} + #--------------------- # Main program #--------------------- @@ -632,6 +642,10 @@ while true; do upgrade) doUpgrade ;; + useconfig) + useConfig "$2" + shift + ;; -h|--help) echo -e "Usage: arkmanager[OPTION]\n" echo "Option Description" @@ -649,6 +663,7 @@ while true; do echo "update --force Apply update without check the current version" echo "update --safe Wait for server to perform world save and update." echo "upgrade Check for a new ARK Server Tools version and upgrades it if needed" + echo "useconfig Use the configuration overrides in the specified config name or file" exit 1 ;; *) diff --git a/tools/arkmanager.cfg b/tools/arkmanager.cfg index 3248c56..3445bb9 100644 --- a/tools/arkmanager.cfg +++ b/tools/arkmanager.cfg @@ -31,3 +31,7 @@ logdir="/var/log/arktools" # Logs path # steamdb specific appid=376030 # Linux server App ID + +# alternate configs +# example for config name "ark1": +#config_ark1="/path/to/config/file" From 2e8e3b6aaa9a747c11d6c4b8b96cdf61f988ab66 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 7 Aug 2015 20:59:41 +1000 Subject: [PATCH 20/21] Fix map name extraction Fixes: f6d402b (Add support for custom modded maps) --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 1997530..af1214d 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -452,7 +452,7 @@ doBackup(){ # If both attempts fail, server may have # crashed between unlink and rename if [ ! -f "${backupdir}/${serverMap##*/}.ark" ]; then - cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap}.tmp" "${backupdir##*/}/${serverMap##*/}.ark" + cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap##*/}.tmp" "${backupdir##*/}/${serverMap##*/}.ark" fi if [ -f "${backupdir}/${serverMap##*/}.ark" ]; then echo -e "${NORMAL}[ ${GREEN}OK${NORMAL} ]" From 0aa7546b067a766722feda8308f48d7c3a19c42b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 7 Aug 2015 21:04:02 +1000 Subject: [PATCH 21/21] Add '-MapModId' support Specifying the Modded Map by ModID was added in 193.0 This adds support for this, and backups should work with it. --- tools/arkmanager | 18 ++++++++++++++++++ tools/arkmanager.cfg | 2 ++ 2 files changed, 20 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index af1214d..d5ec649 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -284,6 +284,10 @@ function isTheServerUp(){ doRun() { arkserveropts="$serverMap" + if [ -n "$serverMapModId" ]; then + arkserveropts="-MapModID=$serverMapModId" + fi + # bring in ark_... options for varname in "${!ark_@}"; do name="${varname#ark_}" @@ -442,6 +446,20 @@ doBackup(){ local backupdir="${arkbackupdir}/${datestamp}" mkdir -p "$backupdir" + # extract the map name from the active map mod + if [ -n "$serverMapModId" ]; then + serverMap="$(perl -e ' + my $data; + { local $/; $data = <>; } + my $mapnamelen = unpack("@0 L<", $data); + my $mapname = substr($data, 4, $mapnamelen - 1); + $mapnamelen += 4; + my $mapfilelen = unpack("@" . ($mapnamelen + 4) . " L<", $data); + my $mapfile = substr($data, $mapnamelen + 8, $mapfilelen - 1); + print $mapfile; + ' <"${arkserverroot}/ShooterGame/Content/Mods/${serverMapModId}/mod.info")" + fi + # ARK server uses Write-Unlink-Rename echo -ne "${NORMAL} Copying ARK world file " cp -p "${arkserverroot}/ShooterGame/Saved/SavedArks/${serverMap##*/}.ark" "${backupdir}/${serverMap##*/}.ark" diff --git a/tools/arkmanager.cfg b/tools/arkmanager.cfg index 3445bb9..e671e72 100644 --- a/tools/arkmanager.cfg +++ b/tools/arkmanager.cfg @@ -16,6 +16,7 @@ arkbackupdir="/home/steam/ARK-Backups" # path to ba # comment out these values if you want to define them # inside your GameUserSettings.ini file serverMap="TheIsland" # server map (default TheIsland) +#serverMapModId="469987622" # Uncomment this to specify the Map Mod Id ( in http://steamcommunity.com/sharedfiles/filedetails/?id=) ark_RCONEnabled="True" # Enable RCON Protocol ark_RCONPort="32330" # RCON Port ark_SessionName="ARK Server Tools" # if your session name needs special characters please use the .ini instead @@ -24,6 +25,7 @@ ark_QueryPort="27016" # ARK query ark_ServerPassword="" # ARK server password, empty: no password required to login ark_ServerAdminPassword="keyboardcat" # ARK server admin password, KEEP IT SAFE! ark_MaxPlayers="70" +#ark_GameModIds="487516323,487516324,487516325" # Uncomment to specify additional mods by Mod Id separated by commas # config Service servicename="arkserv" # Name of the service (don't change if you don't know what are you doing)