Aktionen

ZnilTools:v7000-driveinfo.exe

Aus znilwiki

v7000-driveinfo.exe ist ein Tool welches alle möglichen Werte zu den Festplatten in einer V7000 / V3700 ausliest und in einer Textdatei speichert.
Es werden unter anderem auch der Typ, Drehzahl (RPM) und die Firmware-Version ausgelesen.

Face-wink.png
Tipp:Neue Version 2.0.1.6 ist erschienen!
Details siehe Change Log


Download: v7000-driveinfo.zip

1 Change Log

  • Version 1.0.2.7
    • erste Version
  • Version 2.0.1.1
    • neuer Parameter /MDISK zum Auslesen der Array-Informationen
    • Fehler in der Hilfe korregiert
    • mehr Prüfungen bei der Abfrage eingebaut - manchmal verweigert das Storage schlicht die Auskunft - wenn man es noch mal versucht geht es
    • neuer Parameter /WEB zum Aufruf der Webseite zum Tool (diese hier!)
  • Version 2.0.1.2 vom 08.03.2013
    • Programm stürzte bei "Geisterlaufwerken" nicht mehr ab - hatte hier ein Storage mit einer nicht mehr existieren Festplatte die aber noch angezeigt wurde
  • Version 2.0.1.6 vom 20.03.2015
    • Anpassung an neue Firmwareversion ab 7.4.0.2 - da kamen ein paar neue Felder dazu - und ich hatte das Tool damals schlecht programmiert.
    • Weite Teile geändert das nun die Ausgabe des Storage dynamischer bearbeitet wird.

2 Allgemeine Informationen

v7000-driveinfo.exe enthält plink.exe - siehe dazu die PuTTY Homepage: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Die Datei ist in der .exe mit verpackt und wird beim ersten Start in das gleiche Verzeichnis wie v7000-driveinfo.exe entpackt.



3 Aufruf

Mit

v7000-driveinfo.exe 

oder

 v7000-driveinfo.exe /?

erhält man eine kleine Hilfe über den Aufruf:

Aufruf:

v7000-driveinfo.exe /H:<IPoderDNS> /U:<Benutzername> /P:<Passwort> [/F:Dateiname] [/T:CSV|TAB]

/H:<IPoderDNS>         : IP-Adresse oder (DNS-)Name der V7000
/U:<Benutzername>      : Benutzername
/P:<Passwort>          : Passwort
/F:<Dateiname>         : optional: Name der Ausgabedatei
                         ansonsten wird die Angabe von /H verwendet
                         und die Datei im aktuellen Verzeichnis gespeichert
/T:                    : Optional: Typ der Ausgabedatei:
                         /T:CSV = ; als Trennzeichen (Standard)
                         /T:TAB = Tabulator als Trennzeichen

/MDISK                 : zusätzlidche Informationen zu den mdisks wie Raidlevel
                         abrufen, Ausgabe hat dann 14 Spalten mehr mit den
                         Daten.

/WEB                   : Öffnet diese Seite hier im Standard-Webbrowser

Die Parameter /H, /U und /P müssen angegeben werden!
Alle anderen sind optional.



4 CSV oder TAB?

/T:CSV

Erfolgt die Ausgabe als .csv wird ein ; als Trennzeichen verwendet.
Man kann die Datei so einfach in Excel importieren.
Dies ist auch der Standard wenn der Parameter nicht extra angegeben wird.

/T:TAB

Verwendet einen Tabulator als Trennzeichen ... wozu?
Will man den Text aus einem Editor heraus und in Excel hineinkopieren so landen bei ; alle Zeichen einer Zeile in einer Zellen - man muss den Umweg über importieren gehen.
Nimmt man hingegen Tabulatoren landet jeder Wert in einer eigenen Zelle.



5 Beispiele

v7000-driveinfo.exe /H:v7k-san1 /U:superuser /P:passw0rd /F:C:\san1.csv /T:CSV
v7000-driveinfo.exe /H:192.168.178.4 /U:superuser /P:passw0rd /F:C:\san1.txt /T:TAB
v7000-driveinfo.exe /H:san1.test.local /U:superuser /P:passw0rd




6 Beispielbilder

V7000-driveinfo-001.png

Wie Ihr seht gibt es zwischendurch Fehlermeldungen - manchmal wird es dem Storage zuviel und es beantwortet die Anfragen nicht - aber hab diverses durchprobiert (langsamere Abfrage etc.) - aber das schnelleste war schlicht es noch einmal zu probieren.
Die Ausgabe ist dann z.B.

