#!/bin/bash
#
# Rewrites server config files to switch to a new version and makes
# the server re-read those config files. Also sends a server messages
# to announce the new version.
# Has logic to handle a temporary server for the (now) previous version.
#
# Option -n can be used to do a "dry run".

die() { echo >&2 "$@"; exit 1; }
[ $# -ge 1 ] || die "Syntax: $0 [-n] <new minor version>"
set -o errexit
set -o nounset
set -x

echo=""
[ "$1" = "-n" ] && { echo=echo; shift; }
[ "$1" -ge 1 ] || die "New version must be at least 1!"

dev_version=$(readlink "$HOME/servers/dev")
dev_version_re=${dev_version//./\\.}
new_version=$dev_version.$1
new_version_re=${new_version//./\\.}
prev_version=$dev_version.$(($1-1))
prev_version_re=${prev_version//./\\.}
pprev_version=$dev_version.$(($1-2))
pprev_version_re=${pprev_version//./\\.}
next_version=$dev_version.$(($1+1))
dev_server_config=$HOME/servers/$dev_version/wesnothd.cfg
prev_server_config=$HOME/servers/$dev_version-prev/wesnothd.cfg
prev_server_redirect=$HOME/servers/$dev_version-prev/redirect.cfg

prev=no
test -w "$prev_server_config" && prev=yes
[ "$prev" = no ] || [ "$1" -gt 1 ] || die "New version must be greater than 1 when using a previous version server!"


server_message="Version $new_version has been released! Update now! (You need the new version in order to join this server again.)"
[ "$prev" = yes ] && server_message="Version $new_version has been released! New users with the previous version will now get redirected to a temporary server that will run until binaries for all major OSes are out."

#if ! ps -C wesnothd-$dev_version-prev>/dev/null; then
#	echo "Previous server isn't running!"
#	exit 1
#fi

# Handle the 15 character limit for process names of /proc/<pid>/stat
reread_config() { $echo pkill -HUP "${1:0:15}"; }

[ "$prev" = yes ] && $echo sed -i "/versions_accepted=/s/$pprev_version_re/$prev_version/;/motd=/s/$prev_version_re/$new_version/g" "$prev_server_config"
# reload the config
[ "$prev" = yes ] && reread_config "wesnothd-$dev_version-prev"
# check if we currently allow the previous version to prevent announcing the same version twice
grep "versions_accepted=.*${prev_version//./\\.}" "$dev_server_config" || die "Previous version $prev_version currently not accepted. Announcing the right version? Aborting..."
$echo sed -i "s/^id=.*/id=$new_version/;/^versions_accepted=/{s/$new_version_re/$next_version/;s/$prev_version_re/$new_version/};/motd=/s/$prev_version_re/$new_version/g" "$dev_server_config"
# update previous version redirect
[ "$prev" = yes ] && $echo sed -i "/version=/s/$pprev_version_re/$prev_version/" "$prev_server_redirect"
[ "$prev" = yes ] && $echo sed -i "s,#\({./$dev_version_re-prev-redirect.cfg}\),\1," "$dev_server_config"
# reload the config
reread_config "wesnothd-$dev_version"
$echo "$HOME/bin/send_server_message" "$dev_version" "$server_message"
