]> git.proxmox.com Git - mirror_smartmontools-debian.git/blobdiff - os_win32/smartd_warning.cmd
Merge tag 'upstream/6.6'
[mirror_smartmontools-debian.git] / os_win32 / smartd_warning.cmd
index 3a7b0997066b54dae587cdadf9c4abfc6df42473..9b2d178fce1f2511ab5f9855da3fea9168b5b5c9 100644 (file)
@@ -2,7 +2,9 @@
 ::
 :: smartd warning script
 ::
-:: Copyright (C) 2012-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
+:: Home page of code is: http://www.smartmontools.org
+::
+:: Copyright (C) 2012-17 Christian Franke
 ::
 :: This program is free software; you can redistribute it and/or modify
 :: it under the terms of the GNU General Public License as published by
 :: You should have received a copy of the GNU General Public License
 :: (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
 ::
-:: $Id: smartd_warning.cmd 3816 2013-06-09 16:16:11Z chrfranke $
+:: $Id: smartd_warning.cmd 4569 2017-10-25 20:13:11Z chrfranke $
 ::
 
+verify other 2>nul
+setlocal enableextensions enabledelayedexpansion
+if errorlevel 1 goto UNSUPPORTED
 set err=
 
+:: Change to script directory (not necessary if run from smartd service)
+cd /d %~dp0
+if errorlevel 1 goto ERROR
+
 :: Parse options
 set dryrun=
 if "%1" == "--dryrun" (
-  set dryrun=t
+  set dryrun=--dryrun
   shift
 )
+if not "!dryrun!" == "" echo cd /d !cd!
 
 if not "%1" == "" (
   echo smartd warning message script
   echo.
   echo Usage:
   echo set SMARTD_MAILER='Path to external script, empty for "blat"'
-  echo set SMARTD_ADDRESS='Space separated mail adresses, empty if none'
+  echo set SMARTD_ADDRESS='Space separated mail addresses, empty if none'
   echo set SMARTD_MESSAGE='Error Message'
   echo set SMARTD_FAILTYPE='Type of failure, "EMailTest" for tests'
   echo set SMARTD_TFIRST='Date of first message sent, empty if none'
@@ -42,118 +52,157 @@ if not "%1" == "" (
   echo :: set SMARTD_DEVICETYPE='Device type from -d directive, "auto" if none'
 
   echo smartd_warning.cmd [--dryrun]
-  goto EOF
+  goto ERROR
 )
 
-if "%SMARTD_ADDRESS%%SMARTD_MAILER%" == "" (
+if "!SMARTD_ADDRESS!!SMARTD_MAILER!" == "" (
   echo smartd_warning.cmd: SMARTD_ADDRESS or SMARTD_MAILER must be set
-  goto EOF
+  goto ERROR
 )
 
 :: USERDNSDOMAIN may be unset if running as service
-if "%USERDNSDOMAIN%" == "" (
-  for /f "delims== tokens=2 usebackq" %%d in (`WMIC PATH Win32_Computersystem WHERE "PartOfDomain=TRUE" GET Domain /VALUE 2^>nul ^| find "Domain=" 2^>nul`) do set USERDNSDOMAIN=%%~d
+if "!USERDNSDOMAIN!" == "" (
+  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
 )
+:: Remove possible trailing \r appended by above command (requires %...%)
+set USERDNSDOMAIN=%USERDNSDOMAIN%
 
 :: Format subject
-set SMARTD_SUBJECT=SMART error (%SMARTD_FAILTYPE%) detected on host: %COMPUTERNAME%
+set SMARTD_SUBJECT=SMART error (!SMARTD_FAILTYPE!) detected on host: !COMPUTERNAME!
 
 :: Temp file for message
-if not "%TMP%" == "" set SMARTD_FULLMSGFILE=%TMP%\smartd_warning-%RANDOM%.txt
-if     "%TMP%" == "" set SMARTD_FULLMSGFILE=smartd_warning-%RANDOM%.txt
+if not "!TMP!" == "" set SMARTD_FULLMSGFILE=!TMP!\smartd_warning-!RANDOM!.txt
+if     "!TMP!" == "" set SMARTD_FULLMSGFILE=smartd_warning-!RANDOM!.txt
 
 :: Format message
 (
   echo This message was generated by the smartd service running on:
   echo.
-  echo.   host name:  %COMPUTERNAME%
-  if not "%USERDNSDOMAIN%" == "" echo.   DNS domain: %USERDNSDOMAIN%
-  if     "%USERDNSDOMAIN%" == "" echo.   DNS domain: [Empty]
-  if not "%USERDOMAIN%"    == "" echo.   Win domain: %USERDOMAIN%
+  echo.   host name:  !COMPUTERNAME!
+  if not "!USERDNSDOMAIN!" == "" echo.   DNS domain: !USERDNSDOMAIN!
+  if     "!USERDNSDOMAIN!" == "" echo.   DNS domain: [Empty]
+  if not "!USERDOMAIN!"    == "" echo.   Win domain: !USERDOMAIN!
   echo.
   echo The following warning/error was logged by the smartd service:
   echo.
-  :: SMARTD_MESSAGE and SMARTD_DEVICEINFO may contain parentheses
-  for %%m in ("%SMARTD_MESSAGE%") do echo.%%~m
+  if not "!SMARTD_MESSAGE!" == "" echo !SMARTD_MESSAGE!
+  if     "!SMARTD_MESSAGE!" == "" echo [SMARTD_MESSAGE]
   echo.
   echo Device info:
-  for %%m in ("%SMARTD_DEVICEINFO%") do echo.%%~m
-  set m=
+  if not "!SMARTD_DEVICEINFO!" == "" echo !SMARTD_DEVICEINFO!
+  if     "!SMARTD_DEVICEINFO!" == "" echo [SMARTD_DEVICEINFO]
   echo.
   echo For details see the event log or log file of smartd.
-  if not "%SMARTD_FAILTYPE%" == "EmailTest" (
+  if not "!SMARTD_FAILTYPE!" == "EmailTest" (
     echo.
     echo You can also use the smartctl utility for further investigation.
-    if not "%SMARTD_PREVCNT%" == "0" echo The original message about this issue was sent at %SMARTD_TFIRST%
-    if "%SMARTD_NEXTDAYS%" == "" (
+    if not "!SMARTD_PREVCNT!" == "0" echo The original message about this issue was sent at !SMARTD_TFIRST!
+    if "!SMARTD_NEXTDAYS!" == "" (
       echo No additional messages about this problem will be sent.
-    ) else ( if "%SMARTD_NEXTDAYS%" == "1" (
+    ) else ( if "!SMARTD_NEXTDAYS!" == "1" (
       echo Another message will be sent in 24 hours if the problem persists.
     ) else (
-      echo Another message will be sent in %SMARTD_NEXTDAYS% days if the problem persists.
+      echo Another message will be sent in !SMARTD_NEXTDAYS! days if the problem persists.
     ))
   )
-) > "%SMARTD_FULLMSGFILE%"
+) > "!SMARTD_FULLMSGFILE!"
+if errorlevel 1 goto ERROR
 
-if not "%dryrun%" == "" (
-  echo %SMARTD_FULLMSGFILE%:
-  type "%SMARTD_FULLMSGFILE%"
+if not "!dryrun!" == "" (
+  echo !SMARTD_FULLMSGFILE!:
+  type "!SMARTD_FULLMSGFILE!"
   echo --EOF--
 )
 
 :: Check first address
 set first=
-for /F "tokens=1*" %%a in ("%SMARTD_ADDRESS%") do (set first=%%a)
+for /f "tokens=1*" %%a in ("!SMARTD_ADDRESS!") do (set first=%%a)
 set wtssend=
-if "%first%" == "console"   set wtssend=-c
-if "%first%" == "active"    set wtssend=-a
-if "%first%" == "connected" set wtssend=-s
-set first=
+if "!first!" == "console"   set wtssend=-c
+if "!first!" == "active"    set wtssend=-a
+if "!first!" == "connected" set wtssend=-s
 
-if not "%wtssend%" == "" (
+if not "!wtssend!" == "" (
   :: Show Message box(es) via WTSSendMessage()
-  if not "%dryrun%" == "" (
-    echo call wtssendmsg %wtssend% "%SMARTD_SUBJECT%" - ^< "%SMARTD_FULLMSGFILE%"
+  if not "!dryrun!" == "" (
+    echo call .\wtssendmsg !wtssend! "!SMARTD_SUBJECT!" - ^< "!SMARTD_FULLMSGFILE!"
   ) else (
-    call wtssendmsg %wtssend% "%SMARTD_SUBJECT%" - < "%SMARTD_FULLMSGFILE%"
+    call .\wtssendmsg !wtssend! "!SMARTD_SUBJECT!" - < "!SMARTD_FULLMSGFILE!"
     if errorlevel 1 set err=t
   )
   :: Remove first address
-  for /F "tokens=1*" %%a in ("%SMARTD_ADDRESS%") do (set SMARTD_ADDRESS=%%b)
+  for /f "tokens=1*" %%a in ("!SMARTD_ADDRESS!") do (set SMARTD_ADDRESS=%%b)
 )
-set wtssend=
 
 :: Make comma separated address list
 set SMARTD_ADDRCSV=
-if not "%SMARTD_ADDRESS%" == "" set SMARTD_ADDRCSV=%SMARTD_ADDRESS: =,%
+if not "!SMARTD_ADDRESS!" == "" set SMARTD_ADDRCSV=!SMARTD_ADDRESS: =,!
 
-:: Use blat mailer by default
-if not "%SMARTD_ADDRESS%" == "" if "%SMARTD_MAILER%" == "" set SMARTD_MAILER=blat
+:: Default mailer is smartd_mailer.ps1 (if configured) or blat.exe
+if not "!SMARTD_ADDRESS!" == "" if "!SMARTD_MAILER!" == "" (
+  if not exist smartd_mailer.conf.ps1 set SMARTD_MAILER=blat
+)
+
+:: Get mailer extension
+set ext=
+for /f "delims=" %%f in ("!SMARTD_MAILER!") do (set ext=%%~xf)
 
 :: Send mail or run command
-if not "%SMARTD_ADDRCSV%" == "" (
+if "!ext!" == ".ps1" (
 
-  :: Send mail
-  if not "%dryrun%" == "" (
-    echo call "%SMARTD_MAILER%" - -q -subject "%SMARTD_SUBJECT%" -to "%SMARTD_ADDRCSV%" ^< "%SMARTD_FULLMSGFILE%"
+  :: Run PowerShell script
+  if not "!dryrun!" == "" (
+    set esc=^^
+    echo PowerShell -NoProfile -ExecutionPolicy Bypass -Command !esc!^& '!SMARTD_MAILER!' ^<nul
   ) else (
-    call "%SMARTD_MAILER%" - -q -subject "%SMARTD_SUBJECT%" -to "%SMARTD_ADDRCSV%" < "%SMARTD_FULLMSGFILE%"
+    PowerShell -NoProfile -ExecutionPolicy Bypass -Command ^& '!SMARTD_MAILER!' <nul
+    if errorlevel 1 set err=t
+  )
+
+) else ( if not "!SMARTD_ADDRCSV!" == "" (
+
+  :: Send mail
+  if "!SMARTD_MAILER!" == "" (
+
+    :: Use smartd_mailer.ps1
+    if not "!dryrun!" == "" (
+      echo PowerShell -NoProfile -ExecutionPolicy Bypass -Command .\smartd_mailer.ps1 ^<nul
+      echo ==========
+    )
+    PowerShell -NoProfile -ExecutionPolicy Bypass -Command .\smartd_mailer.ps1 !dryrun! <nul
     if errorlevel 1 set err=t
+    if not "!dryrun!" == "" echo ==========
+
+  ) else (
+
+    :: Use blat mailer or compatible
+    if not "!dryrun!" == "" (
+      echo call "!SMARTD_MAILER!" - -q -subject "!SMARTD_SUBJECT!" -to "!SMARTD_ADDRCSV!" ^< "!SMARTD_FULLMSGFILE!"
+    ) else (
+      call "!SMARTD_MAILER!" - -q -subject "!SMARTD_SUBJECT!" -to "!SMARTD_ADDRCSV!" < "!SMARTD_FULLMSGFILE!"
+      if errorlevel 1 set err=t
+    )
+
   )
 
-) else ( if not "%SMARTD_MAILER%" == "" (
+) else ( if not "!SMARTD_MAILER!" == "" (
 
   :: Run command
-  if not "%dryrun%" == "" (
-    echo call "%SMARTD_MAILER%" ^<nul
+  if not "!dryrun!" == "" (
+    echo call "!SMARTD_MAILER!" ^<nul
   ) else (
-    call "%SMARTD_MAILER%" <nul
+    call "!SMARTD_MAILER!" <nul
     if errorlevel 1 set err=t
   )
 
-))
+)))
+
+del "!SMARTD_FULLMSGFILE!" >nul 2>nul
 
-del "%SMARTD_FULLMSGFILE%" >nul 2>nul
+if not "!err!" == "" goto ERROR
+endlocal
+exit /b 0
 
-:EOF
-if not "%err%" == "" goto ERROR 2>nul
+:ERROR
+endlocal
+exit /b 1