V7000-driveinfo-002.png



7 Quellcode

Sicherlich kein Glanzstück von mir, hatte ich während eines Kundenprojektes mal eben schnell hingeschustert um eine Exceltabelle zu füllen die mir dann die RaidSets baut.
Die Arrays haben feste Größen, Text wird nach seiner Position ausgeschnitten und nicht richtig ermittelt was in welcher Zeile steht und so weiter und so fort. Grausam.
Aber es funktioniert ....

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=znil.ico
#AutoIt3Wrapper_Outfile=v7000-driveinfoV3.exe
#AutoIt3Wrapper_Compression=0
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=2013 Bernhard Linz / Bernhard@znil.de
#AutoIt3Wrapper_Res_Fileversion=2.0.1.6
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Constants.au3>
#include <Array.au3>

; id:status:error_sequence_number:use:tech_type:capacity:mdisk_id:mdisk_name:member_id:enclosure_id:slot_id:node_id:node_name
Dim $i1_drivecounter
Dim $i_drivesArrayDim = 40 ; Wieviele Einträge hat das nachfolgende Array? Achtung, wird ab 0 gezählt
Dim $a_drives[250][$i_drivesArrayDim]
; $a_drives[x][0] = id 33
; $a_drives[x][1] = status online
; $a_drives[x][2] = error_sequence_number
; $a_drives[x][3] = use spare
; $a_drives[x][4] = tech_type sas_hdd
; $a_drives[x][5] = capacity 278.9GB
; $a_drives[x][6] = mdisk_id
; $a_drives[x][7] = mdisk_name
; $a_drives[x][8] = member_id
; $a_drives[x][9] = enclosure_id 2
; $a_drives[x][10] = slot_id 24
; $a_drives[x][11] = node_id
; $a_drives[x][12] = node_name
; $a_drives[x][13] = UID 5000c50059e12cc3
; $a_drives[x][14] = block_size 512
; $a_drives[x][15] = vendor_id IBM-207x
; $a_drives[x][16] = product_id ST9300653SS
; $a_drives[x][17] = FRU_part_number 85Y6185
; $a_drives[x][18] = FRU_identity 11S49Y7433YXXX6XN20W3J
; $a_drives[x][19] = RPM 15000
; $a_drives[x][20] = firmware_level B63B
; $a_drives[x][21] = FPGA_level
; $a_drives[x][22] = quorum_id 1
; $a_drives[x][23] = port_1_status online
; $a_drives[x][24] = port_2_status online
; $a_drives[x][25] = Chain
; $a_drives[x][26] = mdisk_status
; $a_drives[x][27] = mdisk_mode
; $a_drives[x][28] = mdisk_grp_id
; $a_drives[x][29] = mdisk_grp_name_Poolname (Poolname)
; $a_drives[x][30] = mdisk_Pool_capacity
; $a_drives[x][31] = mdisk_fast_write_state
; $a_drives[x][32] = mdisk_raidstatus
; $a_drives[x][33] = mdisk_raid_level
; $a_drives[x][34] = mdisk_redundancy
; $a_drives[x][35] = mdisk_strip_size
; $a_drives[x][36] = mdisk_spare_goal
; $a_drives[x][37] = mdisk_spare_protection_min
; $a_drives[x][38] = mdisk_balanced
; $a_drives[x][39] = mdisk_tier


;~ 1 id 1
;~ 2 status online
;~ 3 error_sequence_number
;~ 4 use spare
;~ 5 UID 5000c50059e12cc3
;~ 6 tech_type sas_hdd
;~ 7 capacity 278.9GB
;~ 8 block_size 512
;~ 9 vendor_id IBM-207x
;~ 10 product_id ST9300653SS
;~ 11 FRU_part_number 85Y6185
;~ 12 FRU_identity 11S49Y7433YXXX6XN20W3J
;~ 13 RPM 15000
;~ 14 firmware_level B63B
;~ 15 FPGA_level
;~ 16 mdisk_id
;~ 17 mdisk_name
;~ 18 member_id
;~ 19 enclosure_id 1
;~ 20 slot_id 24
;~ 21 node_id
;~ 22 node_name
;~ 23 quorum_id 1
;~ 24 port_1_status online
;~ 25 port_2_status online

Global $s_v7000Username = ""
Global $s_v7000Password = ""
Global $s_V7000Hostname = ""
Global $s_Ausgabedatei = ""
Global $b_mdiskinfos = False ;mdisk infos abfragen?
Global $s_mdisk ;hier kommen die Namen aller mdisks rein
Global $a_mdisk[1] ;hier kommen die Namen aller mdisks rein
Global $b_mdisk_gibt_es_schon = False

