reachable-watcher 1.0.101 → 1.0.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -7
- package/reachable-watcher.service +0 -4
- package/reachable-watcher.sh +60 -60
- package/readme.md +0 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reachable-watcher",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.103",
|
|
4
4
|
"license": "CC-BY-3.0",
|
|
5
5
|
"description": "Check status codes of web servers and sends notification e-mails",
|
|
6
6
|
"homepage": "https://torben.website/reachable-watcher",
|
|
@@ -34,16 +34,15 @@
|
|
|
34
34
|
"document:show:error": "bashlink-document reachable-watcher 1>/dev/null",
|
|
35
35
|
"lint": "hash shellcheck && shellcheck -x *.sh || echo Please install \"shellcheck\". || true",
|
|
36
36
|
"lint:given": "shellcheck -x",
|
|
37
|
-
"
|
|
38
|
-
"test": "bashlink-doctest --verbose ../../reachable-watcher",
|
|
37
|
+
"test": "./node_modules/.bin/bashlink-doctest --verbose ../../reachable-watcher",
|
|
39
38
|
"update": "yarn version patch && yarn npm publish",
|
|
40
39
|
"update:documentation": "documentation-website"
|
|
41
40
|
},
|
|
42
41
|
"devDependencies": {
|
|
43
|
-
"bashlink": "^1.0.
|
|
44
|
-
"documentation-website": "^1.0.
|
|
45
|
-
"rimraf": "^
|
|
46
|
-
"shellcheck": "^
|
|
42
|
+
"bashlink": "^1.0.249",
|
|
43
|
+
"documentation-website": "^1.0.328",
|
|
44
|
+
"rimraf": "^6.0.1",
|
|
45
|
+
"shellcheck": "^3.0.0"
|
|
47
46
|
},
|
|
48
47
|
"engines": {
|
|
49
48
|
"node": ">=20",
|
package/reachable-watcher.sh
CHANGED
|
@@ -20,21 +20,21 @@ elif [ -f "/usr/lib/bashlink/module.sh" ]; then
|
|
|
20
20
|
# shellcheck disable=SC1091
|
|
21
21
|
source "/usr/lib/bashlink/module.sh"
|
|
22
22
|
else
|
|
23
|
-
declare -gr
|
|
23
|
+
declare -gr RW_BASHLINK_PATH="$(
|
|
24
24
|
mktemp --directory --suffix -reachable-watcher-bashlink
|
|
25
25
|
)/bashlink/"
|
|
26
|
-
mkdir "$
|
|
26
|
+
mkdir "$RW_BASHLINK_PATH"
|
|
27
27
|
if wget \
|
|
28
28
|
https://torben.website/bashlink/data/distributionBundle/module.sh \
|
|
29
|
-
--output-document "${
|
|
29
|
+
--output-document "${RW_BASHLINK_PATH}module.sh"
|
|
30
30
|
then
|
|
31
|
-
declare -gr
|
|
31
|
+
declare -gr BL_MODULE_RETRIEVE_REMOTE_MODULES=true
|
|
32
32
|
# shellcheck disable=SC1091
|
|
33
|
-
source "${
|
|
34
|
-
rm --force --recursive "$
|
|
33
|
+
source "${RW_BASHLINK_PATH}/module.sh"
|
|
34
|
+
rm --force --recursive "$RW_BASHLINK_PATH"
|
|
35
35
|
else
|
|
36
36
|
echo Needed bashlink library not found 1>&2
|
|
37
|
-
rm --force --recursive "$
|
|
37
|
+
rm --force --recursive "$RW_BASHLINK_PATH"
|
|
38
38
|
exit 1
|
|
39
39
|
fi
|
|
40
40
|
fi
|
|
@@ -45,7 +45,7 @@ bl.module.import bashlink.logging
|
|
|
45
45
|
bl.module.import bashlink.tools
|
|
46
46
|
# endregion
|
|
47
47
|
# region variables
|
|
48
|
-
declare -gr
|
|
48
|
+
declare -gr RW__DOCUMENTATION__='
|
|
49
49
|
Watches a list of urls and sends mails to configured email addresses if one
|
|
50
50
|
does not fit the expected status code.
|
|
51
51
|
|
|
@@ -75,19 +75,19 @@ declare -gr reachableWatcher__documentation__='
|
|
|
75
75
|
|
|
76
76
|
Furthermore you should create a file "/etc/reachableWatcher" to overwrite
|
|
77
77
|
the following variables. You need to set values for
|
|
78
|
-
`
|
|
79
|
-
`
|
|
78
|
+
`RW_URLS_TO_CHECK` and
|
|
79
|
+
`RW_SENDER_E_MAIL_ADDRESS` at least:
|
|
80
80
|
|
|
81
81
|
```bash
|
|
82
|
-
|
|
83
|
-
declare -A
|
|
82
|
+
RW_SENDER_E_MAIL_ADDRESS="ACCOUNT_E_MAIL_ADDRESS"
|
|
83
|
+
declare -A RW_URLS_TO_CHECK=(
|
|
84
84
|
["URL1"]="200 RECIPIENT_E_MAIL_ADDRESS"
|
|
85
85
|
["URL2"]="200 RECIPIENT_E_MAIL_ADDRESS ANOTHER_RECIPIENT_E_MAIL_ADDRESS"
|
|
86
86
|
...
|
|
87
87
|
)
|
|
88
88
|
```
|
|
89
89
|
'
|
|
90
|
-
declare -agr
|
|
90
|
+
declare -agr RW__DEPENDENCIES__=(
|
|
91
91
|
bash
|
|
92
92
|
curl
|
|
93
93
|
date
|
|
@@ -96,14 +96,14 @@ declare -agr reachableWatcher__dependencies__=(
|
|
|
96
96
|
sleep
|
|
97
97
|
)
|
|
98
98
|
## region default options
|
|
99
|
-
declare -ag
|
|
99
|
+
declare -ag RW_URLS_TO_CHECK=()
|
|
100
100
|
# Wait for 5 minutes (60 * 5 = 300).
|
|
101
|
-
declare -ig
|
|
102
|
-
declare -g
|
|
103
|
-
declare -g
|
|
104
|
-
declare -g
|
|
105
|
-
declare -g
|
|
106
|
-
declare -g
|
|
101
|
+
declare -ig RW_DELAY_BETWEEN_TWO_CONSEQUTIVE_REQUESTS_IN_SECONDS=300
|
|
102
|
+
declare -g RW_DATE_TIME_FORMAT='%T:%N at %d.%m.%Y'
|
|
103
|
+
declare -g RW_SENDER_E_MAIL_ADDRESS=''
|
|
104
|
+
declare -g RW_REPLIER_E_MAIL_ADDRESS="$RW_SENDER_E_MAIL_ADDRESS"
|
|
105
|
+
declare -g RW_VERBOSE=false
|
|
106
|
+
declare -g RW_NAME=NODE_NAME
|
|
107
107
|
## endregion
|
|
108
108
|
## region load options if present
|
|
109
109
|
if [ -f /etc/reachableWatcher ]; then
|
|
@@ -113,42 +113,42 @@ fi
|
|
|
113
113
|
## endregion
|
|
114
114
|
# endregion
|
|
115
115
|
# region functions
|
|
116
|
-
alias
|
|
117
|
-
|
|
116
|
+
alias rw.is_status_valid=rw_is_status_valid
|
|
117
|
+
rw_is_status_valid() {
|
|
118
118
|
local -r __documentation__='
|
|
119
119
|
Checks if given and expected status codes results in valid state.
|
|
120
120
|
|
|
121
|
-
>>>
|
|
121
|
+
>>> rw.is_status_valid 200 200; echo $?
|
|
122
122
|
0
|
|
123
123
|
|
|
124
|
-
>>>
|
|
124
|
+
>>> rw.is_status_valid 200 "000"; echo $?
|
|
125
125
|
0
|
|
126
126
|
|
|
127
|
-
>>>
|
|
127
|
+
>>> rw.is_status_valid 200 0; echo $?
|
|
128
128
|
0
|
|
129
129
|
|
|
130
|
-
>>>
|
|
130
|
+
>>> rw.is_status_valid "000" 200; echo $?
|
|
131
131
|
0
|
|
132
132
|
|
|
133
|
-
>>>
|
|
133
|
+
>>> rw.is_status_valid "000" 206; echo $?
|
|
134
134
|
0
|
|
135
135
|
|
|
136
|
-
>>>
|
|
136
|
+
>>> rw.is_status_valid 206 "000"; echo $?
|
|
137
137
|
0
|
|
138
138
|
|
|
139
|
-
>>>
|
|
139
|
+
>>> rw.is_status_valid 206 200; echo $?
|
|
140
140
|
0
|
|
141
141
|
|
|
142
|
-
>>>
|
|
142
|
+
>>> rw.is_status_valid 200 206; echo $?
|
|
143
143
|
0
|
|
144
144
|
|
|
145
|
-
>>>
|
|
145
|
+
>>> rw.is_status_valid 201 206; echo $?
|
|
146
146
|
1
|
|
147
147
|
|
|
148
|
-
>>>
|
|
148
|
+
>>> rw.is_status_valid 206 201; echo $?
|
|
149
149
|
1
|
|
150
150
|
|
|
151
|
-
>>>
|
|
151
|
+
>>> rw.is_status_valid 201 506; echo $?
|
|
152
152
|
1
|
|
153
153
|
'
|
|
154
154
|
# NOTE: Given state "000" resolves to "0" as interpreted integer.
|
|
@@ -170,18 +170,18 @@ reachableWatcher_is_status_valid() {
|
|
|
170
170
|
return 1
|
|
171
171
|
}
|
|
172
172
|
## region controller
|
|
173
|
-
alias
|
|
174
|
-
|
|
173
|
+
alias rw.main=rw_main
|
|
174
|
+
rw_main() {
|
|
175
175
|
local -r __documentation__='
|
|
176
176
|
Main entry point.
|
|
177
177
|
'
|
|
178
|
-
$
|
|
178
|
+
$RW_VERBOSE && \
|
|
179
179
|
bl.logging.set_level info
|
|
180
180
|
while true; do
|
|
181
181
|
local url_to_check
|
|
182
|
-
for url_to_check in "${!
|
|
182
|
+
for url_to_check in "${!RW_URLS_TO_CHECK[@]}"; do
|
|
183
183
|
local -i expected_status_code="$(
|
|
184
|
-
echo "${
|
|
184
|
+
echo "${RW_URLS_TO_CHECK[$url_to_check]}" | \
|
|
185
185
|
grep '^[^ ]+' --only-matching --extended-regexp)"
|
|
186
186
|
bl.logging.debug "Check url \"$url_to_check\" for status code $expected_status_code."
|
|
187
187
|
local -i given_status_code="$(
|
|
@@ -195,25 +195,25 @@ reachableWatcher_main() {
|
|
|
195
195
|
)"
|
|
196
196
|
local normalized_url_to_check="$(
|
|
197
197
|
echo "$url_to_check" | sed 's/[:/.]/_/g')"
|
|
198
|
-
if
|
|
198
|
+
if rw.is_status_valid \
|
|
199
199
|
"$expected_status_code" \
|
|
200
200
|
"$given_status_code"
|
|
201
201
|
then
|
|
202
|
-
local message="Requested URL \"$url_to_check\" returns valid status code $given_status_code on $(date +"$
|
|
202
|
+
local message="Requested URL \"$url_to_check\" returns valid status code $given_status_code on $(date +"$RW_DATE_TIME_FORMAT")."
|
|
203
203
|
bl.logging.debug "$message"
|
|
204
204
|
if [ "$(bl.dictionary.get state "$normalized_url_to_check")" = invalid ]; then
|
|
205
205
|
bl.logging.info "Status has changed to \"valid\" for \"$url_to_check\". Do notification."
|
|
206
206
|
local e_main_address
|
|
207
207
|
for e_mail_address in $(
|
|
208
|
-
echo "${
|
|
208
|
+
echo "${RW_URLS_TO_CHECK[$url_to_check]}" | \
|
|
209
209
|
grep ' .+$' --only-matching --extended-regexp)
|
|
210
210
|
do
|
|
211
211
|
msmtp -t <<EOF
|
|
212
|
-
From: $
|
|
212
|
+
From: $RW_SENDER_E_MAIL_ADDRESS
|
|
213
213
|
To: $e_mail_address
|
|
214
|
-
Reply-To: $
|
|
214
|
+
Reply-To: $RW_REPLIER_E_MAIL_ADDRESS
|
|
215
215
|
Date: $(date)
|
|
216
|
-
Subject: $
|
|
216
|
+
Subject: $RW_NAME registers: "$url_to_check" responses with valid status code $given_status_code.
|
|
217
217
|
|
|
218
218
|
$message
|
|
219
219
|
|
|
@@ -224,7 +224,7 @@ EOF
|
|
|
224
224
|
bl.logging.debug "Status unchanged."
|
|
225
225
|
fi
|
|
226
226
|
else
|
|
227
|
-
local message="Requested URL \"$url_to_check\" returns status code $given_status_code (instead of \"$expected_status_code\") on $(date +"$
|
|
227
|
+
local message="Requested URL \"$url_to_check\" returns status code $given_status_code (instead of \"$expected_status_code\") on $(date +"$RW_DATE_TIME_FORMAT")."
|
|
228
228
|
bl.logging.debug "$message"
|
|
229
229
|
if \
|
|
230
230
|
[ "$(bl.dictionary.get state "$normalized_url_to_check")" = valid ] ||
|
|
@@ -233,15 +233,15 @@ EOF
|
|
|
233
233
|
bl.logging.info "Status has changed to \"invalid for \"$url_to_check\". Do notification."
|
|
234
234
|
local e_main_address
|
|
235
235
|
for e_mail_address in $(
|
|
236
|
-
echo "${
|
|
236
|
+
echo "${RW_URLS_TO_CHECK[$url_to_check]}" | \
|
|
237
237
|
grep ' .+$' --only-matching --extended-regexp)
|
|
238
238
|
do
|
|
239
239
|
msmtp -t <<EOF
|
|
240
|
-
From: $
|
|
240
|
+
From: $RW_SENDER_E_MAIL_ADDRESS
|
|
241
241
|
To: $e_mail_address
|
|
242
|
-
Reply-To: $
|
|
242
|
+
Reply-To: $RW_REPLIER_E_MAIL_ADDRESS
|
|
243
243
|
Date: $(date)
|
|
244
|
-
Subject: $
|
|
244
|
+
Subject: $RW_NAME registers: "$url_to_check" responses with invalid status code $given_status_code!
|
|
245
245
|
|
|
246
246
|
$message
|
|
247
247
|
|
|
@@ -253,8 +253,8 @@ EOF
|
|
|
253
253
|
fi
|
|
254
254
|
fi
|
|
255
255
|
done
|
|
256
|
-
bl.logging.debug "Wait for $
|
|
257
|
-
sleep "$
|
|
256
|
+
bl.logging.debug "Wait for $RW_DELAY_BETWEEN_TWO_CONSEQUTIVE_REQUESTS_IN_SECONDS seconds until next check."
|
|
257
|
+
sleep "$RW_DELAY_BETWEEN_TWO_CONSEQUTIVE_REQUESTS_IN_SECONDS"
|
|
258
258
|
done
|
|
259
259
|
}
|
|
260
260
|
## endregion
|
|
@@ -262,22 +262,22 @@ EOF
|
|
|
262
262
|
if bl.tools.is_main; then
|
|
263
263
|
bl.exception.activate
|
|
264
264
|
bl.exception.try
|
|
265
|
-
|
|
265
|
+
rw.main "$@"
|
|
266
266
|
bl.exception.catch_single
|
|
267
267
|
{
|
|
268
|
-
[ -d "$
|
|
269
|
-
rm --recursive "$
|
|
268
|
+
[ -d "$RW_BASHLINK_PATH" ] && \
|
|
269
|
+
rm --recursive "$RW_BASHLINK_PATH"
|
|
270
270
|
# shellcheck disable=SC2154
|
|
271
|
-
[ -d "$
|
|
272
|
-
rm --recursive "$
|
|
271
|
+
[ -d "$BL_MODULE_REMOTE_MODULE_CACHE_PATH" ] && \
|
|
272
|
+
rm --recursive "$BL_MODULE_REMOTE_MODULE_CACHE_PATH"
|
|
273
273
|
# shellcheck disable=SC2154
|
|
274
274
|
bl.logging.error "$bl_exception_last_traceback"
|
|
275
275
|
}
|
|
276
|
-
[ -d "$
|
|
277
|
-
rm --recursive "$
|
|
276
|
+
[ -d "$RW_BASHLINK_PATH" ] && \
|
|
277
|
+
rm --recursive "$RW_BASHLINK_PATH"
|
|
278
278
|
# shellcheck disable=SC2154
|
|
279
|
-
[ -d "$
|
|
280
|
-
rm --recursive "$
|
|
279
|
+
[ -d "$BL_MODULE_REMOTE_MODULE_CACHE_PATH" ] && \
|
|
280
|
+
rm --recursive "$BL_MODULE_REMOTE_MODULE_CACHE_PATH"
|
|
281
281
|
fi
|
|
282
282
|
# region vim modline
|
|
283
283
|
# vim: set tabstop=4 shiftwidth=4 expandtab:
|
package/readme.md
CHANGED