From dceb83e855d26de1b8a54cfad84d8527ad2f2cb2 Mon Sep 17 00:00:00 2001 From: Bernhard Date: Sat, 9 Sep 2017 23:04:05 +0200 Subject: [PATCH] First --- AgentAutoUpdate.au3 | 401 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 AgentAutoUpdate.au3 diff --git a/AgentAutoUpdate.au3 b/AgentAutoUpdate.au3 new file mode 100644 index 0000000..1a52b5a --- /dev/null +++ b/AgentAutoUpdate.au3 @@ -0,0 +1,401 @@ +#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 \ No newline at end of file