hp: website health checks

I wanted a program or a service to regularly check the health of my websites. Enter hp, a Unix-feeling command line program, and the antithesis of every fucking third-party cloud-hosted service designed towards a similar purpose.

$ go install go.growl.space/hp@latest

Configuration

hp uses a plain text configuration file. Each line follows one of these formats.

http [method] [url] [code[,code]]
tls [addr] [duration]

From the docs:

For a http entry, hp reports an issue if the HTTP response status code for the URL does not match any of the specified codes. The method field specifies the HTTP request method (e.g. GET).

For a tls entry, hp reports an issue if the TLS certificate at the address expires sooner than the specified duration. Specifically, hp checks the “not after” date of the leaf TLS certificate sent by the server. The address is dialed over TCP. The duration value is parsed using time.ParseDuration.

Here’s an example configuration.

# personal website
http GET https://growl.space/ 200
http GET https://growl.space/posts/ 200
http GET https://growl.space/posts/on-go/ 200
http GET https://blog.growl.space/ 302

# go custom imports server
http GET https://go.growl.space/hp?go-get=1 200
http GET https://go.growl.space/hp/ 302

# check tls certificates
# 600h is around 25 days
tls growl.space:443 600h
tls go.growl.space:443 600h
tls littleroot.org:443 600h

Output

The command outputs one line per input configuration entry, and a single summary line at the end.

The checks run concurrently.

$ cat hp.config.txt | hp
http GET https://growl.space/: 200: ok
http GET https://growl.space/posts/: 200: ok
http GET https://growl.space/posts/on-go/: 200: ok
http GET https://blog.growl.space/: 302: ok
http GET https://go.growl.space/hp?go-get=1: 200: ok
http GET https://go.growl.space/hp/: 302: ok
tls growl.space:443: remaining 2155h: ok
tls go.growl.space:443: remaining 2155h: ok
tls littleroot.org:443: remaining 2063h: ok
all: ok
$

If issues exist, the output will contain lines such as:

http GET https://growl.space/hp?go-get=1: bad status code: 500
tls growl.space:443: expires in 50h

Cron + hp

I run hp periodically with a cron job. For example, with OpenBSD 7.3 cron:

@daily		-n go/bin/hp -f hp.config.txt

If the cron implementation doesn’t support flags, such as -n, use hp’s own -s flag to avoid output when the program’s exit code is 0.

0 0 * * *	go/bin/hp -s -f hp.config.txt

These cron entries run hp daily and send mail with any issues found.