]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - os_win32/smartd_warning.cmd
import smartmontools 7.0
[mirror_smartmontools-debian.git] / os_win32 / smartd_warning.cmd
1 @echo off
2 ::
3 :: smartd warning script
4 ::
5 :: Home page of code is: http://www.smartmontools.org
6 ::
7 :: Copyright (C) 2012-17 Christian Franke
8 ::
9 :: SPDX-License-Identifier: GPL-2.0-or-later
10 ::
11 :: $Id: smartd_warning.cmd 4760 2018-08-19 18:45:53Z chrfranke $
12 ::
13
14 verify other 2>nul
15 setlocal enableextensions enabledelayedexpansion
16 if errorlevel 1 goto UNSUPPORTED
17 set err=
18
19 :: Change to script directory (not necessary if run from smartd service)
20 cd /d %~dp0
21 if errorlevel 1 goto ERROR
22
23 :: Parse options
24 set dryrun=
25 if "%1" == "--dryrun" (
26 set dryrun=--dryrun
27 shift
28 )
29 if not "!dryrun!" == "" echo cd /d !cd!
30
31 if not "%1" == "" (
32 echo smartd warning message script
33 echo.
34 echo Usage:
35 echo set SMARTD_MAILER='Path to external script, empty for "blat"'
36 echo set SMARTD_ADDRESS='Space separated mail addresses, empty if none'
37 echo set SMARTD_MESSAGE='Error Message'
38 echo set SMARTD_FAILTYPE='Type of failure, "EMailTest" for tests'
39 echo set SMARTD_TFIRST='Date of first message sent, empty if none'
40 echo :: set SMARTD_TFIRSTEPOCH='time_t format of above'
41 echo set SMARTD_PREVCNT='Number of previous messages, 0 if none'
42 echo set SMARTD_NEXTDAYS='Number of days until next message, empty if none'
43 echo set SMARTD_DEVICEINFO='Device identify information'
44 echo :: set SMARTD_DEVICE='Device name'
45 echo :: set SMARTD_DEVICESTRING='Annotated device name'
46 echo :: set SMARTD_DEVICETYPE='Device type from -d directive, "auto" if none'
47
48 echo smartd_warning.cmd [--dryrun]
49 goto ERROR
50 )
51
52 if "!SMARTD_ADDRESS!!SMARTD_MAILER!" == "" (
53 echo smartd_warning.cmd: SMARTD_ADDRESS or SMARTD_MAILER must be set
54 goto ERROR
55 )
56
57 :: USERDNSDOMAIN may be unset if running as service
58 if "!USERDNSDOMAIN!" == "" (
59 for /f "delims== tokens=2 usebackq" %%d in (`wmic PATH Win32_Computersystem WHERE "PartOfDomain=TRUE" GET Domain /VALUE ^<nul 2^>nul`) do set USERDNSDOMAIN=%%~d
60 )
61 :: Remove possible trailing \r appended by above command (requires %...%)
62 set USERDNSDOMAIN=%USERDNSDOMAIN%
63
64 :: Format subject
65 set SMARTD_SUBJECT=SMART error (!SMARTD_FAILTYPE!) detected on host: !COMPUTERNAME!
66
67 :: Temp file for message
68 if not "!TMP!" == "" set SMARTD_FULLMSGFILE=!TMP!\smartd_warning-!RANDOM!.txt
69 if "!TMP!" == "" set SMARTD_FULLMSGFILE=smartd_warning-!RANDOM!.txt
70
71 :: Format message
72 (
73 echo This message was generated by the smartd service running on:
74 echo.
75 echo. host name: !COMPUTERNAME!
76 if not "!USERDNSDOMAIN!" == "" echo. DNS domain: !USERDNSDOMAIN!
77 if "!USERDNSDOMAIN!" == "" echo. DNS domain: [Empty]
78 if not "!USERDOMAIN!" == "" echo. Win domain: !USERDOMAIN!
79 echo.
80 echo The following warning/error was logged by the smartd service:
81 echo.
82 if not "!SMARTD_MESSAGE!" == "" echo !SMARTD_MESSAGE!
83 if "!SMARTD_MESSAGE!" == "" echo [SMARTD_MESSAGE]
84 echo.
85 echo Device info:
86 if not "!SMARTD_DEVICEINFO!" == "" echo !SMARTD_DEVICEINFO!
87 if "!SMARTD_DEVICEINFO!" == "" echo [SMARTD_DEVICEINFO]
88 echo.
89 echo For details see the event log or log file of smartd.
90 if not "!SMARTD_FAILTYPE!" == "EmailTest" (
91 echo.
92 echo You can also use the smartctl utility for further investigation.
93 if not "!SMARTD_PREVCNT!" == "0" echo The original message about this issue was sent at !SMARTD_TFIRST!
94 if "!SMARTD_NEXTDAYS!" == "" (
95 echo No additional messages about this problem will be sent.
96 ) else ( if "!SMARTD_NEXTDAYS!" == "1" (
97 echo Another message will be sent in 24 hours if the problem persists.
98 ) else (
99 echo Another message will be sent in !SMARTD_NEXTDAYS! days if the problem persists.
100 ))
101 )
102 ) > "!SMARTD_FULLMSGFILE!"
103 if errorlevel 1 goto ERROR
104
105 if not "!dryrun!" == "" (
106 echo !SMARTD_FULLMSGFILE!:
107 type "!SMARTD_FULLMSGFILE!"
108 echo --EOF--
109 )
110
111 :: Check first address
112 set first=
113 for /f "tokens=1*" %%a in ("!SMARTD_ADDRESS!") do (set first=%%a)
114 set wtssend=
115 if "!first!" == "console" set wtssend=-c
116 if "!first!" == "active" set wtssend=-a
117 if "!first!" == "connected" set wtssend=-s
118
119 if not "!wtssend!" == "" (
120 :: Show Message box(es) via WTSSendMessage()
121 if not "!dryrun!" == "" (
122 echo call .\wtssendmsg !wtssend! "!SMARTD_SUBJECT!" - ^< "!SMARTD_FULLMSGFILE!"
123 ) else (
124 call .\wtssendmsg !wtssend! "!SMARTD_SUBJECT!" - < "!SMARTD_FULLMSGFILE!"
125 if errorlevel 1 set err=t
126 )
127 :: Remove first address
128 for /f "tokens=1*" %%a in ("!SMARTD_ADDRESS!") do (set SMARTD_ADDRESS=%%b)
129 )
130
131 :: Make comma separated address list
132 set SMARTD_ADDRCSV=
133 if not "!SMARTD_ADDRESS!" == "" set SMARTD_ADDRCSV=!SMARTD_ADDRESS: =,!
134
135 :: Default mailer is smartd_mailer.ps1 (if configured) or blat.exe
136 if not "!SMARTD_ADDRESS!" == "" if "!SMARTD_MAILER!" == "" (
137 if not exist smartd_mailer.conf.ps1 set SMARTD_MAILER=blat
138 )
139
140 :: Get mailer extension
141 set ext=
142 for /f "delims=" %%f in ("!SMARTD_MAILER!") do (set ext=%%~xf)
143
144 :: Send mail or run command
145 if "!ext!" == ".ps1" (
146
147 :: Run PowerShell script
148 if not "!dryrun!" == "" (
149 set esc=^^
150 echo PowerShell -NoProfile -ExecutionPolicy Bypass -Command !esc!^& '!SMARTD_MAILER!' ^<nul
151 ) else (
152 PowerShell -NoProfile -ExecutionPolicy Bypass -Command ^& '!SMARTD_MAILER!' <nul
153 if errorlevel 1 set err=t
154 )
155
156 ) else ( if not "!SMARTD_ADDRCSV!" == "" (
157
158 :: Send mail
159 if "!SMARTD_MAILER!" == "" (
160
161 :: Use smartd_mailer.ps1
162 if not "!dryrun!" == "" (
163 echo PowerShell -NoProfile -ExecutionPolicy Bypass -Command .\smartd_mailer.ps1 ^<nul
164 echo ==========
165 )
166 PowerShell -NoProfile -ExecutionPolicy Bypass -Command .\smartd_mailer.ps1 !dryrun! <nul
167 if errorlevel 1 set err=t
168 if not "!dryrun!" == "" echo ==========
169
170 ) else (
171
172 :: Use blat mailer or compatible
173 if not "!dryrun!" == "" (
174 echo call "!SMARTD_MAILER!" - -q -subject "!SMARTD_SUBJECT!" -to "!SMARTD_ADDRCSV!" ^< "!SMARTD_FULLMSGFILE!"
175 ) else (
176 call "!SMARTD_MAILER!" - -q -subject "!SMARTD_SUBJECT!" -to "!SMARTD_ADDRCSV!" < "!SMARTD_FULLMSGFILE!"
177 if errorlevel 1 set err=t
178 )
179
180 )
181
182 ) else ( if not "!SMARTD_MAILER!" == "" (
183
184 :: Run command
185 if not "!dryrun!" == "" (
186 echo call "!SMARTD_MAILER!" ^<nul
187 ) else (
188 call "!SMARTD_MAILER!" <nul
189 if errorlevel 1 set err=t
190 )
191
192 )))
193
194 del "!SMARTD_FULLMSGFILE!" >nul 2>nul
195
196 if not "!err!" == "" goto ERROR
197 endlocal
198 exit /b 0
199
200 :ERROR
201 endlocal
202 exit /b 1