Dim $h_Ausgabedatei ; filehandle
Dim $s_Trennzeichen = ""; string
Dim $i1, $i2 ; Integer, für Schleifen
Dim $s_sshCommand = "lssasfabric -delim :"

;                          10        20        30        40        50        60        70        80
;                 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s_Header = "+------------------------------------------------------------------------------" & @CRLF & _
		"| v7000-driveinfo.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
		"+------------------------------------------------------------------------------" & @CRLF & _
		"| 2013 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 = _
		"Fragt eine IBM V7000 ab und erstellt eine Text oder CSV Datei" & @CRLF & _
		"mit den Informationen über die verbauten Festplatten" & @CRLF & _
		"-------------------------------------------------------------------------------" & @CRLF & _
		@CRLF & _
		"Aufruf: " & @CRLF & _
		@CRLF & _
		@ScriptName & " /H:<IPoderDNS> /U:<Benutzername> /P:<Passwort> [/F:Dateiname] [/T:CSV|TAB]" & @CRLF & _
		@CRLF & _
		"/H:<IPoderDNS>         : IP-Adresse oder (DNS-)Name der V7000" & @CRLF & _
		"/U:<Benutzername>      : Benutzername" & @CRLF & _
		"/P:<Passwort>          : Passwort" & @CRLF & _
		"/F:<Dateiname>         : optional: Name der Ausgabedatei" & @CRLF & _
		"                         ansonsten wird die Angabe von /H verwendet" & @CRLF & _
		"                         und die Datei im aktuellen Verzeichnis gespeichert" & @CRLF & _
		"/T:                    : Optional: Typ der Ausgabedatei:" & @CRLF & _
		"                         /T:CSV = ; als Trennzeichen (Standard)" & @CRLF & _
		"                         /T:TAB = Tabulator als Trennzeichen" & @CRLF & _
		@CRLF & _
		"/MDISK                 : zusätzlidche Informationen zu den mdisks wie Raidlevel" & @CRLF & _
		"                         abrufen, Ausgabe hat dann 14 Spalten mehr mit den" & @CRLF & _
		"                         Daten." & @CRLF & _
		@CRLF & _
		"/WEB                   : Öffnet die Homepage zu diesem Tool im Standard-Browser" & @CRLF & _
		"                         Alle anderen Parameter werden ignoriert!" & @CRLF & _
		@CRLF & _
		"Beispiele:" & @CRLF & _
		"-------------------------------------------------------------------------------" & @CRLF & _
		" " & @ScriptName & " /H:storage1 /U:superuser /P:passw0rd" & @CRLF & _
		" " & @ScriptName & " /H:10.1.1.2 /U:superuser /P:passw0rd /F:C:\san1.txt /T:CSV" & @CRLF & _
		" " & @ScriptName & " /H:SAN1 /U:superuser /P:passw0rd /T:TAB" & @CRLF & _
		" " & @ScriptName & " /H:v7k.domain.local /U:superuser /P:passw0rd /T:TAB /MDISK" & @CRLF & _
		" " & @ScriptName & " /WEB" & @CRLF & _
		@CRLF & _
		"+------------------------------------------------------------------------------" & @CRLF & _
		"| v7000-driveinfo.exe ist FREEWARE! Kopieren, weitergeben ausdrücklich erlaubt!" & @CRLF & _
		"| v7000-driveinfo.exe enthält plink.exe!" & @CRLF & _
		"| plink.exe siehe http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" & @CRLF & _
		"| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _
		"| http://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe" & @CRLF & _
		"+------------------------------------------------------------------------------" & @CRLF

; ###################################################################################
; F U N C T I O N E N / S U B R O U T I N E N
; ###################################################################################

; ###################################################################################
; _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()
	;_WinAPI_AttachConsole()
	;$ZeigerConsole = _WinAPI_GetStdHandle(1)
	ConsoleWrite(_ANSI2OEM($s_Header))
	ConsoleWrite(_ANSI2OEM($s_HilfeText))
	;_WinAPI_AttachConsole()
	;$ZeigerConsole = _WinAPI_GetStdHandle(1)
	;_WinAPI_WriteConsole($ZeigerConsole,$s_Header)
	;_WinAPI_WriteConsole($ZeigerConsole,$s_HilfeText)
	;_WinAPI_WriteConsole($ZeigerConsole,@CRLF)
	;Send("{Enter}")
EndFunc   ;==>_HilfeAusgeben

