Blame


1 8f8a96f5 2023-05-31 mischa #!/bin/ksh
2 8f8a96f5 2023-05-31 mischa #
3 9ce8d96b 2023-10-21 mischa # Uptime Atomic v20231021
4 5393330f 2024-11-11 mischa # https://got.high5.nl/?action=summary&path=uptimeatomic.git
5 8f8a96f5 2023-05-31 mischa #
6 8f8a96f5 2023-05-31 mischa export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
7 d8d124d6 2023-06-03 mischa CONFIGFILE="uptimeatomic.conf"
8 acea22e3 2023-06-11 mischa WORKDIR=$(dirname $0)
9 8f8a96f5 2023-05-31 mischa
10 8f8a96f5 2023-05-31 mischa usage() {
11 8f8a96f5 2023-05-31 mischa echo "usage: ${0##*/} [-c checksfile] [-i incidentsfile] [-p pastincidentsfile] [-o htmlfile]" 1>&2
12 8f8a96f5 2023-05-31 mischa exit
13 8f8a96f5 2023-05-31 mischa }
14 8f8a96f5 2023-05-31 mischa
15 fcac9574 2023-06-03 mischa date_rss() {
16 fcac9574 2023-06-03 mischa if [ -n "${1}" ]; then
17 acea22e3 2023-06-11 mischa date -ju '+%a, %d %b %Y %H:%M:%S %z' ${1}
18 fcac9574 2023-06-03 mischa else
19 acea22e3 2023-06-11 mischa date -ju '+%a, %d %b %Y %H:%M:%S %z'
20 fcac9574 2023-06-03 mischa fi
21 fcac9574 2023-06-03 mischa }
22 fcac9574 2023-06-03 mischa date_incident() {
23 fcac9574 2023-06-03 mischa if [ -n "${1}" ]; then
24 acea22e3 2023-06-11 mischa date -ju '+%F %H:%M %Z' ${1}
25 fcac9574 2023-06-03 mischa else
26 acea22e3 2023-06-11 mischa date -ju '+%F %H:%M %Z'
27 fcac9574 2023-06-03 mischa fi
28 fcac9574 2023-06-03 mischa }
29 fcac9574 2023-06-03 mischa
30 8f8a96f5 2023-05-31 mischa get_element() {
31 8f8a96f5 2023-05-31 mischa echo "${2}" | awk -v col="${1}" -F',' '{gsub(/^[ \t]+|[ \t]+$/, "", $col); print $col}'
32 8f8a96f5 2023-05-31 mischa }
33 8f8a96f5 2023-05-31 mischa
34 fcac9574 2023-06-03 mischa incidents() {
35 fcac9574 2023-06-03 mischa _date=${1}
36 fcac9574 2023-06-03 mischa _type=${2}
37 fcac9574 2023-06-03 mischa _description=${3}
38 9ce8d96b 2023-10-21 mischa _file=${4}
39 fcac9574 2023-06-03 mischa [[ ${_type} == "Incident" ]] && color="failed"
40 fcac9574 2023-06-03 mischa [[ ${_type} == "Maintenance" ]] && color="maint"
41 9ce8d96b 2023-10-21 mischa if [ ${_file} == "${PASTINCIDENTSFILE}" ]; then
42 9ce8d96b 2023-10-21 mischa echo "<p>$(date_incident ${_date}) - <b class='${color}'>${_type}</b><br />${_description}</p>" >> ${_PASTHTMLFILE}
43 9ce8d96b 2023-10-21 mischa else
44 9ce8d96b 2023-10-21 mischa echo "<p>$(date_incident ${_date}) - <b class='${color}'>${_type}</b><br />${_description}</p>" >> ${_HTMLFILE}
45 9ce8d96b 2023-10-21 mischa fi
46 a1d4bed3 2023-06-03 mischa if [ -n "${_RSSFILE}" ]; then
47 a1d4bed3 2023-06-03 mischa cat << EOF >> ${_RSSFILE}
48 fcac9574 2023-06-03 mischa <item>
49 fcac9574 2023-06-03 mischa <title>${_type}</title>
50 bcdd495e 2023-06-15 mischa <link>${RSS_URL}/${RSSFILE}</link>
51 bcdd495e 2023-06-15 mischa <guid>${RSS_URL}/${RSSFILE}?$(date -ju +%s $(echo "${_date}"))</guid>
52 fcac9574 2023-06-03 mischa <pubDate>$(date_rss "${_date}")</pubDate>
53 fcac9574 2023-06-03 mischa <description><![CDATA[ ${_description} ]]></description>
54 fcac9574 2023-06-03 mischa </item>
55 fcac9574 2023-06-03 mischa EOF
56 fcac9574 2023-06-03 mischa fi
57 fcac9574 2023-06-03 mischa }
58 fcac9574 2023-06-03 mischa
59 8f8a96f5 2023-05-31 mischa notify() {
60 fcac9574 2023-06-03 mischa _name="${1}"
61 fcac9574 2023-06-03 mischa _status="${2}"
62 fcac9574 2023-06-03 mischa _priority="${3}"
63 8f8a96f5 2023-05-31 mischa
64 fcac9574 2023-06-03 mischa if [ ${_priority} == "ko" ]; then
65 fcac9574 2023-06-03 mischa echo "${_status}." | mail -r "${TITLE} <${SENDER}>" -s "${_name} DOWN" ${RECIPIENT}
66 acea22e3 2023-06-11 mischa ${PUSHOVER} -c ${PUSHOVER_CONF} -t "${TITLE}" -m "${_name} DOWN ${_status}" -p 1 >/dev/null 2>&1
67 fcac9574 2023-06-03 mischa touch "${PUSHOVER_STATUS}/${_name}"
68 8f8a96f5 2023-05-31 mischa fi
69 fcac9574 2023-06-03 mischa if [ ${_priority} == "ok" ]; then
70 acea22e3 2023-06-11 mischa _seconds=$(expr $(date -ju +%s) - $(stat -r "${PUSHOVER_STATUS}/${_name}" | awk '{print $11}'))
71 acea22e3 2023-06-11 mischa _downtime=$(date -jur ${_seconds} +%H:%M:%S)
72 8f8a96f5 2023-05-31 mischa
73 fcac9574 2023-06-03 mischa echo "${_status} - down for ${_downtime}" | mail -r "${TITLE} <${SENDER}>" -s "${_name} OK" ${RECIPIENT}
74 fcac9574 2023-06-03 mischa ${PUSHOVER} -c ${PUSHOVER_CONF} -t "${TITLE}" -m "${_name} OK ${_status} - down for ${_downtime}" >/dev/null 2>&1
75 fcac9574 2023-06-03 mischa rm -rf "${PUSHOVER_STATUS}/${_name}"
76 8f8a96f5 2023-05-31 mischa fi
77 8f8a96f5 2023-05-31 mischa }
78 8f8a96f5 2023-05-31 mischa
79 8f8a96f5 2023-05-31 mischa check() {
80 fcac9574 2023-06-03 mischa _ctype="${1}"
81 fcac9574 2023-06-03 mischa _expectedcode="${2}"
82 fcac9574 2023-06-03 mischa _name="${3}"
83 fcac9574 2023-06-03 mischa _host="${4}"
84 fcac9574 2023-06-03 mischa _timeout="${5}"
85 fcac9574 2023-06-03 mischa IPv="${_ctype#(http|ping|port)}"
86 fcac9574 2023-06-03 mischa [[ -n "${_timeout}" ]] && TIMEOUT=${_timeout}
87 18449f6e 2023-05-31 mischa
88 fcac9574 2023-06-03 mischa case "${_ctype}" in
89 8f8a96f5 2023-05-31 mischa http*)
90 fcac9574 2023-06-03 mischa statuscode="$(curl -${IPv}sSkLo /dev/null -H "${USERAGENT}" -m "${TIMEOUT}" -w "%{http_code}" "${_host}" 2> "${_TMP}/ko/${_name}.error")"
91 fcac9574 2023-06-03 mischa if [ "${statuscode}" -ne "${_expectedcode}" ]; then
92 fcac9574 2023-06-03 mischa if [ -s "${_TMP}/ko/${_name}.error" ]; then
93 fcac9574 2023-06-03 mischa sed -e 's,curl: ([0-9]*) ,,' "${_TMP}/ko/${_name}.error" > "${_TMP}/ko/${_name}.status"
94 8f8a96f5 2023-05-31 mischa else
95 fcac9574 2023-06-03 mischa echo "Status code: ${statuscode}" > "${_TMP}/ko/${_name}.status"
96 8f8a96f5 2023-05-31 mischa fi
97 8f8a96f5 2023-05-31 mischa else
98 fcac9574 2023-06-03 mischa echo "Status code: ${statuscode}" > "${_TMP}/ok/${_name}.status"
99 8f8a96f5 2023-05-31 mischa fi
100 8f8a96f5 2023-05-31 mischa ;;
101 8f8a96f5 2023-05-31 mischa ping*)
102 acea22e3 2023-06-11 mischa ping -${IPv}w "${TIMEOUT}" -c 3 "${_host}" >/dev/null 2>&1
103 8f8a96f5 2023-05-31 mischa statuscode=$?
104 fcac9574 2023-06-03 mischa if [ "${statuscode}" -ne "${_expectedcode}" ]; then
105 fcac9574 2023-06-03 mischa echo "Host unreachable" > "${_TMP}/ko/${_name}.status"
106 8f8a96f5 2023-05-31 mischa else
107 fcac9574 2023-06-03 mischa echo "Host reachable" > "${_TMP}/ok/${_name}.status"
108 8f8a96f5 2023-05-31 mischa fi
109 8f8a96f5 2023-05-31 mischa ;;
110 8f8a96f5 2023-05-31 mischa port*)
111 fcac9574 2023-06-03 mischa error="$(nc -${IPv}w "${TIMEOUT}" -zv ${_host} 2>&1)"
112 8f8a96f5 2023-05-31 mischa statuscode=$?
113 fcac9574 2023-06-03 mischa if [ "${statuscode}" -ne "${_expectedcode}" ]; then
114 fcac9574 2023-06-03 mischa echo "Connection refused" > "${_TMP}/ko/${_name}.status"
115 8f8a96f5 2023-05-31 mischa else
116 fcac9574 2023-06-03 mischa echo "Connection succeeded" > "${_TMP}/ok/${_name}.status"
117 8f8a96f5 2023-05-31 mischa fi
118 8f8a96f5 2023-05-31 mischa ;;
119 8f8a96f5 2023-05-31 mischa maint*)
120 fcac9574 2023-06-03 mischa echo "Maintenance" > "${_TMP}/maint/${_name}.status"
121 8f8a96f5 2023-05-31 mischa ;;
122 8f8a96f5 2023-05-31 mischa esac
123 8f8a96f5 2023-05-31 mischa }
124 8f8a96f5 2023-05-31 mischa
125 d8d124d6 2023-06-03 mischa process_status() {
126 d8d124d6 2023-06-03 mischa _status_files=${1}
127 fcac9574 2023-06-03 mischa
128 d8d124d6 2023-06-03 mischa ls ${_TMP}/${_status_files}/*.status 2>/dev/null | sort -V | while read file; do
129 fcac9574 2023-06-03 mischa [ -e "${file}" ] || continue
130 fcac9574 2023-06-03 mischa _name="$(basename "${file%.status}")"
131 fcac9574 2023-06-03 mischa _status="$(cat "${file}")"
132 fcac9574 2023-06-03 mischa
133 d8d124d6 2023-06-03 mischa if [ ${_status_files} == "ko" ]; then
134 fcac9574 2023-06-03 mischa echo "<li>${_name} <span class='small failed'>(${_status})</span><span class='status failed'>Disrupted</span></li>" >> ${_HTMLFILE}
135 fcac9574 2023-06-03 mischa if [ ! -e "${PUSHOVER_STATUS}/${_name}" ]; then
136 acea22e3 2023-06-11 mischa notify "${_name}" "${_status}" "${_status_files}"
137 fcac9574 2023-06-03 mischa fi
138 fcac9574 2023-06-03 mischa fi
139 d8d124d6 2023-06-03 mischa if [ ${_status_files} == "maint" ]; then
140 fcac9574 2023-06-03 mischa echo "<li>${_name} <span class='status maint'>Maintenance</span></li>" >> ${_HTMLFILE}
141 fcac9574 2023-06-03 mischa fi
142 d8d124d6 2023-06-03 mischa if [ ${_status_files} == "ok" ]; then
143 fcac9574 2023-06-03 mischa echo "<li>${_name} <span class='status success'>Operational</span></li>" >> ${_HTMLFILE}
144 fcac9574 2023-06-03 mischa if [ -e "${PUSHOVER_STATUS}/${_name}" ]; then
145 d8d124d6 2023-06-03 mischa notify "${_name}" "${_status}" "${_status_files}"
146 fcac9574 2023-06-03 mischa fi
147 fcac9574 2023-06-03 mischa fi
148 fcac9574 2023-06-03 mischa done
149 fcac9574 2023-06-03 mischa }
150 fcac9574 2023-06-03 mischa
151 fcac9574 2023-06-03 mischa parse_file() {
152 fcac9574 2023-06-03 mischa _file=${1}
153 fcac9574 2023-06-03 mischa while IFS="$(printf '\n')" read -r line; do
154 fcac9574 2023-06-03 mischa _col1="$(get_element 1 "${line}")"
155 fcac9574 2023-06-03 mischa _col2="$(get_element 2 "${line}")"
156 fcac9574 2023-06-03 mischa _col3="$(get_element 3 "${line}")"
157 fcac9574 2023-06-03 mischa _col4="$(get_element 4 "${line}")"
158 fcac9574 2023-06-03 mischa _col5="$(get_element 5 "${line}")"
159 fcac9574 2023-06-03 mischa if [[ ${_file} == *".csv" ]]; then
160 fcac9574 2023-06-03 mischa check "${_col1}" "${_col2}" "${_col3}" "${_col4}" "${_col5}" &
161 fcac9574 2023-06-03 mischa else
162 9ce8d96b 2023-10-21 mischa incidents "${_col1}" "${_col2}" "${_col3}" "${_file}"
163 fcac9574 2023-06-03 mischa fi
164 fcac9574 2023-06-03 mischa done < "${_file}"
165 fcac9574 2023-06-03 mischa wait
166 fcac9574 2023-06-03 mischa }
167 fcac9574 2023-06-03 mischa
168 13788643 2023-06-03 mischa cd ${WORKDIR}
169 acea22e3 2023-06-11 mischa if [ -s "${CONFIGFILE}" ]; then
170 76fbeada 2023-06-03 mischa . ${WORKDIR}/${CONFIGFILE}
171 76fbeada 2023-06-03 mischa else
172 acea22e3 2023-06-11 mischa echo "Config ${WORKDIR}/${CONFIGFILE} doesn't exist."
173 13788643 2023-06-03 mischa exit
174 13788643 2023-06-03 mischa fi
175 13788643 2023-06-03 mischa
176 fcac9574 2023-06-03 mischa while getopts c:i:o:r:h arg; do
177 8f8a96f5 2023-05-31 mischa case ${arg} in
178 8f8a96f5 2023-05-31 mischa c) CHECKFILE=${OPTARG};;
179 8f8a96f5 2023-05-31 mischa i) INCIDENTSFILE=${OPTARG};;
180 8f8a96f5 2023-05-31 mischa p) PASTINCIDENTSFILE=${OPTARG};;
181 8f8a96f5 2023-05-31 mischa o) HTMLFILE=${OPTARG};;
182 acea22e3 2023-06-11 mischa r) RSSFILE=${OPTARG};;
183 8f8a96f5 2023-05-31 mischa h) usage;;
184 8f8a96f5 2023-05-31 mischa *) usage;;
185 8f8a96f5 2023-05-31 mischa esac
186 8f8a96f5 2023-05-31 mischa done
187 8f8a96f5 2023-05-31 mischa
188 8f8a96f5 2023-05-31 mischa if [ ! -e "${CHECKFILE}" ]; then
189 8f8a96f5 2023-05-31 mischa echo "Checkfile ${WORKDIR}/${CHECKFILE} doesn't exist."
190 8f8a96f5 2023-05-31 mischa exit
191 8f8a96f5 2023-05-31 mischa fi
192 8f8a96f5 2023-05-31 mischa
193 fcac9574 2023-06-03 mischa _TMP="$(mktemp -d)"
194 fcac9574 2023-06-03 mischa mkdir -p "${_TMP}/ok" "${_TMP}/ko" "${_TMP}/maint" || exit 1
195 fcac9574 2023-06-03 mischa _HTMLFILE="${_TMP}/${HTMLFILE}"
196 9ce8d96b 2023-10-21 mischa _PASTHTMLFILE="${_TMP}/${PASTHTMLFILE}"
197 acea22e3 2023-06-11 mischa [[ -n "${RSSFILE}" ]] && _RSSFILE="${_TMP}/${RSSFILE}"
198 8f8a96f5 2023-05-31 mischa
199 fcac9574 2023-06-03 mischa parse_file "${CHECKFILE}"
200 8f8a96f5 2023-05-31 mischa
201 fcac9574 2023-06-03 mischa #
202 fcac9574 2023-06-03 mischa # HTML
203 fcac9574 2023-06-03 mischa #
204 9ce8d96b 2023-10-21 mischa cat << EOF | tee ${_HTMLFILE} | tee ${_PASTHTMLFILE} >/dev/null
205 8f8a96f5 2023-05-31 mischa <!DOCTYPE html>
206 8f8a96f5 2023-05-31 mischa <html lang="en">
207 8f8a96f5 2023-05-31 mischa <head>
208 8f8a96f5 2023-05-31 mischa <meta charset="utf-8">
209 8f8a96f5 2023-05-31 mischa <meta http-equiv="refresh" content="${REFRESH}">
210 8f8a96f5 2023-05-31 mischa <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
211 8f8a96f5 2023-05-31 mischa <title>${TITLE}</title>
212 8f8a96f5 2023-05-31 mischa <style>
213 8f8a96f5 2023-05-31 mischa body { font-family: segoe ui,Roboto,Oxygen-Sans,Ubuntu,Cantarell,helvetica neue,Verdana,sans-serif; }
214 8f8a96f5 2023-05-31 mischa h1 { margin-top: 30px; }
215 8f8a96f5 2023-05-31 mischa ul { padding: 0px; }
216 8f8a96f5 2023-05-31 mischa li { list-style: none; margin-bottom: 2px; padding: 5px; border-bottom: 1px solid #ddd; }
217 8f8a96f5 2023-05-31 mischa .container { max-width: 600px; width: 100%; margin: 15px auto; }
218 8f8a96f5 2023-05-31 mischa .panel { text-align: center; padding: 10px; border: 0px; border-radius: 5px; }
219 8f8a96f5 2023-05-31 mischa .failed-bg { color: white; background-color: #E25D6A; }
220 8f8a96f5 2023-05-31 mischa .success-bg { color: white; background-color: #52B86A; }
221 8f8a96f5 2023-05-31 mischa .maint-bg { color: white; background-color: #5DADE2; }
222 8f8a96f5 2023-05-31 mischa .failed { color: #E25D6A; }
223 8f8a96f5 2023-05-31 mischa .success { color: #52B86A; }
224 8f8a96f5 2023-05-31 mischa .maint { color: #5DADE2; }
225 8f8a96f5 2023-05-31 mischa .small { font-size: 80%; }
226 8f8a96f5 2023-05-31 mischa .status { float: right; }
227 04752bd1 2023-06-04 mischa @media (prefers-color-scheme: dark) {
228 04752bd1 2023-06-04 mischa a, a:link, a:visited { color: #ffe489; }
229 04752bd1 2023-06-04 mischa body, html { background-color: #111111; color: #888888; }
230 04752bd1 2023-06-04 mischa pre { background-color: #111111; color: #aaaaaa; }
231 58271c51 2023-06-04 mischa li { border-bottom: 1px solid #333333; }
232 04752bd1 2023-06-04 mischa .clean { background-color: #111111; color: #aaaaaa; }
233 04752bd1 2023-06-04 mischa }
234 8f8a96f5 2023-05-31 mischa </style>
235 8f8a96f5 2023-05-31 mischa </head>
236 8f8a96f5 2023-05-31 mischa <body>
237 8f8a96f5 2023-05-31 mischa <div class='container'>
238 8f8a96f5 2023-05-31 mischa <h1>${HEADER}</h1>
239 8f8a96f5 2023-05-31 mischa EOF
240 fcac9574 2023-06-03 mischa
241 fcac9574 2023-06-03 mischa #
242 fcac9574 2023-06-03 mischa # RSS
243 fcac9574 2023-06-03 mischa #
244 a1d4bed3 2023-06-03 mischa if [ -n "${_RSSFILE}" ]; then
245 a1d4bed3 2023-06-03 mischa cat << EOF > ${_RSSFILE}
246 fcac9574 2023-06-03 mischa <?xml version="1.0" encoding="utf-8"?>
247 fcac9574 2023-06-03 mischa <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
248 fcac9574 2023-06-03 mischa <channel>
249 bcdd495e 2023-06-15 mischa <atom:link href="${RSS_URL}/${RSSFILE}" rel="self" type="application/rss+xml" />
250 fcac9574 2023-06-03 mischa <title>${TITLE}</title>
251 fcac9574 2023-06-03 mischa <description>${RSS_DESCRIPTION}</description>
252 fcac9574 2023-06-03 mischa <link>${RSS_URL}</link>
253 fcac9574 2023-06-03 mischa <lastBuildDate>$(date_rss)</lastBuildDate>
254 fcac9574 2023-06-03 mischa EOF
255 fcac9574 2023-06-03 mischa fi
256 fcac9574 2023-06-03 mischa
257 fcac9574 2023-06-03 mischa _outage_count="$(find "${_TMP}/ko" -mindepth 1 | grep -c 'status$')"
258 fcac9574 2023-06-03 mischa _maint_count="$(find "${_TMP}/maint" -mindepth 1 | grep -c 'status$')"
259 8f8a96f5 2023-05-31 mischa if [ "${_outage_count}" -ne 0 ]; then
260 fcac9574 2023-06-03 mischa echo "<ul><li class='panel failed-bg'>${_outage_count} Outage(s)</li></ul>" >> ${_HTMLFILE}
261 8f8a96f5 2023-05-31 mischa fi
262 8f8a96f5 2023-05-31 mischa if [ "${_maint_count}" -ne 0 ]; then
263 fcac9574 2023-06-03 mischa echo "<ul><li class='panel maint-bg'>${_maint_count} Maintenance</li></ul>" >> ${_HTMLFILE}
264 8f8a96f5 2023-05-31 mischa fi
265 8f8a96f5 2023-05-31 mischa if [[ "${_outage_count}" -eq 0 && "${_maint_count}" -eq 0 ]]; then
266 fcac9574 2023-06-03 mischa echo "<ul><li class='panel success-bg'>All Systems Operational</li></ul>" >> ${_HTMLFILE}
267 8f8a96f5 2023-05-31 mischa fi
268 fcac9574 2023-06-03 mischa
269 8f8a96f5 2023-05-31 mischa if [ -s "${INCIDENTSFILE}" ]; then
270 fcac9574 2023-06-03 mischa echo '<h2>Incidents / Maintenance</h2>' >> ${_HTMLFILE}
271 fcac9574 2023-06-03 mischa parse_file "${INCIDENTSFILE}"
272 8f8a96f5 2023-05-31 mischa fi
273 fcac9574 2023-06-03 mischa
274 fcac9574 2023-06-03 mischa echo "<h1>Services</h1>" >> ${_HTMLFILE}
275 fcac9574 2023-06-03 mischa echo "<ul>" >> ${_HTMLFILE}
276 fcac9574 2023-06-03 mischa
277 d8d124d6 2023-06-03 mischa process_status "ko"
278 d8d124d6 2023-06-03 mischa process_status "maint"
279 d8d124d6 2023-06-03 mischa process_status "ok"
280 fcac9574 2023-06-03 mischa
281 fcac9574 2023-06-03 mischa echo "</ul>" >> ${_HTMLFILE}
282 acea22e3 2023-06-11 mischa echo "<p class=small>Last check: $(date -ju '+%FT%T %Z')</p>" >> ${_HTMLFILE}
283 fcac9574 2023-06-03 mischa
284 8f8a96f5 2023-05-31 mischa if [ -s "${PASTINCIDENTSFILE}" ]; then
285 9ce8d96b 2023-10-21 mischa echo '<h2>Past Incidents / Maintenance</h2>' >> ${_PASTHTMLFILE}
286 fcac9574 2023-06-03 mischa parse_file "${PASTINCIDENTSFILE}"
287 8f8a96f5 2023-05-31 mischa fi
288 fcac9574 2023-06-03 mischa
289 fcac9574 2023-06-03 mischa #
290 fcac9574 2023-06-03 mischa # END HTML
291 fcac9574 2023-06-03 mischa #
292 9ce8d96b 2023-10-21 mischa cat << EOF | tee -a ${_HTMLFILE} | tee -a ${_PASTHTMLFILE} >/dev/null
293 62e89f28 2023-06-03 mischa <p class=small>
294 62e89f28 2023-06-03 mischa <a href="https://git.high5.nl/uptimeatomic/">Uptime Atomic</a> loosely based on <a href="https://github.com/bderenzo/tinystatus">Tinystatus</a>
295 62e89f28 2023-06-03 mischa EOF
296 9ce8d96b 2023-10-21 mischa [[ -n "${_PASTHTMLFILE}" ]] && echo " - <a href='${PASTHTMLFILE}'>Past Incidents</a>" >> ${_HTMLFILE}
297 acea22e3 2023-06-11 mischa [[ -n "${_RSSFILE}" ]] && echo " - <a href='${RSS_URL}/${RSSFILE}'>RSS</a>" >> ${_HTMLFILE}
298 9ce8d96b 2023-10-21 mischa cat << EOF | tee -a ${_HTMLFILE} | tee -a ${_PASTHTMLFILE} >/dev/null
299 62e89f28 2023-06-03 mischa </p>
300 8f8a96f5 2023-05-31 mischa </div>
301 8f8a96f5 2023-05-31 mischa </body>
302 8f8a96f5 2023-05-31 mischa </html>
303 8f8a96f5 2023-05-31 mischa EOF
304 8f8a96f5 2023-05-31 mischa
305 fcac9574 2023-06-03 mischa #
306 fcac9574 2023-06-03 mischa # END RSS
307 fcac9574 2023-06-03 mischa #
308 a1d4bed3 2023-06-03 mischa if [ -n "${_RSSFILE}" ]; then
309 a1d4bed3 2023-06-03 mischa cat << EOF >> ${_RSSFILE}
310 fcac9574 2023-06-03 mischa </channel>
311 fcac9574 2023-06-03 mischa </rss>
312 fcac9574 2023-06-03 mischa EOF
313 fcac9574 2023-06-03 mischa fi
314 fcac9574 2023-06-03 mischa
315 acea22e3 2023-06-11 mischa if [[ -f "${HTMLDIR}/${RSSFILE}" ]]; then
316 acea22e3 2023-06-11 mischa _diff=$(diff "${_RSSFILE}" "${HTMLDIR}/${RSSFILE}" | wc -l)
317 f83e7a76 2023-06-03 mischa if [ "${_diff}" -ne "4" ]; then
318 acea22e3 2023-06-11 mischa cp ${_RSSFILE} ${HTMLDIR}/${RSSFILE}
319 f83e7a76 2023-06-03 mischa fi
320 acea22e3 2023-06-11 mischa elif [ -n "${RSSFILE}" ]; then
321 acea22e3 2023-06-11 mischa cp ${_RSSFILE} ${HTMLDIR}/${RSSFILE}
322 3991a31f 2023-06-03 mischa fi
323 f83e7a76 2023-06-03 mischa
324 fcac9574 2023-06-03 mischa cp ${_HTMLFILE} ${HTMLDIR}/${HTMLFILE}
325 9ce8d96b 2023-10-21 mischa cp ${_PASTHTMLFILE} ${HTMLDIR}/${PASTHTMLFILE}
326 fcac9574 2023-06-03 mischa rm -r "${_TMP}" 2>/dev/null