#! /bin/sh # # smartd warning script # # Home page of code is: https://www.smartmontools.org # # Copyright (C) 2012-22 Christian Franke # # SPDX-License-Identifier: GPL-2.0-or-later # # $Id: smartd_warning.sh.in 5428 2022-12-31 15:55:43Z chrfranke $ # set -e # Set by config.status @ENABLE_SCRIPTPATH_TRUE@export PATH="@scriptpath@" PACKAGE="@PACKAGE@" VERSION="@VERSION@" prefix="@prefix@" sysconfdir="@sysconfdir@" smartdscriptdir="@smartdscriptdir@" # Default mailer os_mailer="@os_mailer@" # Plugin directory (disabled if empty) plugindir="@smartdplugindir@" # Detect accidental use of '-M exec /path/to/smartd_warning.sh'. if [ -n "$SMARTD_SUBJECT" ]; then echo "$0: SMARTD_SUBJECT is already set - possible recursion" >&2 exit 1 fi # Parse options dryrun= case $1 in --dryrun) dryrun=t; shift ;; esac if [ $# != 0 ]; then cat <&2 exit 1 fi # Get host and domain names for cmd in @os_hostname@ 'echo "[Unknown]"'; do hostname=`eval $cmd 2>/dev/null` || continue test -n "$hostname" || continue break done dnsdomain=${hostname#*.} if [ "$dnsdomain" != "$hostname" ]; then # hostname command printed FQDN hostname=${hostname%%.*} else for cmd in @os_dnsdomainname@ 'echo'; do dnsdomain=`eval $cmd 2>/dev/null` || continue break done test "$dnsdomain" != "(none)" || dnsdomain= fi for cmd in @os_nisdomainname@ 'echo'; do nisdomain=`eval $cmd 2>/dev/null` || continue break done test "$nisdomain" != "(none)" || nisdomain= # Format subject export SMARTD_SUBJECT="SMART error (${SMARTD_FAILTYPE-[SMARTD_FAILTYPE]}) detected on host: $hostname" # Format message fullmessage=` echo "This message was generated by the smartd daemon running on:" echo echo " host name: $hostname" echo " DNS domain: ${dnsdomain:-[Empty]}" test -z "$nisdomain" || echo " NIS domain: $nisdomain" @OS_WIN32_TRUE@test -z "$USERDOMAIN" || @OS_WIN32_TRUE@ echo " Win domain: $USERDOMAIN" echo echo "The following warning/error was logged by the smartd daemon:" echo echo "${SMARTD_MESSAGE-[SMARTD_MESSAGE]}" echo echo "Device info:" echo "${SMARTD_DEVICEINFO-[SMARTD_DEVICEINFO]}" echo echo "For details see host's SYSLOG." if [ "$SMARTD_FAILTYPE" != "EmailTest" ]; then echo echo "You can also use the smartctl utility for further investigation." test "$SMARTD_PREVCNT" = "0" || echo "The original message about this issue was sent at ${SMARTD_TFIRST-[SMARTD_TFIRST]}" case $SMARTD_NEXTDAYS in '') echo "No additional messages about this problem will be sent." ;; 0) echo "Another message will be sent upon next check if the problem persists." ;; 1) echo "Another message will be sent in 24 hours if the problem persists." ;; *) echo "Another message will be sent in $SMARTD_NEXTDAYS days if the problem persists." ;; esac fi ` # Check whether a message line begins with the default 'mail' command escape char '~'. # Heuristically detect dangerous command escapes for possible other escape characters. esc=`echo "$fullmessage" | sed -n -e '/^~/p' -e '/^[^ 0-9A-Za-z][[:space:]]*[!:&2 exit 1 fi # Export message with trailing newline export SMARTD_FULLMESSAGE="$fullmessage " # Run plugin scripts if requested unset SMARTD_ADDRESS_ORIG case " $SMARTD_ADDRESS" in *\ @*) # Collect and remove plugin names from SMARTD_ADDRESS export SMARTD_ADDRESS_ORIG=$SMARTD_ADDRESS SMARTD_ADDRESS= plugins= for ad in $SMARTD_ADDRESS_ORIG; do case $ad in @ALL) if [ -n "$plugindir" ]; then for cmd in "$plugindir"/*; do if [ -f "$cmd" ] && [ -x "$cmd" ]; then plugins="${plugins}${plugins:+ }${cmd##*/}" fi done fi ;; @?*) if [ -n "$plugindir" ]; then plugins="${plugins}${plugins:+ }${ad#@}" fi ;; *) SMARTD_ADDRESS="${SMARTD_ADDRESS}${SMARTD_ADDRESS:+ }$ad" ;; esac done # Run all scripts if [ -n "$plugins" ]; then if [ -n "$dryrun" ]; then echo "export SMARTD_ADDRESS='$SMARTD_ADDRESS'" echo "export SMARTD_ADDRESS_ORIG='$SMARTD_ADDRESS_ORIG'" echo "export SMARTD_SUBJECT='$SMARTD_SUBJECT'" echo "export SMARTD_FULLMESSAGE='$SMARTD_FULLMESSAGE'" fi for p in $plugins; do cmd="$plugindir/$p" if [ -f "$cmd" ]; then if [ -x "$cmd" ]; then if [ -n "$dryrun" ]; then echo "$cmd &2 exit $rc fi fi fi else echo "$cmd: not found" >&2 exit 1 fi done fi # Send email to remaining addresses test -n "$SMARTD_ADDRESS" || exit 0 ;; esac # Send mail or run command if [ -n "$SMARTD_ADDRESS" ]; then # Send mail, use platform mailer by default test -n "$SMARTD_MAILER" || SMARTD_MAILER=$os_mailer if [ -n "$dryrun" ]; then echo "exec '$SMARTD_MAILER' -s '$SMARTD_SUBJECT' $SMARTD_ADDRESS <