; Damit sparen wir uns die Arbeit den Host vorher einmal mit Putty zu Kontaktieren
Func _saveplinkRSAkey($plinkHost)
	$plinkFile = @ScriptDir & "\plink.exe"
	FileInstall("C:\_AutoIt\v7000\plink.exe", $plinkFile, 1)
	$runThis =  @ComSpec & " /c " & "echo yes | " & $plinkFile & " " & $plinkHost
	;ConsoleWrite($runThis & @CRLF)
	RunWait($runThis, "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

EndFunc ;==>_saveplinkRSAkey

;###########################################################################################################################################

Func _runSshCommand($plinkUser, $plinkHost, $command, $password = "", $timeoutInMs = 0)

$plinkFile = @ScriptDir & "\plink.exe"
FileInstall("C:\_AutoIt\v7000\plink.exe", $plinkFile, 1)

$runThis = @ComSpec & " /c " & $plinkFile & " -batch " & $plinkUser & "@" & $plinkHost
If $password <> "" Then $runThis &= " -pw " & $password
$runThis &= " " & $command

$plinkHandle = Run($runThis, "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

$plinkFeedback = ""
$waitForOutputStartTime = TimerInit()
Do
Sleep(5)
$plinkFeedback &= StdoutRead($plinkHandle)
$stdoutReadError = @error
Until $stdoutReadError Or ($timeoutInMs And TimerDiff($waitForOutputStartTime) > $timeoutInMs)

If ProcessExists("plink.exe") Then ProcessClose("plink.exe")

If $stdoutReadError <> 0 Then Return $plinkFeedback

ConsoleWrite(_ANSI2OEM("Timeout während plink-Befehl!" & @CRLF))
Return ""

EndFunc ;==>_runSshCommand

;###########################################################################################################################################


; ###################################################################################
; H I L F E
; ###################################################################################

;testen ob wir überhaupt mit einem Parameter gestartet wurden - sonst Hilfe ausgeben
If $CmdLine[0] = 0 Then
	_HilfeAusgeben()
	Exit
EndIf

;testen ob der Parameter 1 ist auf "/?" testen und ebenfalls Hilfe ausgeben
If $CmdLine[1] = "/?" Then
	_HilfeAusgeben()
	Exit
EndIf

; Restliche Parameter auswerten und Variablen füllen ########################################################
For $i1 = 1 To $CmdLine[0]
	Select
		Case StringLeft($CmdLine[$i1],3) = "/H:"
			$s_V7000Hostname = StringTrimLeft($CmdLine[$i1],3)
		Case StringLeft($CmdLine[$i1],3) = "/U:"
			$s_v7000Username = StringTrimLeft($CmdLine[$i1],3)
		Case StringLeft($CmdLine[$i1],3) = "/P:"
			$s_v7000Password = StringTrimLeft($CmdLine[$i1],3)
		Case StringLeft($CmdLine[$i1],3) = "/F:"
			$s_Ausgabedatei = StringTrimLeft($CmdLine[$i1],3)
		Case $CmdLine[$i1] = "/T:CSV"
			$s_Trennzeichen = ";"
		Case $CmdLine[$i1] = "/T:TAB"
			$s_Trennzeichen = Chr(9)
		Case $CmdLine[$i1] = "/MDISK"
			$b_mdiskinfos = True
		Case $CmdLine[$i1] = "/WEB"
			ShellExecute ("http://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe")
			Exit 0
		Case Else
			ConsoleWrite(_ANSI2OEM("Unbekannter Parameter: " & $CmdLine[$i1] & @CRLF))
			Exit 1
	EndSelect
Next

; Variablen / Parameter überprüfen ##########################################################################
; Ist der Host angegeben und erreichbar?
If $s_V7000Hostname <> "" Then
	If Ping($s_V7000Hostname) > 0 Then
		; Testverbindung - nebenbei wird der RSA-Key in der Registry gespeichert
		_saveplinkRSAkey($s_V7000Hostname)
	Else
		ConsoleWrite(_ANSI2OEM("Kann Storage '" & $s_v7000Password & "' nicht erreichen (Ping-Test)" & @CRLF))
		Exit 1
	EndIf
Else
	ConsoleWrite(_ANSI2OEM("Fehler: Parameter /H: fehlt (/? für Hilfe)" & @CRLF))
	Exit 1
EndIf

; Wurde ein Benutzername angegeben?
If $s_v7000Username = "" Then
	ConsoleWrite(_ANSI2OEM("Fehler: Parameter /U: fehlt (/? für Hilfe)" & @CRLF))
	Exit 1
EndIf

; Wurde ein Passwort angegeben?
If $s_v7000Password = "" Then
	ConsoleWrite(_ANSI2OEM("Fehler: Parameter /P: fehlt (/? für Hilfe)" & @CRLF))
	Exit 1
EndIf

; Wurde ein Dateiname angegeben?
If $s_Ausgabedatei = "" Then
	$s_Ausgabedatei = $s_V7000Hostname
EndIf

; Wurde der Parameter CSV oder TAB angegeben
If $s_Trennzeichen = "" Then
	$s_Trennzeichen = ";"
EndIf

; Dateiendung setzen bei Bedarf
If StringRight($s_Ausgabedatei,4) <> ".txt" And StringRight($s_Ausgabedatei,4) <> ".csv" Then
	If $s_Trennzeichen = ";" Then
		$s_Ausgabedatei = $s_Ausgabedatei & ".csv"
	Else
		$s_Ausgabedatei = $s_Ausgabedatei & ".txt"
	EndIf
EndIf

; Testen ob die Ausgabedatei erstellt werden darf (zum schreiben)
$h_Ausgabedatei = FileOpen($s_Ausgabedatei,1)
If $h_Ausgabedatei = -1 Then
	ConsoleWrite(_ANSI2OEM("Fehler: Kann Ausgabedatei '" & $s_Ausgabedatei & "' nicht erstellen" & @CRLF))
	Exit 1
EndIf



; ### Schritt 1: Festplatten-Infos auslesen - Allgemein #######################################################################
$s_sshCommand = "lsdrive -delim :"
While 1
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)
	$a_RawText = StringSplit($answer, @LF)
	If $a_RawText[0] = 1 Then
		;Sleep(30000)
		ConsoleWrite("Fehler beim Einlesen der Anzahl der Festplatten ... wiederhole" & @CRLF)
		;_ArrayDisplay($a_RawText)
	Else
		ConsoleWrite("Anzahl Festplatten: ")
		ExitLoop
	EndIf
WEnd

For $i1 = 1 To $a_RawText[0]
	;ConsoleWrite($i1 & ", ")
	$a_Helfer = StringSplit($a_RawText[$i1], ":")
	; id:status:error_sequence_number:use:tech_type:capacity:mdisk_id:mdisk_name:member_id:enclosure_id:slot_id:node_id:node_name:auto_manage
	If $a_Helfer[0] >= 13 Then
		$a_drives[$i1-1][0] = $a_Helfer[1] ; id
		$a_drives[$i1-1][1] = $a_Helfer[2] ; status
		$a_drives[$i1-1][2] = $a_Helfer[3] ; error_sequence_number
		$a_drives[$i1-1][3] = $a_Helfer[4] ; use
		$a_drives[$i1-1][4] = $a_Helfer[5] ; tech_type
		$a_drives[$i1-1][5] = $a_Helfer[6] ; capacity
		$a_drives[$i1-1][6] = $a_Helfer[7] ; mdisk_id
		$a_drives[$i1-1][7] = $a_Helfer[8] ; mdisk_name
		$a_drives[$i1-1][8] = $a_Helfer[9] ; member_id
		$a_drives[$i1-1][9] = $a_Helfer[10] ; enclosure_id
		$a_drives[$i1-1][10] = $a_Helfer[11] ; slot_id
		$a_drives[$i1-1][11] = $a_Helfer[12] ; node_id
		$a_drives[$i1-1][12] = $a_Helfer[13] ; node_name
	EndIf
Next
ConsoleWrite(($i1 - 3) & @CRLF)

;_ArrayDisplay($a_drives)

; ### Schritt 2: Festplatten-Infos auslesen - Details zu einzelnen Platten #######################################################################
$a_drives[0][13] = "UID"
$a_drives[0][14] = "block_size"
$a_drives[0][15] = "vendor_id"
$a_drives[0][16] = "product_id"
$a_drives[0][17] = "FRU_part_number"
$a_drives[0][18] = "FRU_identity"
$a_drives[0][19] = "RPM"
$a_drives[0][20] = "firmware_level"
$a_drives[0][21] = "FPGA_level"
$a_drives[0][22] = "quorum_id"
$a_drives[0][23] = "port_1_status"
$a_drives[0][24] = "port_2_status"

$i1 = 1
ConsoleWrite ("Rufe Disk ab: ")

While $a_drives[$i1][0] <> ""
	$s_sshCommand = "lsdrive " & $a_drives[$i1][0]
	ConsoleWrite ($i1 & ", ")
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)
	$a_RawText = StringSplit($answer, @LF)
	If $a_RawText[0] >= 25 Then
		For $i2 = 1 to $a_RawText[0]
			If StringLeft($a_RawText[$i2], StringLen("UID")) = "UID" Then
				$a_drives[$i1][13] = StringReplace(StringMid($a_RawText[$i2],StringLen("UID") + 1 )," ","")  ; UID 5000c50059e12cc3
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("block_size")) = "block_size" Then
				$a_drives[$i1][14] = StringReplace(StringMid($a_RawText[$i2],StringLen("block_size") + 1)," ","")  ; block_size 512
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("vendor_id")) = "vendor_id" Then
				$a_drives[$i1][15] = StringReplace(StringMid($a_RawText[$i2],StringLen("vendor_id") + 1)," ","")  ; vendor_id IBM-207x
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("product_id")) = "product_id" Then
				$a_drives[$i1][16] = StringReplace(StringMid($a_RawText[$i2], StringLen("product_id") + 1)," ","") ; product_id ST9300653SS
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("FRU_part_number")) = "FRU_part_number" Then
				$a_drives[$i1][17] = StringReplace(StringMid($a_RawText[$i2], StringLen("FRU_part_number") + 1)," ","") ; FRU_part_number 85Y6185
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("FRU_identity")) = "FRU_identity" Then
				$a_drives[$i1][18] = StringReplace(StringMid($a_RawText[$i2], StringLen("FRU_identity") + 1)," ","") ; FRU_identity 11S49Y7433YXXX6XN20W3J
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("RPM")) = "RPM" Then
				$a_drives[$i1][19] = StringReplace(StringMid($a_RawText[$i2], StringLen("RPM") + 1)," ","") ; RPM 15000
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("firmware_level")) = "firmware_level" Then
				$a_drives[$i1][20] = StringReplace(StringMid($a_RawText[$i2], StringLen("firmware_level") + 1)," ","") ; firmware_level B63B
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("FPGA_level")) = "FPGA_level" Then
				$a_drives[$i1][21] = StringReplace(StringMid($a_RawText[$i2], StringLen("FPGA_level") + 1)," ","") ; FPGA_level
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("quorum_id")) = "quorum_id" Then
				$a_drives[$i1][22] = StringReplace(StringMid($a_RawText[$i2], StringLen("quorum_id") + 1)," ","") ; quorum_id 1
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("port_1_status")) = "port_1_status" Then
				$a_drives[$i1][23] = StringReplace(StringMid($a_RawText[$i2], StringLen("port_1_status") + 1)," ","") ; port_1_status online
			EndIf
			If StringLeft($a_RawText[$i2], StringLen("port_2_status")) = "port_2_status" Then
				$a_drives[$i1][24] = StringReplace(StringMid($a_RawText[$i2], StringLen("port_2_status") + 1)," ","") ; port_2_status online
			EndIf
		Next
	Else
		;Sleep(30000)
		ConsoleWrite("Fehler - wiederhole: ")
		;_ArrayDisplay($a_RawText)
		$i1 = $i1 - 1
	EndIf
	;Sleep(1000)
	$i1 = $i1 + 1
