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.
Download: v7000-driveinfo.zip
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!)
- neuer Parameter
- 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.
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.
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.
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.
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
Beispielbilder
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.
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