]>
Commit | Line | Data |
---|---|---|
ee38a438 GI |
1 | #! /bin/sh |
2 | # | |
3 | # smartd warning script | |
4 | # | |
5 | # Copyright (C) 2012-13 Christian Franke <smartmontools-support@lists.sourceforge.net> | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or modify | |
8 | # it under the terms of the GNU General Public License as published by | |
9 | # the Free Software Foundation; either version 2, or (at your option) | |
10 | # any later version. | |
11 | # | |
12 | # You should have received a copy of the GNU General Public License | |
13 | # (for example COPYING); If not, see <http://www.gnu.org/licenses/>. | |
14 | # | |
15 | # $Id: smartd_warning.sh.in 3809 2013-04-18 19:41:40Z chrfranke $ | |
16 | # | |
17 | ||
18 | set -e | |
19 | ||
20 | # Set by config.status | |
21 | PACKAGE="@PACKAGE@" | |
22 | VERSION="@VERSION@" | |
23 | prefix="@prefix@" | |
24 | sysconfdir="@sysconfdir@" | |
25 | ||
26 | # Default mailer | |
27 | os_mailer="@os_mailer@" | |
28 | ||
29 | # Plugin directory | |
30 | plugindir="$sysconfdir/smartd_warning.d" | |
31 | ||
32 | # Parse options | |
33 | dryrun= | |
34 | case $1 in | |
35 | --dryrun) dryrun=t; shift ;; | |
36 | esac | |
37 | ||
38 | if [ $# != 0 ]; then | |
39 | cat <<EOF | |
40 | smartd $VERSION warning message script | |
41 | ||
42 | Usage: | |
43 | export SMARTD_MAILER='Path to external script, empty for "$os_mailer"' | |
44 | export SMARTD_ADDRESS='Space separated mail adresses, empty if none' | |
45 | export SMARTD_MESSAGE='Error Message' | |
46 | export SMARTD_FAILTYPE='Type of failure, "EMailTest" for tests' | |
47 | export SMARTD_TFIRST='Date of first message sent, empty if none' | |
48 | #export SMARTD_TFIRSTEPOCH='time_t format of above' | |
49 | export SMARTD_PREVCNT='Number of previous messages, 0 if none' | |
50 | export SMARTD_NEXTDAYS='Number of days until next message, empty if none' | |
51 | export SMARTD_DEVICEINFO='Device identify information' | |
52 | #export SMARTD_DEVICE='Device name' | |
53 | #export SMARTD_DEVICESTRING='Annotated device name' | |
54 | #export SMARTD_DEVICETYPE='Device type from -d directive, "auto" if none' | |
55 | $0 [--dryrun] | |
56 | EOF | |
57 | exit 1 | |
58 | fi | |
59 | ||
60 | if [ -z "${SMARTD_ADDRESS}${SMARTD_MAILER}" ]; then | |
61 | echo "$0: SMARTD_ADDRESS or SMARTD_MAILER must be set" >&2 | |
62 | exit 1 | |
63 | fi | |
64 | ||
65 | # Get host and domain names | |
66 | for cmd in @os_hostname@ 'echo "[Unknown]"'; do | |
67 | hostname=`eval $cmd 2>/dev/null` || continue | |
68 | test -n "$hostname" || continue | |
69 | break | |
70 | done | |
71 | ||
72 | dnsdomain=${hostname#*.} | |
73 | if [ "$dnsdomain" != "$hostname" ]; then | |
74 | # hostname command printed FQDN | |
75 | hostname=${hostname%%.*} | |
76 | else | |
77 | for cmd in @os_dnsdomainname@ 'echo'; do | |
78 | dnsdomain=`eval $cmd 2>/dev/null` || continue | |
79 | break | |
80 | done | |
81 | test "$dnsdomain" != "(none)" || dnsdomain= | |
82 | fi | |
83 | ||
84 | for cmd in @os_nisdomainname@ 'echo'; do | |
85 | nisdomain=`eval $cmd 2>/dev/null` || continue | |
86 | break | |
87 | done | |
88 | test "$nisdomain" != "(none)" || nisdomain= | |
89 | ||
90 | # Format subject | |
91 | export SMARTD_SUBJECT="SMART error (${SMARTD_FAILTYPE-[SMARTD_FAILTYPE]}) detected on host: $hostname" | |
92 | ||
93 | # Format message | |
94 | fullmessage=` | |
95 | echo "This message was generated by the smartd daemon running on:" | |
96 | echo | |
97 | echo " host name: $hostname" | |
98 | echo " DNS domain: ${dnsdomain:-[Empty]}" | |
99 | test -z "$nisdomain" || | |
100 | echo " NIS domain: $nisdomain" | |
101 | @OS_WIN32_TRUE@test -z "$USERDOMAIN" || | |
102 | @OS_WIN32_TRUE@ echo " Win domain: $USERDOMAIN" | |
103 | echo | |
104 | echo "The following warning/error was logged by the smartd daemon:" | |
105 | echo | |
106 | echo "${SMARTD_MESSAGE-[SMARTD_MESSAGE]}" | |
107 | echo | |
108 | echo "Device info:" | |
109 | echo "${SMARTD_DEVICEINFO-[SMARTD_DEVICEINFO]}" | |
110 | echo | |
111 | echo "For details see host's SYSLOG." | |
112 | if [ "$SMARTD_FAILTYPE" != "EmailTest" ]; then | |
113 | echo | |
114 | echo "You can also use the smartctl utility for further investigation." | |
115 | test "$SMARTD_PREVCNT" = "0" || | |
116 | echo "The original message about this issue was sent at ${SMARTD_TFIRST-[SMARTD_TFIRST]}" | |
117 | case $SMARTD_NEXTDAYS in | |
118 | '') echo "No additional messages about this problem will be sent." ;; | |
119 | 1) echo "Another message will be sent in 24 hours if the problem persists." ;; | |
120 | *) echo "Another message will be sent in $SMARTD_NEXTDAYS days if the problem persists." ;; | |
121 | esac | |
122 | fi | |
123 | ` | |
124 | ||
125 | # Export message with trailing newline | |
126 | export SMARTD_FULLMESSAGE="$fullmessage | |
127 | " | |
128 | ||
129 | # Run plugin scripts if requested | |
130 | case " $SMARTD_ADDRESS" in | |
131 | *\ @*) | |
132 | if [ -n "$dryrun" ]; then | |
133 | echo "export SMARTD_SUBJECT='$SMARTD_SUBJECT'" | |
134 | echo "export SMARTD_FULLMESSAGE='$SMARTD_FULLMESSAGE'" | |
135 | fi | |
136 | ||
137 | # Run ALL scripts if requested | |
138 | case " $SMARTD_ADDRESS " in | |
139 | *\ @ALL\ *) | |
140 | for cmd in "$plugindir"/*; do | |
141 | if [ -f "$cmd" ] && [ -x "$cmd" ]; then | |
142 | if [ -n "$dryrun" ]; then | |
143 | echo "$cmd </dev/null" | |
144 | else | |
145 | "$cmd" </dev/null | |
146 | fi | |
147 | fi | |
148 | done | |
149 | ;; | |
150 | esac | |
151 | ||
152 | # Run selected scripts | |
153 | addrs=$SMARTD_ADDRESS | |
154 | SMARTD_ADDRESS= | |
155 | for ad in $addrs; do | |
156 | case $ad in | |
157 | @ALL) | |
158 | ;; | |
159 | @?*) | |
160 | cmd="$plugindir/${ad#@}" | |
161 | if [ -f "$cmd" ] && [ -x "$cmd" ]; then | |
162 | if [ -n "$dryrun" ]; then | |
163 | echo "$cmd </dev/null" | |
164 | else | |
165 | "$cmd" </dev/null | |
166 | fi | |
167 | elif [ ! -e "$cmd" ]; then | |
168 | echo "$cmd: Not found" >&2 | |
169 | fi | |
170 | ;; | |
171 | *) | |
172 | SMARTD_ADDRESS="${SMARTD_ADDRESS:+ }$ad" | |
173 | ;; | |
174 | esac | |
175 | done | |
176 | ||
177 | # Send email to remaining addresses | |
178 | test -n "$SMARTD_ADDRESS" || exit 0 | |
179 | ;; | |
180 | esac | |
181 | ||
182 | # Send mail or run command | |
183 | if [ -n "$SMARTD_ADDRESS" ]; then | |
184 | ||
185 | # Send mail, use platform mailer by default | |
186 | test -n "$SMARTD_MAILER" || SMARTD_MAILER=$os_mailer | |
187 | if [ -n "$dryrun" ]; then | |
188 | echo "exec '$SMARTD_MAILER' -s '$SMARTD_SUBJECT' $SMARTD_ADDRESS <<EOF | |
189 | $fullmessage | |
190 | EOF" | |
191 | else | |
192 | exec "$SMARTD_MAILER" -s "$SMARTD_SUBJECT" $SMARTD_ADDRESS <<EOF | |
193 | $fullmessage | |
194 | EOF | |
195 | fi | |
196 | ||
197 | elif [ -n "$SMARTD_MAILER" ]; then | |
198 | ||
199 | # Run command | |
200 | if [ -n "$dryrun" ]; then | |
201 | echo "export SMARTD_SUBJECT='$SMARTD_SUBJECT'" | |
202 | echo "export SMARTD_FULLMESSAGE='$SMARTD_FULLMESSAGE'" | |
203 | echo "exec '$SMARTD_MAILER' </dev/null" | |
204 | else | |
205 | unset SMARTD_ADDRESS | |
206 | exec "$SMARTD_MAILER" </dev/null | |
207 | fi | |
208 | ||
209 | fi |