WEnd
ConsoleWrite(@CRLF)

; ### Schritt 3: Drive Chains ermitteln und zuordnen #######################################################################
; Drive Chain ermitteln - und damit welches Gehäuse in welcher Chain sitzt:
ConsoleWrite("Ermittle welches Enclosure in welcher Chain hängt ...")
$a_drives[0][25] = "Chain"
While 1
	$s_sshCommand = "lssasfabric -delim :"
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)
	$a_RawText = StringSplit($answer, @LF)
	;_ArrayDisplay($a_RawText)
	If $a_RawText[0] = 1 Then
		Sleep(2000)
		ConsoleWrite("Fehler - wiederhole ... ")
		;_ArrayDisplay($a_RawText)
	Else
		ExitLoop
	EndIf
WEnd

ConsoleWrite(" fertig!" & @CRLF)
ConsoleWrite("Ordne die Chain den Laufwerken zu ... ")

$i1 = 1
While $a_drives[$i1][0] <> ""
	For $i2 = 1 To $a_RawText[0]
		$a_Helfer = StringSplit($a_RawText[$i2],":")
		; $a_Helfer[1] = enclosure_id
		; $a_Helfer[2] = canister_id
		; $a_Helfer[3] = canister_port_id
		; $a_Helfer[4] = control_enclosure_id
		; $a_Helfer[5] = node_canister_id
		; $a_Helfer[6] = node_canister_port_id
		; $a_Helfer[7] = position:IO_group_id
		; $a_Helfer[8] = IO_group_name
		; $a_Helfer[9] = node_id
		; $a_Helfer[10] = node_name
		If $a_Helfer[0] > 1 Then ; gab es doch den Fall das ein Geisterlaufwerk im System war ... ohne diese Prüfung stürzt mein Tool ab ....
			If $a_drives[$i1][9] = $a_Helfer[1] Then
				$a_drives[$i1][25] = $a_Helfer[6]
			EndIf
		EndIf
	Next
	$i1 = $i1 + 1
	ConsoleWrite(".")
