#!/usr/bin/env bash # usage usage() { SYSTEMD_CHECK_USAGE=$(cat < /dev/null || { echo "Requiring 'hostname' but it's not installed"; exit 1; } type whoami &> /dev/null || { echo "Requiring 'whoami' but it's not installed"; exit 1; } type systemctl &> /dev/null || { echo "Requiring 'systemctl' but it's not installed"; exit 1; } } SYSTEMD_CHECK_LIST_FILE="$HOME/.systemd_check.list" SYSTEMD_CHECK_GLOBAL_LIST_FILE="/etc/systemd_check.list" SYSTEMD_CHECK_SERVICES=() source_config "$HOME/.systemd_check.conf" "/etc/systemd_check.conf" check_required SYSTEMD_CHECK_HOSTNAME=$(hostname) SYSTEMD_CHECK_USER=$(whoami) listFileToUse="" if [[ -f "$SYSTEMD_CHECK_LIST_FILE" ]]; then listFileToUse="$SYSTEMD_CHECK_LIST_FILE" else listFileToUse="$SYSTEMD_CHECK_GLOBAL_LIST_FILE" fi if [[ ! -f $listFileToUse ]]; then echo "$listFileToUse doesn't exist. Add a file which holds one systemd service or timer per line."; echo ""; usage; exit 1; fi echo "Scanning $listFileToUse for services..."; while IFS='' read -r line || [[ -n "$line" ]]; do SYSTEMD_CHECK_SERVICES+=("$line") echo "-> Found $line"; done < "$listFileToUse" # get status for a service function checkService() { local SERVICE=$1; local MESSAGE="$SERVICE is not running for user $SYSTEMD_CHECK_USER"; local ROOT_COMMAND="systemctl is-active --quiet $SERVICE"; local USER_COMMAND="systemctl --user is-active --quiet $SERVICE"; local RESULT=0; if [ "$(id -u)" != "0" ]; then # shellcheck disable=SC2091 if ! $($USER_COMMAND); then RESULT=1; fi else # shellcheck disable=SC2091 if ! $($ROOT_COMMAND) && ! $($USER_COMMAND); then RESULT=1; fi fi if [ "$RESULT" -gt 0 ]; then local SUBJECT="[systemd $SYSTEMD_CHECK_HOSTNAME for $SYSTEMD_CHECK_USER] CRITICAL $SERVICE"; echo "-> $SUBJECT: $MESSAGE"; notifier "${SUBJECT}" "${MESSAGE}"; fi return; } # execute check for defined SYSTEMD_CHECK_SERVICES for service in "${SYSTEMD_CHECK_SERVICES[@]}"; do echo "Checking $service..."; checkService "$service" done