Awesome Open Source
Awesome Open Source

status.sh

Build Status

Simple Bash script to generate a static status page. Displays status of websites, services (HTTP, SAP, MySQL...) and ping. Everything easy to customize. 🤓

You can also easily check more complicated things with this script. For example if a text is present in a web page or if a host appears in the route path (traceroute). Checking the route path is useful, for instance, if you have a backup mobile internet connection in addition to your cable connection.

Screenshot

In addition to the status web page, there is also a JSON version and an SVG icon. With the script alert.sh you can be alerted by email, SMS or Pushover in case of a downtime.

Installation

By default, it is best to place everything in your home directory in a new status directory:

mkdir ~/status
cd ~/status

1️⃣ Download Bash script status.sh:

curl \
  -f "https://raw.githubusercontent.com/Cyclenerd/static_status/master/status.sh" \
  -o "status.sh"

💡 Tip: Update works exactly the same way as the installation. Simply download the latest version of status.sh.

2️⃣ Download configuration file status_hostname_list.txt:

curl \
  -f "https://raw.githubusercontent.com/Cyclenerd/static_status/master/status_hostname_list.txt" \
  -o "status_hostname_list.txt"

3️⃣ Customize the status_hostname_list.txt configuration file and define what you want to monitor:

vi status_hostname_list.txt

Optional

Edit the script status.sh or better add more configuration to the configuration file config:

Download example configuration file:

curl \
  -f "https://raw.githubusercontent.com/Cyclenerd/static_status/master/config-example" \
  -o "config"

Customize configuration file:

vi config

Run

bash status.sh

Usage

Usage: status.sh [OPTION]:
	OPTION is one of the following:
		silent  no output from faulty connections to stout (default: no)
		loud    output from successful and faulty connections to stout (default: no)
		help    displays help (this message)

Example:

bash status.sh loud

Execute a cron job every minute:

crontab -e

Add:

*/1 * * * * bash "/path/to/status.sh" silent >> /dev/null

Requirements

Only bash, ping, traceroute, curl, nc, grep and sed. In many *NIX distributions (Ubuntu, macOS) the commands are already included. If not, the missing packages can be installed quickly.

On a debian-based system (Ubuntu), just run:

sudo apt install curl iputils-ping traceroute netcat-openbsd grep sed

💡 Tip: You can disable the traceroute dependency. Add MY_TRACEROUTE_HOST='' to your config.

Demo

This demo page is generated with GitHub Action: https://cyclenerd.github.io/static_status/

Screenshots

Screenshot Screenshot Screenshot Screenshot Screenshot

Custom Text

You can display a custom text instead of the HOSTNAME/IP/URL (see example below).

Screenshot

status_hostname_list.txt:

ping;8.8.8.8|Google DNS
nc;8.8.8.8|DNS @ Google;53
curl;http://www.heise.de/ping|www.heise.de
traceroute;192.168.211.1|DSL Internet;3
script;/bin/true|always up

SVG Icon

If you want to signal directly if everything is fine or if something is wrong in the infrastructure, you can insert the SVG icon into your websites.

Please remember to include the image with a cache breaker URL (eg. an appended timestamp:

<a href="status.html">Status <img src="status.svg?{{ timestamp }}"></a>

Static websites needs to fallback to render the icon with javascript, eg with:

document.write('<img src="status.svg?' + Date.now() + '">')

Custom Script Checks

You can extend the checks of status.sh with your own custom shell scripts.

If the shell script outputs a return code 0 it is evaluated as available. With other return codes it is a failure (outage, down).

Add your script to the status_hostname_list.txt configuration file. Example:

script;script.sh
script;/path/to/your/script.sh|Custom Text
script;/path/to/your/script_a|see symbolic link example

Please note that you do not pass any parameters. You can work with symbolic links. Example:

$ ln -sf script.sh script_a
$ ln -sf script.sh script_b
$ ls -lah
script_a -> script.sh
script_b -> script.sh

Example script.sh:

#!/bin/bash

MY_NAME=$(basename "$0")

case "$MY_NAME" in
"script_a")
  echo "A"
  exit 0
  ;;
"script_b")
  echo "B"
  exit 0
  ;;
esac

TODO

  • More and better documentation

Help is welcome 👍

License

GNU Public License version 3. Please feel free to fork and modify this on GitHub (https://awesomeopensource.com/project/Cyclenerd/static_shell).


Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Shell (232,878
Bash (7,040
Monitoring (4,127
Github Actions (3,986
Ubuntu (3,352
Simple (2,074
Bash Script (1,870
Status (388
Monitoring Tool (274
Related Projects