WEnd
ConsoleWrite(@CRLF)

;_ArrayDisplay($a_drives)


; ### Schritt 4: Raidsets ermitteln und zuordnen #######################################################################
; Abfragen welche Raidsets die mdisk haben und in welchen Pool diese sind
If $b_mdiskinfos = True Then
	ConsoleWrite("Ermittle die Anzahl der mdisks: ")
	$a_drives[0][26] = "mdisk_status"
    $a_drives[0][27] = "mdisk_mode"
	$a_drives[0][28] = "mdisk_grp_id"
	$a_drives[0][29] = "mdisk_grp_name_Poolname"
	$a_drives[0][30] = "mdisk_Pool_capacity"
	$a_drives[0][31] = "mdisk_fast_write_state"
	$a_drives[0][32] = "mdisk_raidstatus"
	$a_drives[0][33] = "mdisk_raid_level"
	$a_drives[0][34] = "mdisk_redundancy"
	$a_drives[0][35] = "mdisk_strip_size"
	$a_drives[0][36] = "mdisk_spare_goal"
	$a_drives[0][37] = "mdisk_spare_protection_min"
	$a_drives[0][38] = "mdisk_balanced"
	$a_drives[0][39] = "mdisk_tier"
	;Anzahl der MDisk ermitteln und deren Namen
	$s_mdisk = ""
	$a_mdisk[0] = ""
	$i1 = 1
	While $a_drives[$i1][0] <> ""
		If $a_drives[$i1][7] <> "" Then ;Wenn im mdisk_namen Feld etwas steht ...
			If UBound($a_mdisk) = 1 And $a_mdisk[0] = "" Then
				$a_mdisk[0] = $a_drives[$i1][7]
			Else
				; Prüfen ob es diese mdisk schon gibt ... hatte einfachere Lösung ... aber da kam es zu verwechslungen zwischen mdisk1 und mdisk10 :-)
				; deshalb Einzelvergleichm, so mühsam es auch sein mag
				$b_mdisk_gibt_es_schon = False
				For $i2 = 0 To (UBound($a_mdisk) - 1)
					If $a_mdisk[$i2] = $a_drives[$i1][7] Then
						$b_mdisk_gibt_es_schon = True
					EndIf
				Next
				If $b_mdisk_gibt_es_schon = False Then
					_ArrayAdd($a_mdisk, $a_drives[$i1][7])
				EndIf
			EndIf
		EndIf
		$i1 = $i1 + 1
	WEnd

	ConsoleWrite(UBound($a_mdisk) & @CRLF)

	;mdisks Details abrufen	.... wenn es überhaupt welche gibt
	If $a_mdisk[0] <> "" Then ; wenn es mindestens eine gibt funzt es ....
		For $i1 = 0 To (UBound($a_mdisk) - 1)
			$s_sshCommand = "lsmdisk " & $a_mdisk[$i1]
			ConsoleWrite("Rufe Details zu mdisk '" & $a_mdisk[$i1] & "' ab ...")
			While 1
				$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)
				$a_RawText = StringSplit($answer, @LF)
				;_ArrayDisplay($a_RawText)
				If $a_RawText[0] >= 27 Then
					ConsoleWrite(_ANSI2OEM(" und ordne die Daten den zugehörigen Laufwerken zu ..."))
					$i2 = 1
					While $a_drives[$i2][0] <> ""
						If $a_mdisk[$i1] = $a_drives[$i2][7] Then
							$a_drives[$i2][26] = StringReplace(StringMid($a_RawText[3],StringLen("status") + 1 )," ","")  ; mdisk_status
							$a_drives[$i2][27] = StringReplace(StringMid($a_RawText[4],StringLen("mode") + 1)," ","")  ; mdisk_mode
							$a_drives[$i2][28] = StringReplace(StringMid($a_RawText[5],StringLen("mdisk_grp_id") + 1 )," ","")  ; mdisk_grp_id
							$a_drives[$i2][29] = StringMid($a_RawText[6],StringLen("mdisk_grp_name") + 1)  ; mdisk_grp_name_Poolname
							$a_drives[$i2][30] = StringReplace(StringMid($a_RawText[7],StringLen("capacity") + 1)," ","")  ; mdisk_Pool_capacity
							$a_drives[$i2][31] = StringReplace(StringMid($a_RawText[20], StringLen("fast_write_state") + 1)," ","") ; mdisk_fast_write_state
							$a_drives[$i2][32] = StringReplace(StringMid($a_RawText[21], StringLen("raid_status") + 1)," ","") ; mdisk_raidstatus
							$a_drives[$i2][33] = StringReplace(StringMid($a_RawText[22], StringLen("raid_level") + 1)," ","") ; mdisk_raid_level
							$a_drives[$i2][34] = StringReplace(StringMid($a_RawText[23], StringLen("redundancy") + 1)," ","") ; mdisk_redundancy
							$a_drives[$i2][35] = StringReplace(StringMid($a_RawText[24], StringLen("strip_size") + 1)," ","") ; mdisk_strip_size
							$a_drives[$i2][36] = StringReplace(StringMid($a_RawText[25], StringLen("spare_goal") + 1)," ","") ; mdisk_spare_goal
							$a_drives[$i2][37] = StringReplace(StringMid($a_RawText[26], StringLen("spare_protection_min") + 1)," ","") ; mdisk_spare_protection_min
							$a_drives[$i2][38] = StringReplace(StringMid($a_RawText[27], StringLen("balanced") + 1)," ","") ; mdisk_balanced
							$a_drives[$i2][39] = StringReplace(StringMid($a_RawText[28], StringLen("tier") + 1)," ","") ; mdisk_tier
						EndIf
						$i2 = $i2 + 1
					WEnd
					ConsoleWrite(" Fertig!" & @CRLF)
					ExitLoop
				Else
					;Sleep(30000)
					ConsoleWrite(" Fehler - wiederhole ...")
					;_ArrayDisplay($a_RawText)
				EndIf
			WEnd
		Next
	Else
		ConsoleWrite(@CRLF & "!!!!!! Konnte keine Daten zu mdisk abrufen da es keine gibt!!!!!!" & @CRLF)
	EndIf

	ConsoleWrite("Abrufen der mdisk Daten abgeschlossen!" & @CRLF)
	;_ArrayDisplay($a_drives)
