forked from anapsix/zabbix-haproxy
-
Notifications
You must be signed in to change notification settings - Fork 1
/
haproxy_discovery.sh
executable file
·95 lines (83 loc) · 2.7 KB
/
haproxy_discovery.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash
#
# Get list of Frontends and Backends from HAPROXY
# Example: ./haproxy_discovery.sh FRONTEND|BACKEND|SERVERS
# First argument is should be either FRONTEND, BACKEND or SERVERS, will default to FRONTEND if not set
#
# !! Make sure the user running this script has Read/Write permissions to that socket !!
#
## haproxy.cfg snippet
# global
# stats socket /run/haproxy/info.sock mode 666 level user
SCRIPT_DIR=`dirname $0`
CONF_FILE="${SCRIPT_DIR}/haproxy_zbx.conf"
# default constant values - can be overridden by the $CONF_FILE
HAPROXY_SOCK="/var/run/haproxy/info.sock"
DEBUG=0
DEBUG_ONLY_LOG=1
DISCOVERY_LOG_FILE="/var/tmp/haproxy_discovery.log"
QUERYING_METHOD="SOCKET"
# constants override
if [ -f ${CONF_FILE} ]; then
source ${CONF_FILE}
fi
debug() {
[[ "${DEBUG}" -eq 1 ]] || return # return immediately if debug is disabled
echo "DEBUG: $@" >> ${DISCOVERY_LOG_FILE}
[[ "${DEBUG_ONLY_LOG}" -ne 1 ]] || return
echo >&2 "DEBUG: $@"
}
fail() {
local _exit_code=${1:-1}
shift 1
if [[ -n "$1" ]]; then
if [[ "${DEBUG}" -eq 0 ]]; then
echo >&2 "$@"
else
debug "$@"
fi
fi
exit $_exit_code
}
if [[ "$HAPROXY_STATS_IP" =~ (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):[0-9]{1,5} ]];
then
QUERYING_METHOD="TCP"
fi
debug "DEBUG_ONLY_LOG => $DEBUG_ONLY_LOG"
debug "DISCOVERY_LOG_FILE => $DISCOVERY_LOG_FILE"
debug "QUERYING_METHOD => $QUERYING_METHOD"
query_stats() {
if [[ ${QUERYING_METHOD} == "SOCKET" ]]; then
echo "show stat" | socat ${HAPROXY_SOCK} stdio 2>/dev/null
elif [[ ${QUERYING_METHOD} == "TCP" ]]; then
echo "show stat" | nc ${HAPROXY_STATS_IP//:/ } 2>/dev/null
fi
}
get_stats() {
echo "$(query_stats)" | grep -v "^#"
}
if [ -e "$HAPROXY_SOCKET" ]; then
if [ ! -r "$HAPROXY_SOCKET" ]; then
fail 126 'ERROR: cannot read socket file'
fi
else
fail 126 "ERROR: HAProxy Socket file ($HAPROXY_SOCKET) doesn't exists"
fi
case $1 in
B*) END="BACKEND" ;;
F*) END="FRONTEND" ;;
S*)
for backend in $(get_stats | grep BACKEND | cut -d, -f1 | uniq); do
for server in $(get_stats | grep "^${backend}," | grep -v BACKEND | cut -d, -f2); do
serverlist="$serverlist,\n"'\t\t{\n\t\t\t"{#BACKEND_NAME}":"'$backend'",\n\t\t\t"{#SERVER_NAME}":"'$server'"}'
done
done
echo -e '{\n\t"data":[\n'${serverlist#,}']}'
exit 0
;;
*) fail 126 "ERROR: wrong resource type" ;;
esac
for frontend in $(get_stats | grep "$END" | cut -d, -f1 | uniq); do
felist="$felist,\n"'\t\t{\n\t\t\t"{#'${END}'_NAME}":"'$frontend'"}'
done
echo -e '{\n\t"data":[\n'${felist#,}']}'