TaskSchedulerMonitoring/TaskSchedulerMonitoring.au3
2017-09-11 13:57:23 +02:00

626 lines
32 KiB
AutoIt
Raw Permalink Blame History

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Monitor scheduled Tasks
#AutoIt3Wrapper_Res_Fileversion=1.0.0.49
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2015 Bernhard Linz
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_Field=Website|http://znil.net
#AutoIt3Wrapper_Res_Field=Manual|http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring
#AutoIt3Wrapper_Res_Field=See You|znil.net
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt('MustDeclareVars', 1)
#Region ;************ Includes ************
#Include <Array.au3>
#include <Constants.au3>
#include <Date.au3>
#EndRegion ;************ Includes ************
; ##########################################################################################################################
; ##########################################################################################################################
; # TaskSchedulerMonitoring.exe --> Tool for Check BackupJobs in Zabbix #
; # 2013 Bernhard Linz / Bernhard@znil.de / http://znil.net #
; # #
; # Latest Version of this Program and Template in German: #
; # http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring #
; # #
; # ________ .__ __. __ __ .__ __. _______ .___________. #
; # | / | \ | | | | | | | \ | | | ____|| | #
; # `---/ / | \| | | | | | | \| | | |__ `---| |----` #
; # / / | . ` | | | | | | . ` | | __| | | #
; # / /----.| |\ | | | | `----.__| |\ | | |____ | | #
; # /________||__| \__| |__| |_______(__)__| \__| |_______| |__| #
; # #
; ##########################################################################################################################
; ##########################################################################################################################
Global $s_schtasksexe
Global $s_temp1, $s_temp2
Global $a_temp1, $a_temp2
Global $a_DateTemp
Global $a_RuntimeTemp
Global $a_ScheduledTasks[1][8] ; [0][0] = Anzahl der Tasks
; [x][1] = Name des Task "original"
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix unr zur <20>bergabe an dieses Programm hier
; [x][3] = Last Result
; [x][4] = Last Run Time
; [x][5] = Next Run Time
; [x][6] = Run As User
; [x][7] = Task To Run
Global $s_Task2IgnoreFile = @ScriptDir & "\TaskSchedulerMonitoring-ignore.txt"
Global $h_Task2IgnoreFile
Global $a_Task2Ignore[1] = [ 0 ]
Global $b_IgnoreTask = False
Global $s_CleanTaskName
Global $s_OriginalTaskName
Global $s_QueryTaskName
Global $i_ThisTask
Global $s_JSONOutput
Global $s_RunCommand
Global $iStartTime
Global $iRunTime
Global $b_Verbose
; 10 20 30 40 50 60 70 80
; 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s__Header = _
"+------------------------------------------------------------------------------" & @CRLF & _
"| TaskSchedulderMonitoring.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
"| 2015 von Bernhard Linz f<>r http://znil.net - Kontakt: Bernhard@znil.net" & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
@CRLF
; 10 20 30 40 50 60 70 80
; 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s__HilfeText = _
"Hilfsprogramm f<>r Zabbix als UserParameter um die Aufgabenplanung / Geplante" & @CRLF & _
"Tasks zu <20>berwachen" & @CRLF & _
"---------------------------------------------------------------------------" & @CRLF & _
@CRLF & _
"Aufruf: " & @CRLF & _
@CRLF & _
@ScriptName & " <Option> <Parameter>" & @CRLF & _
@CRLF & _
"Optionen:" & @CRLF & _
"---------" & @CRLF & _
" /? oder -? : Diese Hilfe Anzeigen" & @CRLF & _
@CRLF & _
" discovertasks : Erzeugt eine Liste im JSON Format <20>ber alle Aufgaben." & @CRLF & _
" <20>bernommen werden nur alle Tasks die im Stammordner \ stehen," & @CRLF & _
" also direkt unterhalb von 'Aufgabenplanungsbibliothek' bzw." & @CRLF & _
" 'Task Scheduler Library'" & @CRLF & _
@CRLF & _
" query : Ben<65>tigt als Parameter den Namen des geplanten Task." & @CRLF & _
" Sendet das Ergebnis direkt an den Zabbix-Server bzw. Proxy" & @CRLF & _
" <20>ber die Zabbix_Sender.exe. Es wird die Konfiguration des" & @CRLF & _
" installierten Zabbix Agenten ausgelesen und der dort" & @CRLF & _
" hinterlegte Server als Ziel genommen. Die Zabbix_Sender.exe" & @CRLF & _
" muss im gleichen Pfad liegen wie die zabbix_agentd.exe" & @CRLF & _
" Gibt die Laufzeit des Programmes in Sekunden zur<75>ck." & @CRLF & _
@CRLF & _
" /verbose : Muss als 2. (discovertasks) oder 3. (query) Parameter" & @CRLF & _
" angegeben werden. Gibt umfangreiche Meldungen <20>ber die" & @CRLF & _
" Abfrage und das Senden der Daten aus" & @CRLF & _
@CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
"| TaskSchedulderMonitoring.exe ist FREEWARE!" & @CRLF & _
"| Kopieren, weitergeben ausdr<64>cklich erlaubt!" & @CRLF & _
"| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _
"| http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring" & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF
; ##########################################################################################################################
; ##########################################################################################################################
; ########################################
; ######## ## ## ## ## ###### ######## #### ####### ## ## ###### ########################################
; ## ## ## ### ## ## ## ## ## ## ## ### ## ## ## ########################################
; ## ## ## #### ## ## ## ## ## ## #### ## ## ########################################
; ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ########################################
; ## ## ## ## #### ## ## ## ## ## ## #### ## ########################################
; ## ## ## ## ### ## ## ## ## ## ## ## ### ## ## ########################################
; ## ####### ## ## ###### ## #### ####### ## ## ###### ########################################
; ########################################
; ##########################################################################################################################
; ##########################################################################################################################
Func _schtasks($s_schtasksparameter)
_VerboseConsoleWrite("Funktion _schtasks wird gestartet")
Local $s_RunCommand
Local $outputschtasks
Local $errorsschtasks
Local $hschtasks
Local $ischtasksmaxWaitTime = 20000
Local $ischtasksmaxWaitTimeSTART
Local $s_tdoutReadFEHLER
; build the Command for run
;ConsoleWrite($s_schtasksexe & " " & $s_schtasksparameter & @CRLF)
_VerboseConsoleWrite("F<EFBFBD>hre Abfrage aus: " & $s_schtasksexe & " " & $s_schtasksparameter)
$s_RunCommand = $s_schtasksexe & " " & $s_schtasksparameter
; Start the timer for max wait time
$ischtasksmaxWaitTimeSTART = TimerInit()
; run the Command
$hschtasks = Run($s_RunCommand, @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
;get the output
Do
Sleep(5)
; get the output
$outputschtasks = $outputschtasks & StdoutRead($hschtasks)
; get the errors
$errorsschtasks = $errorsschtasks & StderrRead($hschtasks)
; did we have an error while reading?
$s_tdoutReadFEHLER = @error
If $s_tdoutReadFEHLER <> "" Then
; No error, go on
If $outputschtasks = "" Then
; but also no output, let us take a 2. try
$outputschtasks = $outputschtasks & StdoutRead($hschtasks)
If $outputschtasks = "" Then
; anymore no output, oh oh
If $s_tdoutReadFEHLER <> "" Then
; but we have an error message
ConsoleWriteError($errorsschtasks & @CRLF)
EndIf
EndIf
EndIf
EndIf
Until $s_tdoutReadFEHLER Or TimerDiff($ischtasksmaxWaitTimeSTART) > $ischtasksmaxWaitTime
_VerboseConsoleWrite("Abfrage beendet. Ergebnis:" & $outputschtasks)
;MsgBox(0,"",$outputschtasks)
_VerboseConsoleWrite("Funktion _schtasks wird beendet")
Return $outputschtasks
EndFunc ;<== End _schtasks()
; ###################################################################################
; _ANSI2OEM l<>st das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
; So k<>nnen hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt
; Wir zudem f<>r die Pr<50>fung der Gruppenzugeh<65>rigkeit ben<65>tigt f<>r Gruppen mit Umlauten, z.B. Dom<6F>nen-Admins
; Dank an Xenobiologist von AutoIt.de f<>r diese L<>sung: http://www.autoit.de/index.php?page=Thread&threadID=9461&highlight=ANSI2OEM
Func _ANSI2OEM($text)
$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
Return $text[2]
;Return $text
EndFunc ;==>_ANSI2OEM
; ###################################################################################
Func _VerboseConsoleWrite($VerboseText)
If $b_Verbose = True Then
If StringLen($VerboseText) < 16000 Then
ConsoleWrite(_ANSI2OEM($VerboseText) & @CRLF)
Else
ConsoleWrite($VerboseText & @CRLF)
EndIf
EndIf
EndFunc
; ###################################################################################
; Hilfsroutine die den Hilfetext ausgibt
Func _HilfeAusgeben()
ConsoleWrite(_ANSI2OEM($s__Header))
ConsoleWrite(_ANSI2OEM($s__HilfeText))
EndFunc ;==>_HilfeAusgeben
; ##################################################################################################################
; ######## ### ######## ######## #### ## ## ###### ####### ## ## ########
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ##
; ## ## ## ######## ######## ## ### ## ## ## ## ## ## ######
; ## ######### ## ## ## ## ## ## ## ## ## ## ## #### ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ##
; ####### ######## ## ## ######## ######## #### ## ## ####### ###### ####### ## ## ##
; ##################################################################################################################
Global $sZabbix_agentd_exe
Global $sZabbix_agentd_conf
Global $sZabbix_sender_exe
Global $sZabbix_Hostname
Global $sZabbix_Server
Global $iZabbix_Server_Port
Global $sZabbix_String2Send
Func _Zabbix_conf()
_VerboseConsoleWrite("Funktion _Zabbix_conf wird gestartet")
Dim $sRegTMP
Dim $iRegTMP = 0
Dim $iLoop
Dim $aRegTMP
Dim $aZabbix_config
Dim $sZabbix_config_file
Dim $a2temp
_VerboseConsoleWrite("Durchsuche Registry nach Zabbix Agent Dienst ...")
While 1
$iRegTMP = $iRegTMP + 1
$sRegTMP = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services", $iRegTMP)
If @error Then
ExitLoop
EndIf
$sRegTMP = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\" & $sRegTMP, "ImagePath")
If @error = 0 Then
If StringInStr($sRegTMP, "zabbix_agentd.exe") > 0 Then
_VerboseConsoleWrite("Gefunden: " & $sRegTMP)
_VerboseConsoleWrite("Extrahiere Daten ...")
$aRegTMP = StringSplit($sRegTMP, '"')
;_ArrayDisplay($aRegTMP)
$sZabbix_agentd_exe = $aRegTMP[2]
$sZabbix_sender_exe = StringReplace($sZabbix_agentd_exe, "zabbix_agentd.exe", "zabbix_sender.exe")
$sZabbix_config_file = $aRegTMP[4]
$sZabbix_agentd_conf = $sZabbix_config_file
_VerboseConsoleWrite("Lese Konfigurationsdatei ein: " & $sZabbix_config_file)
$aZabbix_config = FileReadToArray($sZabbix_config_file)
If @error = 0 Then
For $iLoop = 0 To (UBound($aZabbix_config) -1)
If StringLeft($aZabbix_config[$iLoop], StringLen("ServerActive=")) = "ServerActive=" Then
$sZabbix_Server = StringReplace($aZabbix_config[$iLoop], "ServerActive=", "")
$sZabbix_Server = StringReplace($sZabbix_Server, " ", "")
$a2temp = StringSplit($sZabbix_Server, ":")
If $a2temp[0] = 1 Then
$iZabbix_Server_Port = 10051
Else
$sZabbix_Server = $a2temp[1]
$iZabbix_Server_Port = $a2temp[2]
EndIf
EndIf
If StringLeft($aZabbix_config[$iLoop], StringLen("Hostname=")) = "Hostname=" Then
$sZabbix_Hostname = StringReplace($aZabbix_config[$iLoop], "Hostname=", "")
$sZabbix_Hostname = StringReplace($sZabbix_Hostname, " ", "")
EndIf
Next
Else
_VerboseConsoleWrite("Fehler - Konfigurationsdatei nicht gefunden oder kein Zugriff m<>glich: " & $sZabbix_config_file)
ConsoleWrite("File not found: " & $sZabbix_config_file & @CRLF)
Exit 1
EndIf
If FileExists($sZabbix_sender_exe) = 0 Then
_VerboseConsoleWrite("Fehler - zabbix_sender.exe nicht gefunden oder kein Zugriff m<>glich: " & $sZabbix_sender_exe)
ConsoleWrite("zabbix_sender.exe not found at: " & $sZabbix_sender_exe & @CRLF)
Exit 1
EndIf
EndIf
EndIf
WEnd
_VerboseConsoleWrite("zabbix_agentd.exe: " & '"' & $sZabbix_agentd_exe & '"')
_VerboseConsoleWrite("zabbix_sender.exe: " & '"' & $sZabbix_sender_exe & '"')
_VerboseConsoleWrite("Hostname used in Zabbix: " & '"' & $sZabbix_Hostname & '"')
_VerboseConsoleWrite("IP(:Port) Zabbix Server: " & '"' & $sZabbix_Server & '"')
_VerboseConsoleWrite("Funktion _Zabbix_conf wurde beendet")
EndFunc
; #############################################################################################################################################################################################################################################################################
; ###### ######## ## ## ######## ## ## ### ## ## ## ######## ## ## #### ######## ## ## ######## ### ######## ######## #### ## ## ###### ######## ## ## ######## ######## ########
; ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ##
; ## ## #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ## ## ## ##
; ###### ###### ## ## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ## ######### ## ## ## ######## ######## ## ### ###### ###### ## ## ## ## ## ###### ########
; ## ## ## #### ## ## ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ######### ## ## ## ## ## ## ## ## ## ## #### ## ## ## ## ##
; ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ##
; ####### ###### ######## ## ## ######## ### ## ## ######## ####### ######## ####### ### ### #### ## ## ## ####### ######## ## ## ######## ######## #### ## ## ####### ###### ######## ## ## ######## ######## ## ##
; #############################################################################################################################################################################################################################################################################
Func _SendValue_with_Zabbix_Sender($sItemName, $sItemValue)
_VerboseConsoleWrite('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"' & " -vv")
If $b_Verbose = False Then
RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"', "", @SW_HIDE, $RUN_CREATE_NEW_CONSOLE)
Else
RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"' & " -vv", "")
EndIf
EndFunc
; ####################################################################################################################
; ###### ######## ######## ### ## ## ######## ### ###### ## ## ######
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ## #### ###### ## ## ## ## ## ## ## ## ###### ##### ######
; ## ## ## ## ######### ## ## ## ######### ## ## ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ####### ###### ######## ## ## ## ######## ######## ## ## ## ###### ## ## ######
; ####################################################################################################################
Func _GetAllScheduledTasks()
_VerboseConsoleWrite("Funktion GetAllScheduledTasks wird gestartet")
Dim $s_lastTaskName = ""
; Get all scheduled Jobs
_VerboseConsoleWrite("Starte Abfrage der Tasks")
$s_temp1 = _schtasks("/query /FO CSV")
;ConsoleWrite($s_temp1 & @CRLF)
_VerboseConsoleWrite("Extrahiere Daten aus der R<>ckgabe")
$s_temp1 = StringReplace($s_temp1, @CRLF, "@CRLF")
$a_temp1 = StringSplit($s_temp1, "@CRLF", 1)
; _ArrayDisplay($a_temp1)
For $i = 2 To $a_temp1[0] ; Skip the first line with headlines
;_ArrayDisplay($a_temp1)
$b_IgnoreTask = False
;~ If StringLeft($a_temp1[$i], StringLen('"\Microsoft')) = '"\Microsoft' Then
;~ ExitLoop
;~ EndIf
If StringLeft($a_temp1[$i], 2) = '"\' Then
$a_temp2 = StringSplit($a_temp1[$i],",")
If $a_temp2[0] > 1 Then
$s_OriginalTaskName = StringTrimLeft(StringReplace($a_temp2[1], '"', "") ,1)
$s_CleanTaskName = StringTrimLeft(StringReplace($a_temp2[1], " ", "_") ,1)
$s_CleanTaskName = StringRegExpReplace($s_CleanTaskName, "[^\w\.@-]", "")
_VerboseConsoleWrite("Task gefunden : " & $s_OriginalTaskName)
_VerboseConsoleWrite("Bereinige Task Namen zu : " & $s_CleanTaskName)
If $a_Task2Ignore[0] > 0 Then
_VerboseConsoleWrite("Pr<EFBFBD>fe ob dieser Task ignoriert werden soll")
For $j = 1 To $a_Task2Ignore[0]
;MsgBox(0,"","$s_OriginalTaskName" & @CRLF & $a_Task2Ignore[$j] & @CRLF & @CRLF & $s_CleanTaskName & @CRLF & $a_Task2Ignore[$j])
If StringInStr($s_OriginalTaskName, $a_Task2Ignore[$j]) > 0 Then
$b_IgnoreTask = True
_VerboseConsoleWrite("Soll ignoriert werden: " & $s_OriginalTaskName & " <-> " & $a_Task2Ignore[$j])
EndIf
If StringInStr($s_CleanTaskName, $a_Task2Ignore[$j]) > 0 Then
$b_IgnoreTask = True
_VerboseConsoleWrite("Soll ignoriert werden: " & $s_CleanTaskName & " <-> " & $a_Task2Ignore[$j])
EndIf
Next
EndIf
If $s_lastTaskName = $s_OriginalTaskName Then
$b_IgnoreTask = True
_VerboseConsoleWrite("Ignoriere Task da gleicher Name wie beim Durchlauf wie zuvor")
EndIf
If $b_IgnoreTask = False Then
_VerboseConsoleWrite("Task soll nicht igoriert werden, f<>ge diesen der Liste hinzu")
$a_ScheduledTasks[0][0] = $a_ScheduledTasks[0][0] + 1
ReDim $a_ScheduledTasks[ $a_ScheduledTasks[0][0] + 1 ][8]
; [x][1] = Name des Task "original"
$a_ScheduledTasks[ $a_ScheduledTasks[0][0] ][1] = $s_OriginalTaskName
$s_lastTaskName = $s_OriginalTaskName
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix und zur <20>bergabe an dieses Programm hier
$a_ScheduledTasks[ $a_ScheduledTasks[0][0] ][2] = $s_CleanTaskName
EndIf
EndIf
Else
; Er beginnt in Zeile 2 nach geplanten Aufgaben zu suchen. Diese Fangen mit "\ an.
; Gibt es keine Aufgaben wird da wieder eine Kopfzeile mit den Feldbezeichnungen kommen f<>r den n<>chsten Abschnitt
; Und damit sind wir schon hier und verlassen die Schleife
ExitLoop
EndIf
Next
_VerboseConsoleWrite("Funktion GetAllScheduledTasks wird beendet")
EndFunc
; ##########################################################################################################################
; ##########################################################################################################################
; ####################################################################################
; ## ## ### #### ## ## ####################################################################################
; ### ### ## ## ## ### ## ####################################################################################
; #### #### ## ## ## #### ## ####################################################################################
; ## ### ## ## ## ## ## ## ## ####################################################################################
; ## ## ######### ## ## #### ####################################################################################
; ## ## ## ## ## ## ### ####################################################################################
; ## ## ## ## #### ## ## ####################################################################################
; ####################################################################################
; ##########################################################################################################################
; ##########################################################################################################################
$iStartTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc())
If StringInStr($CmdLineRaw, "/verbose") > 0 Then
$b_Verbose = True
Else
$b_Verbose = False
EndIf
If $CmdLine[0] > 0 Then
If $CmdLine[1] = "/?" Or $CmdLine[1] = "-?" Then
_HilfeAusgeben()
Exit 0
EndIf
EndIf
If $CmdLine[0] = 0 Then
_HilfeAusgeben()
Exit 0
EndIf
;~ If $CmdLine[0] = 0 Then
;~ _HilfeAusgeben()
;~ Exit 0
;~ EndIf
; Ok, we need the schtasks.exe,
$s_schtasksexe = @ComSpec & " /C " & @WindowsDir & "\system32\schtasks.exe"
$a_ScheduledTasks[0][0] = 0
$a_ScheduledTasks[0][1] = "Original Name"
$a_ScheduledTasks[0][2] = "Clean Name"
$a_ScheduledTasks[0][3] = "Last Result"
$a_ScheduledTasks[0][4] = "Last Run Time"
$a_ScheduledTasks[0][5] = "Next Run Time"
$a_ScheduledTasks[0][6] = "Run As User"
$a_ScheduledTasks[0][7] = "Task To Run"
; ##########################################################################################################################
; ##########################################################################################################################
; Some of the services are irritating, just ignore them - read items from a file
_VerboseConsoleWrite("Pr<EFBFBD>fe ob es eine Datei " & $s_Task2IgnoreFile & " gibt ...")
If FileExists($s_Task2IgnoreFile) = 1 Then
_VerboseConsoleWrite("Gefunden! Lese Datei ein")
$h_Task2IgnoreFile = FileOpen($s_Task2IgnoreFile, 0)
While 1
$s_temp1 = FileReadLine($h_Task2IgnoreFile)
If @error = -1 Then
ExitLoop
Else
If StringLen($s_temp1) > 2 Then ; at least 3 or more chars
_VerboseConsoleWrite("Eintrag gefunden: " & $s_temp1)
$a_Task2Ignore[0] = $a_Task2Ignore[0] + 1
ReDim $a_Task2Ignore[$a_Task2Ignore[0] + 1] ;That's AutoIt - Redim an Array without data-loss
$a_Task2Ignore[$a_Task2Ignore[0]] = $s_temp1
Else
_VerboseConsoleWrite("Ignoriere Eintrag mit weniger als 3 Zeichen: " & $s_temp1)
EndIf
EndIf
WEnd
_VerboseConsoleWrite("Einlesen der Ignorieren Eintr<74>ge beendet")
EndIf
;_ArrayDisplay($a_Task2Ignore)
If $CmdLine[1] = "discovertasks" Then
_VerboseConsoleWrite("Parameter discovertasks gefunden - ermittle Aufgaben und erstelle JSON")
_GetAllScheduledTasks()
_VerboseConsoleWrite("Baue JSON-String zusammen")
$s_JSONOutput = '{"data":[' & @CRLF
For $i = 1 To $a_ScheduledTasks[0][0]
$s_JSONOutput = $s_JSONOutput & " " & '{' & '@CRLF' & _
" " & '"{#TSMTASKNAME}":"' & $a_ScheduledTasks[$i][2] & '"' & '@CRLF' & _
" " & '},' & '@CRLF'
Next
$s_JSONOutput = StringTrimRight($s_JSONOutput, StringLen("," & "@CRLF")) & @CRLF & " " & ']' & @CRLF & '}'
$s_JSONOutput = StringReplace($s_JSONOutput, "@CRLF", @CRLF)
If StringLen($s_JSONOutput) < 11 Then
ConsoleWrite('{"data":[]}' & @CRLF)
Else
ConsoleWrite(_ANSI2OEM($s_JSONOutput))
EndIf
_VerboseConsoleWrite("Programm abgeschlossen")
Exit 0
EndIf
If $CmdLine[1] = "query" And $CmdLine[0] > 1 Then
_VerboseConsoleWrite("Parameter query gefunden - Frage bestimmten Task ab und sende Daten direkt an Zabbix Server")
_GetAllScheduledTasks()
$s_QueryTaskName = ""
$i_ThisTask = 0
_VerboseConsoleWrite("Suche den Originalnamen des gew<65>nschten Task")
If $a_ScheduledTasks[0][0] > 0 Then
For $i = 1 To $a_ScheduledTasks[0][0]
If $CmdLine[2] = $a_ScheduledTasks[$i][2] Then
$s_QueryTaskName = $a_ScheduledTasks[$i][1]
$i_ThisTask = $i
EndIf
Next
EndIf
If $s_QueryTaskName = "" Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
_VerboseConsoleWrite("Gefunden: " & $s_QueryTaskName)
_VerboseConsoleWrite("Frage Status dieses Task ab: ")
$s_temp1 = _schtasks("/QUERY /FO CSV /V /TN " & '"' & $s_QueryTaskName & '"')
;ConsoleWrite($s_temp1 & @CRLF)
$s_temp1 = StringReplace($s_temp1, @CRLF, "@CRLF")
$a_temp1 = StringSplit($s_temp1, "@CRLF", 1)
If $a_temp1[0] < 2 Then
_VerboseConsoleWrite("R<EFBFBD>ckgabe der Abfrage war zu kurz / nicht erfolgreich")
ConsoleWrite("ZBX_SUPPORTED" & @CRLF)
Exit 0
EndIf
_VerboseConsoleWrite("Zerlege die R<>ckgabe")
$a_temp2 = StringSplit($a_temp1[2],",")
;_ArrayDisplay($a_temp2)
If $a_temp2[0] > 1 Then
;_ArrayDisplay($a_temp2)
;Last Result
$a_ScheduledTasks[$i_ThisTask][3] = StringReplace($a_temp2[7], '"', "")
;Last Run Time
; M<>gliche Werte zum Beispiel: "18.04.2015 01:00:00" oder "04/14/2015 01:00:00" oder "n/a"' oder "Nicht zutreffend"
If StringRegExp($a_temp2[6], '\d+') = 1 Then ; String enth<74>lt mindestens eine Zahl
If StringInStr($a_temp2[6], "/") > 0 Then
_VerboseConsoleWrite("Last Runtime gefunden in englischer Schreibweise: " & $a_temp2[6])
$a_temp1 = StringSplit(StringReplace($a_temp2[6], '"', ""), "/ ", 0)
; $a_temp1[1] = MM
; $a_temp1[2] = DD
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][4] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[1] & "/" & $a_temp1[2] & " " & $a_temp1[4])
Else
_VerboseConsoleWrite("Last Runtime gefunden in deutscher Schreibweise: " & $a_temp2[6])
$a_temp1 = StringSplit(StringReplace($a_temp2[6], '"', ""), ". ", 0)
; $a_temp1[1] = DD
; $a_temp1[2] = MM
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][4] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[2] & "/" & $a_temp1[1] & " " & $a_temp1[4])
EndIf
Else
_VerboseConsoleWrite("Last Runtime nicht gefunden: " & $a_temp2[6])
$a_ScheduledTasks[$i_ThisTask][4] = "ZBX_NOTSUPPORTED"
EndIf
; Next Run Time
; M<>gliche Werte zum Beispiel: "18.04.2015 01:00:00" oder "04/14/2015 01:00:00" oder "n/a"' oder "Nicht zutreffend"
If StringRegExp($a_temp2[3], '\d+') = 1 Then ; String enth<74>lt mindestens eine Zahl
If StringInStr($a_temp2[3], "/") > 0 Then
_VerboseConsoleWrite("Next Runtime gefunden in englischer Schreibweise: " & $a_temp2[6])
$a_temp1 = StringSplit(StringReplace($a_temp2[3], '"', ""), "/ ", 0)
; $a_temp1[1] = MM
; $a_temp1[2] = DD
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][5] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[1] & "/" & $a_temp1[2] & " " & $a_temp1[4])
Else
_VerboseConsoleWrite("Next Runtime gefunden in deutscher Schreibweise: " & $a_temp2[6])
$a_temp1 = StringSplit(StringReplace($a_temp2[3], '"', ""), ". ", 0)
; $a_temp1[1] = DD
; $a_temp1[2] = MM
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][5] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[2] & "/" & $a_temp1[1] & " " & $a_temp1[4])
EndIf
Else
_VerboseConsoleWrite("Next Runtime nicht gefunden: " & $a_temp2[6])
$a_ScheduledTasks[$i_ThisTask][5] = "ZBX_NOTSUPPORTED"
EndIf
; Run As User
$a_ScheduledTasks[$i_ThisTask][6] = StringReplace($a_temp2[8], '"', "")
_VerboseConsoleWrite("Task wird ausgef<65>hrt als: " & $a_ScheduledTasks[$i_ThisTask][6])
; Task To Run
$a_ScheduledTasks[$i_ThisTask][7] = StringReplace($a_temp2[9], '"', "")
_VerboseConsoleWrite("Ausgef<EFBFBD>hrt wird: " & $a_ScheduledTasks[$i_ThisTask][7])
Else
ConsoleWrite("ZBX_SUPPORTED" & @CRLF)
Exit 0
EndIf
_Zabbix_conf()
;_ArrayDisplay($a_ScheduledTasks)
;$a_ScheduledTasks[0][8] ; [0][0] = Anzahl der Tasks
; [x][1] = Name des Task "original"
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix und zur <20>bergabe an dieses Programm hier
; [x][3] = Last Result
; [x][4] = Last Run Time
; [x][5] = Next Run Time
; [x][6] = Run As User
; [x][7] = Task To Run
_VerboseConsoleWrite("Sende Daten mit zabbix_sender.exe")
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[LastResult," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][3])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[LastRunTime," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][4])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[NextRunTime," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][5])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[RunAsUser," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][6])
$iRunTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc()) - $iStartTime
ConsoleWrite($iRunTime & @CRLF)
Exit 0
Else
ConsoleWrite("ERROR - Option 'query' without Parameter - see /? vor Help")
EndIf
Exit 0