kopia lustrzana https://0xacab.org/rysiek/fasada
84 wiersze
2.8 KiB
Bash
Executable File
84 wiersze
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#
|
|
# generating relevant tests
|
|
#
|
|
# $1 -- path of the upstreams.conf file to use
|
|
|
|
#
|
|
# first, upstream-related tests
|
|
#
|
|
|
|
FASADA_TESTS_DIR="$( dirname "$BASH_SOURCE" )"
|
|
FASADA_TESTS_UPSTREAMS_FILE="$FASADA_TESTS_DIR/001-upstreams.bats"
|
|
|
|
# clear the playing field
|
|
echo > "$FASADA_TESTS_UPSTREAMS_FILE"
|
|
|
|
# do we have *any* upstreams configured?
|
|
cat <<EOF >> "$FASADA_TESTS_UPSTREAMS_FILE"
|
|
@test "[\$HOSTNAME][upstreams] any upstreams configured?" {
|
|
[ $( awk '/^upstream/,/^}/' "$1" | egrep '^\s+server' | sed -r -e 's/^\s*server\s([][a-f0-9\.\:]+)(;|\s+.+)/\1/g' | wc -l ) != 0 ]
|
|
}
|
|
EOF
|
|
|
|
# ok, let's go through hte upstreams
|
|
# and generate tests per-upstream
|
|
for upstream in $( awk '/^upstream/,/^}/' "$1" | egrep '^\s+server' | sed -r -e 's/^\s*server\s([][a-f0-9\.\:]+)(;|\s+.+)/\1/g' ); do
|
|
|
|
# NOTICE: this will also handle regular domain names... not sure if that's what we want
|
|
if [[ "$upstream" = *'.'* ]]; then
|
|
# IPv4
|
|
BATS_RUN="run ping -c 2 -w 3 '${upstream%:*}'"
|
|
else
|
|
# IPv6
|
|
BATS_RUN="run ping6 -c 2 -w 3 '$( echo -n ${upstream%]*} | tr -d '[]' )'"
|
|
fi
|
|
|
|
cat <<EOF >> "$FASADA_TESTS_UPSTREAMS_FILE"
|
|
# pinging the upstream but *without* the port, obviously
|
|
@test "[\$HOSTNAME][upstreams] testing upstream: $upstream - accessible via ping?" {
|
|
$BATS_RUN
|
|
[ "\$status" -eq 0 ]
|
|
}
|
|
EOF
|
|
|
|
# checking TCP connectivity
|
|
# yes we're using bash built-in /dev/tcp for this to not rely on things like curl or wget
|
|
# relevant: https://www.linuxjournal.com/content/more-using-bashs-built-devtcp-file-tcpip
|
|
#
|
|
# no need to get *too* fancy here, if a HTTP request is sent to a HTTPS port
|
|
# we will still get a HTTP/1.1 Bad Request plain text response
|
|
#
|
|
# if no port is specified, default to 80
|
|
# using example.com for all requests, we just want to check if a webserver is listening
|
|
# are we doing IPv4 or IPv6?
|
|
if [[ $upstream = *'.'* ]]; then
|
|
# IPv4 (or a domain name), we can assume there's max. a single ':'
|
|
UPSTREAM_IP="${upstream%:*}"
|
|
UPSTREAM_PORT="${upstream#*:}"
|
|
if [ "$UPSTREAM_IP" == "$UPSTREAM_PORT" ]; then
|
|
UPSTREAM_PORT="80"
|
|
fi
|
|
else
|
|
# IPv6, square brackets are obligatory, otherwise nginx complains about invalid port
|
|
# so we can use that to drop the port if any
|
|
UPSTREAM_IP="$( echo -n ${upstream%]*} | tr -d '[]' )"
|
|
UPSTREAM_PORT="${upstream#*]:}"
|
|
if [ "$UPSTREAM_PORT" == "" ]; then
|
|
UPSTREAM_PORT="80"
|
|
fi
|
|
fi
|
|
|
|
cat <<EOF >> "$FASADA_TESTS_UPSTREAMS_FILE"
|
|
@test "[\$HOSTNAME][upstreams] testing upstream: $upstream - accessible via HTTP/HTTPS?" {
|
|
exec 8<>/dev/tcp/$UPSTREAM_IP/$UPSTREAM_PORT
|
|
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&8
|
|
run timeout 3 cat <&8
|
|
exec 8<&-
|
|
[[ "\${lines[0]}" == "HTTP/1.1 "* ]]
|
|
}
|
|
|
|
EOF
|
|
done
|