forked from bderenzo/tinystatus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtinystatus
executable file
·131 lines (120 loc) · 4.13 KB
/
tinystatus
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env sh
title=tinystatus
header="Global Status"
timeout=10
tmp="$(mktemp -d)"
checkfile="${1:-checks.csv}"
incidentsfile="${2:-incidents.txt}"
failonoutage=false
useragent="User-Agent: Mozilla/5.0 (X11; Linux x86_64; Debian) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
command_exists(){
if ! command -v "${1}" >/dev/null 2>&1; then
echo >&2 "Error: ${1} missing. Please install it"
exit 1
fi
}
get_element(){
echo "${2}" | awk -v col="${1}" -F',' '{gsub(/^[ \t]+|[ \t]+$/, "", $col); print $col}'
}
check(){
ctype="${1}"
host="${2}"
name="${3}"
expectedcode="${4}"
IPv="$(echo "${ctype}" | grep -o '[46]$')"
case "${ctype}" in
http*)
statuscode="$(curl -${IPv}sSkLo /dev/null -H "${useragent}" -m "${timeout}" -w "%{http_code}" "${host}" 2> "${tmp}/ko/${name}.error")";;
ping*)
ping -${IPv}W "${timeout}" -c 1 "${host}" >/dev/null 2>&1
statuscode=$?
[ "${statuscode}" -ne "${expectedcode}" ] && echo 'Host unreachable' > "${tmp}/ko/${name}.error";;
port*)
error="$(nc -${IPv}w "${timeout}" -zv ${host} 2>&1)"
statuscode=$?
[ "${statuscode}" -ne "${expectedcode}" ] && echo "${error}" > "${tmp}/ko/${name}.error";;
esac
# verity status and write files
if [ "${statuscode}" -eq "${expectedcode}" ]; then
echo "Status code: ${statuscode}" > "${tmp}/ok/${name}.status"
else
echo "Status code: ${statuscode}" > "${tmp}/ko/${name}.status"
fi
if [ -s "${tmp}/ko/${name}.error" ]; then
sed "${tmp}/ko/${name}.error" \
-e 's,curl: ([0-9]*) ,,' \
-e 's,.*) failed: ,,' > "${tmp}/ko/${name}.status"
fi
}
command_exists 'curl'
command_exists 'nc'
command_exists 'ping'
mkdir -p "${tmp}/ok" "${tmp}/ko" || exit 1
while IFS="$(printf '\n')" read -r line; do
ctype="$(get_element 1 "${line}")"
code="$(get_element 2 "${line}")"
name="$(get_element 3 "${line}")"
host="$(get_element 4 "${line}")"
check "${ctype}" "${host}" "${name}" "${code}" &
done < "${checkfile}"
wait
cat << EOF
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><title>${title}</title><style>
body { font-family: segoe ui,Roboto,Oxygen-Sans,Ubuntu,Cantarell,helvetica neue,Verdana,sans-serif; }
h1 { margin-top: 30px; }
ul { padding: 0px; }
li { list-style: none; margin-bottom: 2px; padding: 5px; border-bottom: 1px solid #ddd; }
.container { max-width: 600px; width: 100%; margin: 15px auto; }
.panel { text-align: center; padding: 10px; border: 0px; border-radius: 5px; }
.failed-bg { color: white; background-color: #E25D6A; }
.success-bg { color: white; background-color: #52B86A; }
.failed { color: #E25D6A; }
.success { color: #52B86A; }
.small { font-size: 80%; }
.status { float: right; }
</style></head>
<body>
<div class='container'>
<h1>${header}</h1>
EOF
outagenb="$(find "${tmp}/ko" -mindepth 1 | grep -c 'status$')"
if [ "${outagenb}" -ne 0 ]; then
echo "<ul><li class='panel failed-bg'>${outagenb} Outage(s)</li></ul>"
else
echo "<ul><li class='panel success-bg'>All Systems Operational</li></ul>"
fi
cat << EOF
<h1>Services</h1>
<ul>
EOF
for file in "${tmp}/ko/"*.status; do
[ -e "${file}" ] || continue
name="$(basename "${file}" | sed 's,.status$,,')"
status="$(cat "${file}")"
echo "<li>${name} <span class='small failed'>(${status})</span><span class='status failed'>Disrupted</span></li>"
done
for file in "${tmp}/ok/"*.status; do
[ -e "${file}" ] || continue
name="$(basename "${file}" | sed 's,.status$,,')"
echo "<li>${name} <span class='status success'>Operational</span></li>"
done
cat << EOF
</ul>
<p class=small> Last check: $(date +%FT%T%z)</p>
EOF
if [ -f "${incidentsfile}" ]; then
echo '<h1>Incidents</h1>'
if [ -s "${incidentsfile}" ]; then
sed 's|^\(.*\)$|<p>\1</p>|' "${incidentsfile}"
else
echo '<p>No incident reported yet ;)</p>'
fi
fi
cat <<EOF
</div>
</body></html>
EOF
rm -r "${tmp}" 2>/dev/null
if [ "${failonoutage}" = true ]; then
exit "${outagenb}"
fi