Aktionen

Zabbix:Template Windows Mountpoints-Discover - Windows Volumes ohne Laufwerk entdecken

Aus znilwiki

Ab Werk ist in Zabbix eine automatische Erkennung und Überwachung von Datenträgern eingebaut.
Unter Windows findet er NTFS und FAT32 Datenträger und erstellt die notwendigen Items und Trigger.

Nun hab ich hier einen Kunden der Massiv Datenträger / Volumes in vorhandene NTFS-Ordner gemountet hat.

Auf C:\ gibt es z.B. einen Ordner C:\Disk2" der wiederum eine eigene Festplatte ist:
Zabbix-WindowsMountpoints-001.PNG

Zabbix erkennt jetzt aber nur das Laufwerk C: und nicht die 2. Festplatte unter C:\Disk2.
Da gibt auch schon einen Feature-Request für: https://support.zabbix.com/browse/ZBXNEXT-1595

Aber auch in der aktuellen 2.4.3 Version ist das noch nicht drin.
Da ich es brauchte habe ich mir "mal eben schnell" eine eigene Lösung gebaut.



1 Changelog

  • 09.02.2015: Erste öffentliche Version, Dateiversion der WindowsMountPoints.exe ist 1.0.0.12
  • 22.03.2015: Windows SnapShots / ShadowCopys werden nun ausgefiltert. Falls eine Erkennung lief während zum Beispiel ein Backup von Veeam im Gange war wurden bisher dessen SnapShots ebenfalls erkannt
  • 22.03.2015: Werden keine MountPoints gefunden meldet das Programm nun ZBX_NOTSUPPORTED zurück
  • 16.04.2015: Werden keine MountPoints gefunden meldet das Programm nun einen leeren JSON String zurück. ZBX_NOTSUPPORTED wird nur noch bei WMI-Zugriffsfehlern zurück gegeben




2 Download

Aktuelle Dateiversion der WindowsMountPoints.exe ist 1.0.0.24
Download: Znil-Zabbix-Windows-Mountpoints.zip



3 Agenten erweitern

Kopiert die

WindowsMountpoints.exe

aus dem Archiv in das Verzeichnis in welchen auch der Zabbix-Windows-Agent liegt.
Bearbeitet die

zabbix_agentd.win.conf

und hängt folgende Zeile an:

UserParameter=vfs.fs.znil.windowsmountpoints.discovery,"%PROGRAMFILES%\Zabbix\UserParameter\WindowsMountPoints.exe"

den Pfad natürlich an eure Gegebenheiten anpassen!
Dann den Agenten einmal neu starten:

net stop "Zabbix Agent"
net start "Zabbix Agent"




4 Template importieren

Importiert die .XML Datei aus dem Archiv.
Danach habt Ihr in der Host-Gruppe

Templates DATAGROUP

ein neues Template mit dem Namen

znil Template OS Windows only Mountpoints V2015-02-09

welches Ihr dann einfach den Host zuweisen könnt.
Trigger etc müsst Ihr dann anpassen!
Die automatische Erkennung läuft alle 60 Minuten.



5 Screenshots

Zabbix-WindowsMountpoints-002.PNG




6 Quellcode

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_Outfile=WindowsMountPoints.exe
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Windows Mountpoints Auto-Discovery
#AutoIt3Wrapper_Res_Fileversion=1.0.0.24
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2015 Bernhard Linz
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_Field=Website|http://znil.net
#AutoIt3Wrapper_Res_Field=Manual|http://znil.net/index.php?title=Zabbix:Template_Windows_Mountpoints_-_Windows_Festplatten_Mountpoints_entdecken
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
Opt('MustDeclareVars', 1)
; ##########################################################################################################################
; ##########################################################################################################################
; # WindowsMountpoints.exe --> Tool for Auto-Discovery Windows Mountpoints (Volumes without Driveletter, mounted at Folder)#
; # 2015 Bernhard Linz    /    Bernhard@znil.de    /    http://znil.net                                                    #
; #                                                                                                                        #
; # Latest Version of this Program and Template                                                                            #
; # http://znil.net/index.php?title=Zabbix:Template_Windows_Mountpoints_-_Windows_Festplatten_Mountpoints_entdecken        #
; #                                                                                                                        #
; #	         ________  .__   __.  __   __        .__   __.  _______ .___________.                                          #
; #	        |       /  |  \ |  | |  | |  |       |  \ |  | |   ____||           |                                          #
; #	        `---/  /   |   \|  | |  | |  |       |   \|  | |  |__   `---|  |----`                                          #
; #	           /  /    |  . `  | |  | |  |       |  . `  | |   __|      |  |                                               #
; #	          /  /----.|  |\   | |  | |  `----.__|  |\   | |  |____     |  |                                               #
; #	         /________||__| \__| |__| |_______(__)__| \__| |_______|    |__|                                               #
; #                                                                                                                        #
; ##########################################################################################################################
; ##########################################################################################################################

; Catch all Error while using the WMI-Interface with own Error-Function
Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc"), $f_COMError = False
; And the Error-Function itself
Func MyErrFunc()
    Local $HexNumber=hex($oMyError.number,8)
    ConsoleWriteError("We intercepted a COM Error !" & @CRLF & _
                "Number is: " & $HexNumber & @CRLF & _
                "WinDescription is: " & $oMyError.windescription & @CRLF & _
                "Source is: " & $oMyError.source & @CRLF & _
                "ScriptLine is: " & $oMyError.scriptline & @CRLF)
	Exit 1
Endfunc

