#!/usr/bin/env bash # usage usage() { SYSTEMD_CHECK_USAGE=$(cat <'. EOF ) echo "$SYSTEMD_CHECK_USAGE"; } set -e; # vars and defaults SYSTEMD_CHECK_LIST_FILE="$HOME/.systemd_check.list" SYSTEMD_CHECK_GLOBAL_LIST_FILE="/etc/systemd_check.list" SYSTEMD_CHECK_MAIL_ENABLED=fase SYSTEMD_CHECK_MAIL_ADDRESS="" SYSTEMD_CHECK_HOSTNAME=$(hostname) SYSTEMD_CHECK_USER=$(whoami) SYSTEMD_CHECK_SERVICES=() # check for config file apply_config() { local config=$1; if [[ ! -f "$config" ]]; then echo "No config file specified"; echo ""; usage; exit 1; fi set -a; source "$config"; set +a; } source_config() { local config=$1; local configFallback=$2; local configGlobalFallback=$3; if [[ -f "$config" ]]; then apply_config "$config"; return; fi if [[ -f "$configFallback" ]]; then apply_config "$configFallback"; return; fi if [[ -f "$configGlobalFallback" ]]; then apply_config "$configGlobalFallback"; return; fi } source_config "$1" "$HOME/.systemd_check.conf" "/etc/systemd_check.conf" 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 if ! $($USER_COMMAND); then RESULT=1; fi else 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"; if [ "$SYSTEMD_CHECK_MAIL_ENABLED" = true ]; then echo $MESSAGE|mailx -Ssendwait -s "$SUBJECT" $SYSTEMD_CHECK_MAIL_ADDRESS; fi fi return; } # execute check for defined SYSTEMD_CHECK_SERVICES for service in "${SYSTEMD_CHECK_SERVICES[@]}"; do echo "Checking $service..."; checkService "$service" done