From 7f797acd951d4c1c928237aaa425a307e4220f0e Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 27 Feb 2016 22:06:04 +1000 Subject: [PATCH 01/98] Begin development on v1.6 --- .version | 2 +- tools/arkmanager | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.version b/.version index c239c60..810ee4e 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.5 +1.6 diff --git a/tools/arkmanager b/tools/arkmanager index 52c7633..7bccf83 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -7,7 +7,7 @@ # Contributors: Sispheor, Atriusftw, klightspeed, lexat, puseidr # Script version -arkstVersion="1.5" +arkstVersion="1.6" arkstCommit='' doUpgradeTools() { From 7014502ee1e542278b95a94af1225e199c3f1274 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 20 Feb 2016 21:36:19 +1000 Subject: [PATCH 02/98] Change .mod file output --- tools/arkmanager | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 7bccf83..bb8c3ac 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1348,23 +1348,31 @@ doExtractMod(){ fi done + modname="$(curl -s "http://steamcommunity.com/sharedfiles/filedetails/?id=${modid}" | sed -n 's|^.*
\([^<]*\)
.*|\1|p')" + + rm "${moddestdir}/.mod" + 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); - print pack("L< L< L< Z8 L< C L< L<", $ARGV[0], 0, 8, "ModName", 1, 0, 1, $mapfilelen); - print $mapfile; + my $mapfilelen = unpack("@" . ($mapnamelen + 8) . " L<", $data); + my $mapfile = substr($data, $mapnamelen + 12, $mapfilelen); + my $modname = $ARGV[1] . "\x00"; + my $modnamelen = length($modname); + my $modpath = "../../../ShooterGame/Content/Mods/" . $ARGV[0] . "\x00"; + my $modpathlen = length($modpath); + print pack("L< L< L< Z$modnamelen L< Z$modpathlen L< L< Z$mapfilelen", + $ARGV[0], 0, $modnamelen, $modname, $modpathlen, $modpath, + 1, $mapfilelen, $mapfile); print "\x33\xFF\x22\xFF\x02\x00\x00\x00\x01"; - ' $modid <"$moddestdir/mod.info" >"$moddestdir/.mod" + ' $modid "$modname" <"$moddestdir/mod.info" >"${moddestdir}.mod" if [ -f "$moddestdir/modmeta.info" ]; then - cat "$moddestdir/modmeta.info" >>"$moddestdir/.mod" + cat "$moddestdir/modmeta.info" >>"${moddestdir}.mod" else - echo -ne '\x01\x00\x00\x00\x08\x00\x00\x00ModType\x00\x02\x00\x00\x001\x00' >>"$moddestdir/.mod" + echo -ne '\x01\x00\x00\x00\x08\x00\x00\x00ModType\x00\x02\x00\x00\x001\x00' >>"${moddestdir}.mod" fi echo "$modbranch" >"$moddestdir/.modbranch" From fe11e77f0f025c2f10754fdedfbbe227790949c1 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 21 Feb 2016 10:40:06 +1000 Subject: [PATCH 03/98] Only try to remove .mod if it exists --- tools/arkmanager | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index bb8c3ac..317d3e0 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1350,7 +1350,9 @@ doExtractMod(){ modname="$(curl -s "http://steamcommunity.com/sharedfiles/filedetails/?id=${modid}" | sed -n 's|^.*
\([^<]*\)
.*|\1|p')" - rm "${moddestdir}/.mod" + if [ -f "${moddestdir}/.mod" ]; then + rm "${moddestdir}/.mod" + fi perl -e ' my $data; From e81f1905cdc5edd68966608decc95d3ffd1f7745 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 23 Feb 2016 05:38:25 +1000 Subject: [PATCH 04/98] Use name from mod.info if mod name can't be retrieved --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 317d3e0..5e8281c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1361,7 +1361,7 @@ doExtractMod(){ my $mapname = substr($data, 4, $mapnamelen - 1); my $mapfilelen = unpack("@" . ($mapnamelen + 8) . " L<", $data); my $mapfile = substr($data, $mapnamelen + 12, $mapfilelen); - my $modname = $ARGV[1] . "\x00"; + my $modname = ($ARGV[1] || $mapname) . "\x00"; my $modnamelen = length($modname); my $modpath = "../../../ShooterGame/Content/Mods/" . $ARGV[0] . "\x00"; my $modpathlen = length($modpath); From 7c0abf2dfbec627601faaa070581018f90f936e3 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 23 Feb 2016 07:36:20 +1000 Subject: [PATCH 05/98] Add Blob SHA to --version output This should make it possible to determine the arkmanager version when it hasn't been installed using the netinstall script. --- tools/arkmanager | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/arkmanager b/tools/arkmanager index 5e8281c..67415e0 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1806,6 +1806,7 @@ while true; do if [ -n "${arkstCommit}" ]; then echo "Commit: ${arkstCommit:0:7}" fi + echo "Blob SHA: $( (echo -ne "blob $(stat -c "%s" "$0")\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;; -h|--help) From 4eeeebeb8ec989d22665e58ecce80a34ab19a2e5 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 27 Feb 2016 22:19:10 +1000 Subject: [PATCH 06/98] Add handling for global options --- tools/arkmanager | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 67415e0..b6f8201 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1732,6 +1732,22 @@ while true; do shift nrarg=0 + # Handle global options + case "$command" in + --verbose) + verbose=1 + continue + ;; + --dots) + progressDisplayType=dots + continue + ;; + --spinner) + progressDisplayType=spinner + continue + ;; + esac + # get the number of arguments for commands that take arguments case "$command" in installmod) nrarg=1; ;; From eb72148b35a319c434e491386c3c3c435750656d Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 27 Feb 2016 22:39:22 +1000 Subject: [PATCH 07/98] Add support for adding and removing cron jobs --- README.asciidoc | 31 +++++++++++++++++++++ tools/arkmanager | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 31abc77..2f6a39d 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -238,6 +238,37 @@ instances. `status`:: Prints the status of the ARK server +`install-cronjob `:: + Installs a cron job that executes the specified command. + This accepts any of the options the specified command accepts, + as well as the following options. In order to specify an + argument to the command (e.g. to the `broadcast` command), + use the `--arg=` option. + + `--daily`;; + The command should be executed daily + + `--hourly`;; + The command should be executed hourly + + `--hour=`;; + Specifies one or more hours when the command should execute. + This is the hour field of the cron job. + + `--minute=`;; + Specifies one or more minutes of the hour when the command + should execute. This is the minute field of the cron job. + + `--enable-output`;; + Enables the output from the command - the cron daemon usually + emails this to the user specified in the cron configuration + + `--arg=`;; + Specifies an argument to pass to the command + +`remove-cronjob `:: + Removes a cron job previously installed by `install-cronjob` + Configuration files ------------------- diff --git a/tools/arkmanager b/tools/arkmanager index b6f8201..37ecdae 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1561,6 +1561,64 @@ doBackup(){ fi } +# +# Install a cron job to execute a particular command +# +doInstallCronJob(){ + hour='*' + minute='0' + cmdopts="${arkCronExtraOpts}" + cmdargs="" + output=">/dev/null 2>&1" + command="$1" + shift + + for opt in "$@"; do + case "$opt" in + --daily) + ;; + --hourly) + hour='*' + ;; + --hour=*) + hour="${opt#--hour=}" + ;; + --minute=*) + minute="${opt#--minute=}" + ;; + --enable-output) + output= + ;; + --arg=*) + cmdargs="${cmdargs} $(printf "%q" "${opt#--opt=}")" + ;; + --*) + cmdopts="${cmdopts} $(printf "%q" "${opt}")" + ;; + *) + cmdargs="${args} $(printf "%q" "${opt}")" + ;; + esac + done + + cronjob="${minute} ${hour} * * * arkmanager --cronjob ${command} @${instance} ${cmdopts} --args ${cmdargs} -- ${output}" + + (crontab -l | \ + sed -e "/ [*] [*] [*] arkmanager --cronjob ${command} @${instance} /d"; + echo "${cronjob}" ) | \ + crontab - +} + +# +# Removes an installed cron job +# +doRemoveCronJob(){ + command="$1" + + crontab -l | \ + sed -e "/ [*] [*] [*] arkmanager --cronjob ${command} @${instance} /d" | \ + crontab - +} # # Print the status of the server (running? online? version?) @@ -1697,6 +1755,8 @@ showUsage() { echo "installmod Installs a mod from the Steam workshop" echo "uninstallmod Removes the mod from the Mods directory" echo "reinstallmod Removes and re-installs a mod in the Mods directory" + echo "install-cronjob Adds a cron job using the specified command" + echo "remove-cronjob Removes a cron job that used the specified command" echo "restart Stops the server and then starts it" echo "run Runs the server without daemonizing" echo "start Starts the server" @@ -1746,6 +1806,10 @@ while true; do progressDisplayType=spinner continue ;; + --cronjob) + inCronJob=true + continue + ;; esac # get the number of arguments for commands that take arguments @@ -1756,6 +1820,8 @@ while true; do broadcast) nrarg=1; ;; rconcmd) nrarg=1; ;; useconfig) nrarg=1; ;; + install-cronjob) nrarg=1; ;; + remove-cronjob) nrarg=1; ;; esac # Enumerate the options and arguments @@ -1912,6 +1978,12 @@ while true; do status) printStatus ;; + install-cronjob) + doInstallCronJob "${args[@]}" "${options[@]}" + ;; + remove-cronjob) + doRemoveCronJob "${args[@]}" + ;; *) echo -n "arkmanager v${arkstVersion}: unknown command '$command' specified" showUsage From 326bb5560b20c1c88713aa081cc5f763f9ff141a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 27 Feb 2016 23:35:03 +1000 Subject: [PATCH 08/98] Process ark options in config file order --- tools/arkmanager | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 37ecdae..feb9ecb 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -602,6 +602,42 @@ doRun() { arkextraopts=( ) + while read varname; do + val="${!varname}" + case "$varname" in + ark_*) + name="${varname#ark_}" + + # Port is actually one higher than specified + # i.e. specifying port 7777 will have the server + # use port 7778 + if [ "$name" == "Port" ]; then + (( val = val - 1 )) + fi + + if [ -n "$val" ]; then + arkserveropts="${arkserveropts}?${name}=${val}" + else + arkserveropts="${arkserveropts}?${name}" + fi + ;; + arkopt_*) + name="${varname#arkopt_}" + val="${!varname}" + + if [ -n "$val" ]; then + arkextraopts=( "${arkextraopts[@]}" "-${name}=${val}" ) + fi + ;; + arkflag_*) + name="${varname#arkflag_}" + + arkextraopts=( "${arkextraopts[@]}" "-${name}" ) + ;; + esac + unset $varname + done < <(sed -n 's/^\(ark\(\|opt\|flag\)_[^= ]*\)=.*/\1/p' <"$configfile") + # bring in ark_... options for varname in "${!ark_@}"; do name="${varname#ark_}" From 1729c16df0f7593af9f3b600d8506b33b97bdca2 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 2 Mar 2016 00:47:14 +1000 Subject: [PATCH 09/98] Use serverMapModId to set map name and MapModID option --- tools/arkmanager | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index feb9ecb..7308839 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -593,7 +593,17 @@ doRun() { arkserveropts="$serverMap" if [ -n "$serverMapModId" ]; then - arkserveropts="-MapModID=$serverMapModId" + 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")" + arkserveropts="${serverMap}?MapModID=${serverMapModId}" fi if [ -z "$arkserveropts" ]; then From fd2637577036d22f213b9c882de59cd31f93d3ec Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 7 Mar 2016 15:56:33 +1000 Subject: [PATCH 10/98] Return -1 from numplayers if server unreachable --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 7308839..e1c6042 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -577,7 +577,7 @@ function numPlayersConnected(){ my $sockaddr = pack_sockaddr_in($port, inet_aton($ARGV[1])); send($socket, "\xff\xff\xff\xffTSource Engine Query\x00", 0, $sockaddr); my $data = ""; - recv($socket, $data, 1400, 0) or (print "0" and exit(1)); + recv($socket, $data, 1400, 0) or (print "-1" and exit(1)); my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5); my $players = ord(substr($rest, 2, 1)); print "$players\n"; From 63ded49b304077cb7bce67cb0b740c1a151c6acc Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 9 Mar 2016 19:32:01 +1000 Subject: [PATCH 11/98] Fix a couple of potential issues with player count checking --- tools/arkmanager | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index e1c6042..a066ae5 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -949,7 +949,7 @@ doWarn(){ doBroadcastWithEcho "$warnmsg" for (( min = warnminutes - 1; min >= warninterval; min-- )); do numplayers=$(numPlayersConnected) - if (( numplayers + 0 == 0 )); then + if (( (numplayers + 0) == 0 )); then echo "Nobody is connected. Shutting down immediately" return 0 fi @@ -976,7 +976,7 @@ doWarn(){ doBroadcastWithEcho "$warnmsg" if (( warnseconds >= 20 )); then numplayers=$(numPlayersConnected) - if (( numplayers + 0 == 0 )); then + if (( (numplayers + 0) == 0 )); then echo "Nobody is connected. Shutting down immediately" return 0 fi @@ -1114,7 +1114,7 @@ doUpdate() { fi elif [ "$updatetype" == "ifempty" ]; then numplayers=$(( $(numPlayersConnected) + 0 )) - if (( numplayers == 0 )); then + if (( numplayers != 0 )); then echo "${numplayers} players are still connected" return 1 fi From 3eca9d3446d607e13669a5c2229ece09c662dd5b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 9 Mar 2016 20:03:31 +1000 Subject: [PATCH 12/98] Fix numPlayersConnected to use getQueryPort --- tools/arkmanager | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index a066ae5..6b1f2bb 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -581,7 +581,7 @@ function numPlayersConnected(){ my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5); my $players = ord(substr($rest, 2, 1)); print "$players\n"; - ' "${ark_QueryPort}" "${ark_MultiHome:-127.0.0.1}" + ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" } # @@ -949,6 +949,7 @@ doWarn(){ doBroadcastWithEcho "$warnmsg" for (( min = warnminutes - 1; min >= warninterval; min-- )); do numplayers=$(numPlayersConnected) + echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then echo "Nobody is connected. Shutting down immediately" return 0 @@ -976,6 +977,7 @@ doWarn(){ doBroadcastWithEcho "$warnmsg" if (( warnseconds >= 20 )); then numplayers=$(numPlayersConnected) + echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then echo "Nobody is connected. Shutting down immediately" return 0 From 912c4dc824d8841aa753aea76d71d980252738b0 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 8 May 2016 23:27:51 +1000 Subject: [PATCH 13/98] Handle multiple map files in mods --- tools/arkmanager | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 6b1f2bb..59e645b 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1407,15 +1407,21 @@ doExtractMod(){ { local $/; $data = ; } my $mapnamelen = unpack("@0 L<", $data); my $mapname = substr($data, 4, $mapnamelen - 1); - my $mapfilelen = unpack("@" . ($mapnamelen + 8) . " L<", $data); - my $mapfile = substr($data, $mapnamelen + 12, $mapfilelen); + my $nummaps = unpack("@" . ($mapnamelen + 4) . " L<", $data); + my $pos = $mapnamelen + 8; my $modname = ($ARGV[1] || $mapname) . "\x00"; my $modnamelen = length($modname); my $modpath = "../../../ShooterGame/Content/Mods/" . $ARGV[0] . "\x00"; my $modpathlen = length($modpath); - print pack("L< L< L< Z$modnamelen L< Z$modpathlen L< L< Z$mapfilelen", + print pack("L< L< L< Z$modnamelen L< Z$modpathlen L<", $ARGV[0], 0, $modnamelen, $modname, $modpathlen, $modpath, - 1, $mapfilelen, $mapfile); + $nummaps); + for (my $mapnum = 0; $mapnum < $nummaps; $mapnum++){ + my $mapfilelen = unpack("@" . ($pos) . " L<", $data); + my $mapfile = substr($data, $mapnamelen + 12, $mapfilelen); + print pack("L< Z$mapfilelen", $mapfilelen, $mapfile); + $pos = $pos + 4 + $mapfilelen; + } print "\x33\xFF\x22\xFF\x02\x00\x00\x00\x01"; ' $modid "$modname" <"$moddestdir/mod.info" >"${moddestdir}.mod" From 103c3abcf9b2d783f4b8bbe9f8918a7c734b8b46 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 16 May 2016 17:32:32 +1000 Subject: [PATCH 14/98] Account for all lower-case names in some environments --- tools/arkmanager | 57 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 59e645b..3cd8657 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1493,18 +1493,57 @@ doBackup(){ savedir="${ark_AltSaveDirectoryName}" fi + saverootdir="${arkserverroot}/ShooterGame/Saved" + savedcfgdir="${saverootdir}/Config/LinuxServer" + savedir="${savedrootdir}/${savedir}" + + # Check for the (unlikely) case that the case of the + # saved ark directory is screwed up + if [ ! -d "${savedir}" ]; then + cisavedir="$(find "${arkserverroot}" -ipath "${savedir}" | head -n1)" + + if [ -n "$cisavedir" ]; then + echo -e " ${NORMAL}[ ${YELLOW}WARN${NORMAL} ] Saved arks directory capitalization is inconsistent" + savedir="${cisavedir}" + else + echo -e " ${NORMAL}[ ${RED}ERROR${NORMAL} ] Saved arks directory does not exist" + return 1 + fi + fi + # ARK server uses Write-Unlink-Rename echo -ne "${NORMAL} Copying ARK world file " - cp -p "${arkserverroot}/ShooterGame/Saved/${savedir}/${serverMap##*/}.ark" "${backupdir}/${serverMap##*/}.ark" - if [ ! -f "${backupdir}/${serverMap##*/}.ark" ]; then + + # Take into account screwed up casing of saved ark files + # in some environments + mapfile="$(find "${savedir}" -iname "${serverMap##*/}.ark" | head -n1)" + + if [ -z "$mapfile" ]; then sleep 2 - cp -p "${arkserverroot}/ShooterGame/Saved/${savedir}/${serverMap##*/}.ark" "${backupdir}/${serverMap##*/}.ark" + mapfile="$(find "${savedir}" -iname "${serverMap##*/}.ark" | head -n1)" fi + # If both attempts fail, server may have # crashed between unlink and rename - if [ ! -f "${backupdir}/${serverMap##*/}.ark" ]; then - cp -p "${arkserverroot}/ShooterGame/Saved/${savedir}/${serverMap##*/}.tmp" "${backupdir##*/}/${serverMap##*/}.ark" + if [ -z "$mapfile" ]; then + mapfile="$(find "${savedir}" -iname "${serverMap##*/}.tmp" | head -n1)" fi + + # If neither the ark nor the tmp file exists, then the + # map name may be incorrect. Try to get any ark or tmp + # file in the saved arks directory + if [ -z "$mapfile" ]; then + mapfile="$(find "${savedir}" -iname "*.ark" | head -n1)" + + if [ -z "$mapfile" ]; then + mapfile="$(find "${savedir}" -iname "*.tmp" | head -n1)" + fi + fi + + if [ -f "${mapfile}" ]; then + cp -p "${mapfile}" "${backupdir}/${serverMap##*/}.ark" + fi + if [ -f "${backupdir}/${serverMap##*/}.ark" ]; then echo -e "${NORMAL}\e[68G[ ${GREEN}OK${NORMAL} ]" else @@ -1516,7 +1555,7 @@ doBackup(){ # 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/${savedir}/"*.arkprofile; do + for f in "${savedir}/"*.arkprofile; do echo -ne "${NORMAL} ${f##*/} " cp -p "${f}" "${backupdir}/${f##*/}" if [ ! -s "${backupdir}/${f##*/}" ]; then @@ -1537,7 +1576,7 @@ doBackup(){ # ARK server uses Lock-Truncate-Write-Unlock echo -e "${NORMAL} Copying ARK tribe files " - for f in "${arkserverroot}/ShooterGame/Saved/${savedir}/"*.arktribe; do + for f in "${savedir}/"*.arktribe; do echo -ne "${NORMAL} ${f##*/} " cp -p "${f}" "${backupdir}/${f##*/}" if [ ! -s "${backupdir}/${f##*/}" ]; then @@ -1558,7 +1597,7 @@ doBackup(){ # 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" + cp -p "${savedcfgdir}/GameUserSettings.ini" "${backupdir}/GameUserSettings.ini" if [ ! -s "${backupdir}/GameUserSettings.ini" ]; then sleep 2 cp -p "${f}" "${backupdir}/${f##*/}" @@ -1572,7 +1611,7 @@ doBackup(){ echo -ne "${NORMAL} Copying Game.ini " - cp -p "${arkserverroot}/ShooterGame/Saved/Config/LinuxServer/Game.ini" "${backupdir}/Game.ini" + cp -p "${savedcfgdir}/Game.ini" "${backupdir}/Game.ini" if [ ! -s "${backupdir}/Game.ini" ]; then sleep 2 cp -p "${f}" "${backupdir}/${f##*/}" From e9b2c9b21f15a869d180620ccd8bd956ad4f8469 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 16 May 2016 17:38:08 +1000 Subject: [PATCH 15/98] Parse output of download_workshop_item command --- tools/arkmanager | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 3cd8657..3acc36b 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -158,6 +158,7 @@ else install_datadir="${install_datadir:-${install_bindir%/*}/share/arkmanager}" fi +declare -A modsrcdirs #--------------------- # functions @@ -366,8 +367,11 @@ function runSteamCMD(){ function runSteamCMDspinner(){ if [ -n "$verbose" ]; then - echo - runSteamCMD "$@" + if command >&3; then + runSteamCMD "$@" | tee /dev/fd/3 + else + runSteamCMD "$@" + fi return $? else if [ -z "$progressDisplayType" ]; then @@ -377,7 +381,11 @@ function runSteamCMDspinner(){ progressDisplayType=dots fi fi - runSteamCMD "$@" >/dev/null 2>&1 & + if command >&3; then + runSteamCMD "$@" >&3 & + else + runSteamCMD "$@" >/dev/null & + fi local scpid=$! local pos=0 local spinner=( '\b-' '\b/' '\b|' '\b\\' ) @@ -396,6 +404,12 @@ function runSteamCMDspinner(){ fi } +function runSteamCMDspinnerSubst(){ + local fd="$1" + shift + runSteamCMDspinner "$@" 3>&1 >/dev/fd/${fd} +} + # # Check if a new version is available but not apply it # @@ -1223,9 +1237,10 @@ doDownloadMod(){ while true; do echo -n "Downloading mod $modid" - runSteamCMDspinner +workshop_download_item $mod_appid $modid + local output=$(runSteamCMDspinnerSubst 5 +workshop_download_item $mod_appid $modid) 5>&1 result=$? if [ $result -eq 0 ]; then + modsrcdir="$(echo "$output" | sed -n 's@^Success. Downloaded item [0-9][0-9]* to "\([^"]*\)" .*@\1@p')" break else echo @@ -1243,6 +1258,7 @@ doDownloadMod(){ if [ -f "$modsrcdir/mod.info" ]; then echo "Mod $modid downloaded" + modsrcdirs[$modid]="$modsrcdir" return 0 else echo "Mod $modid was not successfully downloaded" @@ -1268,6 +1284,10 @@ isModUpdateNeeded(){ local moddestdir="$arkserverroot/ShooterGame/Content/Mods/$modid" local modbranch="${mod_branch:-Windows}" + if [ -n "${modsrcdirs[$modid]}" ]; then + modsrcdir="${modsrcdirs[$modid]}" + fi + for varname in "${!mod_branch_@}"; do if [ "mod_branch_$modid" == "$varname" ]; then modbranch="${!varname}" @@ -1315,6 +1335,10 @@ doExtractMod(){ local moddestdir="$arkserverroot/ShooterGame/Content/Mods/$modid" local modbranch="${mod_branch:-Windows}" + if [ -n "${modsrcdirs[$modid]}" ]; then + modsrcdir="${modsrcdirs[$modid]}" + fi + for varname in "${!mod_branch_@}"; do if [ "mod_branch_$modid" == "$varname" ]; then modbranch="${!varname}" From 053a938f56fc0dead21d93d58ec8024a7fb2af99 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 16 May 2016 17:38:37 +1000 Subject: [PATCH 16/98] Improve broadcast warning messages --- tools/arkmanager | 317 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 219 insertions(+), 98 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 3acc36b..0cd3f00 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -896,118 +896,207 @@ doInstall() { getCurrentVersion } +# +# Formats a warning message based on replacement strings +# +printWarnMessage(){ + local msg + if [ -n "$msgWarnReason" ]; then + local reason + local msgtime + if [ "$3" == "minutes" ]; then + if [ -n "$msgTimeMinutes" ]; then + msgtime="${msgTimeMinutes//\{minutes\}/$4}" + else + msgtime="$4 minutes" + fi + else + if [ -n "$msgTimeSeconds" ]; then + msgtime="${msgTimeSeconds//\{seconds\}/$4}" + else + msgtime="$4 seconds" + fi + fi + msg="${msgWarnReason//\{time\}/$msgtime}" + if [ "$1" == "update" ]; then + if [ -n "$appupdate" ]; then + if [ -n "$modupdate" ]; then + if [ -n "$msgReasonUpdateAppMod" ]; then + reason="$msgReasonUpdateMod" + else + reason="an update to the game and an update to mod(s) {modnamesupdated}" + fi + else + if [ -n "$msgReasonUpdateApp" ]; then + reason="$msgReasonUpdateApp" + else + reason="an update to the game" + fi + fi + elif [ -n "$modupdate" ]; then + if [ -n "$msgReasonUpdateMod" ]; then + reason="$msgReasonUpdateMod" + else + reason="an update to mod(s) {modnamesupdated}" + fi + fi + elif [ -n "$shutdownreason" ]; then + reason="$shutdownreason" + elif [ "$1" == "restart" ]; then + if [ -n "$msgReasonRestart" ]; then + reason="$msgReasonRestart" + else + reason="a restart" + fi + else + if [ -n "$msgReasonShutdown" ]; then + reason="$msgReasonShutdown" + else + reason="maintenance" + fi + fi + reason="${reason//\{modnamesupdated\}/${modnamesupdated}}" + msg="${msg//\{reason\}/${reason}}" + printf "%s\n" "$msg" + else + if [ "$1" == "update" ]; then + if [ "$3" == "minutes" ]; then + if [ -n "$msgWarnUpdateMinutes" ]; then + msg="${msgWarnUpdateMinutes//%d/$4}" + else + msg="This ARK server will shutdown for an update in $4 minutes" + fi + else + if [ -n "$msgWarnUpdateSeconds" ]; then + msg="${msgWarnUpdateSeconds//%d/$4}" + else + msg="This ARK server will shutdown for an update in $4 seconds" + fi + fi + elif [ "$1" == "restart" ]; then + if [ "$3" == "minutes" ]; then + if [ -n "$msgWarnRestartMinutes" ]; then + msg="${msgWarnRestartMinutes//%d/$4}" + else + msg="This ARK server will shutdown for a restart in $4 minutes" + fi + else + if [ -n "$msgWarnRestartSeconds" ]; then + msg="${msgWarnRestartSeconds//%d/$4}" + else + msg="This ARK server will shutdown for a restart in $4 seconds" + fi + fi + else + if [ "$3" == "minutes" ]; then + if [ -n "$msgWarnShutdownMinutes" ]; then + msg="${msgWarnShutdownMinutes//%d/$4}" + else + msg="This ARK server will shutdown in $4 minutes" + fi + else + if [ -n "$msgWarnShutdownSeconds" ]; then + msg="${msgWarnShutdownSeconds//%d/$4}" + else + msg="This ARK server will shutdown in $4 seconds" + fi + fi + fi + fi + + doBroadcastWithEcho "$msg" +} + # # Waits for a configurable number of minutes before updating the server # doWarn(){ cd "$arkserverroot" - local warnmsgmin - local warnmsgsec - - if [ "$1" == "update" ]; then - if [ -n "$msgWarnUpdateMinutes" ]; then - warnmsgmin="$msgWarnUpdateMinutes" - else - warnmsgmin="This ARK server will shutdown for an update in %d minutes" - fi - if [ -n "$msgWarnUpdateSeconds" ]; then - warnmsgsec="$msgWarnUpdateSeconds" - else - warnmsgsec="This ARK server will shutdown for an update in %d seconds" - fi - elif [ "$1" == "restart" ]; then - if [ -n "$msgWarnRestartMinutes" ]; then - warnmsgmin="$msgWarnRestartMinutes" - else - warnmsgmin="This ARK server will shutdown for a restart in %d minutes" - fi - if [ -n "$msgWarnRestartSeconds" ]; then - warnmsgsec="$msgWarnRestartSeconds" - else - warnmsgsec="This ARK server will shutdown for a restart in %d seconds" - fi - else - if [ -n "$msgWarnShutdownMinutes" ]; then - warnmsgmin="$msgWarnShutdownMinutes" - else - warnmsgmin="This ARK server will shutdown in %d minutes" - fi - if [ -n "$msgWarnShutdownSeconds" ]; then - warnmsgsec="$msgWarnShutdownSeconds" - else - warnmsgsec="This ARK server will shutdown in %d seconds" - fi - fi - - local pid=`getServerPID` - local sleeppid - if [ -n "$pid" ]; then - local warnmsg - local warnminutes=$(( arkwarnminutes )) - if (( warnminutes == 0 )); then - warnminutes=60 - fi - - local warnintervals=( 90 60 45 30 20 15 10 5 4 3 2 ) - - for warninterval in "${warnintervals[@]}"; do - if [ "`getServerPID`" != "$pid" ]; then - echo "Server has stopped. Aborting $1" - return 1 + ( + update_cancelled(){ + if [ -n "$msgUpdateCancelled" ]; then + msg="${msgUpdateCancelled//%s/$1}" + else + msg="Update cancelled by operator ($1)" fi - if (( warnminutes > warninterval )); then - sleep 1m & + doBroadcastWithEcho "${msg}" + } + + trap "update_cancelled 'Ctrl+C'" SIGINT + trap "update_cancelled 'Terminated'" SIGTERM + trap "update_cancelled 'Connection Closed'" SIGHUP + trap "update_cancelled 'Quit'" SIGQUIT + + local pid=`getServerPID` + local sleeppid + if [ -n "$pid" ]; then + local warnmsg + local warnminutes=$(( arkwarnminutes )) + if (( warnminutes == 0 )); then + warnminutes=60 + fi + + local warnintervals=( 90 60 45 30 20 15 10 5 4 3 2 ) + + for warninterval in "${warnintervals[@]}"; do + if [ "`getServerPID`" != "$pid" ]; then + echo "Server has stopped. Aborting $1" + return 1 + fi + if (( warnminutes >= warninterval )); then + sleep 1m & + sleeppid=$! + printWarnMessage "$1" "$2" "minutes" "$warnminutes" + for (( min = warnminutes - 1; min >= warninterval; min-- )); do + numplayers=$(numPlayersConnected) + echo "There are ${numplayers} players connected" + if (( (numplayers + 0) == 0 )); then + doBroadcastWithEcho "Nobody is connected. Shutting down immediately" + return 0 + fi + wait $sleeppid + if (( $min > $warninterval )); then + sleep 1m & + sleeppid=$! + fi + done + warnminutes=$warninterval + fi + done + + local warnseconds=120 + warnintervals=( 90 60 45 30 20 15 10 5 0 ) + for warninterval in "${warnintervals[@]}"; do + sleep $(( warnseconds - warninterval ))s & sleeppid=$! - warnmsg="$(printf "$warnmsgmin" "$warnminutes")" - doBroadcastWithEcho "$warnmsg" - for (( min = warnminutes - 1; min >= warninterval; min-- )); do + if [ "`getServerPID`" != "$pid" ]; then + echo "Server has stopped. Aborting update" + return 1 + fi + printWarnMessage "$1" "$2" "seconds" "$warnseconds" + if (( warnseconds >= 20 )); then numplayers=$(numPlayersConnected) echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then - echo "Nobody is connected. Shutting down immediately" + doBroadcastWithEcho "Nobody is connected. Shutting down immediately" return 0 fi - wait $sleeppid - if (( $min > $warninterval )); then - sleep 1m & - sleeppid=$! - fi - done - warnminutes=$warninterval - fi - done - - local warnseconds=120 - warnintervals=( 90 60 45 30 20 15 10 5 0 ) - for warninterval in "${warnintervals[@]}"; do - sleep $(( warnseconds - warninterval ))s & - sleeppid=$! - if [ "`getServerPID`" != "$pid" ]; then - echo "Server has stopped. Aborting update" - return 1 - fi - warnmsg="$(printf "$warnmsgsec" "$warnseconds")" - doBroadcastWithEcho "$warnmsg" - if (( warnseconds >= 20 )); then - numplayers=$(numPlayersConnected) - echo "There are ${numplayers} players connected" - if (( (numplayers + 0) == 0 )); then - echo "Nobody is connected. Shutting down immediately" - return 0 fi - fi - wait $sleeppid - warnseconds=$warninterval - done - fi + wait $sleeppid + warnseconds=$warninterval + done + fi - if [ "`getServerPID`" != "$pid" ]; then - echo "Server has stopped. Aborting $1" - return 1 - fi + if [ "`getServerPID`" != "$pid" ]; then + echo "Server has stopped. Aborting $1" + return 1 + fi - return 0 + return 0 + ) + + return $? } # @@ -1313,17 +1402,49 @@ isModUpdateNeeded(){ return 1 } +# +# Get the name of the specified mod +# +getModName(){ + local modid=$1 + local modsrcdir="$steamcmdroot/steamapps/workshop/content/$mod_appid/$modid" + + if [ -n "${modsrcdirs[$modid]}" ]; then + modsrcdir="${modsrcdirs[$modid]}" + fi + + modname="$(curl -s "http://steamcommunity.com/sharedfiles/filedetails/?id=${modid}" | sed -n 's|^.*
\([^<]*\)
.*|\1|p')" + + if [ -n "$modname" ]; then + echo "$modname" + else + perl -e ' + my $data; + { local $/; $data = ; } + my $mapnamelen = unpack("@0 L<", $data); + my $mapname = substr($data, 4, $mapnamelen - 1); + print $mapname + ' <"${modsrcdir}/mod.info" + fi +} + # # Checks if any installed or requested mods need to be updated # isAnyModUpdateNeeded(){ + modnamesupdated="" + local ismodupdateneeded=1 for modid in $(getModIds); do if isModUpdateNeeded $modid; then - return 0 + ismodupdateneeded=0 + if [ -n "$modnamesupdated" ]; then + modnamesupdated="${modnamesupdated}, " + fi + modnamesupdated="${modnamesupdated}$(getModName "$modid")" fi done - return 1 + return $ismodupdateneeded } # From 2b83abf65cebdc784049bbc2691c20d240c8fff2 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 16 May 2016 17:39:49 +1000 Subject: [PATCH 17/98] Allow stop and restart commands to take a reason --- tools/arkmanager | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 0cd3f00..0e10b28 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -816,10 +816,24 @@ doStartAll(){ # doStop() { if isTheServerRunning; then - if [[ " $* " =~ " --warn " ]]; then - doWarn "$1" + local stopreason="$1" + local dowarn= + local warnreason= + local dosave= + shift + + for arg in "$@"; do + case "$arg" in + --warn) dowarn=1; ;; + --warnreason=*) warnreason="${arg#*=}"; ;; + --saveworld) dosave=1; ;; + esac + done + + if [[ -n "$dowarn" ]]; then + doWarn "$1" "$warnreason" fi - if [[ " $* " =~ " --saveworld " ]]; then + if [[ -n "$dosave" ]]; then doSaveWorld fi tput sc @@ -1237,7 +1251,7 @@ doUpdate() { doSaveWorld fi - doStop + doStop update # If user wants to back-up, we do it here. From eaefdfaaa61f7f6e8065357950f5ae5e2dd1fdcd Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 16 May 2016 17:55:50 +1000 Subject: [PATCH 18/98] Move .modbranch to __arkmanager_modbranch__.info --- tools/arkmanager | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 0e10b28..c55f8d0 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1397,7 +1397,11 @@ isModUpdateNeeded(){ fi done - if [ \( ! -f "$moddestdir/.modbranch" \) ] || [ "$(<"$moddestdir/.modbranch")" != "$modbranch" ]; then + if [ -f "$moddestdir/.modbranch" ]; then + mv "$moddestdir/.modbranch" "$moddestdir/__arkmanager_modbranch__.info" + fi + + if [ \( ! -f "$moddestdir/__arkmanager_modbranch__.info" \) ] || [ "$(<"$moddestdir/__arkmanager_modbranch__.info")" != "$modbranch" ]; then return 0 fi @@ -1480,7 +1484,11 @@ doExtractMod(){ fi done - if [ \( ! -f "$moddestdir/.modbranch" \) ] || [ "$(<"$moddestdir/.modbranch")" != "$modbranch" ]; then + if [ -f "$moddestdir/.modbranch" ]; then + mv "$moddestdir/.modbranch" "$moddestdir/__arkmanager_modbranch__.info" + fi + + if [ \( ! -f "$moddestdir/__arkmanager_modbranch__.info" \) ] || [ "$(<"$moddestdir/__arkmanager_modbranch__.info")" != "$modbranch" ]; then rm -rf "$moddestdir" fi @@ -1590,7 +1598,7 @@ doExtractMod(){ echo -ne '\x01\x00\x00\x00\x08\x00\x00\x00ModType\x00\x02\x00\x00\x001\x00' >>"${moddestdir}.mod" fi - echo "$modbranch" >"$moddestdir/.modbranch" + echo "$modbranch" >"$moddestdir/__arkmanager_modbranch__.info" fi } From 8c57170e4d680f55d1713f20548abc2001911d5a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 17 May 2016 07:12:33 +1000 Subject: [PATCH 19/98] Remove now unnecessary ulimit setup --- tools/arkmanager | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index c55f8d0..5f0009c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -701,8 +701,6 @@ doRun() { arkserveropts="${arkserveropts}?listen" # run the server in background echo "`timestamp`: start" - # set max open files limit before we start the server - ulimit -n $maxOpenFiles serverpid=0 restartserver=1 From bc40544bf81bbd31d34c5abfef12d44607b08cee Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 17 May 2016 08:11:40 +1000 Subject: [PATCH 20/98] Fix an inconsistency between install.sh and arkmanager.init --- tools/systemd/arkmanager.init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/systemd/arkmanager.init b/tools/systemd/arkmanager.init index fa760d2..c63be0c 100755 --- a/tools/systemd/arkmanager.init +++ b/tools/systemd/arkmanager.init @@ -1,6 +1,6 @@ #!/bin/bash -DAEMON=/usr/bin/arkmanager +DAEMON="/usr/bin/arkmanager" for service in $(${DAEMON} list-instances --brief); do case "$1" in From c8f6cee90b45aed0baa9089498adba607db20756 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 17 May 2016 09:52:48 +1000 Subject: [PATCH 21/98] Fix typo in doBackup --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 5f0009c..db1e70e 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1660,7 +1660,7 @@ doBackup(){ saverootdir="${arkserverroot}/ShooterGame/Saved" savedcfgdir="${saverootdir}/Config/LinuxServer" - savedir="${savedrootdir}/${savedir}" + savedir="${saverootdir}/${savedir}" # Check for the (unlikely) case that the case of the # saved ark directory is screwed up From e05ec78ac897005646a34d573adc5562b05d82d0 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 17 May 2016 09:56:33 +1000 Subject: [PATCH 22/98] Change to the home directory This should prevent errors when running from an inaccessible directory --- tools/arkmanager | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index db1e70e..898dcf8 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -126,6 +126,8 @@ if [ -f "${HOME}/.arkmanager.cfg" ]; then source "${HOME}/.arkmanager.cfg" fi +cd "$HOME" + lsof=lsof if [ -x /usr/sbin/lsof ]; then lsof=/usr/sbin/lsof From 9a4211d47480a59a90145d6b98e0b68e0dec94b2 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 17 May 2016 10:14:13 +1000 Subject: [PATCH 23/98] Update documentation with new options --- README.asciidoc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 2f6a39d..ad81caa 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -152,6 +152,9 @@ instances. `--warn`;; Warns any connected players that the server is going down + `--warnreason`;; + Gives a reason for the shutdown. Defaults to `maintenance` + `--saveworld`;; Saves the world using `saveworld` - usually not necessary, as server usually saves the world on a graceful @@ -161,6 +164,9 @@ instances. Runs the `stop` command followed by the `restart` command. Accepts and passes the options for those commands + `--warnreason`;; + Gives a reason for the restart. Defaults to `a restart` + `install`:: Downloads and installs (or validates an existing install) of the ARK server @@ -352,6 +358,32 @@ The following options can be overridden on a per-instance basis: Templated messages for warnings, where `%d` is replaced with the number of minutes / seconds before the update / restart / shutdown +`msgWarnReason`:: +`msgTimeMinutes`:: +`msgTimeSeconds`:: +`msgReasonUpdateApp`:: +`msgReasonUpdateMod`:: +`msgReasonUpdateAppMod`:: +`msgReasonRestart`:: +`msgReasonShutdown`:: + Alternative templated messages for warnings with the following + replacement parameters: + + `{reason}`;; + Valid in `msgWarnReason`, replaced at runtime with the appropriate `msgReason*` template + + `{time}`;; + Valid in `msgWarnReason`, replaced at runtime with the appropriate `msgTime*` template + + `{modnamesupdate}`;; + Valid in `msgReason*Mod`, replaced at runtime with a comma-delimited list of updated mod names + + `{minutes}`;; + Valid in `msgTimeMinutes`, replaced at runtime with minutes remaining until shutdown + + `{seconds}`;; + Valid in `msgTimeSeconds`, replaced at runtime with seconds remaining until shutdown + `logdir`:: Specifies where to store log files From 41097175fa86f6e6866a4f83984c2ced01cf54df Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Thu, 19 May 2016 19:09:18 +1000 Subject: [PATCH 24/98] Add cancelshutdown command --- README.asciidoc | 4 ++++ tools/arkmanager | 45 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) 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 ;; From 6b22944fe611eb96cdd6e3f9e11685b97daff4f3 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 21 May 2016 19:26:04 +1000 Subject: [PATCH 25/98] Print SteamCMD command being executed --- tools/arkmanager | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 2629212..d5488e1 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -369,6 +369,9 @@ function runSteamCMD(){ function runSteamCMDspinner(){ if [ -n "$verbose" ]; then + printf "Executing" + printf " %q" "$steamcmdroot/$steamcmdexec" +@NoPromptForPassword 1 +login ${steamlogin:-anonymous} "$@" +quit + printf "\n" if command >&3; then runSteamCMD "$@" | tee /dev/fd/3 else From 5f317c8d5754e2b03019ce8f9a2089d743c76b81 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 28 May 2016 13:25:01 +1000 Subject: [PATCH 26/98] Allow {time} in warning reason --- README.asciidoc | 2 +- tools/arkmanager | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.asciidoc b/README.asciidoc index a6a68e3..07b896e 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -377,7 +377,7 @@ The following options can be overridden on a per-instance basis: Valid in `msgWarnReason`, replaced at runtime with the appropriate `msgReason*` template `{time}`;; - Valid in `msgWarnReason`, replaced at runtime with the appropriate `msgTime*` template + Valid in `msgWarnReason` and `msgReason*`, replaced at runtime with the appropriate `msgTime*` template `{modnamesupdate}`;; Valid in `msgReason*Mod`, replaced at runtime with a comma-delimited list of updated mod names diff --git a/tools/arkmanager b/tools/arkmanager index d5488e1..2d4775c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -988,6 +988,7 @@ printWarnMessage(){ reason="maintenance" fi fi + reason="${reason//\{time\}/${msgtime}}" reason="${reason//\{modnamesupdated\}/${modnamesupdated}}" msg="${msg//\{reason\}/${reason}}" printf "%s\n" "$msg" From f9668ceae05bc46d9b2726f1dd29e5e42aa871bc Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 28 May 2016 13:35:03 +1000 Subject: [PATCH 27/98] Fix a typo in the documentation --- README.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.asciidoc b/README.asciidoc index 07b896e..ac3784f 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -379,7 +379,7 @@ The following options can be overridden on a per-instance basis: `{time}`;; Valid in `msgWarnReason` and `msgReason*`, replaced at runtime with the appropriate `msgTime*` template - `{modnamesupdate}`;; + `{modnamesupdated}`;; Valid in `msgReason*Mod`, replaced at runtime with a comma-delimited list of updated mod names `{minutes}`;; From ea6de39917175edd3af434736c6467a2c71adc88 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 28 May 2016 20:19:06 +1000 Subject: [PATCH 28/98] " \n " added to empty response message Server response when a command returns no response is "Server received, But no response!! \n " --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 2d4775c..3fa123a 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -323,10 +323,10 @@ rconcmd() { auth($socket, $password); sendpkt($socket, 2, 2, $command); my ($resid, $restype, $rcvbody) = recvpkt($socket); - if ($rcvbody eq "Server received, But no response!!") { + if ($rcvbody eq "Server received, But no response!! \n ") { print "Command processed\n"; } else { - print $rcvbody, "\n"; + print "\"", $rcvbody, "\"\n"; } ' "$(getRconPort)" "${ark_MultiHome:-127.0.0.1}" "$adminpass" "$1" } From 957a5689dc7b0cc4b3793f43ac7b982fbe53ce41 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 28 May 2016 20:41:25 +1000 Subject: [PATCH 29/98] Fix an error in doWarn that was causing duplicate warnings --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 3fa123a..a854b88 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1099,7 +1099,7 @@ doWarn(){ sleep 1m & sleeppid=$! printWarnMessage "$1" "$2" "minutes" "$warnminutes" - for (( min = warnminutes - 1; min >= warninterval; min-- )); do + for (( min = warnminutes; min >= warninterval; min-- )); do numplayers=$(numPlayersConnected) echo "There are ${numplayers} players connected" if (( (numplayers + 0) == 0 )); then @@ -1113,7 +1113,7 @@ doWarn(){ sleeppid=$! fi done - warnminutes=$warninterval + warnminutes=$(( warninterval - 1 )) fi done From 0be8a67ba0ff4222ffd7328cb02b849b8e0aa0e2 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 02:25:11 +1000 Subject: [PATCH 30/98] Actually cancel warning when Ctrl-C etc are pressed --- tools/arkmanager | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/arkmanager b/tools/arkmanager index a854b88..2b82806 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1071,6 +1071,7 @@ doWarn(){ msg="Shutdown cancelled by operator ($1)" fi doBroadcastWithEcho "${msg}" + exit 1 } trap "update_cancelled 'Ctrl+C'" SIGINT From e2c3fa3c683dc12bb3c2590699cd797070fd814a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 02:27:37 +1000 Subject: [PATCH 31/98] Fix warning in runSteamCMDspinner --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 2b82806..504d1b6 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -386,7 +386,7 @@ function runSteamCMDspinner(){ progressDisplayType=dots fi fi - if command >&3; then + if (command >&3) 2>/dev/null; then runSteamCMD "$@" >&3 & else runSteamCMD "$@" >/dev/null & From ca3ff1e5f6b550acdd71ab2c8a0a6b9ed027591a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 02:38:19 +1000 Subject: [PATCH 32/98] Fix restart --warn broadcasting shutdown message --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 504d1b6..7b9cb82 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -834,7 +834,7 @@ doStop() { done if [[ -n "$dowarn" ]]; then - if ! doWarn "$1" "$warnreason"; then + if ! doWarn "$stopreason" "$warnreason"; then return 1 fi fi From 6ae8a442990af2306b9318b0a4a2701b44ac2a4e Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 12:54:59 +1000 Subject: [PATCH 33/98] Fix error in runSteamCMDspinnerSubst --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 7b9cb82..533deff 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1383,7 +1383,7 @@ doDownloadMod(){ while true; do echo -n "Downloading mod $modid" - local output=$(runSteamCMDspinnerSubst 5 +workshop_download_item $mod_appid $modid) 5>&1 + local output=$(runSteamCMDspinnerSubst 5 +workshop_download_item $mod_appid $modid) result=$? if [ $result -eq 0 ]; then modsrcdir="$(echo "$output" | sed -n 's@^Success. Downloaded item [0-9][0-9]* to "\([^"]*\)" .*@\1@p')" @@ -1400,7 +1400,7 @@ doDownloadMod(){ fi echo "Mod $modid not fully downloaded - retrying" fi - done + done 5>&1 if [ -f "$modsrcdir/mod.info" ]; then echo "Mod $modid downloaded" From 2b160082aa50f935aedba003fd899858d114416e Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 18:10:01 +1000 Subject: [PATCH 34/98] Fix permission denied error when updating mods --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 533deff..86eeee5 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1400,7 +1400,7 @@ doDownloadMod(){ fi echo "Mod $modid not fully downloaded - retrying" fi - done 5>&1 + done 5> >(cat) if [ -f "$modsrcdir/mod.info" ]; then echo "Mod $modid downloaded" From 6b9245cb638a51ec83f30d52d9588dc2be45c32b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 18:18:05 +1000 Subject: [PATCH 35/98] Fix spinner --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 86eeee5..27faac2 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -380,7 +380,7 @@ function runSteamCMDspinner(){ return $? else if [ -z "$progressDisplayType" ]; then - if stty <&1 >/dev/null 2>&1; then + if stty <&2 >/dev/null 2>&1; then progressDisplayType=spinner else progressDisplayType=dots From cbe5e2ea5034213efbbc91d9873e2cc8f3d915cf Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 18:39:03 +1000 Subject: [PATCH 36/98] Fix Blob SHA breakage --- netinstall.sh | 2 -- tools/arkmanager | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/netinstall.sh b/netinstall.sh index e1e679a..564b3d9 100644 --- a/netinstall.sh +++ b/netinstall.sh @@ -43,8 +43,6 @@ curl -L -k -s https://github.com/FezVrasta/ark-server-tools/archive/${COMMIT}.ta # Install ARK Server Tools cd ark-server-tools-${COMMIT}/tools sed -i "s|^arkstCommit='.*'$|arkstCommit='${COMMIT}'|" arkmanager -version=`<../.version` -sed -i "s|^arkstVersion=\".*\"|arkstVersion='${version}'|" arkmanager chmod +x install.sh bash install.sh "$steamcmd_user" "$@" >"$output" 2>&1 diff --git a/tools/arkmanager b/tools/arkmanager index 27faac2..57d6ef3 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -7,7 +7,7 @@ # Contributors: Sispheor, Atriusftw, klightspeed, lexat, puseidr # Script version -arkstVersion="1.6" +arkstVersion='1.6' arkstCommit='' doUpgradeTools() { @@ -2191,7 +2191,8 @@ while true; do if [ -n "${arkstCommit}" ]; then echo "Commit: ${arkstCommit:0:7}" fi - echo "Blob SHA: $( (echo -ne "blob $(stat -c "%s" "$0")\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" + blobsize="$(sed "s@^arkstCommit=.*@arkstCommit=''@" "$0" | wc -c)" + echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;; -h|--help) From 06e1c190443e20cd7166e800a351733918e1eb79 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 20:03:16 +1000 Subject: [PATCH 37/98] remove-mods removes mods from workshop directory --- tools/arkmanager | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 57d6ef3..2d1f342 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1672,6 +1672,26 @@ doUninstallMod(){ fi } +# +# Removes mod from steamcmd workshop directory +# +doRemoveMods(){ + local modid + for modid in ${1//,/ }; do + if [ -f "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" ]; then + sed -i "/^\\t\\t\"${modid}\"/,/^\\t\\t}/d" "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" + fi + + if [ -d "$steamcmdroot/steamapps/workshop/content/${mod_appid}/${modid}" ]; then + rm -rf "$steamcmdroot/steamapps/workshop/content/${mod_appid}/${modid}" + fi + + if [ -d "$steamcmdroot/steamapps/workshop/downloads/${mod_appid}/${modid}" ]; then + rm -rf "$steamcmdroot/steamapps/workshop/downloads/${mod_appid}/${modid}" + fi + done +} + # # Copies server state to a backup directory # @@ -2125,6 +2145,7 @@ while true; do useconfig) nrarg=1; ;; install-cronjob) nrarg=1; ;; remove-cronjob) nrarg=1; ;; + remove-mods) nrarg=1; ;; esac # Enumerate the options and arguments @@ -2181,6 +2202,10 @@ while true; do defaultinstance="${args[0]}" continue ;; + remove-mods) + doRemoveMods "${args[0]}" + continue + ;; list-instances) doListAllInstances "${options[@]}" exit From f0ef9fdaf7e7329e482499f0c3067fa1f947aa4c Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 20:18:45 +1000 Subject: [PATCH 38/98] Add remove-mods to readme --- README.asciidoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index ac3784f..21c43a7 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -129,6 +129,9 @@ Instanceless commands `useconfig`:: Legacy command for specifying an instance for the following command(s) +`remove-mods`:: + Remove the specified mods from the `steamcmd` workshop directory + Commands acting on instances ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From e8de3826c985b4619abe2192aea1abac8cf03b6f Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 30 May 2016 20:29:15 +1000 Subject: [PATCH 39/98] Avoid "no command" message if remove-mods is only command --- tools/arkmanager | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 2d1f342..4263495 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2204,7 +2204,11 @@ while true; do ;; remove-mods) doRemoveMods "${args[0]}" - continue + if [ $# -eq 0 ]; then + exit 0 + else + continue + fi ;; list-instances) doListAllInstances "${options[@]}" From cb22f09df283291f5aad28065a40df86d4774573 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 31 May 2016 18:46:37 +1000 Subject: [PATCH 40/98] Fix mod download not being retried --- tools/arkmanager | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 4263495..9c143c9 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -372,8 +372,8 @@ function runSteamCMDspinner(){ printf "Executing" printf " %q" "$steamcmdroot/$steamcmdexec" +@NoPromptForPassword 1 +login ${steamlogin:-anonymous} "$@" +quit printf "\n" - if command >&3; then - runSteamCMD "$@" | tee /dev/fd/3 + if (command >&3) 2>/dev/null; then + runSteamCMD "$@" > >(tee /dev/fd/3) else runSteamCMD "$@" fi @@ -1383,7 +1383,8 @@ doDownloadMod(){ while true; do echo -n "Downloading mod $modid" - local output=$(runSteamCMDspinnerSubst 5 +workshop_download_item $mod_appid $modid) + local output + output=$(runSteamCMDspinnerSubst 5 +workshop_download_item $mod_appid $modid) result=$? if [ $result -eq 0 ]; then modsrcdir="$(echo "$output" | sed -n 's@^Success. Downloaded item [0-9][0-9]* to "\([^"]*\)" .*@\1@p')" From eb99bb7391c8f5966c245e7c548ea51ff300ee36 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 6 Jun 2016 07:54:47 +1000 Subject: [PATCH 41/98] Add --no-download option to update --- tools/arkmanager | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 9c143c9..5b31a0d 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1166,6 +1166,7 @@ doUpdate() { local modupdate= local saveworld= local downloadonly= + local nodownload= for arg in "$@"; do if [ "$arg" == "--force" ]; then @@ -1189,6 +1190,8 @@ doUpdate() { arkStagingDir="${ark#--stagingdir=}" elif [ "$arg" == "--downloadonly" ]; then downloadonly=1 + elif [ "$arg" == "--no-download" ]; then + nodownload=1 else echo "Unrecognized option $arg" echo "Try 'arkmanager -h' or 'arkmanager --help' for more information." @@ -1213,8 +1216,10 @@ doUpdate() { rm -f "${arkserverroot}/.ark-update.lock.$$" if [ -n "$modupdate" ]; then - if ! doDownloadAllMods; then - modupdate= + if [ -z "$nodownload" ]; then + if ! doDownloadAllMods; then + modupdate= + fi fi if ! isAnyModUpdateNeeded; then modupdate= @@ -1244,12 +1249,14 @@ doUpdate() { rm -rf "$arkStagingDir/ShooterGame/Saved/"* fi - echo -n "Downloading ARK update" - cd "$steamcmdroot" - runSteamCMDAppUpdate "$arkStagingDir" $validate - if [ -d "${arkStagingDir}/steamapps/downloading/${appid}" ]; then - echo "Update download interrupted" - return 1 + if [ -z "$nodownload" ]; then + echo -n "Downloading ARK update" + cd "$steamcmdroot" + runSteamCMDAppUpdate "$arkStagingDir" $validate + if [ -d "${arkStagingDir}/steamapps/downloading/${appid}" ]; then + echo "Update download interrupted" + return 1 + fi fi fi fi From 91776b27a1078922721a023238583d6fdb39894f Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Thu, 9 Jun 2016 03:06:04 +1000 Subject: [PATCH 42/98] Clean up after SteamCMD if it returns successful --- tools/arkmanager | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 5b31a0d..a6a0e7f 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1252,8 +1252,11 @@ doUpdate() { if [ -z "$nodownload" ]; then echo -n "Downloading ARK update" cd "$steamcmdroot" - runSteamCMDAppUpdate "$arkStagingDir" $validate - if [ -d "${arkStagingDir}/steamapps/downloading/${appid}" ]; then + if runSteamCMDAppUpdate "$arkStagingDir" $validate; then + rm -rf "${arkStagingDir}/steamapps/downloading/${appid}" + fi + + if [ -d "${arkStagingDir}/steamapps/downloading/${appid}" ]; then echo "Update download interrupted" return 1 fi From 29ffa2f3a35f73b930666761f363f2fc32fbe9d3 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 11 Jun 2016 01:58:35 +1000 Subject: [PATCH 43/98] Make arkmanager script sourceable --- tools/arkmanager | 457 ++++++++++++++++++++++++----------------------- 1 file changed, 233 insertions(+), 224 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index a6a0e7f..a477210 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2114,254 +2114,263 @@ showUsage() { # Main program #--------------------- -# check the configuration and throw errors or warnings if needed -checkConfig +main(){ + # check the configuration and throw errors or warnings if needed + checkConfig -while true; do - options=( ) - allinstances=no - instances=( ) - args=( ) - command="$1" - shift - nrarg=0 + while true; do + options=( ) + allinstances=no + instances=( ) + args=( ) + command="$1" + shift + nrarg=0 - # Handle global options - case "$command" in - --verbose) - verbose=1 - continue - ;; - --dots) - progressDisplayType=dots - continue - ;; - --spinner) - progressDisplayType=spinner - continue - ;; - --cronjob) - inCronJob=true - continue - ;; - esac - - # get the number of arguments for commands that take arguments - case "$command" in - installmod) nrarg=1; ;; - uninstallmod) nrarg=1; ;; - reinstallmod) nrarg=1; ;; - broadcast) nrarg=1; ;; - rconcmd) nrarg=1; ;; - useconfig) nrarg=1; ;; - install-cronjob) nrarg=1; ;; - remove-cronjob) nrarg=1; ;; - remove-mods) nrarg=1; ;; - esac - - # Enumerate the options and arguments - while [ $# -ne 0 ]; do - case "$1" in - --) - shift - break - ;; - --args) - nrarg=$# - ;; + # Handle global options + case "$command" in --verbose) verbose=1 + continue ;; --dots) progressDisplayType=dots + continue ;; --spinner) progressDisplayType=spinner + continue ;; - --*) - options+=( "$1" ) + --cronjob) + inCronJob=true + continue ;; - @all) - allinstances=yes - ;; - @*) - instances+=( "${1#@}" ) - ;; - *) - if [ $nrarg -gt 0 ]; then - args+=( "$1" ) - (( nrarg-- )) - else + esac + + # get the number of arguments for commands that take arguments + case "$command" in + installmod) nrarg=1; ;; + uninstallmod) nrarg=1; ;; + reinstallmod) nrarg=1; ;; + broadcast) nrarg=1; ;; + rconcmd) nrarg=1; ;; + useconfig) nrarg=1; ;; + install-cronjob) nrarg=1; ;; + remove-cronjob) nrarg=1; ;; + remove-mods) nrarg=1; ;; + esac + + # Enumerate the options and arguments + while [ $# -ne 0 ]; do + case "$1" in + --) + shift break + ;; + --args) + nrarg=$# + ;; + --verbose) + verbose=1 + ;; + --dots) + progressDisplayType=dots + ;; + --spinner) + progressDisplayType=spinner + ;; + --*) + options+=( "$1" ) + ;; + @all) + allinstances=yes + ;; + @*) + instances+=( "${1#@}" ) + ;; + *) + if [ $nrarg -gt 0 ]; then + args+=( "$1" ) + (( nrarg-- )) + else + break + fi + ;; + esac + shift + done + + # handle non-instance separately + case "$command" in + upgrade-tools) + doUpgradeTools + exit + ;; + uninstall-tools) + doUninstallTools + exit + ;; + useconfig) + defaultinstance="${args[0]}" + continue + ;; + remove-mods) + doRemoveMods "${args[0]}" + if [ $# -eq 0 ]; then + exit 0 + else + continue fi ;; - esac - shift - done - - # handle non-instance separately - case "$command" in - upgrade-tools) - doUpgradeTools - exit - ;; - uninstall-tools) - doUninstallTools - exit - ;; - useconfig) - defaultinstance="${args[0]}" - continue - ;; - remove-mods) - doRemoveMods "${args[0]}" - if [ $# -eq 0 ]; then - exit 0 - else - continue - fi - ;; - list-instances) - doListAllInstances "${options[@]}" - exit - ;; - --version) - echo "Version: ${arkstVersion}" - echo "Channel: ${arkstChannel}" - if [ -n "${arkstCommit}" ]; then - echo "Commit: ${arkstCommit:0:7}" - fi - blobsize="$(sed "s@^arkstCommit=.*@arkstCommit=''@" "$0" | wc -c)" - echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" - exit 1 - ;; - -h|--help) - showUsage - exit 1 - ;; - "") - echo "arkmanager v${arkstVersion}: no command specified" - showUsage - exit 1 - ;; - esac - - # Handle no instances being specified - if [[ "${#instances[@]}" == 0 && "$allinstances" == "no" ]]; then - if [ -n "$defaultinstance" ]; then - instances=( "$defaultinstance" ) - else - echo "No instances supplied for command ${command} ${options[*]} ${args[*]}" - read -p "Do you wish to run this command for all instances?" -n 1 -r - echo - if [[ "$REPLY" =~ ^[Yy]$ ]]; then - allinstances=yes - else + list-instances) + doListAllInstances "${options[@]}" + exit + ;; + --version) + echo "Version: ${arkstVersion}" + echo "Channel: ${arkstChannel}" + if [ -n "${arkstCommit}" ]; then + echo "Commit: ${arkstCommit:0:7}" + fi + blobsize="$(sed "s@^arkstCommit=.*@arkstCommit=''@" "$0" | wc -c)" + echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 + ;; + -h|--help) + showUsage + exit 1 + ;; + "") + echo "arkmanager v${arkstVersion}: no command specified" + showUsage + exit 1 + ;; + esac + + # Handle no instances being specified + if [[ "${#instances[@]}" == 0 && "$allinstances" == "no" ]]; then + if [ -n "$defaultinstance" ]; then + instances=( "$defaultinstance" ) + else + echo "No instances supplied for command ${command} ${options[*]} ${args[*]}" + read -p "Do you wish to run this command for all instances?" -n 1 -r + echo + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + allinstances=yes + else + exit 1 + fi fi fi - fi - # Handle all instances being requested - if [[ "$allinstances" == "yes" ]]; then - instances=( $(getAllInstanceNames) ) - fi + # Handle all instances being requested + if [[ "$allinstances" == "yes" ]]; then + instances=( $(getAllInstanceNames) ) + fi - # Run the command for each instance requested - for instance in "${instances[@]}"; do - ( - echo "Running command '${command}' for instance '${instance}'" - useConfig "$instance" - checkConfig - - case "$command" in - run) - doRun - ;; - start) - doStart "${options[@]}" - ;; - stop) - doStop shutdown "${options[@]}" - ;; - restart) - doStop restart "${options[@]}" - echo "`timestamp`: stop" >> "$logdir/$arkmanagerLog" - ;; - cancelshutdown) - doCancelShutdown "${options[@]}" - ;; - install) - doInstall - ;; - update) - doUpdate "${options[@]}" - ;; - checkupdate) - checkForUpdate - ;; - installmod) - doInstallMod "${args[@]}" - ;; - uninstallmod) - doUninstallMod "${args[@]}" - ;; - reinstallmod) - doUninstallMod "${args[@]}" - doInstallMod "${args[@]}" - ;; - backup) - doBackup - ;; - broadcast) - doBroadcast "${args[@]}" - ;; - saveworld) - doSaveWorld - ;; - rconcmd) - rconcmd "${args[@]}" - ;; - status) - printStatus - ;; - install-cronjob) - doInstallCronJob "${args[@]}" "${options[@]}" - ;; - remove-cronjob) - doRemoveCronJob "${args[@]}" - ;; - *) - echo -n "arkmanager v${arkstVersion}: unknown command '$command' specified" - showUsage - exit 255 - ;; - esac - ) - laststatus=$? - if [ $laststatus -eq 255 ]; then - exit 1 - elif [ $laststatus -ne 0 ]; then - status=$laststatus - fi - done - - # Perform the restart portion of the restart command - if [[ "$command" == "restart" ]]; then - sleep 1 + # Run the command for each instance requested for instance in "${instances[@]}"; do ( + echo "Running command '${command}' for instance '${instance}'" useConfig "$instance" - doStart "${options[@]}" - echo "`timestamp`: start" >> "$logdir/$arkmanagerLog" - echo "`timestamp`: restart" >> "$logdir/$arkmanagerLog" + checkConfig + + case "$command" in + run) + doRun + ;; + start) + doStart "${options[@]}" + ;; + stop) + doStop shutdown "${options[@]}" + ;; + restart) + doStop restart "${options[@]}" + echo "`timestamp`: stop" >> "$logdir/$arkmanagerLog" + ;; + cancelshutdown) + doCancelShutdown "${options[@]}" + ;; + install) + doInstall + ;; + update) + doUpdate "${options[@]}" + ;; + checkupdate) + checkForUpdate + ;; + installmod) + doInstallMod "${args[@]}" + ;; + uninstallmod) + doUninstallMod "${args[@]}" + ;; + reinstallmod) + doUninstallMod "${args[@]}" + doInstallMod "${args[@]}" + ;; + backup) + doBackup + ;; + broadcast) + doBroadcast "${args[@]}" + ;; + saveworld) + doSaveWorld + ;; + rconcmd) + rconcmd "${args[@]}" + ;; + status) + printStatus + ;; + install-cronjob) + doInstallCronJob "${args[@]}" "${options[@]}" + ;; + remove-cronjob) + doRemoveCronJob "${args[@]}" + ;; + *) + echo -n "arkmanager v${arkstVersion}: unknown command '$command' specified" + showUsage + exit 255 + ;; + esac ) + laststatus=$? + if [ $laststatus -eq 255 ]; then + exit 1 + elif [ $laststatus -ne 0 ]; then + status=$laststatus + fi done - fi - if [ $# -eq 0 ]; then - break - fi -done + # Perform the restart portion of the restart command + if [[ "$command" == "restart" ]]; then + sleep 1 + for instance in "${instances[@]}"; do + ( + useConfig "$instance" + doStart "${options[@]}" + echo "`timestamp`: start" >> "$logdir/$arkmanagerLog" + echo "`timestamp`: restart" >> "$logdir/$arkmanagerLog" + ) + done + fi + + if [ $# -eq 0 ]; then + break + fi + done + + exit $status +} + +# Only execute main function if script is not being sourced +# by another script +if [[ "$(caller)" =~ ^0 ]]; then + main "$@" +fi -exit $status From 6e1627c80175013cba1253efdf362985416f1223 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 12 Jun 2016 15:12:18 +1000 Subject: [PATCH 44/98] Fix update --force with arkStagingDir --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index a477210..afd72cb 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1228,7 +1228,7 @@ doUpdate() { cd "$arkserverroot" - if isUpdateNeeded; then + if [ -n "$appupdate" ] || isUpdateNeeded; then appupdate=1 if [ -n "${arkStagingDir}" -a "${arkStagingDir}" != "${arkserverroot}" ]; then From 8aad9cd42eb6ea98e6de0db626305f5037895f4b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 27 Jun 2016 19:16:57 +1000 Subject: [PATCH 45/98] Don't print the warning message twice --- tools/arkmanager | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index afd72cb..ac73ec7 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -991,7 +991,6 @@ printWarnMessage(){ reason="${reason//\{time\}/${msgtime}}" reason="${reason//\{modnamesupdated\}/${modnamesupdated}}" msg="${msg//\{reason\}/${reason}}" - printf "%s\n" "$msg" else if [ "$1" == "update" ]; then if [ "$3" == "minutes" ]; then From c7053d8a9341032b411d49da95a607746610f0e0 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 28 Jun 2016 19:58:26 +1000 Subject: [PATCH 46/98] Fix --stagingdir= parameter --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index ac73ec7..72795ae 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1185,7 +1185,7 @@ doUpdate() { modupdate=1 elif [ "$arg" == "--backup" ]; then arkBackupPreUpdate=true - elif [[ "$arg" =~ "^--stagingdir=" ]]; then + elif [[ "$arg" =~ ^--stagingdir= ]]; then arkStagingDir="${ark#--stagingdir=}" elif [ "$arg" == "--downloadonly" ]; then downloadonly=1 From e1b2cdb8c89d8221250fc41d1b988d23212435a7 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 1 Jul 2016 23:11:28 +1000 Subject: [PATCH 47/98] Add option to allow players to cancel restart --- tools/arkmanager | 30 ++++++++++++++++++++++++++++++ tools/arkmanager.cfg | 4 ++++ 2 files changed, 34 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 72795ae..4c06104 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1040,6 +1040,28 @@ printWarnMessage(){ doBroadcastWithEcho "$msg" } +# +# Checks if a player has requested an update cancel in the last 5 minutes +# +isUpdateCancelRequested(){ + if [ -n "$chatCommandRestartCancel" ]; then + local canceltime="$( + find ~/ARK/server1/ShooterGame/Saved/Logs -name 'ServerGame.*.log' -mmin -5 -print0 | + xargs -0 grep -F -e "${chatCommandRestartCancel}" | + sed 's@^[[]\(....\)\.\(..\)\.\(..\)-\(..\)\.\(..\)\.\(..\):.*@\1-\2-\3 \4:\5:\6 UTC@' | + head -n1)" + if [ -n canceltime ]; then + canceltime="$(date +%s --date="${canceltime}")" + local timenow="$(date +%s --date="now - 5 minutes")" + if (( canceltime > timenow )); then + return 0 + fi + fi + fi + + return 1 +} + # # Waits for a configurable number of minutes before updating the server # @@ -1107,6 +1129,10 @@ doWarn(){ rm -f "${arkserverroot}/.ark-warn.lock" return 0 fi + if isUpdateCancelRequested; then + doBroadcastWithEcho "Restart cancelled by player request" + return 1 + fi wait $sleeppid if (( $min > $warninterval )); then sleep 1m & @@ -1136,6 +1162,10 @@ doWarn(){ rm -f "${arkserverroot}/.ark-warn.lock" return 0 fi + if isUpdateCancelRequested; then + doBroadcastWithEcho "Restart cancelled by player request" + return 1 + fi fi wait $sleeppid warnseconds=$warninterval diff --git a/tools/arkmanager.cfg b/tools/arkmanager.cfg index b563ff2..750f866 100644 --- a/tools/arkmanager.cfg +++ b/tools/arkmanager.cfg @@ -32,6 +32,10 @@ msgWarnRestartMinutes="This ARK server will shutdown for a restart in %d minutes msgWarnRestartSeconds="This ARK server will shutdown for a restart in %d seconds" msgWarnShutdownMinutes="This ARK server will shutdown in %d minutes" msgWarnShutdownSeconds="This ARK server will shutdown in %d seconds" +msgWarnCancelled="Restart cancelled by player request" + +# Restart cancel chat command +#chatCommandRestartCancel="/cancelupdate" # ARK server common options - use ark_= # comment out these values if you want to define them From 3fe29777e6694b6100f26bda48bdb8b202b940d9 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 8 Jul 2016 09:29:55 +1000 Subject: [PATCH 48/98] Add support for -automanagedmods --- tools/arkmanager | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 4c06104..76cfa12 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -607,7 +607,7 @@ function numPlayersConnected(){ # run function # doRun() { - cd "$arkserverroot" + cd "${arkserverroot}/${arkserverexec%/*}" arkserveropts="$serverMap" @@ -703,6 +703,14 @@ doRun() { fi done + if [[ " ${arkextraopts[*]} " =~ " -automanagedmods " ]]; then + if [ ! -f "${arkserverroot}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then + mkdir -p "${arkserverroot}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + curl -s "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" -o "${arkserverroot}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd_linux.tar.gz" + tar -xzf "${arkserverroot}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd_linux.tar.gz" -C "${arkserverroot}/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fi + fi + arkserveropts="${arkserveropts}?listen" # run the server in background echo "`timestamp`: start" From 4c8d9d53da88a36407f443245f00e4559880889a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 8 Jul 2016 09:43:26 +1000 Subject: [PATCH 49/98] Add -automanagedmods support to update --- tools/arkmanager | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 76cfa12..d12903c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1284,6 +1284,7 @@ doUpdate() { fi rm -rf "$arkStagingDir/ShooterGame/Content/Mods/"* rm -rf "$arkStagingDir/ShooterGame/Saved/"* + rm -rf "$arkStagingDir/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" fi if [ -z "$nodownload" ]; then @@ -1384,7 +1385,7 @@ doUpdate() { echo "`timestamp`: update to $instver complete" >> "$logdir/update.log" fi - if [ -n "$modupdate" ]; then + if [ -n "$modupdate" ] && [ -z "$arkflag_automanagedmods" ]; then for modid in $(getModIds); do if isModUpdateNeeded $modid; then echo "Updating mod $modid" @@ -1423,6 +1424,10 @@ getModIds(){ # doDownloadMod(){ local modid=$1 + local steamcmdroot="$steamcmdroot" + if [ -n "$arkflag_automanagedmods" ]; then + steamcmdroot="$arkserverroot/Engine/Binaries/ThirdParty/SteamCMD/Linux" + fi local modsrcdir="$steamcmdroot/steamapps/workshop/content/$mod_appid/$modid" local moddldir="$steamcmdroot/steamapps/workshop/downloads/$mod_appid" cd "$steamcmdroot" From 55f9a80dddd6ccf49ce02314393ccdcb5fd179e5 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 9 Jul 2016 14:26:43 +1000 Subject: [PATCH 50/98] Change systemd service type to forking --- tools/systemd/arkmanager.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/systemd/arkmanager.service b/tools/systemd/arkmanager.service index c2d4053..97ec6bd 100644 --- a/tools/systemd/arkmanager.service +++ b/tools/systemd/arkmanager.service @@ -5,7 +5,7 @@ After=network.target [Service] ExecStart=/usr/libexec/arkmanager/arkmanager.init start ExecStop=/usr/libexec/arkmanager/arkmanager.init stop -Type=oneshot +Type=forking [Install] WantedBy=multi-user.target From 794171e7e457d90e4dc002b55862af4102de2309 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 9 Jul 2016 15:50:25 +1000 Subject: [PATCH 51/98] Add option to always auto-restart --- tools/arkmanager | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index d12903c..ffa3dc0 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -742,6 +742,9 @@ doRun() { # Disable auto-restart so we don't get caught in a restart loop rm -f "$arkserverroot/$arkautorestartfile" restartserver=0 + if [ -n "$arkAlwaysRestartOnCrash" ]; then + restartserver=1 + fi sleep 5 @@ -762,6 +765,8 @@ doRun() { echo "`timestamp`: Bad PID '$pid'; expected '$serverpid'" if [ "$pid" != "" ]; then # Another instance must be running - disable autorestart + echo "Error: another server instance is running from the same directory" + echo "Aborting - two servers MUST NOT run from the same directory" restartserver=0 fi break @@ -797,6 +802,10 @@ doStart() { doUpdate --update-mods fi fi + + if [[ " $* " =~ " --alwaysrestart " ]]; then + arkAlwaysRestartOnCrash=true + fi tput sc echo "The server is starting..." From f6a770c624e3837a9d2dd83ed9073a61a12cfe0b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 9 Jul 2016 15:59:38 +1000 Subject: [PATCH 52/98] Add arkAlwaysRestartOnCrash to readme --- README.asciidoc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 21c43a7..d295e60 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -149,6 +149,11 @@ instances. `--noautoupdate`;; Disables automatic updating on startup if it is enabled + `--alwaysrestart`;; + Enable automatically restarting the server even if it crashes + without becoming ready for player connections. + + `stop`:: Stops the server if it is running @@ -343,6 +348,12 @@ The following options can be overridden on a per-instance basis: The relative path within an ARK server install to place the autorestart lock file +`arkAlwaysRestartOnCrash`:: + Set to `true` to enable automatically restarting even when the + server has not become ready for player connections. + Be aware that this may cause the server to enter an endless + crash-restart loop if the cause of the crash is not resolved. + `arkAutoUpdateOnStart`:: Set to `true` to enable updating before server startup From 12198f8f3c6c77f5923d57e8f8c0fc00938af747 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 9 Jul 2016 16:34:43 +1000 Subject: [PATCH 53/98] Add RemainAfterExit=yes to arkmanager.service --- tools/systemd/arkmanager.service | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/systemd/arkmanager.service b/tools/systemd/arkmanager.service index 97ec6bd..55ab37d 100644 --- a/tools/systemd/arkmanager.service +++ b/tools/systemd/arkmanager.service @@ -6,6 +6,7 @@ After=network.target ExecStart=/usr/libexec/arkmanager/arkmanager.init start ExecStop=/usr/libexec/arkmanager/arkmanager.init stop Type=forking +RemainAfterExit=yes [Install] WantedBy=multi-user.target From b22b16b41db4176d1826f9342589d988bca69b7a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 10 Jul 2016 18:44:49 +1000 Subject: [PATCH 54/98] Create the saved arks directory if it doesn't exist --- tools/arkmanager | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/arkmanager b/tools/arkmanager index ffa3dc0..14f557c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -202,6 +202,7 @@ checkConfig() { # SavedArks directory if [ -n "$arkserverroot" ]; then local savedarksdir="${arkserverroot}/ShooterGame/Saved/${ark_AltSaveDirectoryName:-SavedArks}" + mkdir -p "${savedarksdir}" if [ ! -w "${savedarksdir}" ]; then echo -e "[" "$RED" "ERROR" "$NORMAL" "]" "\tThe ARK SavedArks directory is not writable, and saveworld will fail" fi From 6d207952b5fdefd84462bb535d4a5d1f537cc620 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 11 Jul 2016 10:03:44 +1000 Subject: [PATCH 55/98] Fix arkAlwaysRestartOnCrash --- tools/arkmanager | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 14f557c..5c0e97b 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -745,6 +745,7 @@ doRun() { restartserver=0 if [ -n "$arkAlwaysRestartOnCrash" ]; then restartserver=1 + touch "$arkserverroot/$arkautorestartfile" fi sleep 5 @@ -782,6 +783,7 @@ doRun() { # doStop will remove the autorestart file if [ ! -f "$arkserverroot/$arkautorestartfile" ]; then restartserver=0 + fi if [ "$restartserver" -ne 0 ]; then From 7f8aa05e80102dc03719b2b79b4f594b97c5a1a8 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 11 Jul 2016 13:23:54 +1000 Subject: [PATCH 56/98] Add printconfig command This new command will print the file that each config option is taken from. --- tools/arkmanager | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 5c0e97b..3197a44 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2088,6 +2088,23 @@ doListAllInstances(){ fi } +doPrintConfig(){ + declare -A vars + declare -A vals + for v in $(eval echo \$\{\!{a..z}\*\} \$\{\!{A..Z}\*\} \$\{\!_\*\}); do + vals["$v"]="${!v}" + done + for cfgfile in "$configfile" "$HOME/.arkmanager.cfg" "/etc/arkmanager/arkmanager.cfg"; do + while read v; do + val="$(source "$cfgfile"; echo "${!v}")" + if [[ "$val" = "${vals[$v]}" && -z "${vars[$v]}" ]]; then + vars["$v"]="$cfgfile" + echo "${cfgfile} => ${v}" + fi + done < <(sed -n 's/^[[:space:]]*\([A-Za-z_][A-Za-z0-9_]*\)=.*/\1/p' <"$cfgfile") + done +} + useConfig() { configfile= if [ -f "/etc/arkmanager/instances/${1}.cfg" ]; then @@ -2377,6 +2394,9 @@ main(){ rconcmd) rconcmd "${args[@]}" ;; + printconfig) + doPrintConfig + ;; status) printStatus ;; From 23757124c92d863ded13a21c8e3edcf2a45cd5cc Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 11 Jul 2016 11:17:45 +1000 Subject: [PATCH 57/98] Change config migration Write new example global config to `arkmanager.cfg.example` Write migrated global config to `arkmanager.cfg.NEW` Write migrated main instance config to `instances/main.cfg.NEW` --- tools/install.sh | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index cf801ed..eac2d60 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -3,6 +3,7 @@ userinstall=no steamcmd_user= showusage=no +migrateconfig=no while [ -n "$1" ]; do case "$1" in @@ -63,6 +64,9 @@ while [ -n "$1" ]; do DATADIR="$2" shift ;; + --migrate-config) + migrateconfig=yes + ;; -*) echo "Invalid option '$1'" showusage=yes @@ -169,7 +173,7 @@ if [ "$userinstall" == "yes" ]; then "${INSTALL_ROOT}${INSTANCEDIR}/instance.cfg.example" # Copy arkmanager.cfg to ~/.arkmanager.cfg.NEW - cp arkmanager.cfg "${INSTALL_ROOT}${CONFIGFILE}.NEW" + cp arkmanager.cfg "${INSTALL_ROOT}${CONFIGFILE}.example" # Change the defaults in the new config file sed -i -e "s|^steamcmd_user=\"steam\"|steamcmd_user=\"--me\"|" \ -e "s|\"/home/steam|\"${PREFIX}|" \ @@ -177,18 +181,24 @@ if [ "$userinstall" == "yes" ]; then -e "s|^install_bindir=.*|install_bindir=\"${BINDIR}\"|" \ -e "s|^install_libexecdir=.*|install_libexecdir=\"${LIBEXECDIR}\"|" \ -e "s|^install_datadir=.*|install_datadir=\"${DATADIR}\"|" \ - "${INSTALL_ROOT}${CONFIGFILE}.NEW" + "${INSTALL_ROOT}${CONFIGFILE}.example" # Copy arkmanager.cfg to ~/.arkmanager.cfg if it doesn't already exist if [ -f "${INSTALL_ROOT}${CONFIGFILE}" ]; then - bash ./migrate-config.sh "${INSTALL_ROOT}${CONFIGFILE}" - bash ./migrate-main-instance.sh "${INSTALL_ROOT}${CONFIGFILE}" "${INSTALL_ROOT}${INSTANCEDIR}/main.cfg" + SUFFIX= + if [ "$migrateconfig" = "no" ]; then + SUFFIX=".NEW" + cp "${INSTALL_ROOT}${CONFIGFILE}" "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" + fi + + bash ./migrate-config.sh "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" + bash ./migrate-main-instance.sh "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" "${INSTALL_ROOT}${INSTANCEDIR}/main.cfg${SUFFIX}" 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 '${CONFIGFILE}.NEW'. Make sure to review any changes and update your config accordingly!" exit 2 else - mv -n "${INSTALL_ROOT}${CONFIGFILE}.NEW" "${INSTALL_ROOT}${CONFIGFILE}" + cp -n "${INSTALL_ROOT}${CONFIGFILE}.example" "${INSTALL_ROOT}${CONFIGFILE}" cp -n "${INSTALL_ROOT}/${INSTANCEDIR}/instance.cfg.example" "${INSTALL_ROOT}/${INSTANCEDIR}/main.cfg" fi else @@ -301,24 +311,30 @@ else # Copy arkmanager.cfg inside linux configuation folder if it doesn't already exists mkdir -p "${INSTALL_ROOT}/etc/arkmanager" chown "$steamcmd_user" "${INSTALL_ROOT}/etc/arkmanager" - cp arkmanager.cfg "${INSTALL_ROOT}${CONFIGFILE}.NEW" - chown "$steamcmd_user" "${INSTALL_ROOT}${CONFIGFILE}.NEW" + cp arkmanager.cfg "${INSTALL_ROOT}${CONFIGFILE}.example" + chown "$steamcmd_user" "${INSTALL_ROOT}${CONFIGFILE}.example" sed -i -e "s|^steamcmd_user=\"steam\"|steamcmd_user=\"$steamcmd_user\"|" \ -e "s|\"/home/steam|\"/home/$steamcmd_user|" \ -e "s|^install_bindir=.*|install_bindir=\"${BINDIR}\"|" \ -e "s|^install_libexecdir=.*|install_libexecdir=\"${LIBEXECDIR}\"|" \ -e "s|^install_datadir=.*|install_datadir=\"${DATADIR}\"|" \ - "${INSTALL_ROOT}${CONFIGFILE}.NEW" + "${INSTALL_ROOT}${CONFIGFILE}.example" if [ -f "${INSTALL_ROOT}${CONFIGFILE}" ]; then - bash ./migrate-config.sh "${INSTALL_ROOT}${CONFIGFILE}" - bash ./migrate-main-instance.sh "${INSTALL_ROOT}${CONFIGFILE}" "${INSTALL_ROOT}${INSTANCEDIR}/main.cfg" + SUFFIX= + if [ "$migrateconfig" = "no" ]; then + SUFFIX=".NEW" + cp "${INSTALL_ROOT}${CONFIGFILE}" "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" + fi + + bash ./migrate-config.sh "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" + bash ./migrate-main-instance.sh "${INSTALL_ROOT}${CONFIGFILE}${SUFFIX}" "${INSTALL_ROOT}${INSTANCEDIR}/main.cfg${SUFFIX}" 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 /etc/arkmanager. Make sure to review any changes and update your config accordingly!" exit 2 else - mv -n "${INSTALL_ROOT}${CONFIGFILE}.NEW" "${INSTALL_ROOT}${CONFIGFILE}" + cp -n "${INSTALL_ROOT}${CONFIGFILE}.example" "${INSTALL_ROOT}${CONFIGFILE}" cp -n "${INSTALL_ROOT}/${INSTANCEDIR}/instance.cfg.example" "${INSTALL_ROOT}/${INSTANCEDIR}/main.cfg" fi fi From 4d4f4888638d3d4899c566eed46b0d18db242f7b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 13 Jul 2016 23:08:19 +1000 Subject: [PATCH 58/98] Improve restart behaviour using pid files --- tools/arkmanager | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 3197a44..bf672e3 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -151,6 +151,8 @@ arkserverLog="arkserver.log" # here is logged the output of ShooterGameServer appid="${appid:-376030}" mod_appid="${mod_appid:-346110}" arkautorestartfile="${arkautorestartfile:-ShooterGame/Saved/.autorestart}" +arkserverpidfile="${arkserverpidfile:-ShooterGame/Saved/.arkserver.pid}" +arkmanagerpidfile="${arkmanagerpidfile:-ShooterGame/Saved/.arkmanager.pid}" install_bindir="${install_bindir:-${0%/*}}" install_libexecdir="${install_libexecdir:-${install_bindir%/*}/libexec/arkmanager}" @@ -507,6 +509,13 @@ function getAvailableVersion(){ # Get the PID of the server process # function getServerPID(){ + if [ -f "${arkserverroot}/${arkserverpidfile}" ]; then + serverpid="$(<"${arkserverroot}/${arkserverpidfile}")" + if kill -0 "$serverpid" >/dev/null 2>&1; then + echo $serverpid + return + fi + fi ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' } @@ -610,6 +619,14 @@ function numPlayersConnected(){ doRun() { cd "${arkserverroot}/${arkserverexec%/*}" + if isTheServerRunning; then + echo "Error: another server instance is running from the same directory" + echo "Aborting - two servers MUST NOT run from the same directory" + exit 1 + fi + + echo "$$" >"${arkserverroot}/${arkmanagerpidfile}" + arkserveropts="$serverMap" if [ -n "$serverMapModId" ]; then @@ -722,10 +739,11 @@ doRun() { # Shutdown the server when we are terminated shutdown_server(){ restartserver=0 - rm "$arkserverroot/$arkautorestartfile" + rm -f "$arkserverroot/$arkautorestartfile" if [ "$serverpid" -ne 0 ]; then - kill -INT $serverpid + kill -INT $serverpid >/dev/null 2>&1 fi + exit 0 } trap shutdown_server INT TERM @@ -739,6 +757,7 @@ doRun() { "$arkserverroot/$arkserverexec" "$arkserveropts" "${arkextraopts[@]}" & # Grab the server PID serverpid=$! + echo "$serverpid" >"${arkserverroot}/${arkserverpidfile}" echo "`timestamp`: Server PID: $serverpid" # Disable auto-restart so we don't get caught in a restart loop rm -f "$arkserverroot/$arkautorestartfile" @@ -767,8 +786,6 @@ doRun() { echo "`timestamp`: Bad PID '$pid'; expected '$serverpid'" if [ "$pid" != "" ]; then # Another instance must be running - disable autorestart - echo "Error: another server instance is running from the same directory" - echo "Aborting - two servers MUST NOT run from the same directory" restartserver=0 fi break @@ -882,6 +899,13 @@ doStop() { kill -KILL $PID fi + if [ -f "${arkserverroot}/${arkmanagerpidfile}" ]; then + PID="$(<"${arkserverroot}/${arkmanagerpidfile}")" + if [ -n "$PID" ]; then + kill $PID + fi + fi + tput rc; tput ed; echo "The server has been stopped" echo "`timestamp`: stopped" >> "$logdir/$arkmanagerLog" From 4786e5e9253bee0693726be1fbca686adf01649d Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 15 Jul 2016 16:35:30 +1000 Subject: [PATCH 59/98] Fix --arg bug in install-cronjob --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index bf672e3..d28afda 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2002,7 +2002,7 @@ doInstallCronJob(){ output= ;; --arg=*) - cmdargs="${cmdargs} $(printf "%q" "${opt#--opt=}")" + cmdargs="${cmdargs} $(printf "%q" "${opt#--arg=}")" ;; --*) cmdopts="${cmdopts} $(printf "%q" "${opt}")" From dea6befbe65fb03934670b87033e1b8c1485437e Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 15 Jul 2016 16:40:15 +1000 Subject: [PATCH 60/98] Use full arkmanager path --- tools/arkmanager | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index d28afda..7a2fd3c 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1982,6 +1982,7 @@ doInstallCronJob(){ cmdopts="${arkCronExtraOpts}" cmdargs="" output=">/dev/null 2>&1" + arkmanagerpath="${0}" command="$1" shift @@ -2013,10 +2014,10 @@ doInstallCronJob(){ esac done - cronjob="${minute} ${hour} * * * arkmanager --cronjob ${command} @${instance} ${cmdopts} --args ${cmdargs} -- ${output}" + cronjob="${minute} ${hour} * * * ${arkmanagerpath} --cronjob ${command} @${instance} ${cmdopts} --args ${cmdargs} -- ${output}" (crontab -l | \ - sed -e "/ [*] [*] [*] arkmanager --cronjob ${command} @${instance} /d"; + sed -e "/ [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} /d"; echo "${cronjob}" ) | \ crontab - } @@ -2025,10 +2026,11 @@ doInstallCronJob(){ # Removes an installed cron job # doRemoveCronJob(){ + arkmanagerpath="${0}" command="$1" crontab -l | \ - sed -e "/ [*] [*] [*] arkmanager --cronjob ${command} @${instance} /d" | \ + sed -e "/ [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} /d" | \ crontab - } From 421c2c4c0b2ef59c71085330685f6205c4ae1de8 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 15 Jul 2016 20:03:31 +1000 Subject: [PATCH 61/98] Fix sed command in install-cronjob --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 7a2fd3c..da12cf7 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2017,7 +2017,7 @@ doInstallCronJob(){ cronjob="${minute} ${hour} * * * ${arkmanagerpath} --cronjob ${command} @${instance} ${cmdopts} --args ${cmdargs} -- ${output}" (crontab -l | \ - sed -e "/ [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} /d"; + sed -e "\\# [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} #d"; echo "${cronjob}" ) | \ crontab - } @@ -2030,7 +2030,7 @@ doRemoveCronJob(){ command="$1" crontab -l | \ - sed -e "/ [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} /d" | \ + sed -e "\\# [*] [*] [*] ${arkmanagerpath} --cronjob ${command} @${instance} #d" | \ crontab - } From bab7832fc9a58cb4009de23e3caaa7bd2aabc609 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 15 Jul 2016 20:53:02 +1000 Subject: [PATCH 62/98] Elaborate on install-cronjob --minute and --hour --- README.asciidoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index d295e60..89edc23 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -272,10 +272,16 @@ instances. `--hour=`;; Specifies one or more hours when the command should execute. This is the hour field of the cron job. + If you want to have the command execute every n hours, then + use `--hour='*/n'` + Default: `*` (i.e. all hours) `--minute=`;; Specifies one or more minutes of the hour when the command should execute. This is the minute field of the cron job. + If you want to have the command execute every n minutes, + then use `--minute='*/n'` + Default: `0` (i.e. the first minute of the hour) `--enable-output`;; Enables the output from the command - the cron daemon usually From 915b5ace415686fef6d6f3f1ab2e985570f7005d Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 15 Jul 2016 21:26:35 +1000 Subject: [PATCH 63/98] Point user to crontab(5) man page --- README.asciidoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 89edc23..eb6b78a 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -262,6 +262,9 @@ instances. as well as the following options. In order to specify an argument to the command (e.g. to the `broadcast` command), use the `--arg=` option. + Please read your `man 5 crontab` manpage to determine what + minute and hour values are valid, as some implementations + may not accept e.g. the `*/n` minute / hour specification. `--daily`;; The command should be executed daily From 9a76dd8e1671d76b2d2e1be14f0a0b007f856a78 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 16 Jul 2016 13:11:27 +1000 Subject: [PATCH 64/98] Add --warnreason --- tools/arkmanager | 54 ++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index da12cf7..29f602a 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -865,7 +865,7 @@ doStop() { for arg in "$@"; do case "$arg" in --warn) dowarn=1; ;; - --warnreason=*) warnreason="${arg#*=}"; ;; + --warnreason=*) warnreason="${arg#--warnreason=}"; ;; --saveworld) dosave=1; ;; esac done @@ -995,6 +995,12 @@ printWarnMessage(){ fi fi msg="${msgWarnReason//\{time\}/$msgtime}" + if [ -n "$warnreason" ]; then + local v="warnreason_$warnreason" + reason="${!v}" + if [ -z "$reason" ]; then + reason="$warnreason" + fi if [ "$1" == "update" ]; then if [ -n "$appupdate" ]; then if [ -n "$modupdate" ]; then @@ -1242,34 +1248,24 @@ doUpdate() { local nodownload= for arg in "$@"; do - if [ "$arg" == "--force" ]; then - appupdate=1 - elif [ "$arg" == "--safe" ]; then - updatetype=safe - elif [ "$arg" == "--warn" ]; then - updatetype=warn - elif [ "$arg" == "--ifempty" ]; then - updatetype=ifempty - elif [ "$arg" == "--validate" ]; then - validate=validate - appupdate=1 - elif [ "$arg" == "--saveworld" ]; then - saveworld=1 - elif [ "$arg" == "--update-mods" ]; then - modupdate=1 - elif [ "$arg" == "--backup" ]; then - arkBackupPreUpdate=true - elif [[ "$arg" =~ ^--stagingdir= ]]; then - arkStagingDir="${ark#--stagingdir=}" - elif [ "$arg" == "--downloadonly" ]; then - downloadonly=1 - elif [ "$arg" == "--no-download" ]; then - nodownload=1 - else - echo "Unrecognized option $arg" - echo "Try 'arkmanager -h' or 'arkmanager --help' for more information." - exit 1 - fi + case "$arg" in + --force) appupdate=1; ;; + --safe) updatetype=safe; ;; + --warn) updatetype=warn; ;; + --ifempty) updatetype=ifempty; ;; + --warnreason=*) warnreason="${arg#--warnreason=}"; ;; + --validate) validate=validate; appupdate=1; ;; + --saveworld) saveworld=1; ;; + --update-mods) modupdate=1; ;; + --backup) arkBackupPreUpdate=true; ;; + --stagingdir=*) arkStagingDir="${arg#--stagingdir=}"; ;; + --downloadonly) downloadonly=1; ;; + --no-download) nodownload=1; ;; + *) + echo "Unrecognized option $arg" + echo "Try 'arkmanager -h' or 'arkmanager --help' for more information." + exit 1 + esac done echo "$$" >"${arkserverroot}/.ark-update.lock.$$" 2>/dev/null From ca9ea08ebe46b4c5be5a339a19ebbb9736accf69 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 16 Jul 2016 13:17:20 +1000 Subject: [PATCH 65/98] Fix error in last commit --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 29f602a..63d3743 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1001,7 +1001,7 @@ printWarnMessage(){ if [ -z "$reason" ]; then reason="$warnreason" fi - if [ "$1" == "update" ]; then + elif [ "$1" == "update" ]; then if [ -n "$appupdate" ]; then if [ -n "$modupdate" ]; then if [ -n "$msgReasonUpdateAppMod" ]; then From 94f3e9566d6bc19620845c458ad31eb68d02478a Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 16 Jul 2016 13:21:25 +1000 Subject: [PATCH 66/98] Stop warning if server is offline --- tools/arkmanager | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 63d3743..bf6bd69 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1174,7 +1174,10 @@ doWarn(){ for (( min = warnminutes; min >= warninterval; min-- )); do numplayers=$(numPlayersConnected) echo "There are ${numplayers} players connected" - if (( (numplayers + 0) == 0 )); then + if [[ "numplayers" == "-1" ]]; then + echo "Server is not running. Shutting down immediately" + return 0 + elif (( (numplayers + 0) == 0 )); then doBroadcastWithEcho "Nobody is connected. Shutting down immediately" rm -f "${arkserverroot}/.ark-warn.lock" return 0 @@ -1207,7 +1210,10 @@ doWarn(){ if (( warnseconds >= 20 )); then numplayers=$(numPlayersConnected) echo "There are ${numplayers} players connected" - if (( (numplayers + 0) == 0 )); then + if [[ "numplayers" == "-1" ]]; then + echo "Server is not running. Shutting down immediately" + return 0 + elif (( (numplayers + 0) == 0 )); then doBroadcastWithEcho "Nobody is connected. Shutting down immediately" rm -f "${arkserverroot}/.ark-warn.lock" return 0 From 4b98f92ff8a158075922f462a143f50b1de581e9 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 23 Jul 2016 02:18:51 +1000 Subject: [PATCH 67/98] Use the A2S_PLAYER query to get active players --- tools/arkmanager | 57 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index bf6bd69..788ed96 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -599,18 +599,39 @@ function isTheServerOnline(){ # Check if anybody is connected to the server # function numPlayersConnected(){ - 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($ARGV[1])); - send($socket, "\xff\xff\xff\xffTSource Engine Query\x00", 0, $sockaddr); - my $data = ""; - recv($socket, $data, 1400, 0) or (print "-1" and exit(1)); - my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5); - my $players = ord(substr($rest, 2, 1)); - print "$players\n"; - ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" + if [ -n "$arkUsePlayerList" ]; then + 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($ARGV[1])); + send($socket, "\xff\xff\xff\xff\x55\xff\xff\xff\xff", 0, $sockaddr); + my $data = ""; + recv($socket, $data, 1400, 0) or (print "-1" and exit(1)); + if (ord(substr($data, 4, 1)) == 0x41) { + my $chal = substr($data, 5); + send($socket, "\xff\xff\xff\xff\x55" . $chal, 0, $sockaddr); + $data = ""; + recv($socket, $data, 1400, 0) or (print "-1" and exit(1)); + } + ord(substr($data, 4, 1)) != 0x44 and (print "-1" and exit(1)); + my $players = ord(substr($data, 5, 1)); + print "$players\n"; + ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" + else + 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($ARGV[1])); + send($socket, "\xff\xff\xff\xffTSource Engine Query\x00", 0, $sockaddr); + my $data = ""; + recv($socket, $data, 1400, 0) or (print "-1" and exit(1)); + my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5); + my $players = ord(substr($rest, 2, 1)); + print "$players\n"; + ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" + fi } # @@ -2063,6 +2084,18 @@ printStatus(){ my $maxplayers = ord(substr($rest, 3, 1)); print "Server Name: $servername\n"; print "Players: $players / $maxplayers\n"; + send($socket, "\xff\xff\xff\xff\x55\xff\xff\xff\xff", 0, $sockaddr); + $data = ""; + recv($socket, $data, 1400, 0) or (print "Challenge request failed" and exit(1)); + if (ord(substr($data, 4, 1)) == 0x41) { + my $chal = substr($data, 5); + send($socket, "\xff\xff\xff\xff\x55" . $chal, 0, $sockaddr); + $data = ""; + recv($socket, $data, 1400, 0) or (print "A2S_PLAYERS request failed" and exit(1)); + } + ord(substr($data, 4, 1)) != 0x44 and (print ("A2S_PLAYERS Response: : " . unpack("H*", $data)) and exit(1)); + my $players = ord(substr($data, 5, 1)); + print "Active Players: $players\n"; ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" if isTheServerOnline; then From 2d76c199e6054707023c4f88c5f00c37db828b50 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 23 Jul 2016 02:46:22 +1000 Subject: [PATCH 68/98] --warnreason now implies --warn --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 788ed96..90a4f23 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -886,7 +886,7 @@ doStop() { for arg in "$@"; do case "$arg" in --warn) dowarn=1; ;; - --warnreason=*) warnreason="${arg#--warnreason=}"; ;; + --warnreason=*) warnreason="${arg#--warnreason=}"; dowarn=1; ;; --saveworld) dosave=1; ;; esac done @@ -1280,7 +1280,7 @@ doUpdate() { --safe) updatetype=safe; ;; --warn) updatetype=warn; ;; --ifempty) updatetype=ifempty; ;; - --warnreason=*) warnreason="${arg#--warnreason=}"; ;; + --warnreason=*) warnreason="${arg#--warnreason=}"; updatetype=warn; ;; --validate) validate=validate; appupdate=1; ;; --saveworld) saveworld=1; ;; --update-mods) modupdate=1; ;; From beaa42d80f8ad371e0ac531b25438318780b4974 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 30 Jul 2016 03:32:00 +1000 Subject: [PATCH 69/98] Get version from version.txt --- tools/arkmanager | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 90a4f23..a54a668 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1061,6 +1061,7 @@ printWarnMessage(){ fi reason="${reason//\{time\}/${msgtime}}" reason="${reason//\{modnamesupdated\}/${modnamesupdated}}" + reason="${reason//\{version\}/${arkversion}}" msg="${msg//\{reason\}/${reason}}" else if [ "$1" == "update" ]; then @@ -1337,6 +1338,7 @@ doUpdate() { cp -al "$arkserverroot/linux64/." "$arkStagingDir/linux64" cp -al "$arkserverroot/PackageInfo.bin" "$arkStagingDir/PackageInfo.bin" cp -al "$arkserverroot/steamclient.so" "$arkStagingDir/steamclient.so" + cp -al "$arkserverroot/version.txt" "$arkStagingDir/version.txt" cp -a "$arkserverroot/steamapps/." "$arkStagingDir/steamapps" else rsync -a "$arkserverroot/." "$arkStagingDir/." @@ -1370,6 +1372,7 @@ doUpdate() { fi echo "Not applying update - download-only enabled" elif [ -n "$appupdate" -o -n "$modupdate" ]; then + arkversion="$(<"$arkserverroot/version.txt")" if isTheServerRunning; then if [ "$updatetype" == "safe" ]; then while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name ${serverMap##*/}.ark` ]; do @@ -1418,6 +1421,7 @@ doUpdate() { cp -alu --remove-destination "$arkStagingDir/linux64/." "$arkserverroot/linux64" cp -alu --remove-destination "$arkStagingDir/PackageInfo.bin" "$arkserverroot/PackageInfo.bin" cp -alu --remove-destination "$arkStagingDir/steamclient.so" "$arkserverroot/steamclient.so" + cp -alu --remove-destination "$arkStagingDir/version.txt" "$arkserverroot/version.txt" cp -au --remove-destination "$arkStagingDir/steamapps/." "$arkserverroot/steamapps" else rsync -a "$arkStagingDir/." "$arkserverroot" @@ -2107,7 +2111,8 @@ printStatus(){ fi getCurrentVersion - echo -e "$NORMAL" "Server version: " "$GREEN" $instver "$NORMAL" + echo -e "$NORMAL" "Server build ID: " "$GREEN" $instver "$NORMAL" + echo -e "$NORMAL" "Server version: " "$GREEN" "$(<"$arkserverroot/version.txt")" "$NORMAL" } getAllInstanceNames(){ From eb1cdbb72b8ab5f43cbc29064b6ddcd17cfadae6 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Mon, 1 Aug 2016 10:43:47 +1000 Subject: [PATCH 70/98] Count players with names --- tools/arkmanager | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index aede241..0f77f3a 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -616,7 +616,17 @@ function numPlayersConnected(){ } ord(substr($data, 4, 1)) != 0x44 and (print "-1" and exit(1)); my $players = ord(substr($data, 5, 1)); - print "$players\n"; + my $active = 0; + my $pdata = substr($data, 6); + for my $i (0 .. $players) { + my $idx = ord(substr($pdata, 0, 1)); + my ($name, $rest) = split(/\x00/, substr($pdata, 1), 2); + $pdata = substr($rest, 8); + if ($name != "") { + $active = $active + 1; + } + } + print "$active\n"; ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" else perl -MSocket -e ' @@ -2114,7 +2124,17 @@ printStatus(){ } ord(substr($data, 4, 1)) != 0x44 and (print ("A2S_PLAYERS Response: : " . unpack("H*", $data)) and exit(1)); my $players = ord(substr($data, 5, 1)); - print "Active Players: $players\n"; + my $active = 0; + my $pdata = substr($data, 6); + for my $i (0 .. $players) { + my $idx = ord(substr($pdata, 0, 1)); + my ($name, $rest) = split(/\x00/, substr($pdata, 1), 2); + $pdata = substr($rest, 8); + if ($name != "") { + $active = $active + 1; + } + } + print "Active Players: $active\n"; ' "$(getQueryPort)" "${ark_MultiHome:-127.0.0.1}" if isTheServerOnline; then From ea03c35fafb74e8e6f478986841444adfd203f42 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 2 Aug 2016 02:48:31 +1000 Subject: [PATCH 71/98] Perl string inequality is "ne" --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 0f77f3a..01d7814 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -622,7 +622,7 @@ function numPlayersConnected(){ my $idx = ord(substr($pdata, 0, 1)); my ($name, $rest) = split(/\x00/, substr($pdata, 1), 2); $pdata = substr($rest, 8); - if ($name != "") { + if ($name ne "") { $active = $active + 1; } } @@ -2130,7 +2130,7 @@ printStatus(){ my $idx = ord(substr($pdata, 0, 1)); my ($name, $rest) = split(/\x00/, substr($pdata, 1), 2); $pdata = substr($rest, 8); - if ($name != "") { + if ($name ne "") { $active = $active + 1; } } From af44f8df85c1a565d155af66c50a71857b21bec2 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 7 Aug 2016 08:50:48 +1000 Subject: [PATCH 72/98] Add installmods command --- tools/arkmanager | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 01d7814..36577f1 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1802,6 +1802,15 @@ doInstallMod(){ fi } +# +# Downloads and installs all requested mods +# +doInstallAllMods(){ + for modid in $(getModids); do + doInstallMod "$modid" + done +} + # # Removes mod from mods directory # @@ -2476,6 +2485,9 @@ main(){ installmod) doInstallMod "${args[@]}" ;; + installmods) + doInstallAllMods + ;; uninstallmod) doUninstallMod "${args[@]}" ;; From 2bc7c3e9f2d6d47dc7fdfeab68e7db4ad88aa501 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 7 Aug 2016 09:01:46 +1000 Subject: [PATCH 73/98] Fix shift typo --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 36577f1..7b709d3 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1806,7 +1806,7 @@ doInstallMod(){ # Downloads and installs all requested mods # doInstallAllMods(){ - for modid in $(getModids); do + for modid in $(getModIds); do doInstallMod "$modid" done } From dfb35396c3f0da5c4ff0c4072a31e168ad7ee0a8 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 7 Aug 2016 09:12:48 +1000 Subject: [PATCH 74/98] Add installmods command to readme --- README.asciidoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index b73fd91..3bc4e16 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -226,6 +226,10 @@ instances. `checkupdate`:: Checks if an ARK server update is available +`installmods`:: + Installs all mods specified in the instance config into the + `ShooterGame/Content/Mods` directory + `installmod `:: Installs the specified mod into the `ShooterGame/Content/Mods` directory From 54d0e81ee8ede04e02802c6b1d835e03b68c1d22 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 7 Aug 2016 15:15:12 +1000 Subject: [PATCH 75/98] Add support for arkmod_* in config --- tools/arkmanager | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index 7b709d3..c653be9 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -660,6 +660,22 @@ doRun() { arkserveropts="$serverMap" + while read varname; do + val="${!varname}" + modid="${varname#arkmod_}" + case "$val" in + game*|enabled) + ark_GameModIds="${ark_GameModIds}${ark_GameModIds:+,}${modid}" + ;; + map*) + serverMapModId="${modid}" + ;; + tc|total*) + ark_TotalConversionMod="${modid}" + ;; + esac + done < <(sed -n 's/^\(arkmod_[^= ]*\)=.*/\1/p' <"$configfile") + if [ -n "$serverMapModId" ]; then serverMap="$(perl -e ' my $data; @@ -1488,6 +1504,11 @@ getModIds(){ echo "${serverMapModId}" echo "${ark_TotalConversionMod}" echo "${ark_GameModIds}" | tr ',' '\n' + for v in "${!arkmod_@}"; do + if [ "${!v}" != "disabled" ]; then + echo "${v#arkmod_}" + fi + done find "${arkserverroot}/ShooterGame/Content/Mods" -maxdepth 1 -type d -printf "%P\n" ) | sort | uniq | grep '^[1-9][0-9]*$' } From 0403d2949519e8f32c65dfe5d4e9e75811e84967 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 7 Aug 2016 15:37:52 +1000 Subject: [PATCH 76/98] Add enablemod and disablemod commands --- README.asciidoc | 40 ++++++++++++++++++++++++++++++++++++++++ tools/arkmanager | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 3bc4e16..d11ce84 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -242,6 +242,22 @@ instances. Runs the `uninstallmod` command followed by the `installmod` command +`enablemod `:: +`enablemod =`:: + Enables the `arkmod_` setting in the instance config. + modtype defaults to `game`. + Mod types: + + `game`;; + A mod in `GameModIds` + + `map`;; + The `MapModId` mod + + `tc`;; + `totalconversion`;; + The `TotalConversionMod` mod + `backup`:: Backs up the saved world and game config files to a compressed tar file in the backups directory specified in the config @@ -495,6 +511,30 @@ the global config. the `-StructureDestructionTag=DestroySwampSnowStructures` option. +`arkmod_=`:: + Specifies a mod that can be enabled or disabled using + `enablemod` and `disablemod`. Note that mod ids specified + using these options are in addition to those specified directly + in the `ark_GameModIds` option, and override those specified in the + `ark_MapModId`, `serverMapMod` and `ark_TotalConversionMod` + options. Options are processed in the order they are specified + in the instance config file, and `arkmod_*` options in the + common config file are not applied. + Mod types: + + `game`;; + A mod to be specified in `GameModIds` + + `map`;; + The mod to be specified in `MapModId` + + `tc`;; + `totalconversion`;; + The mod to be specified in `TotalConversionMod` + + `disabled`;; + A disabled mod + Common ARK options ~~~~~~~~~~~~~~~~~~ diff --git a/tools/arkmanager b/tools/arkmanager index c653be9..6fe9697 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1843,6 +1843,37 @@ doUninstallMod(){ fi } +# +# Enables a mod in the config +# +doEnableMod(){ + local modid="${1%=*}" + local modtype="${1#*=}" + if [ "$modtype" = "$1" ]; then + modtype=game + fi + local modvar="arkmod_${modid}" + if [ -n "${!modvar}" ]; then + sed -i "s|^\(${modvar}\)=[^ ]*|\1=${modtype}|" "$configfile" + else + echo "${modvar}=${modtype}" >>"$configfile" + fi +} + +# +# Disable a mod in the config +# +doDisableMod(){ + local modid="$1" + local modvar="arkmod_$modid" + if [ "$ark_GameModIds" = *"$modid"* ]; then + sed -i "s|^\(ark_GameModIds=\(\|[\"']\)\(\|[^\"' ]*,\)\)${modid},*|\1|" "$configfile" + fi + if [ -n "$modvar" ]; then + sed -i "s|^\(arkmod_${modid}\)=[^ ]*|\1=disabled|" "$configfile" + fi +} + # # Removes mod from steamcmd workshop directory # @@ -2506,6 +2537,12 @@ main(){ installmod) doInstallMod "${args[@]}" ;; + enablemod) + doEnableMod "${args[@]}" + ;; + disablemod) + doDisableMod "${args[@]}" + ;; installmods) doInstallAllMods ;; From 09843fc8697087e3a31035811a4b06c2f2cd4ad9 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 17 Aug 2016 17:02:37 +1000 Subject: [PATCH 77/98] Use release tags by default for lastest version --- tools/arkmanager | 125 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 25 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 6fe9697..ddce8bf 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -7,7 +7,8 @@ # Contributors: Sispheor, Atriusftw, klightspeed, lexat, puseidr # Script version -arkstVersion='1.6' +arkstVersion='1.6-pre1' +arkstTag='' arkstCommit='' doUpgradeTools() { @@ -15,9 +16,57 @@ doUpgradeTools() { if [ "$UID" == 0 -o "$steamcmd_user" == "--me" ]; then sudo= fi + + local reinstall_args=() + if [ -n "$install_bindir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--bindir" "$install_bindir" ) + fi + if [ -n "$install_libexecdir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--libexecdir" "$install_libexecdir" ) + fi + if [ -n "$install_datadir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--datadir" "$install_datadir" ) + fi + echo "arkmanager v${arkstVersion}: Checking for updates..." - arkstLatestVersion=`curl -s https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version` - arkstLatestCommit=`curl -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${arkstChannel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` + + if [ -n "$arkstUnstable" ] || [ "$arkstChannel" != "master" ]; then + doUpgradeToolsFromBranch + else + doUpgradeToolsFromRelease + fi +} + +doUpgradeToolsFromCommit(){ + local commit="$1" + tmpdir="$(mktemp -d "ark-server-tools-XXXXXXXX")" + if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi + cd "$tmpdir" + echo "Downloading installer" + curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + cd "ark-server-tools-${commit}/tools" + if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi + sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ + -e "s|^arkstTag='.*'|arkstTag='${tagname}'|" \ + arkmanager + echo "Running install.sh" + bash install.sh "$steamcmd_user" "${reinstall_args[@]}" + result=$? + cd / + rm -rf "$tmpdir" + + if [ "$result" = 0 ] || [ "$result" = 2 ]; then + "ARK Server Tools successfully upgraded" + "$0" --version + else + "ARK Server Tools upgrade failed" + fi + exit $result +} + +doUpgradeToolsFromBranch(){ + arkstLatestVersion=`curl -s "https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version"` + arkstLatestCommit=`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${arkstChannel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` if [ "$arkstLatestVersion" == "Not Found" ]; then echo "Channel ${arkstChannel} does not exist" @@ -28,33 +77,53 @@ doUpgradeTools() { return fi - reinstall_args=() - if [ -n "$install_bindir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--bindir" "$install_bindir" ) - fi - if [ -n "$install_libexecdir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--libexecdir" "$install_libexecdir" ) - fi - if [ -n "$install_datadir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--datadir" "$install_datadir" ) - fi + REPLY= + 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} "${reinstall_args[@]}" - exit 0 - fi + echo elif [[ $arkstLatestVersion == $arkstVersion && "$arkstLatestCommit" != "$arkstCommit" ]]; then read -p "A hotfix is available for v${arkstLatestVersion}. Do you wish to install it?" -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} "${reinstall_args[@]}" - exit 0 - fi + echo else echo "Your ARK server tools are already up to date" fi + + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + doUpgradeToolsFromCommit "$arkstLatestCommit" + fi +} + +doUpgradeToolsFromRelease(){ + local tagname= + local desc= + + echo "Getting latest release..." + # Read the variables from github + while IFS=$'\t' read n v; do + case "${n}" in + tag_name) tagname="${v}"; ;; + body) desc="${v}" + esac + done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + + if [ -n "$tagname" ]; then + if [ "$tagname" != "$arkstTag" ]; then + echo "A new version has been released: ${tagname}" + echo -e "$desc" + read -p "Do you want to upgrade to ${tagname}? [Y/N] " -n 1 -r + echo + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + echo "Getting commit for latest release..." + local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + doUpgradeToolsFromCommit "$commit" + fi + else + echo "Your ARK server tools are already up to date" + fi + else + echo "Unable to get latest release" + fi } doUninstallTools() { @@ -86,7 +155,10 @@ runAsRoot(){ fi } + cd / + arkstChannel="$(getConfigVar arkstChannel "master")" + arkstUnstable="$(getConfigVar arkstUnstable "")" install_bindir="$(getConfigVar install_bindir "${0%/*}")" install_libexecdir="$(getConfigVar install_libexecdir "${install_bindir%/*}/libexec/arkmanager")" install_datadir="$(getConfigVar install_datadir "${install_bindir%/*}/share/arkmanager")" @@ -2465,8 +2537,11 @@ main(){ if [ -n "${arkstCommit}" ]; then echo "Commit: ${arkstCommit:0:7}" fi - blobsize="$(sed "s@^arkstCommit=.*@arkstCommit=''@" "$0" | wc -c)" - echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" + if [ -n "${arkstTag}" ]; then + echo "Release Tag: ${arkstTag}" + fi + blobsize="$(sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0" | wc -c)" + echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;; -h|--help) From c7dd01d06e63f6e5612c4887e6fe8f5e8d6ba811 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 17 Aug 2016 17:33:55 +1000 Subject: [PATCH 78/98] Switch netinstall.sh to using release tag --- netinstall.sh | 116 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 41 deletions(-) diff --git a/netinstall.sh b/netinstall.sh index 564b3d9..f1a6924 100644 --- a/netinstall.sh +++ b/netinstall.sh @@ -19,48 +19,82 @@ elif [[ "$1" =~ ^--output= ]]; then shift fi -# Download and untar installation files -cd /tmp -COMMIT="`curl -L -k -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" +unstable= +if [ "$1" = "--unstable" ]; then + unstable=1 +fi -if [ -z "$COMMIT" ]; then - if [ "$channel" != "master" ]; then - echo "Channel ${channel} not found - trying master" - channel=master - COMMIT="`curl -L -k -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" +function doInstallFromCommit(){ + local commit="$1" + tmpdir="$(mktemp -d "ark-server-tools-XXXXXXXX")" + if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi + cd "$tmpdir" + echo "Downloading installer" + curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + cd "ark-server-tools-${commit}/tools" + if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi + sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ + -e "s|^arkstTag='.*'|arkstTag='${tagname}'|" \ + arkmanager + echo "Running install.sh" + bash install.sh "$steamcmd_user" "${reinstall_args[@]}" + result=$? + cd / + rm -rf "$tmpdir" + + if [ "$result" = 0 ] || [ "$result" = 2 ]; then + "ARK Server Tools successfully installed" + else + "ARK Server Tools install failed" fi + exit $result +} + +function doInstallFromRelease(){ + local tagname= + local desc= + + echo "Getting latest release..." + # Read the variables from github + while IFS=$'\t' read n v; do + case "${n}" in + tag_name) tagname="${v}"; ;; + body) desc="${v}" + esac + done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + + if [ -n "$tagname" ]; then + echo "Latest release is ${tagname}" + echo "Getting commit for latest release..." + local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + doUpgradeToolsFromCommit "$commit" + else + echo "Unable to get latest release" + fi +} + +function doInstallFromBranch(){ + channel="$1" + commit="`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" + + if [ -z "$commit" ]; then + if [ -n "$unstable" ]; then + echo "Channel ${channel} not found - trying master" + doInstallFromBranch master + else + doInstallFromRelease + fi + fi + + doInstallFromCommit "$commit" +} + +# Download and untar installation files +cd "$TEMP" + +if [ "$channel" = "master" ] && [ -z "$unstable" ]; then + doInstallFromRelease +else + doInstallFromBranch "$channel" fi -if [ -z "$COMMIT" ]; then - echo "Unable to retrieve latest commit" - exit 1 -fi - -mkdir ark-server-tools-${channel} -cd ark-server-tools-${channel} -curl -L -k -s https://github.com/FezVrasta/ark-server-tools/archive/${COMMIT}.tar.gz | tar xz - -# Install ARK Server Tools -cd ark-server-tools-${COMMIT}/tools -sed -i "s|^arkstCommit='.*'$|arkstCommit='${COMMIT}'|" arkmanager -chmod +x install.sh -bash install.sh "$steamcmd_user" "$@" >"$output" 2>&1 - -status=$? - -rm -rf /tmp/ark-server-tools-${channel} - -# Print messages -case "$status" in - "0") - echo "ARK Server Tools were correctly installed in your system inside the home directory of $steamcmd_user!" - ;; - - "1") - echo "Something where wrong :(" - ;; - "2") - echo "WARNING: 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 "ARK Server Tools were correctly installed in your system inside the home directory of $steamcmd_user!" - ;; -esac From 7efbbd3fdf6a35da09ee10a314e67accfa482ea6 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 26 Aug 2016 17:25:56 +1000 Subject: [PATCH 79/98] Add arkPriorityBoost --- tools/arkmanager | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 281333d..8ef7826 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -666,6 +666,12 @@ doRun() { fi fi + if [ " $* " = *" --wait "* ]; then + # This requires bash 4+ + # $$ returns the main process, $BASHPID returns the current process + kill -STOP $BASHPID # wait for caller to renice us + fi + arkserveropts="$serverMap" while read varname; do @@ -893,7 +899,20 @@ doStart() { tput sc echo "The server is starting..." - doRun >"$logdir/$arkserverLog" 2>&1 & # output of this command is logged + local pid=$! + if [ -n "$arkPriorityBoost" ]; then + doRun --wait >"$logdir/$arkserverLog" 2>&1 & # output of this command is logged + local pid="$!" + + # Wait for monitor process to suspend itself + wait + + echo "Boosting priority of ark server" + sudo renice -n "$arkPriorityBoost" "$pid" + kill -CONT "$pid" + else + doRun >"$logdir/$arkserverLog" 2>&1 & # output of this command is logged + fi echo "`timestamp`: start" >> "$logdir/$arkmanagerLog" tput rc; tput ed; echo "The server is now running, and should be up within 10 minutes" From fac21dd9a87b3fe49003568f921999427d12f696 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 26 Aug 2016 17:28:03 +1000 Subject: [PATCH 80/98] Fix doRun writing the wrong PID to the run file --- tools/arkmanager | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 8ef7826..f121fd5 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -656,7 +656,8 @@ doRun() { exit 1 fi - echo "$$" >"${arkserverroot}/${arkmanagerpidfile}" + # $$ returns the main process, $BASHPID returns the current process + echo "$BASHPID" >"${arkserverroot}/${arkmanagerpidfile}" if [ -f "${arkserverroot}/.ark-update.lock" ]; then local updatepid="$(<"${arkserverroot}/.ark-update.lock")" From d6d6e3cc58b8674783e66676a50fcb1c7adc6fd4 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 26 Aug 2016 17:35:30 +1000 Subject: [PATCH 81/98] Add arkPriorityBoost to documentation --- README.asciidoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index d11ce84..94bcf59 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -396,6 +396,11 @@ The following options can be overridden on a per-instance basis: `arkMaxBackupSizeMB`:: Limits the size of the stored backups +`arkPriorityBoost`:: + Attempts to boost the priority of the ARK server. + Negative values give a higher priority, and positive values give a lower priority. + Requires `sudo` and `renice` + `msgWarnUpdateMinutes`:: `msgWarnUpdateSeconds`:: `msgWarnRestartMinutes`:: From e0ab6c98ef5e88d0fef50b1196199789546cd633 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 31 Aug 2016 16:01:53 +1000 Subject: [PATCH 82/98] Use full yyyy-mm-dd HH:MM:SS timestamp --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 0ed033d..922d3fd 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -172,7 +172,7 @@ declare -A modsrcdirs # timestamp # timestamp() { - date +%T + date +"%Y-%m-%d %H:%M:%S" } # From a46ef5ad23136bf7bf2ef05258ab1c83dc90308b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 31 Aug 2016 16:27:48 +1000 Subject: [PATCH 83/98] Restart server if necessary after update check --- tools/arkmanager | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 922d3fd..cf7f0f0 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -881,12 +881,14 @@ doStart() { local updatepid="$(<"${arkserverroot}/.ark-update.lock")" if kill -0 "$updatepid" >/dev/null 2>&1; then echo "An update is currently in progress. Start aborted" + echo "`timestamp`: Start aborted due to running update - pid: $updatepid" >>"$logdir/$arkserverLog" return 1 fi fi if isTheServerRunning; then echo "The server is already running" + echo "`timestamp`: Start aborted due to server already running" else if [ "$arkAutoUpdateOnStart" == "true" ]; then if ! [[ " $* " =~ " --noautoupdate " ]]; then @@ -969,7 +971,7 @@ doStop() { fi tput sc echo "Stopping server..." - echo "`timestamp`: stopping" >> "$logdir/$arkmanagerLog" + echo "`timestamp`: stopping; reason: $stopreason" >> "$logdir/$arkmanagerLog" rm -f "$arkserverroot/$arkautorestartfile" # kill the server with the PID PID=`getServerPID` @@ -1364,6 +1366,12 @@ doUpdate() { esac done + # check if the server was alive before the update so we can launch it back after the update + serverWasAlive=0 + if isTheServerRunning ;then + serverWasAlive=1 + fi + echo "$$" >"${arkserverroot}/.ark-update.lock.$$" 2>/dev/null while true; do if ! ln "${arkserverroot}/.ark-update.lock.$$" "${arkserverroot}/.ark-update.lock" 2>/dev/null; then @@ -1380,6 +1388,8 @@ doUpdate() { done rm -f "${arkserverroot}/.ark-update.lock.$$" + echo "`timestamp`: checking for update; PID: $$" + if [ -n "$modupdate" ]; then if [ -z "$nodownload" ]; then if ! doDownloadAllMods; then @@ -1461,12 +1471,6 @@ doUpdate() { fi fi - # check if the server was alive before the update so we can launch it back after the update - serverWasAlive=0 - if isTheServerRunning ;then - serverWasAlive=1 - fi - if [ -n "$saveworld" ]; then echo "Saving world" doSaveWorld @@ -1525,20 +1529,21 @@ doUpdate() { fi done fi - - rm -f "${arkserverroot}/.ark-update.lock" - # we restart the server only if it was started before the update - if [ $serverWasAlive -eq 1 ] || [ -f "${arkserverroot}/.startAfterUpdate" ]; then - rm -f "${arkserverroot}/.startAfterUpdate" - rm -f "${arkserverroot}/.ark-update.lock" - doStart --noautoupdate - fi else echo "Your server is already up to date! The most recent version is ${bnumber}." echo "`timestamp`: No update needed." >> "$logdir/update.log" fi; rm -f "${arkserverroot}/.ark-update.lock" + + if ! isTheServerRunning; then + # we restart the server only if it was started before the update + if [ $serverWasAlive -eq 1 ] || [ -f "${arkserverroot}/.startAfterUpdate" ]; then + rm -f "${arkserverroot}/.startAfterUpdate" + rm -f "${arkserverroot}/.ark-update.lock" + doStart --noautoupdate + fi + fi } # @@ -2642,10 +2647,9 @@ main(){ sleep 1 for instance in "${instances[@]}"; do ( + echo "`timestamp`: restart" >> "$logdir/$arkmanagerLog" useConfig "$instance" doStart "${options[@]}" - echo "`timestamp`: start" >> "$logdir/$arkmanagerLog" - echo "`timestamp`: restart" >> "$logdir/$arkmanagerLog" ) done fi From ac56f438f1363c5b372e50affca7b73171a2afc9 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Thu, 1 Sep 2016 20:08:05 +1000 Subject: [PATCH 84/98] Allow multiple mods to be installed or uninstalled --- README.asciidoc | 13 ++++++++----- tools/arkmanager | 31 +++++++++++++++++-------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 94bcf59..df5559b 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -230,15 +230,18 @@ instances. Installs all mods specified in the instance config into the `ShooterGame/Content/Mods` directory -`installmod `:: - Installs the specified mod into the `ShooterGame/Content/Mods` +`installmod [,[,...]]`:: + Installs the specified mods into the `ShooterGame/Content/Mods` directory -`uninstallmod `:: - Deletes the specified mod from the `ShooterGame/Content/Mods` +`uninstallmod [,[,...]]`:: + Deletes the specified mods from the `ShooterGame/Content/Mods` directory -`reinstallmod `:: +`removemod [,[,...]]`:: + Deletes the specified mods from the SteamCMD workshop directory + +`reinstallmod [,[,...]]`:: Runs the `uninstallmod` command followed by the `installmod` command diff --git a/tools/arkmanager b/tools/arkmanager index cf7f0f0..6c438d7 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1861,16 +1861,17 @@ doExtractMod(){ # Downloads mod and installs it into mods directory # doInstallMod(){ - local modid=$1 + local modid + for modid in "${1//,/ }"; do + if [ -f "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" ]; then + sed -i "/^\\t\\t\"${modid}\"/,/^\\t\\t}/d" "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" + fi - if [ -f "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" ]; then - sed -i "/^\\t\\t\"${modid}\"/,/^\\t\\t}/d" "$steamcmdroot/steamapps/workshop/appworkshop_${mod_appid}.acf" - fi - - if doDownloadMod $modid; then - doExtractMod $modid - echo "Mod $modid installed" - fi + if doDownloadMod $modid; then + doExtractMod $modid + echo "Mod $modid installed" + fi + done } # @@ -1886,11 +1887,13 @@ doInstallAllMods(){ # Removes mod from mods directory # doUninstallMod(){ - local modid=$1 - local moddir="$arkserverroot/ShooterGame/Content/Mods/$modid" - if [ -d "${moddir}" ]; then - rm -rf "${moddir}" - fi + local modid + for modid in "${1//,/ }"; do + local moddir="$arkserverroot/ShooterGame/Content/Mods/$modid" + if [ -d "${moddir}" ]; then + rm -rf "${moddir}" + fi + done } # From 2e8475cdc1f44c626abb5afc1f273ffdf8495f22 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Thu, 1 Sep 2016 20:19:56 +1000 Subject: [PATCH 85/98] Add uninstallmods command --- README.asciidoc | 3 +++ tools/arkmanager | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index df5559b..45ca324 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -230,6 +230,9 @@ instances. Installs all mods specified in the instance config into the `ShooterGame/Content/Mods` directory +`uninstallmods`:: + Deletes all mods from the `ShooterGame/Content/Mods` directory + `installmod [,[,...]]`:: Installs the specified mods into the `ShooterGame/Content/Mods` directory diff --git a/tools/arkmanager b/tools/arkmanager index 6c438d7..51ecddf 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1883,6 +1883,17 @@ doInstallAllMods(){ done } +# +# Removes all mods from the mods directory +# +doUninstallAllMods(){ + for modid in $(getModIds); do + if [[ "$modid" != "111111111" && "$modid" != "TheCenter" ]]; then + doUninstallMod "$modid" + fi + done +} + # # Removes mod from mods directory # @@ -1890,9 +1901,13 @@ doUninstallMod(){ local modid for modid in "${1//,/ }"; do local moddir="$arkserverroot/ShooterGame/Content/Mods/$modid" + local modfile="$arkserverroot/ShooterGame/Content/Mods/${modid}.mod" if [ -d "${moddir}" ]; then rm -rf "${moddir}" fi + if [ -f "${modfile}" ]; then + rm -f "$modfile" + fi done } @@ -2599,6 +2614,9 @@ main(){ installmods) doInstallAllMods ;; + uninstallmods) + doUninstallAllMods + ;; uninstallmod) doUninstallMod "${args[@]}" ;; From 9a08add72a1875bf83bb1fbf05c7fa76aae5ce39 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 13 Sep 2016 20:29:32 +1000 Subject: [PATCH 86/98] Sync more files; accept missing version.txt --- tools/arkmanager | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 1f5f5fc..1175383 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1417,16 +1417,16 @@ doUpdate() { cp -al "$arkserverroot/ShooterGame/." "$arkStagingDir/ShooterGame" cp -al "$arkserverroot/Engine/." "$arkStagingDir/Engine" cp -al "$arkserverroot/linux64/." "$arkStagingDir/linux64" - cp -al "$arkserverroot/PackageInfo.bin" "$arkStagingDir/PackageInfo.bin" - cp -al "$arkserverroot/steamclient.so" "$arkStagingDir/steamclient.so" - cp -al "$arkserverroot/version.txt" "$arkStagingDir/version.txt" cp -a "$arkserverroot/steamapps/." "$arkStagingDir/steamapps" + cp -l "$arkserverroot/"* "$arkStagingDir" else rsync -a "$arkserverroot/." "$arkStagingDir/." fi rm -rf "$arkStagingDir/ShooterGame/Content/Mods/"* rm -rf "$arkStagingDir/ShooterGame/Saved/"* rm -rf "$arkStagingDir/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + cp -al "$arkserverroot/ShooterGame/Content/Mods/111111111/." "$arkStagingDir/ShooterGame/Content/Mods/111111111" + cp -l "$arkserverroot/ShooterGame/Content/Mods/111111111.mod" "$arkStagingDir/ShooterGame/Content/Mods/111111111.mod" fi if [ -z "$nodownload" ]; then @@ -1458,7 +1458,12 @@ doUpdate() { fi echo "Not applying update - download-only enabled" elif [ -n "$appupdate" -o -n "$modupdate" -o -n "$bgupdate" ]; then - arkversion="$(<"$arkserverroot/version.txt")" + if [ -f "$arkserverroot/version.txt" ]; then + arkversion="$(<"$arkserverroot/version.txt")" + else + arkversion="$(getCurrentVersion; echo "$instver")" + fi + if isTheServerRunning; then if [ "$updatetype" == "safe" ]; then while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name ${serverMap##*/}.ark` ]; do @@ -1499,9 +1504,7 @@ doUpdate() { cp -alu --remove-destination "$arkStagingDir/ShooterGame/." "$arkserverroot/ShooterGame" cp -alu --remove-destination "$arkStagingDir/Engine/." "$arkserverroot/Engine" cp -alu --remove-destination "$arkStagingDir/linux64/." "$arkserverroot/linux64" - cp -alu --remove-destination "$arkStagingDir/PackageInfo.bin" "$arkserverroot/PackageInfo.bin" - cp -alu --remove-destination "$arkStagingDir/steamclient.so" "$arkserverroot/steamclient.so" - cp -alu --remove-destination "$arkStagingDir/version.txt" "$arkserverroot/version.txt" + cp -lu --remove-destination "$arkStagingDir/"* "$arkserverroot" cp -au --remove-destination "$arkStagingDir/steamapps/." "$arkserverroot/steamapps" else rsync -a "$arkStagingDir/." "$arkserverroot" @@ -2286,7 +2289,9 @@ printStatus(){ getCurrentVersion echo -e "$NORMAL" "Server build ID: " "$GREEN" $instver "$NORMAL" - echo -e "$NORMAL" "Server version: " "$GREEN" "$(<"$arkserverroot/version.txt")" "$NORMAL" + if [ -f "$arkserverroot/version.txt" ]; then + echo -e "$NORMAL" "Server version: " "$GREEN" "$(<"$arkserverroot/version.txt")" "$NORMAL" + fi } getAllInstanceNames(){ From 5770903960f9c45265f8190ae691d24b06fc20e9 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 17 Sep 2016 20:13:44 +1000 Subject: [PATCH 87/98] Don't use the old `ps -ef` method with clusterid --- tools/arkmanager | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 2395b88..f0e1e29 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -513,7 +513,9 @@ function getServerPID(){ return fi fi - ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' + if [ -z "$arkopt_clusterid" ]; then + ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' + fi } # From 437d628a008b4647d5439a4a6282644f944df46e Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 17 Sep 2016 20:18:46 +1000 Subject: [PATCH 88/98] Add old PID file; remove PID files on stop --- tools/arkmanager | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/arkmanager b/tools/arkmanager index f0e1e29..f0cc933 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -513,6 +513,14 @@ function getServerPID(){ return fi fi + if [ -f "${arkserverroot}/${arkserveroldpidfile}" ]; then + serverpid="$(<"${arkserverroot}/${arkserveroldpidfile}")" + if kill -0 "$serverpid" >/dev/null 2>&1; then + echo $serverpid + return + fi + fi + if [ -z "$arkopt_clusterid" ]; then ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' fi @@ -996,6 +1004,10 @@ doStop() { fi fi + rm -f "${arkserverroot}/${arkserverpidfile}" + rm -f "${arkserverroot}/${arkserveroldpidfile}" + rm -f "${arkserverroot}/${arkmanagerpidfile}" + tput rc; tput ed; echo "The server has been stopped" echo "`timestamp`: stopped" >> "$logdir/$arkmanagerLog" @@ -2375,6 +2387,7 @@ useConfig() { fi arkautorestartfile="${arkautorestartfile:-ShooterGame/Saved/.autorestart-${1}}" arkserverpidfile="${arkserverpidfile:-ShooterGame/Saved/.arkserver-${1}.pid}" + arkserveroldpidfile="ShooterGame/Saved/.arkserver.pid" arkmanagerpidfile="${arkmanagerpidfile:-ShooterGame/Saved/.arkmanager-${1}.pid}" } From fd23dac69647cee5bf2b487b1b04d04123ece056 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Tue, 13 Sep 2016 20:29:32 +1000 Subject: [PATCH 89/98] Sync more files; accept missing version.txt --- tools/arkmanager | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index f0cc933..c89b000 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -1428,16 +1428,16 @@ doUpdate() { cp -al "$arkserverroot/ShooterGame/." "$arkStagingDir/ShooterGame" cp -al "$arkserverroot/Engine/." "$arkStagingDir/Engine" cp -al "$arkserverroot/linux64/." "$arkStagingDir/linux64" - cp -al "$arkserverroot/PackageInfo.bin" "$arkStagingDir/PackageInfo.bin" - cp -al "$arkserverroot/steamclient.so" "$arkStagingDir/steamclient.so" - cp -al "$arkserverroot/version.txt" "$arkStagingDir/version.txt" cp -a "$arkserverroot/steamapps/." "$arkStagingDir/steamapps" + cp -l "$arkserverroot/"* "$arkStagingDir" else rsync -a "$arkserverroot/." "$arkStagingDir/." fi rm -rf "$arkStagingDir/ShooterGame/Content/Mods/"* rm -rf "$arkStagingDir/ShooterGame/Saved/"* rm -rf "$arkStagingDir/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" + cp -al "$arkserverroot/ShooterGame/Content/Mods/111111111/." "$arkStagingDir/ShooterGame/Content/Mods/111111111" + cp -l "$arkserverroot/ShooterGame/Content/Mods/111111111.mod" "$arkStagingDir/ShooterGame/Content/Mods/111111111.mod" fi if [ -z "$nodownload" ]; then @@ -1469,7 +1469,12 @@ doUpdate() { fi echo "Not applying update - download-only enabled" elif [ -n "$appupdate" -o -n "$modupdate" -o -n "$bgupdate" ]; then - arkversion="$(<"$arkserverroot/version.txt")" + if [ -f "$arkserverroot/version.txt" ]; then + arkversion="$(<"$arkserverroot/version.txt")" + else + arkversion="$(getCurrentVersion; echo "$instver")" + fi + if isTheServerRunning; then if [ "$updatetype" == "safe" ]; then while [ ! `find $arkserverroot/ShooterGame/Saved/SavedArks -mmin -1 -name ${serverMap##*/}.ark` ]; do @@ -1510,9 +1515,7 @@ doUpdate() { cp -alu --remove-destination "$arkStagingDir/ShooterGame/." "$arkserverroot/ShooterGame" cp -alu --remove-destination "$arkStagingDir/Engine/." "$arkserverroot/Engine" cp -alu --remove-destination "$arkStagingDir/linux64/." "$arkserverroot/linux64" - cp -alu --remove-destination "$arkStagingDir/PackageInfo.bin" "$arkserverroot/PackageInfo.bin" - cp -alu --remove-destination "$arkStagingDir/steamclient.so" "$arkserverroot/steamclient.so" - cp -alu --remove-destination "$arkStagingDir/version.txt" "$arkserverroot/version.txt" + cp -lu --remove-destination "$arkStagingDir/"* "$arkserverroot" cp -au --remove-destination "$arkStagingDir/steamapps/." "$arkserverroot/steamapps" else rsync -a "$arkStagingDir/." "$arkserverroot" @@ -2299,7 +2302,9 @@ printStatus(){ getCurrentVersion echo -e "$NORMAL" "Server build ID: " "$GREEN" $instver "$NORMAL" - echo -e "$NORMAL" "Server version: " "$GREEN" "$(<"$arkserverroot/version.txt")" "$NORMAL" + if [ -f "$arkserverroot/version.txt" ]; then + echo -e "$NORMAL" "Server version: " "$GREEN" "$(<"$arkserverroot/version.txt")" "$NORMAL" + fi } getAllInstanceNames(){ From 50039710aee739615f61cc331cf43e1e3911a766 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 17 Aug 2016 17:02:37 +1000 Subject: [PATCH 90/98] Use release tags by default for lastest version --- tools/arkmanager | 125 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 25 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index c89b000..3d51f84 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -7,7 +7,8 @@ # Contributors: Sispheor, Atriusftw, klightspeed, lexat, puseidr # Script version -arkstVersion='1.6' +arkstVersion='1.6-pre1' +arkstTag='' arkstCommit='' doUpgradeTools() { @@ -15,9 +16,57 @@ doUpgradeTools() { if [ "$UID" == 0 -o "$steamcmd_user" == "--me" ]; then sudo= fi + + local reinstall_args=() + if [ -n "$install_bindir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--bindir" "$install_bindir" ) + fi + if [ -n "$install_libexecdir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--libexecdir" "$install_libexecdir" ) + fi + if [ -n "$install_datadir" ]; then + reinstall_args=( "${reinstall_args[@]}" "--datadir" "$install_datadir" ) + fi + echo "arkmanager v${arkstVersion}: Checking for updates..." - arkstLatestVersion=`curl -s https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version` - arkstLatestCommit=`curl -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${arkstChannel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` + + if [ -n "$arkstUnstable" ] || [ "$arkstChannel" != "master" ]; then + doUpgradeToolsFromBranch + else + doUpgradeToolsFromRelease + fi +} + +doUpgradeToolsFromCommit(){ + local commit="$1" + tmpdir="$(mktemp -d "ark-server-tools-XXXXXXXX")" + if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi + cd "$tmpdir" + echo "Downloading installer" + curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + cd "ark-server-tools-${commit}/tools" + if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi + sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ + -e "s|^arkstTag='.*'|arkstTag='${tagname}'|" \ + arkmanager + echo "Running install.sh" + bash install.sh "$steamcmd_user" "${reinstall_args[@]}" + result=$? + cd / + rm -rf "$tmpdir" + + if [ "$result" = 0 ] || [ "$result" = 2 ]; then + "ARK Server Tools successfully upgraded" + "$0" --version + else + "ARK Server Tools upgrade failed" + fi + exit $result +} + +doUpgradeToolsFromBranch(){ + arkstLatestVersion=`curl -s "https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version"` + arkstLatestCommit=`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${arkstChannel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` if [ "$arkstLatestVersion" == "Not Found" ]; then echo "Channel ${arkstChannel} does not exist" @@ -28,33 +77,53 @@ doUpgradeTools() { return fi - reinstall_args=() - if [ -n "$install_bindir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--bindir" "$install_bindir" ) - fi - if [ -n "$install_libexecdir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--libexecdir" "$install_libexecdir" ) - fi - if [ -n "$install_datadir" ]; then - reinstall_args=( "${reinstall_args[@]}" "--datadir" "$install_datadir" ) - fi + REPLY= + 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} "${reinstall_args[@]}" - exit 0 - fi + echo elif [[ $arkstLatestVersion == $arkstVersion && "$arkstLatestCommit" != "$arkstCommit" ]]; then read -p "A hotfix is available for v${arkstLatestVersion}. Do you wish to install it?" -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} "${reinstall_args[@]}" - exit 0 - fi + echo else echo "Your ARK server tools are already up to date" fi + + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + doUpgradeToolsFromCommit "$arkstLatestCommit" + fi +} + +doUpgradeToolsFromRelease(){ + local tagname= + local desc= + + echo "Getting latest release..." + # Read the variables from github + while IFS=$'\t' read n v; do + case "${n}" in + tag_name) tagname="${v}"; ;; + body) desc="${v}" + esac + done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + + if [ -n "$tagname" ]; then + if [ "$tagname" != "$arkstTag" ]; then + echo "A new version has been released: ${tagname}" + echo -e "$desc" + read -p "Do you want to upgrade to ${tagname}? [Y/N] " -n 1 -r + echo + if [[ "$REPLY" =~ ^[Yy]$ ]]; then + echo "Getting commit for latest release..." + local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + doUpgradeToolsFromCommit "$commit" + fi + else + echo "Your ARK server tools are already up to date" + fi + else + echo "Unable to get latest release" + fi } doUninstallTools() { @@ -86,7 +155,10 @@ runAsRoot(){ fi } + cd / + arkstChannel="$(getConfigVar arkstChannel "master")" + arkstUnstable="$(getConfigVar arkstUnstable "")" install_bindir="$(getConfigVar install_bindir "${0%/*}")" install_libexecdir="$(getConfigVar install_libexecdir "${install_bindir%/*}/libexec/arkmanager")" install_datadir="$(getConfigVar install_datadir "${install_bindir%/*}/share/arkmanager")" @@ -2565,8 +2637,11 @@ main(){ if [ -n "${arkstCommit}" ]; then echo "Commit: ${arkstCommit:0:7}" fi - blobsize="$(sed "s@^arkstCommit=.*@arkstCommit=''@" "$0" | wc -c)" - echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkstCommit=.*@arkstCommit=''@" "$0") | sha1sum | cut -d' ' -f1)" + if [ -n "${arkstTag}" ]; then + echo "Release Tag: ${arkstTag}" + fi + blobsize="$(sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0" | wc -c)" + echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;; -h|--help) From e0fddd6a6c5d5b302670cb04441f2e0c7fc63ea1 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 17 Aug 2016 17:33:55 +1000 Subject: [PATCH 91/98] Switch netinstall.sh to using release tag --- netinstall.sh | 117 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/netinstall.sh b/netinstall.sh index a8c9336..006b2bb 100644 --- a/netinstall.sh +++ b/netinstall.sh @@ -19,48 +19,83 @@ elif [[ "$1" =~ ^--output= ]]; then shift fi -# Download and untar installation files -cd /tmp -COMMIT="`curl -L -k -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" +unstable= +if [ "$1" = "--unstable" ]; then + unstable=1 +fi -if [ -z "$COMMIT" ]; then - if [ "$channel" != "master" ]; then - echo "Channel ${channel} not found - trying master" - channel=master - COMMIT="`curl -L -k -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel} | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" +function doInstallFromCommit(){ + local commit="$1" + tmpdir="$(mktemp -d "ark-server-tools-XXXXXXXX")" + if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi + cd "$tmpdir" + echo "Downloading installer" + curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + cd "ark-server-tools-${commit}/tools" + if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi + sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ + -e "s|^arkstTag='.*'|arkstTag='${tagname}'|" \ + arkmanager + echo "Running install.sh" + bash install.sh "$steamcmd_user" "${reinstall_args[@]}" + result=$? + cd / + rm -rf "$tmpdir" + + if [ "$result" = 0 ] || [ "$result" = 2 ]; then + "ARK Server Tools successfully installed" + else + "ARK Server Tools install failed" fi + return $result +} + +function doInstallFromRelease(){ + local tagname= + local desc= + + echo "Getting latest release..." + # Read the variables from github + while IFS=$'\t' read n v; do + case "${n}" in + tag_name) tagname="${v}"; ;; + body) desc="${v}" + esac + done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + + if [ -n "$tagname" ]; then + echo "Latest release is ${tagname}" + echo "Getting commit for latest release..." + local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + doUpgradeToolsFromCommit "$commit" + else + echo "Unable to get latest release" + return 1 + fi +} + +function doInstallFromBranch(){ + channel="$1" + commit="`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" + + if [ -z "$commit" ]; then + if [ -n "$unstable" ]; then + echo "Channel ${channel} not found - trying master" + doInstallFromBranch master + else + doInstallFromRelease + fi + else + doInstallFromCommit "$commit" + fi +} + +# Download and untar installation files +cd "$TEMP" + +if [ "$channel" = "master" ] && [ -z "$unstable" ]; then + doInstallFromRelease +else + doInstallFromBranch "$channel" fi -if [ -z "$COMMIT" ]; then - echo "Unable to retrieve latest commit" - exit 1 -fi - -mkdir ark-server-tools-${channel} -cd ark-server-tools-${channel} -curl -L -k -s https://github.com/FezVrasta/ark-server-tools/archive/${COMMIT}.tar.gz | tar xz - -# Install ARK Server Tools -cd ark-server-tools-${COMMIT}/tools -sed -i "s|^arkstCommit='.*'$|arkstCommit='${COMMIT}'|" arkmanager -chmod +x install.sh -bash install.sh "$steamcmd_user" "$@" >"$output" 2>&1 - -status=$? - -rm -rf /tmp/ark-server-tools-${channel} - -# Print messages -case "$status" in - "0") - echo "ARK Server Tools were correctly installed in your system inside the home directory of $steamcmd_user!" - ;; - - "1") - echo "Something went wrong :( Make sure you meet the Prerequisites found in the readme." - ;; - "2") - echo "WARNING: 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 "ARK Server Tools were correctly installed in your system inside the home directory of $steamcmd_user!" - ;; -esac From 85e717a85f269763cbab5574e22f2bdab95b2271 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 17 Sep 2016 22:55:47 +1000 Subject: [PATCH 92/98] v1.6-pre3 --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 7e149e4..db53abd 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -7,7 +7,7 @@ # Contributors: Sispheor, Atriusftw, klightspeed, lexat, puseidr # Script version -arkstVersion='1.6-pre1' +arkstVersion='1.6-pre3' arkstTag='' arkstCommit='' From 02173e86dfe4097525c487f8e312aae2f7bb358d Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sat, 17 Sep 2016 23:03:37 +1000 Subject: [PATCH 93/98] Fix blob SHA Commit/Tag fixup --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index db53abd..dea38d6 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2662,7 +2662,7 @@ main(){ echo "Release Tag: ${arkstTag}" fi blobsize="$(sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0" | wc -c)" - echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0") | sha1sum | cut -d' ' -f1)" + echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^\\(arkst\\(Commit\\|Tag\\)\\)=.*@\\1=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;; -h|--help) From b7bb6e5b48737046c326a2de93ba4bbe0bb72141 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 18 Sep 2016 01:20:47 +1000 Subject: [PATCH 94/98] Move repo name to top of files --- netinstall.sh | 10 ++++++---- tools/arkmanager | 13 +++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/netinstall.sh b/netinstall.sh index 006b2bb..1ae38db 100644 --- a/netinstall.sh +++ b/netinstall.sh @@ -4,6 +4,8 @@ # Net Installer, used with curl # +arkstGithubRepo="FezVrasta/ark-server-tools" + steamcmd_user="$1" channel=${2:-master} # if defined by 2nd argument install the defined version, otherwise install master shift @@ -30,7 +32,7 @@ function doInstallFromCommit(){ if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi cd "$tmpdir" echo "Downloading installer" - curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + curl -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz cd "ark-server-tools-${commit}/tools" if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ @@ -61,12 +63,12 @@ function doInstallFromRelease(){ tag_name) tagname="${v}"; ;; body) desc="${v}" esac - done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + done < <(curl -s "https://api.github.com/repos/${arkstGithubRepo}/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') if [ -n "$tagname" ]; then echo "Latest release is ${tagname}" echo "Getting commit for latest release..." - local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + local commit="$(curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" doUpgradeToolsFromCommit "$commit" else echo "Unable to get latest release" @@ -76,7 +78,7 @@ function doInstallFromRelease(){ function doInstallFromBranch(){ channel="$1" - commit="`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${channel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" + commit="`curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/heads/${channel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'`" if [ -z "$commit" ]; then if [ -n "$unstable" ]; then diff --git a/tools/arkmanager b/tools/arkmanager index dea38d6..18774ac 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -10,6 +10,7 @@ arkstVersion='1.6-pre3' arkstTag='' arkstCommit='' +arkstGithubRepo="FezVrasta/ark-server-tools" doUpgradeTools() { local sudo=sudo @@ -43,7 +44,7 @@ doUpgradeToolsFromCommit(){ if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi cd "$tmpdir" echo "Downloading installer" - curl -L "https://github.com/FezVrasta/ark-server-tools/archive/${commit}.tar.gz" | tar -xz + curl -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz cd "ark-server-tools-${commit}/tools" if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ @@ -65,14 +66,14 @@ doUpgradeToolsFromCommit(){ } doUpgradeToolsFromBranch(){ - arkstLatestVersion=`curl -s "https://raw.githubusercontent.com/FezVrasta/ark-server-tools/${arkstChannel}/.version"` - arkstLatestCommit=`curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads/${arkstChannel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` + arkstLatestVersion=`curl -s "https://raw.githubusercontent.com/${arkstGithubRepo}/${arkstChannel}/.version"` + arkstLatestCommit=`curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/heads/${arkstChannel}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p'` if [ "$arkstLatestVersion" == "Not Found" ]; then echo "Channel ${arkstChannel} does not exist" echo echo "Available channels:" - curl -s https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/heads | sed -n 's|^ *"ref": "refs/heads/\(.*\)",|\1|p' + curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/heads" | sed -n 's|^ *"ref": "refs/heads/\(.*\)",|\1|p' echo return fi @@ -105,7 +106,7 @@ doUpgradeToolsFromRelease(){ tag_name) tagname="${v}"; ;; body) desc="${v}" esac - done < <(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') + done < <(curl -s "https://api.github.com/repos/${arkstGithubRepo}/releases/latest" | sed -n 's/^ "\([^"]*\)": "*\([^"]*\)"*,*/\1\t\2/p') if [ -n "$tagname" ]; then if [ "$tagname" != "$arkstTag" ]; then @@ -115,7 +116,7 @@ doUpgradeToolsFromRelease(){ echo if [[ "$REPLY" =~ ^[Yy]$ ]]; then echo "Getting commit for latest release..." - local commit="$(curl -s "https://api.github.com/repos/FezVrasta/ark-server-tools/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" + local commit="$(curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" doUpgradeToolsFromCommit "$commit" fi else From 18f19b40045c2489a202c0bd3d3101ac27b61489 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 18 Sep 2016 01:43:02 +1000 Subject: [PATCH 95/98] Fix netinstall --- netinstall.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/netinstall.sh b/netinstall.sh index 1ae38db..c69a2de 100644 --- a/netinstall.sh +++ b/netinstall.sh @@ -28,11 +28,11 @@ fi function doInstallFromCommit(){ local commit="$1" - tmpdir="$(mktemp -d "ark-server-tools-XXXXXXXX")" + tmpdir="$(mktemp -t -d "ark-server-tools-XXXXXXXX")" if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi cd "$tmpdir" echo "Downloading installer" - curl -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz + curl -s -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz cd "ark-server-tools-${commit}/tools" if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ @@ -45,9 +45,9 @@ function doInstallFromCommit(){ rm -rf "$tmpdir" if [ "$result" = 0 ] || [ "$result" = 2 ]; then - "ARK Server Tools successfully installed" + echo "ARK Server Tools successfully installed" else - "ARK Server Tools install failed" + echo "ARK Server Tools install failed" fi return $result } @@ -69,7 +69,7 @@ function doInstallFromRelease(){ echo "Latest release is ${tagname}" echo "Getting commit for latest release..." local commit="$(curl -s "https://api.github.com/repos/${arkstGithubRepo}/git/refs/tags/${tagname}" | sed -n 's/^ *"sha": "\(.*\)",.*/\1/p')" - doUpgradeToolsFromCommit "$commit" + doInstallFromCommit "$commit" else echo "Unable to get latest release" return 1 From 63590c4fb5fc83b93a6698e8892fa216710a87a4 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 18 Sep 2016 02:08:45 +1000 Subject: [PATCH 96/98] Fix upgrade-tools --- tools/arkmanager | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 18774ac..e3dbd3e 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -57,10 +57,10 @@ doUpgradeToolsFromCommit(){ rm -rf "$tmpdir" if [ "$result" = 0 ] || [ "$result" = 2 ]; then - "ARK Server Tools successfully upgraded" + echo "ARK Server Tools successfully upgraded" "$0" --version else - "ARK Server Tools upgrade failed" + echo "ARK Server Tools upgrade failed" fi exit $result } From 984eb0f9e954f5f9a212fba558c1aa9842e331b7 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 18 Sep 2016 02:38:53 +1000 Subject: [PATCH 97/98] Make update download slightly more silent --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index e3dbd3e..6ad1fd8 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -44,7 +44,7 @@ doUpgradeToolsFromCommit(){ if [ -z "$tmpdir" ]; then echo "Unable to create temporary directory"; exit 1; fi cd "$tmpdir" echo "Downloading installer" - curl -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz + curl -s -L "https://github.com/${arkstGithubRepo}/archive/${commit}.tar.gz" | tar -xz cd "ark-server-tools-${commit}/tools" if [ ! -f "install.sh" ]; then echo "install.sh not found in $PWD"; exit 1; fi sed -i -e "s|^arkstCommit='.*'|arkstCommit='${commit}'|" \ From 69aced9a79e1ec0237a52546a86e6b4e808c9852 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Sun, 18 Sep 2016 02:56:06 +1000 Subject: [PATCH 98/98] Fix Blob SHA calculation --- tools/arkmanager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/arkmanager b/tools/arkmanager index 6ad1fd8..ebe2fcc 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -2662,7 +2662,7 @@ main(){ if [ -n "${arkstTag}" ]; then echo "Release Tag: ${arkstTag}" fi - blobsize="$(sed "s@^arkst\\(Commit\\|Tag\\)=.*@\\1=''@" "$0" | wc -c)" + blobsize="$(sed "s@^\\(arkst\\(Commit\\|Tag\\)\\)=.*@\\1=''@" "$0" | wc -c)" echo "Blob SHA: $( (echo -ne "blob ${blobsize}\0"; sed "s@^\\(arkst\\(Commit\\|Tag\\)\\)=.*@\\1=''@" "$0") | sha1sum | cut -d' ' -f1)" exit 1 ;;