AgentAutoUpdater/AgentAutoUpdate.au3

401 lines
20 KiB
Plaintext
Raw Permalink Blame History

#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 <Date.au3>
#Include <Crypt.au3>
;~ #Include <Array.au3>;~~~
;~ #include <Constants.au3>;~~~
;~ #include <Date.au3>;~~~
#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<75>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<50>fung nur die Hash-Werte" & @CRLF & _
"in die Registry geschrieben werden. Es wird dann NICHT im Anschlu<6C> das" & @CRLF & _
"Updateskript / Updateprogramm aufgerufen" & @CRLF & _
@CRLF & _
@ScriptName & " <Pfad zur Netzwerkfreigabe> <Pfad zur Installationsdatei>" & @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<50>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<64>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<73>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<75>ck
; optional: $sDelim legt Trennzeichen f<>r Stringr<67>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<74>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<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
; ###################################################################################
; 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 & ": <20>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<65>ndert - beende mich ohne etwas zu tun") & @CRLF)
Exit 0
EndIf
; Ok, wenn wir hier sind hat sich mindestens eine Datei ge<67>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<68>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