Monitor Website's HTML Status Code with Bash Script

Monitor your websites in bulk by using curl on the page and returning the status code

#!/bin/bash

cd ~/html-status-codes

declare -a WEBSITES
WEBSITES+=( 
  "https://make-a-gram.williamusic.com"
  "https://www.tawtaw.site/home"
  "https://cutefruit.tawtaw.site/home" 
  "https://partyvibeonline.tawtaw.site/home"
  "http://prowlarr.lan"
  "http://dupdash.lan"
  "https://150events-ks.tawtaw.site/home"
  "https://blesspress.williamusic.com"
)

# commented code is for monitoring in a single document
# printf '%(%Y-%m-%d %H:%M:%S)T\n' -1 >> all-codes.log

for website in "${WEBSITES[@]}"
do
  # curl -o /dev/null -s -w "%{http_code} " $website >> all-codes.log
  # echo "$website" >> all-codes.log

  # remove any bad chars for filenames
  FILENAME=$(sed -E 's/(http|https):\/\///g' <<< $website | sed 's/\//_/g')
  test -e "./logs/$FILENAME.log" || touch ./logs/$FILENAME.log
  curl -o /dev/null -s -w "%{http_code}" $website > "./logs/$FILENAME.log"
done

# echo "---" >> all-codes.log

This will create a file for each website that houses the latest code returned. If you want a single file that houses the log with timestamp, uncomment out the other snippets.

Cron

Run this regularly with a crontab -e config every 15 minutes

*/15 * * * * ~/html-status-codes/html-code-monitor.sh

Home Assistant Sensor

I leverage Home Assistant as a way to track history and send alerts. Here is how to set up the sensor

sensor:
	- platform: template
	  sensors:
	    html_code_makeagram:
	      friendly_name: HTML Code Make a Gram
	      value_template: "{{ int(value,0)}}"
	      icon_template: >-
	        {% if int(value,0) == 0 %}
	          mdi:server-off
	        {% elif int(value,0) > 199 and int(value,0) < 400 %}
	          mdi:check-circle
	        {% elif int(value,0) > 499 %}
	          mdi:alert-outline
	        {% else %}
	          mdi:help-rhombus-outline
	        {% endif %}

Credit