; ##########################################################################################################################
; ##########################################################################################################################
; Function for catching the special characters - hey we using the old DOS-Console and the Console did'nt like them
Func _ANSI2OEM($text)
	$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
	Return $text[2]
EndFunc   ;==>_ANSI2OEM

; ##########################################################################################################################
; ##########################################################################################################################
; Other needed Variables
Dim $wbemFlagReturnImmediately = 0x10
Dim $wbemFlagForwardOnly = 0x20
Dim $colItems = ""
Dim $strComputer = "localhost"
Dim $o_WMI
Dim $o_colListOfVolumes
Dim $s_JSONOutput
Dim $s_Mointpoint2IgnoreFile = @ScriptDir & "\WindowsMountPoints-ignore.txt"
Dim $h_Mountpoint2IgnoreFile
Dim $a_Mountpoint2Ignore[1] = [ 0 ]
Dim $b_IgnoreMountpoint = False
Dim $i_ServiceType
Dim $s_temp
Dim $i
Dim $s_spaces = '     ' ; 5 Spaces

; ##########################################################################################################################
; ##########################################################################################################################
; Some of the mountpoints are irritating, just ignore them - read items from a file
If FileExists($s_Mointpoint2IgnoreFile) = 1 Then
	$h_Mountpoint2IgnoreFile = FileOpen($s_Mointpoint2IgnoreFile, 0)
	While 1
		$s_temp = FileReadLine($h_Mountpoint2IgnoreFile)
		If @error = -1 Then
			ExitLoop
		Else
			If StringLen($s_temp) > 2 Then ; at least 3 or more chars
				$a_Mountpoint2Ignore[0] = $a_Mountpoint2Ignore[0] + 1
				ReDim $a_Mountpoint2Ignore[$a_Mountpoint2Ignore[0] + 1] ;That's AutoIt - Redim an Array without data-loss
				$a_Mountpoint2Ignore[$a_Mountpoint2Ignore[0]] = $s_temp
			EndIf
		EndIf
	WEnd
EndIf

; ##########################################################################################################################
; ##########################################################################################################################
; Get the WMI-Interface at local Computer (= .)
$o_WMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
; Test whether it worked and go on
If IsObj($o_WMI) Then
	; Get List of all Autostart-Services
	$o_colListOfVolumes = $o_WMI.ExecQuery("SELECT * FROM Win32_Volume", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
	; Ok, we have the List, now look if we were interrupted last Time
	; Start creating the JSON Output:
	$s_JSONOutput = '{"data":[' & '@CRLF'
	; Loop: Add the Services to JSON Output String Line for Line but nor more than 4000 Chars
	For $objMountpoint In $o_colListOfVolumes
		$b_IgnoreMountpoint = False
		; Do nothing until we found the Service of last Run
		; Will start after the first Part found the Service of last Time or will run from beginning if there was no last time
		; Test 1: But first check if the service is one of the bad one we wanna ignore
		If $a_Mountpoint2Ignore[0] > 0 Then
			For $i = 1 To $a_Mountpoint2Ignore[0]
				;ConsoleWrite($objMountpoint.DisplayName & "<--->" & $a_Mountpoint2Ignore[$i] & @CRLF)
				If StringInStr($objMountpoint.DeviceID, $a_Mountpoint2Ignore[$i]) > 0 Then
					$b_IgnoreMountpoint = True
				EndIf
				If StringInStr($objMountpoint.Name, $a_Mountpoint2Ignore[$i]) > 0 Then
					$b_IgnoreMountpoint = True
				EndIf
			Next
		EndIf
		; Skip all normal Mountpoints with Driveletters like C:\ or D:\
		If StringRight($objMountpoint.Name, 2) = ":\" Then
			$b_IgnoreMountpoint = True
		EndIf
		; Ignore SnapShots!
		If StringLeft($objMountpoint.Name, 4) = "\\?\" Then
			$b_IgnoreMountpoint = True
		EndIf
		; Ok, all Tests processed, now add the service to list (if we don't wanna ignore this service)
		If $b_IgnoreMountpoint = False Then
			$s_JSONOutput = $s_JSONOutput & _
								$s_spaces & '{' & '@CRLF' & _
								$s_spaces & $s_spaces & '"{#ZNILFSTYPE}":"' & $objMountpoint.FileSystem & '",' & '@CRLF' & _
								$s_spaces & $s_spaces & '"{#ZNILFSNAME}":"' & StringReplace(StringTrimRight($objMountpoint.Name, 1),"\", "/") & '"' & '@CRLF' & _
								$s_spaces & '},' & '@CRLF'
		EndIf
	Next
	; Delete the last -> , <-
	$s_JSONOutput = StringTrimRight($s_JSONOutput, StringLen(',' & '@CRLF'))
	$s_JSONOutput = $s_JSONOutput & ']}'
	; SpecialChars replace
	$s_JSONOutput = StringReplace($s_JSONOutput, "@CRLF", @CRLF, 0, 1)
	If StringLen($s_JSONOutput) < 11 Then
		ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
	Else
		ConsoleWrite(_ANSI2OEM($s_JSONOutput))
	EndIf
EndIf
Exit 0




7 Kommentare


Massimo Bastianoin m.bastianoni@gmail.com

23 Monaten zuvor
Punktzahl 0++

I tried to aplly the tamplate but I don't received any data in the zabbix interface.

Can you help me?

ilya.shvedov@gmail.com

2 Monaten zuvor
Punktzahl 0++

Нифига не работает ваш вариант. Возращает пустое значение:

{"data":[]}

и все..

Хорошо было бы указать пример, корректного поведения, какое значение должно быть получено в результате опроса WindowsMountpoints.exe
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.