EndIf




; ### Schritt 5: in Textdatei ausgeben #######################################################################
; und das ganze in eine Text-Datei schreiben:
$h_Ausgabedatei = FileOpen($s_Ausgabedatei, 2)
If $h_Ausgabedatei = -1 Then
	ConsoleWrite("Konnte Ausgabedatei '" & $s_Ausgabedatei & "' nicht erstellen!" & @CRLF)
	Exit 1
EndIf
ConsoleWrite("Schreibe Ausgabedatei: " & $s_Ausgabedatei & @CRLF)
ConsoleWrite("Fortschritt .")
$s_TempZeile = ""
If $b_mdiskinfos = False Then
	$i_drivesArrayDim = 26 ;mdisk Felder abschneiden
EndIf
For $i1 = 0 To ($i_drivesArrayDim -1)
	$s_TempZeile = $s_TempZeile & $a_drives[0][$i1] & $s_Trennzeichen
Next
$s_TempZeile = StringTrimRight($s_TempZeile, StringLen($s_Trennzeichen))
ConsoleWrite(".")
FileWriteLine($h_Ausgabedatei, $s_TempZeile)
$i1 = 1
While $a_drives[$i1][0] <> ""
	ConsoleWrite(".")
	$s_TempZeile = ""
	For $i2 = 0 To ($i_drivesArrayDim -1)
		$s_TempZeile = $s_TempZeile & $a_drives[$i1][$i2] & $s_Trennzeichen
	Next
	$s_TempZeile = StringTrimRight($s_TempZeile, StringLen($s_Trennzeichen))
	FileWriteLine($h_Ausgabedatei, $s_TempZeile)
	$i1 = $i1 + 1
WEnd
FileClose($h_Ausgabedatei)
ConsoleWrite(" Fertig!" & @CRLF)

Exit 0



8 Kommentare


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. Bei einem Kommentar wird deine IP-Adresse zusammen mit dem Text, den angegebenen Namen bzw. der Email-Adresse in der Datenbank für die Kommentare dauerhaft gespeichert. Genaueres kannst du hier nachlesen: Datenschutzerklärung