#NoTrayIcon #RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=Icon256-32.ico #AutoIt3Wrapper_Outfile=AgentAutoUpdate.exe #AutoIt3Wrapper_Outfile_x64=AgentAutoUpdate64.exe #AutoIt3Wrapper_Compile_Both=y #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_Change2CUI=y #AutoIt3Wrapper_Res_Description=ZabbixAgent Auto Update #AutoIt3Wrapper_Res_Fileversion=1.0.0.98 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #AutoIt3Wrapper_Res_LegalCopyright=2013 Bernhard Linz #AutoIt3Wrapper_Res_SaveSource=y #AutoIt3Wrapper_Res_Language=1031 #AutoIt3Wrapper_Res_Field=Website|http://znil.net #AutoIt3Wrapper_Res_Field=Manual| #AutoIt3Wrapper_Res_Field=See You|znil.net #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** Opt('MustDeclareVars', 1) #Region ;************ Includes ************ #Include #Include ;~ #Include ;~~~ ;~ #include ;~~~ ;~ #include ;~~~ #EndRegion ;************ Includes ************ ; ########################################################################################################################## ; ########################################################################################################################## ; # AgentAutoUpdate.exe # ; # 2014 Bernhard Linz / Bernhard@znil.de / http://znil.net # ; # Idea and Original at Zabbix Wiki # ; # # ; # Latest Version of this Program and Template in German: # ; # http://znil.net/index.php?title=Agent_Auto_Updater # ; # # ; # ________ .__ __. __ __ .__ __. _______ .___________. # ; # | / | \ | | | | | | | \ | | | ____|| | # ; # `---/ / | \| | | | | | | \| | | |__ `---| |----` # ; # / / | . ` | | | | | | . ` | | __| | | # ; # / /----.| |\ | | | | `----.__| |\ | | |____ | | # ; # /________||__| \__| |__| |_______(__)__| \__| |_______| |__| # ; # # ; ########################################################################################################################## ; ########################################################################################################################## Dim $s_Networkshare = "\\192.168.1.253\Zabbix-Agent\autoupdate" Dim $s_Attrib Dim $s_RegistryKey = "HKEY_LOCAL_MACHINE\Software\znil.net\Zabbix-Agent-Autoupdater" Dim $a_Files[1] Dim $a_Checksum[1] Dim $i Dim $s_temp Dim $b_Update = False Dim $i_lasttime ; 10 20 30 40 50 60 70 80 ; 12345678901234567890123456789012345678901234567890123456789012345678901234567890 Dim $s_Header = _ "+------------------------------------------------------------------------------" & @CRLF & _ "| ZabbixAgentAutoUpdate.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _ "+------------------------------------------------------------------------------" & @CRLF & _ "| 2014 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 die Aktualisierung des Zabbix-Agenten" & @CRLF & _ "-------------------------------------------------------------------------------" & @CRLF & _ @CRLF & _ "Aufruf: " & @CRLF & _ @CRLF & _ @ScriptName & " lasttime" & @CRLF & _ "Gibt Datum und Uhrzeit des letzten Updates zurück. Format ist UNIXTIME, also" & @CRLF & _ "die Anzahl der Sekunden seit dem 01.01.1970. Für das Template muss die" & @CRLF & _ @ScriptName & " als UserParameter eingebunden sein" & @CRLF & _ @CRLF & _ @ScriptName & " settime" & @CRLF & _ "Speicher einmal Datum und Uhrzeit des Aufrufs als letzten Zeitpunkt eines Updates" & @CRLF & _ "in der Registry - gedacht für den Aufruf aus einem Installationsskript" & @CRLF & _ @CRLF & _ @ScriptName & " NextTimeOnlyHashUpdate" & @CRLF & _ "Setzt ein Flag in die Registry das bei der nächsten Prüfung nur die Hash-Werte" & @CRLF & _ "in die Registry geschrieben werden. Es wird dann NICHT im Anschluß das" & @CRLF & _ "Updateskript / Updateprogramm aufgerufen" & @CRLF & _ @CRLF & _ @ScriptName & " " & @CRLF & _ @CRLF & _ "Die Netzwerkfreigabe ist der UNC-Pfad inklusive Unterordner zu den Dateien" & @CRLF & _ "mit dem Zabbix Agenten und anderen Dateien inklusive des Installationsscripts" & @CRLF & _ "Als 2. Parameter der Name und Pfad zur Installationsdatei." & @CRLF & _ "Das angegebene Verzeichnis wird gescannt, es wird eine Prüfsumme (Hash) für jede Datei" & @CRLF & _ "gebildet und mit den gespeicherten Werten in der Registry verglichen." & @CRLF & _ "Gibt es eine Abweichung wird das im 2. Parameter angegebene Programm oder" & @CRLF & _ "Skript gestartet. Zudem werden die Hash-Werte in der Registry für den" & @CRLF & _ "nächsten Vergleich gespeichert." & @CRLF & _ @CRLF & _ "Beispiel:" & @CRLF & _ @ScriptName & " \\192.168.1.253\Zabbix-Agent\autoupdate \\192.168.1.253\Zabbix-Agent\autoupdate\InstallZabbixAgent.bat" & @CRLF & _ @CRLF & _ "+------------------------------------------------------------------------------" & @CRLF & _ "| ZabbixAgentAutoUpdate.exe ist FREEWARE!" & @CRLF & _ "| Kopieren, weitergeben ausdrücklich erlaubt!" & @CRLF & _ "| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _ "| http://znil.net/index.php?title=Agent_Auto_Updater" & @CRLF & _ "+------------------------------------------------------------------------------" & @CRLF ; ########################################################################################################################## ; ########################################################################################################################## ; ######################################## ; ######## ## ## ## ## ###### ######## #### ####### ## ## ###### ######################################## ; ## ## ## ### ## ## ## ## ## ## ## ### ## ## ## ######################################## ; ## ## ## #### ## ## ## ## ## ## #### ## ## ######################################## ; ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ######################################## ; ## ## ## ## #### ## ## ## ## ## ## #### ## ######################################## ; ## ## ## ## ### ## ## ## ## ## ## ## ### ## ## ######################################## ; ## ####### ## ## ###### ## #### ####### ## ## ###### ######################################## ; ######################################## ; ########################################################################################################################## ; ########################################################################################################################## ; ################################################################################### ; Soll ganz toll ganze Verzeichnisbäume abgrasen können ;================================================================================================== ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]]) ; Description: Rekursive Auflistung von Dateien und/oder Ordnern ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad) ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard) ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner ; optional: $iRetType 0 gibt Array, 1 gibt String zurück ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|' ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner ; Author(s): BugFix (bugfix@autoit.de) ;================================================================================================== Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0') Global $oFSO = ObjCreate('Scripting.FileSystemObject') Global $strFiles = '' Switch $sDelim Case '1' $sDelim = @CR Case '2' $sDelim = @LF Case '3' $sDelim = ';' Case '4' $sDelim = '|' Case Else $sDelim = @CRLF EndSwitch If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0 If $sExt = -1 Then $sExt = '*' If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1 _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim) If $iRetType = 0 Then Local $aOut $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1) If $aOut[1] = '' Then ReDim $aOut[1] $aOut[0] = 0 EndIf Return $aOut Else Return StringTrimRight($strFiles, StringLen($sDelim)) EndIf EndFunc Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF) If Not IsDeclared("strFiles") Then Global $strFiles = '' If ($Dir = -1) Or ($Dir = 0) Then For $file In $Folder.Files If $Ext <> '*' Then If StringRight($file.Name, StringLen($Ext)) = $Ext Then _ $strFiles &= $file.Path & $Delim Else $strFiles &= $file.Path & $Delim EndIf Next EndIf For $Subfolder In $Folder.SubFolders If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim) Next EndFunc ; ################################################################################### ; _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üfung der Gruppenzugehörigkeit benötigt für Gruppen mit Umlauten, z.B. Domä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 ; ################################################################################### ; Hilfsroutine die den Hilfetext ausgibt Func _HilfeAusgeben() ConsoleWrite(_ANSI2OEM($s_Header)) ConsoleWrite(_ANSI2OEM($s_HilfeText)) EndFunc ;==>_HilfeAusgeben ; ########################################################################################################################## ; ########################################################################################################################## ; #################################################################################### ; ## ## ### #### ## ## #################################################################################### ; ### ### ## ## ## ### ## #################################################################################### ; #### #### ## ## ## #### ## #################################################################################### ; ## ### ## ## ## ## ## ## ## #################################################################################### ; ## ## ######### ## ## #### #################################################################################### ; ## ## ## ## ## ## ### #################################################################################### ; ## ## ## ## #### ## ## #################################################################################### ; #################################################################################### ; ########################################################################################################################## ; ########################################################################################################################## If $CmdLine[0] = 0 Then _HilfeAusgeben() Exit 0 EndIf If @OSArch <> "X86" Then $s_RegistryKey = StringReplace($s_RegistryKey, "HKEY_LOCAL_MACHINE", "HKEY_LOCAL_MACHINE64") EndIf If $CmdLine[0] = 1 Then If $CmdLine[1] = "lasttime" Then $i_lasttime = RegRead($s_RegistryKey, "lasttime") If $i_lasttime = "" Then $i_lasttime = 0 EndIf ConsoleWrite($i_lasttime & @CRLF) Exit 0 EndIf If $CmdLine[1] = "settime" Then $i_lasttime = _DateDiff("s", "1970/01/01 00:00:00", @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC) If RegWrite($s_RegistryKey, "lasttime", "REG_SZ", $i_lasttime) = 0 Then ConsoleWrite("Fehler - konnte letzte Startzeit nicht in Registry schreiben" & @CRLF) Exit 1 Else Exit 0 EndIf EndIf If $CmdLine[1] = "NextTimeOnlyHashUpdate" Then If RegWrite($s_RegistryKey, "NextTimeOnlyHashUpdate", "REG_SZ", "1") = 0 Then ConsoleWrite("Fehler - konnte letzte NextTimeOnlyHashUpdate nicht in Registry schreiben" & @CRLF) Exit 1 Else Exit 0 EndIf EndIf EndIf If $CmdLine[0] = 1 Or $CmdLine[0] > 2 Then ConsoleWrite("Fehlerhafte Anzahl von Parametern! Es werden genau 2 Parameter erwartet!" & @CRLF) ConsoleWrite("Folgende Parameter wurden gefunden:" & @CRLF) For $i = 1 To $CmdLine[0] ConsoleWrite("Parameter " & $i & ": " & $CmdLine[$i] & @CRLF) Next ConsoleWrite(_ANSI2OEM("Für Hilfe Programm ohne Parameter aufrufen!") & @CRLF) Exit 1 EndIf $s_Networkshare = $CmdLine[1] If FileExists($s_Networkshare) = 1 Then $s_Attrib = FileGetAttrib($s_Networkshare) If StringInStr($s_Attrib, "D") = 0 Then ConsoleWrite("Parameter 1 ist kein Verzeichnis sondern eine Datei: " & $s_Networkshare & @CRLF) Exit 1 EndIf Else ConsoleWrite("Verzeichnis existiert nicht oder kein Zugriff: " & $s_Networkshare & @CRLF) Exit 1 EndIf If FileExists($CmdLine[2]) = 1 Then $s_Attrib = FileGetAttrib($CmdLine[2]) If StringInStr($s_Attrib, "D") > 0 Then ConsoleWrite("Parameter 2 ist keine Datei sondern ein Verzeichnis: " & $CmdLine[2] & @CRLF) Exit 1 EndIf Else ConsoleWrite("Datei existiert nicht oder kein Zugriff: " & $CmdLine[2] & @CRLF) Exit 1 EndIf If @OSArch <> "X86" And @ScriptName <> "AgentAutoUpdate64.exe" Then ConsoleWrite("Ist ein 64 Bit System - starte die 64-Bit Variante dieses Programs" & @CRLF) Sleep(3000) Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW "' & @ScriptDir & '\AgentAutoUpdate64.exe" ' & '"' & $CmdLine[1] & '" "' & $CmdLine[2] & '"', "", @SW_SHOW) Exit 0 EndIf ConsoleWrite(@CRLF) ConsoleWrite("Zabbix-Agent Autoupdater" & @CRLF) ConsoleWrite("------------------------" & @CRLF) ConsoleWrite(@CRLF) ConsoleWrite('Schritt 1: Ermittle vorhandene Dateien im Pfad ' & $s_Networkshare & @CRLF) $a_Files = _GetFilesFolder_Rekursiv($s_Networkshare, -1, 0, 0) ConsoleWrite("Folgende " & $a_Files[0] & " Dateien wurden ermittelt:" & @CRLF) For $i = 1 To $a_Files[0] ConsoleWrite($a_Files[$i] & @CRLF) Next ConsoleWrite(@CRLF) ConsoleWrite(_ANSI2OEM("Sammle MD5-Hash für diese ") & $a_Files[0] & " Dateien ..." & @CRLF) ReDim $a_Checksum[$a_Files[0] + 1] $a_Checksum[0] = $a_Files[0] _Crypt_Startup() For $i = 1 To $a_Files[0] $a_Checksum[$i] = _Crypt_HashFile($a_Files[$i], $CALG_MD5) ConsoleWrite($a_Files[$i] & " ::: " & $a_Checksum[$i] & @CRLF) Next _Crypt_Shutdown() ConsoleWrite(@CRLF) ConsoleWrite("Vergleiche MD5-Werte mit denen aus der Registry ..." & @CRLF) For $i = 1 To $a_Files[0] If $a_Checksum[$i] = RegRead($s_RegistryKey, $a_Files[$i]) Then ConsoleWrite(_ANSI2OEM("Datei " & $i & ": Übereinstimmung!") & @CRLF) Else ConsoleWrite("Datei " & $i & ": fehlt oder geaendert! --> " & $a_Files[$i] & @CRLF) $b_Update = True EndIf Next ConsoleWrite(@CRLF) If $b_Update = False Then ConsoleWrite(_ANSI2OEM("Keine Datei wurde verändert - beende mich ohne etwas zu tun") & @CRLF) Exit 0 EndIf ; Ok, wenn wir hier sind hat sich mindestens eine Datei geändert - also tun wir was ConsoleWrite("Schreibe neue Hash-Werte in Registry .") For $i = 1 To $a_Files[0] If RegWrite($s_RegistryKey, $a_Files[$i], "REG_SZ", $a_Checksum[$i]) = 1 Then ConsoleWrite(".") Else ConsoleWrite("FEHLER - konnte nicht in Registry schreiben!" & @CRLF) ConsoleWrite(_ANSI2OEM("Registry-Schlüssel: ") & $s_RegistryKey & @CRLF) Exit 1 EndIf Next ConsoleWrite(@CRLF) If RegRead($s_RegistryKey, "NextTimeOnlyHashUpdate") = "1" Then ConsoleWrite("Flag NextTimeOnlyHashUpdate gefunden - starte Updateprogramm NICHT!" & @CRLF) RegWrite($s_RegistryKey, "NextTimeOnlyHashUpdate", "REG_SZ", "0") Exit 0 EndIf ConsoleWrite(@CRLF) ConsoleWrite(_ANSI2OEM("Beende Zabbix Agenten für Update ...") & @CRLF) ;RunWait(@ComSpec & ' /c net stop "zabbix agent"', @SW_SHOW) RunWait(@ComSpec & " /c " & 'net stop "zabbix agent"', "", @SW_HIDE) ;ConsoleWrite("Warte 5 Sekunden ..." & @CRLF) ;Sleep(5000) ConsoleWrite(_ANSI2OEM("Beende UserParameter-Programme für Update ..." & @CRLF)) For $i = 1 To $a_Files[0] $a_Files[$i] = StringRegExpReplace($a_Files[$i], '^([a-z]:|\\\\[a-z0-9 %._-]+\\[a-z0-9 $%._-]+)?(\\?(?:[^\\/:*?"<>|\r\n]+\\)+)', "") ;ConsoleWrite($a_Files[$i] & @CRLF) While ProcessExists($a_Files) > 0 ConsoleWrite("Beende Programm: " & $a_Files[$i] & @CRLF) If $a_Files[$i] <> @ScriptName Then ; eigenen Prozess auslassen! ProcessClose($a_Files) EndIf Sleep(1000) WEnd Next ConsoleWrite(@CRLF) ConsoleWrite("Starte Installationsdatei: " & $CmdLine[2] & @CRLF) If Run(@ComSpec & ' /c start "Zabbix" /MIN /LOW ' & $CmdLine[2], "", @SW_SHOW) > 0 Then ConsoleWrite("Wurde erfolgreich gestartet! Beende mich jetzt!" & @CRLF) $i_lasttime = _DateDiff("s", "1970/01/01 00:00:00", @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC) If RegWrite($s_RegistryKey, "lasttime", "REG_SZ", $i_lasttime) = 0 Then ConsoleWrite("Fehler - konnte letzte Startzeit nicht in Registry schreiben" & @CRLF) EndIf Else ConsoleWrite(_ANSI2OEM("Konnte Programm nicht starten! Lösche Hash-Werte wieder aus Registry") & @CRLF) For $i = 1 To $a_Files[0] RegWrite($s_RegistryKey, $a_Files[$i], "REG_SZ", "Fehler beim Start der Datei: " & $CmdLine[2]) Next ConsoleWrite(_ANSI2OEM("Dies ist das ENDE.") & @CRLF) Exit 1 EndIf Exit 0