#!/bin/bash

set -e

export VERBOSE=1
export TIMEOUT=90
export MASTER_SOCKET=${MASTER_SOCKET:-/var/run/haproxy-master.sock}
export RET=

alert() {
	if [ "$VERBOSE" -ge "1" ]; then
		echo "[ALERT] $*" >&2
	fi
}


reload() {
	while read -r line; do

		if [ "$line" = "Success=0" ]; then
			RET=1
		elif [ "$line" = "Success=1" ]; then
			RET=0
		elif [ "$line" = "Another reload is still in progress." ]; then
			alert "$line"
		elif [ "$line" = "--" ]; then
			continue;
		else
			if [ "$RET" = 1 ] && [ "$VERBOSE" = "2" ]; then
				echo "$line" >&2
			elif [ "$VERBOSE" = "3" ]; then
				echo "$line" >&2
			fi
		fi

	done < <(echo "reload" | socat -t"${TIMEOUT}" "${MASTER_SOCKET}" -)

	if [ -z "$RET" ]; then
		alert "Couldn't finish the reload before the timeout (${TIMEOUT})."
		return 1
	fi

	return "$RET"
}

usage() {
	echo "Usage:"
	echo " $0 [options]*"
	echo ""
	echo " Trigger a reload from the master socket"
	echo " Require socat"
	echo " EXPERIMENTAL script!"
	echo ""
	echo "Options:"
	echo "  -S,  --master-socket <path>   Use the master socket at <path> (default: ${MASTER_SOCKET})"
	echo "  -d,  --debug                  Debug mode, set -x"
	echo "  -t,  --timeout                Timeout (socat -t) (default: ${TIMEOUT})"
	echo "  -s,  --silent                 Slient mode (no output)"
	echo "  -v,  --verbose                Verbose output (output from haproxy on failure)"
	echo "  -vv                           Even more verbose output (output from haproxy on success and failure)"
	echo "  -h,  --help                   This help"
	echo ""
	echo "Examples:"
	echo "  $0 -S ${MASTER_SOCKET} -d ${TIMEOUT}"
}


main() {
	while [ -n "$1" ]; do
		case "$1" in
			-S|--master-socket)
				MASTER_SOCKET="$2"
				shift 2
				;;
			-t|--timeout)
				TIMEOUT="$2"
				shift 2
				;;
			-s|--silent)
				VERBOSE=0
				shift
				;;
			-v|--verbose)
				VERBOSE=2
				shift
				;;
			-vv|--verbose)
				VERBOSE=3
				shift
				;;
			-d|--debug)
				DEBUG=1
				shift
				;;
			-h|--help)
				usage "$@"
				exit 0
				;;
			*)
				echo "[ALERT] ($$) : Unknown option '$1'" >&2
				usage "$@"
				exit 1
				;;
		esac
	done

	if [ -n "$DEBUG" ]; then
		set -x
	fi
}

main "$@"
reload
