mirror of
https://github.com/haproxy/haproxy.git
synced 2026-03-09 17:40:49 -04:00
The script relied on a bash-specific process substitution (< <(...)) to feed socat's output into the read loop. This is replaced with a standard POSIX pipe into a command group. The response parsing is also simplified: instead of iterating over each line with a while loop and echoing them individually, the status line is read first, the "--" separator consumed, and the remaining output is streamed to stderr or discarded as a whole depending on the verbosity level. Could be backported to 3.3 as it makes it more portable, but introduce a slight change in the error format.
118 lines
2.3 KiB
Bash
Executable file
118 lines
2.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
export VERBOSE=1
|
|
export TIMEOUT=90
|
|
export MASTER_SOCKET="${MASTER_SOCKET:-/var/run/haproxy-master.sock}"
|
|
|
|
alert() {
|
|
if [ "$VERBOSE" -ge "1" ]; then
|
|
echo "[ALERT] $*" >&2
|
|
fi
|
|
}
|
|
|
|
|
|
reload() {
|
|
if [ -S "$MASTER_SOCKET" ]; then
|
|
socat_addr="UNIX-CONNECT:${MASTER_SOCKET}"
|
|
else
|
|
case "$MASTER_SOCKET" in
|
|
*:[0-9]*)
|
|
socat_addr="TCP:${MASTER_SOCKET}"
|
|
;;
|
|
*)
|
|
alert "Invalid master socket address '${MASTER_SOCKET}': expected a UNIX socket file or <host>:<port>"
|
|
return 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
echo "reload" | socat -t"${TIMEOUT}" "$socat_addr" - | {
|
|
read -r status || { alert "No status received (connection error or timeout after ${TIMEOUT}s)."; exit 1; }
|
|
case "$status" in
|
|
"Success=1") ret=0 ;;
|
|
"Success=0") ret=1 ;;
|
|
*) alert "Unexpected response: '$status'"; exit 1 ;;
|
|
esac
|
|
|
|
read -r _ # consume "--"
|
|
|
|
if [ "$VERBOSE" -ge 3 ] || { [ "$ret" = 1 ] && [ "$VERBOSE" -ge 2 ]; }; then
|
|
cat >&2
|
|
else
|
|
cat >/dev/null
|
|
fi
|
|
|
|
exit "$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 <addr> Unix socket path or <host>:<port> (default: ${MASTER_SOCKET})"
|
|
echo " -d, --debug Debug mode, set -x"
|
|
echo " -t, --timeout Timeout (socat -t) (default: ${TIMEOUT})"
|
|
echo " -s, --silent Silent 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
|