<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://znil.net/index.php?action=history&amp;feed=atom&amp;title=ZnilTools%3Av7000-driveinfo.exe</id>
	<title>ZnilTools:v7000-driveinfo.exe - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://znil.net/index.php?action=history&amp;feed=atom&amp;title=ZnilTools%3Av7000-driveinfo.exe"/>
	<link rel="alternate" type="text/html" href="https://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe&amp;action=history"/>
	<updated>2026-05-08T01:54:20Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in znilwiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe&amp;diff=9565&amp;oldid=prev</id>
		<title>BLinz: Textersetzung - „&lt;comments&gt;“ durch „&lt;comments /&gt;“</title>
		<link rel="alternate" type="text/html" href="https://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe&amp;diff=9565&amp;oldid=prev"/>
		<updated>2017-08-06T21:34:36Z</updated>

		<summary type="html">&lt;p&gt;Textersetzung - „&amp;lt;comments&amp;gt;“ durch „&amp;lt;comments /&amp;gt;“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
[[Kategorie:IBM]]&lt;br /&gt;
[[Kategorie:SAN]]&lt;br /&gt;
[[Kategorie:V3700]]&lt;br /&gt;
[[Kategorie:V5000]]&lt;br /&gt;
[[Kategorie:V7000]]&lt;br /&gt;
[[Kategorie:ZnilTools]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Media:V7000-driveinfo.zip|v7000-driveinfo.exe]]&amp;#039;&amp;#039;&amp;#039; ist ein Tool welches alle möglichen Werte zu den Festplatten in einer V7000 / V3700 ausliest und in einer Textdatei speichert.&amp;lt;br&amp;gt;&lt;br /&gt;
Es werden unter anderem auch der Typ, Drehzahl (RPM) und die Firmware-Version ausgelesen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{Tipp|Neue Version 2.0.1.6 ist erschienen! &amp;lt;br&amp;gt;Details siehe Change Log}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Download:&amp;#039;&amp;#039;&amp;#039; &amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;[[Media:V7000-driveinfo.zip|v7000-driveinfo.zip]]&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===Change Log===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version 1.0.2.7&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** erste Version&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version 2.0.1.1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** neuer Parameter &amp;lt;code&amp;gt;/MDISK&amp;lt;/code&amp;gt; zum Auslesen der Array-Informationen&lt;br /&gt;
** Fehler in der Hilfe korregiert&lt;br /&gt;
** mehr Prüfungen bei der Abfrage eingebaut - manchmal verweigert das Storage schlicht die Auskunft - wenn man es noch mal versucht geht es&lt;br /&gt;
** neuer Parameter &amp;lt;code&amp;gt;/WEB&amp;lt;/code&amp;gt; zum Aufruf der Webseite zum Tool (diese hier!)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version 2.0.1.2&amp;#039;&amp;#039;&amp;#039; vom 08.03.2013&lt;br /&gt;
** Programm stürzte bei &amp;quot;Geisterlaufwerken&amp;quot; nicht mehr ab - hatte hier ein Storage mit einer nicht mehr existieren Festplatte die aber noch angezeigt wurde&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version 2.0.1.6&amp;#039;&amp;#039;&amp;#039; vom 20.03.2015&lt;br /&gt;
** Anpassung an neue Firmwareversion ab 7.4.0.2 - da kamen ein paar neue Felder dazu - und ich hatte das Tool damals schlecht programmiert.&lt;br /&gt;
** Weite Teile geändert das nun die Ausgabe des Storage dynamischer bearbeitet wird.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;v7000-driveinfo.exe&amp;#039;&amp;#039;&amp;#039; enthält [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html plink.exe] - siehe dazu die PuTTY Homepage: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&amp;lt;br&amp;gt;&lt;br /&gt;
Die Datei ist in der .exe mit verpackt und wird beim ersten Start in das gleiche Verzeichnis wie &amp;#039;&amp;#039;&amp;#039;v7000-driveinfo.exe&amp;#039;&amp;#039;&amp;#039; entpackt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
===Aufruf===&lt;br /&gt;
Mit&lt;br /&gt;
 v7000-driveinfo.exe &lt;br /&gt;
oder&lt;br /&gt;
  v7000-driveinfo.exe /?&lt;br /&gt;
erhält man eine kleine Hilfe über den Aufruf:&lt;br /&gt;
 Aufruf:&lt;br /&gt;
 &lt;br /&gt;
 v7000-driveinfo.exe /H:&amp;lt;IPoderDNS&amp;gt; /U:&amp;lt;Benutzername&amp;gt; /P:&amp;lt;Passwort&amp;gt; [/F:Dateiname] [/T:CSV|TAB]&lt;br /&gt;
 &lt;br /&gt;
 /H:&amp;lt;IPoderDNS&amp;gt;         : IP-Adresse oder (DNS-)Name der V7000&lt;br /&gt;
 /U:&amp;lt;Benutzername&amp;gt;      : Benutzername&lt;br /&gt;
 /P:&amp;lt;Passwort&amp;gt;          : Passwort&lt;br /&gt;
 /F:&amp;lt;Dateiname&amp;gt;         : optional: Name der Ausgabedatei&lt;br /&gt;
                          ansonsten wird die Angabe von /H verwendet&lt;br /&gt;
                          und die Datei im aktuellen Verzeichnis gespeichert&lt;br /&gt;
 /T:                    : Optional: Typ der Ausgabedatei:&lt;br /&gt;
                          /T:CSV = ; als Trennzeichen (Standard)&lt;br /&gt;
                          /T:TAB = Tabulator als Trennzeichen&lt;br /&gt;
 &lt;br /&gt;
 /MDISK                 : zusätzlidche Informationen zu den mdisks wie Raidlevel&lt;br /&gt;
                          abrufen, Ausgabe hat dann 14 Spalten mehr mit den&lt;br /&gt;
                          Daten.&lt;br /&gt;
 &lt;br /&gt;
 /WEB                   : Öffnet diese Seite hier im Standard-Webbrowser&lt;br /&gt;
&lt;br /&gt;
Die Parameter /H, /U und /P &amp;#039;&amp;#039;&amp;#039;müssen&amp;#039;&amp;#039;&amp;#039; angegeben werden!&amp;lt;br&amp;gt;&lt;br /&gt;
Alle anderen sind optional.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===CSV oder TAB?===&lt;br /&gt;
 /T:CSV&lt;br /&gt;
Erfolgt die Ausgabe als &amp;lt;code&amp;gt;.csv&amp;lt;/code&amp;gt; wird ein &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; als Trennzeichen verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
Man kann die Datei so einfach in Excel importieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist auch der Standard wenn der Parameter nicht extra angegeben wird.&amp;lt;br&amp;gt;&lt;br /&gt;
 /T:TAB&lt;br /&gt;
Verwendet einen Tabulator als Trennzeichen ... wozu?&amp;lt;br&amp;gt;&lt;br /&gt;
Will man den Text aus einem Editor heraus und in Excel hineinkopieren so landen bei &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; alle Zeichen einer Zeile in einer Zellen - man muss den Umweg über importieren gehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Nimmt man hingegen Tabulatoren landet jeder Wert in einer eigenen Zelle.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
 v7000-driveinfo.exe /H:v7k-san1 /U:superuser /P:passw0rd /F:C:\san1.csv /T:CSV&lt;br /&gt;
 v7000-driveinfo.exe /H:192.168.178.4 /U:superuser /P:passw0rd /F:C:\san1.txt /T:TAB&lt;br /&gt;
 v7000-driveinfo.exe /H:san1.test.local /U:superuser /P:passw0rd&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
===Beispielbilder===&lt;br /&gt;
[[Datei:V7000-driveinfo-001.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ausgabe ist dann z.B.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:V7000-driveinfo-002.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
==Quellcode==&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
Aber es funktioniert ....&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;AutoIt&amp;quot;&amp;gt;&lt;br /&gt;
#NoTrayIcon&lt;br /&gt;
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****&lt;br /&gt;
#AutoIt3Wrapper_Icon=znil.ico&lt;br /&gt;
#AutoIt3Wrapper_Outfile=v7000-driveinfoV3.exe&lt;br /&gt;
#AutoIt3Wrapper_Compression=0&lt;br /&gt;
#AutoIt3Wrapper_UseUpx=n&lt;br /&gt;
#AutoIt3Wrapper_Change2CUI=y&lt;br /&gt;
#AutoIt3Wrapper_Res_Description=2013 Bernhard Linz / Bernhard@znil.de&lt;br /&gt;
#AutoIt3Wrapper_Res_Fileversion=2.0.1.6&lt;br /&gt;
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y&lt;br /&gt;
#AutoIt3Wrapper_Res_Language=1031&lt;br /&gt;
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****&lt;br /&gt;
#include &amp;lt;Constants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;Array.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; id:status:error_sequence_number:use:tech_type:capacity:mdisk_id:mdisk_name:member_id:enclosure_id:slot_id:node_id:node_name&lt;br /&gt;
Dim $i1_drivecounter&lt;br /&gt;
Dim $i_drivesArrayDim = 40 ; Wieviele Einträge hat das nachfolgende Array? Achtung, wird ab 0 gezählt&lt;br /&gt;
Dim $a_drives[250][$i_drivesArrayDim]&lt;br /&gt;
; $a_drives[x][0] = id 33&lt;br /&gt;
; $a_drives[x][1] = status online&lt;br /&gt;
; $a_drives[x][2] = error_sequence_number&lt;br /&gt;
; $a_drives[x][3] = use spare&lt;br /&gt;
; $a_drives[x][4] = tech_type sas_hdd&lt;br /&gt;
; $a_drives[x][5] = capacity 278.9GB&lt;br /&gt;
; $a_drives[x][6] = mdisk_id&lt;br /&gt;
; $a_drives[x][7] = mdisk_name&lt;br /&gt;
; $a_drives[x][8] = member_id&lt;br /&gt;
; $a_drives[x][9] = enclosure_id 2&lt;br /&gt;
; $a_drives[x][10] = slot_id 24&lt;br /&gt;
; $a_drives[x][11] = node_id&lt;br /&gt;
; $a_drives[x][12] = node_name&lt;br /&gt;
; $a_drives[x][13] = UID 5000c50059e12cc3&lt;br /&gt;
; $a_drives[x][14] = block_size 512&lt;br /&gt;
; $a_drives[x][15] = vendor_id IBM-207x&lt;br /&gt;
; $a_drives[x][16] = product_id ST9300653SS&lt;br /&gt;
; $a_drives[x][17] = FRU_part_number 85Y6185&lt;br /&gt;
; $a_drives[x][18] = FRU_identity 11S49Y7433YXXX6XN20W3J&lt;br /&gt;
; $a_drives[x][19] = RPM 15000&lt;br /&gt;
; $a_drives[x][20] = firmware_level B63B&lt;br /&gt;
; $a_drives[x][21] = FPGA_level&lt;br /&gt;
; $a_drives[x][22] = quorum_id 1&lt;br /&gt;
; $a_drives[x][23] = port_1_status online&lt;br /&gt;
; $a_drives[x][24] = port_2_status online&lt;br /&gt;
; $a_drives[x][25] = Chain&lt;br /&gt;
; $a_drives[x][26] = mdisk_status&lt;br /&gt;
; $a_drives[x][27] = mdisk_mode&lt;br /&gt;
; $a_drives[x][28] = mdisk_grp_id&lt;br /&gt;
; $a_drives[x][29] = mdisk_grp_name_Poolname (Poolname)&lt;br /&gt;
; $a_drives[x][30] = mdisk_Pool_capacity&lt;br /&gt;
; $a_drives[x][31] = mdisk_fast_write_state&lt;br /&gt;
; $a_drives[x][32] = mdisk_raidstatus&lt;br /&gt;
; $a_drives[x][33] = mdisk_raid_level&lt;br /&gt;
; $a_drives[x][34] = mdisk_redundancy&lt;br /&gt;
; $a_drives[x][35] = mdisk_strip_size&lt;br /&gt;
; $a_drives[x][36] = mdisk_spare_goal&lt;br /&gt;
; $a_drives[x][37] = mdisk_spare_protection_min&lt;br /&gt;
; $a_drives[x][38] = mdisk_balanced&lt;br /&gt;
; $a_drives[x][39] = mdisk_tier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;~ 1 id 1&lt;br /&gt;
;~ 2 status online&lt;br /&gt;
;~ 3 error_sequence_number&lt;br /&gt;
;~ 4 use spare&lt;br /&gt;
;~ 5 UID 5000c50059e12cc3&lt;br /&gt;
;~ 6 tech_type sas_hdd&lt;br /&gt;
;~ 7 capacity 278.9GB&lt;br /&gt;
;~ 8 block_size 512&lt;br /&gt;
;~ 9 vendor_id IBM-207x&lt;br /&gt;
;~ 10 product_id ST9300653SS&lt;br /&gt;
;~ 11 FRU_part_number 85Y6185&lt;br /&gt;
;~ 12 FRU_identity 11S49Y7433YXXX6XN20W3J&lt;br /&gt;
;~ 13 RPM 15000&lt;br /&gt;
;~ 14 firmware_level B63B&lt;br /&gt;
;~ 15 FPGA_level&lt;br /&gt;
;~ 16 mdisk_id&lt;br /&gt;
;~ 17 mdisk_name&lt;br /&gt;
;~ 18 member_id&lt;br /&gt;
;~ 19 enclosure_id 1&lt;br /&gt;
;~ 20 slot_id 24&lt;br /&gt;
;~ 21 node_id&lt;br /&gt;
;~ 22 node_name&lt;br /&gt;
;~ 23 quorum_id 1&lt;br /&gt;
;~ 24 port_1_status online&lt;br /&gt;
;~ 25 port_2_status online&lt;br /&gt;
&lt;br /&gt;
Global $s_v7000Username = &amp;quot;&amp;quot;&lt;br /&gt;
Global $s_v7000Password = &amp;quot;&amp;quot;&lt;br /&gt;
Global $s_V7000Hostname = &amp;quot;&amp;quot;&lt;br /&gt;
Global $s_Ausgabedatei = &amp;quot;&amp;quot;&lt;br /&gt;
Global $b_mdiskinfos = False ;mdisk infos abfragen?&lt;br /&gt;
Global $s_mdisk ;hier kommen die Namen aller mdisks rein&lt;br /&gt;
Global $a_mdisk[1] ;hier kommen die Namen aller mdisks rein&lt;br /&gt;
Global $b_mdisk_gibt_es_schon = False&lt;br /&gt;
&lt;br /&gt;
Dim $h_Ausgabedatei ; filehandle&lt;br /&gt;
Dim $s_Trennzeichen = &amp;quot;&amp;quot;; string&lt;br /&gt;
Dim $i1, $i2 ; Integer, für Schleifen&lt;br /&gt;
Dim $s_sshCommand = &amp;quot;lssasfabric -delim :&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;                          10        20        30        40        50        60        70        80&lt;br /&gt;
;                 12345678901234567890123456789012345678901234567890123456789012345678901234567890&lt;br /&gt;
Dim $s_Header = &amp;quot;+------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| v7000-driveinfo.exe - Version &amp;quot; &amp;amp; FileGetVersion(@ScriptName) &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;+------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| 2013 von Bernhard Linz für http://znil.net - Kontakt: Bernhard@znil.net&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;+------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF&lt;br /&gt;
&lt;br /&gt;
;                          10        20        30        40        50        60        70        80&lt;br /&gt;
;                 12345678901234567890123456789012345678901234567890123456789012345678901234567890&lt;br /&gt;
Dim $s_HilfeText = _&lt;br /&gt;
		&amp;quot;Fragt eine IBM V7000 ab und erstellt eine Text oder CSV Datei&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;mit den Informationen über die verbauten Festplatten&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;-------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;Aufruf: &amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		@ScriptName &amp;amp; &amp;quot; /H:&amp;lt;IPoderDNS&amp;gt; /U:&amp;lt;Benutzername&amp;gt; /P:&amp;lt;Passwort&amp;gt; [/F:Dateiname] [/T:CSV|TAB]&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/H:&amp;lt;IPoderDNS&amp;gt;         : IP-Adresse oder (DNS-)Name der V7000&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/U:&amp;lt;Benutzername&amp;gt;      : Benutzername&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/P:&amp;lt;Passwort&amp;gt;          : Passwort&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/F:&amp;lt;Dateiname&amp;gt;         : optional: Name der Ausgabedatei&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         ansonsten wird die Angabe von /H verwendet&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         und die Datei im aktuellen Verzeichnis gespeichert&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/T:                    : Optional: Typ der Ausgabedatei:&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         /T:CSV = ; als Trennzeichen (Standard)&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         /T:TAB = Tabulator als Trennzeichen&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/MDISK                 : zusätzlidche Informationen zu den mdisks wie Raidlevel&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         abrufen, Ausgabe hat dann 14 Spalten mehr mit den&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         Daten.&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;/WEB                   : Öffnet die Homepage zu diesem Tool im Standard-Browser&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;                         Alle anderen Parameter werden ignoriert!&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;Beispiele:&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;-------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot; &amp;quot; &amp;amp; @ScriptName &amp;amp; &amp;quot; /H:storage1 /U:superuser /P:passw0rd&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot; &amp;quot; &amp;amp; @ScriptName &amp;amp; &amp;quot; /H:10.1.1.2 /U:superuser /P:passw0rd /F:C:\san1.txt /T:CSV&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot; &amp;quot; &amp;amp; @ScriptName &amp;amp; &amp;quot; /H:SAN1 /U:superuser /P:passw0rd /T:TAB&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot; &amp;quot; &amp;amp; @ScriptName &amp;amp; &amp;quot; /H:v7k.domain.local /U:superuser /P:passw0rd /T:TAB /MDISK&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot; &amp;quot; &amp;amp; @ScriptName &amp;amp; &amp;quot; /WEB&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		@CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;+------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| v7000-driveinfo.exe ist FREEWARE! Kopieren, weitergeben ausdrücklich erlaubt!&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| v7000-driveinfo.exe enthält plink.exe!&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| plink.exe siehe http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;| http://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe&amp;quot; &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
		&amp;quot;+------------------------------------------------------------------------------&amp;quot; &amp;amp; @CRLF&lt;br /&gt;
&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
; F U N C T I O N E N / S U B R O U T I N E N&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
; _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&lt;br /&gt;
; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt&lt;br /&gt;
; Wir zudem für die Prüfung der Gruppenzugehörigkeit benötigt für Gruppen mit Umlauten, z.B. Domänen-Admins&lt;br /&gt;
; Dank an Xenobiologist von AutoIt.de für diese Lösung: http://www.autoit.de/index.php?page=Thread&amp;amp;threadID=9461&amp;amp;highlight=ANSI2OEM&lt;br /&gt;
&lt;br /&gt;
Func _ANSI2OEM($text)&lt;br /&gt;
	$text = DllCall(&amp;#039;user32.dll&amp;#039;, &amp;#039;Int&amp;#039;, &amp;#039;CharToOem&amp;#039;, &amp;#039;str&amp;#039;, $text, &amp;#039;str&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	Return $text[2]&lt;br /&gt;
	;Return $text&lt;br /&gt;
EndFunc   ;==&amp;gt;_ANSI2OEM&lt;br /&gt;
&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
; Hilfsroutine die den Hilfetext ausgibt&lt;br /&gt;
Func _HilfeAusgeben()&lt;br /&gt;
	;_WinAPI_AttachConsole()&lt;br /&gt;
	;$ZeigerConsole = _WinAPI_GetStdHandle(1)&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM($s_Header))&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM($s_HilfeText))&lt;br /&gt;
	;_WinAPI_AttachConsole()&lt;br /&gt;
	;$ZeigerConsole = _WinAPI_GetStdHandle(1)&lt;br /&gt;
	;_WinAPI_WriteConsole($ZeigerConsole,$s_Header)&lt;br /&gt;
	;_WinAPI_WriteConsole($ZeigerConsole,$s_HilfeText)&lt;br /&gt;
	;_WinAPI_WriteConsole($ZeigerConsole,@CRLF)&lt;br /&gt;
	;Send(&amp;quot;{Enter}&amp;quot;)&lt;br /&gt;
EndFunc   ;==&amp;gt;_HilfeAusgeben&lt;br /&gt;
&lt;br /&gt;
; Damit sparen wir uns die Arbeit den Host vorher einmal mit Putty zu Kontaktieren&lt;br /&gt;
Func _saveplinkRSAkey($plinkHost)&lt;br /&gt;
	$plinkFile = @ScriptDir &amp;amp; &amp;quot;\plink.exe&amp;quot;&lt;br /&gt;
	FileInstall(&amp;quot;C:\_AutoIt\v7000\plink.exe&amp;quot;, $plinkFile, 1)&lt;br /&gt;
	$runThis =  @ComSpec &amp;amp; &amp;quot; /c &amp;quot; &amp;amp; &amp;quot;echo yes | &amp;quot; &amp;amp; $plinkFile &amp;amp; &amp;quot; &amp;quot; &amp;amp; $plinkHost&lt;br /&gt;
	;ConsoleWrite($runThis &amp;amp; @CRLF)&lt;br /&gt;
	RunWait($runThis, &amp;quot;&amp;quot;, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)&lt;br /&gt;
&lt;br /&gt;
EndFunc ;==&amp;gt;_saveplinkRSAkey&lt;br /&gt;
&lt;br /&gt;
;###########################################################################################################################################&lt;br /&gt;
&lt;br /&gt;
Func _runSshCommand($plinkUser, $plinkHost, $command, $password = &amp;quot;&amp;quot;, $timeoutInMs = 0)&lt;br /&gt;
&lt;br /&gt;
$plinkFile = @ScriptDir &amp;amp; &amp;quot;\plink.exe&amp;quot;&lt;br /&gt;
FileInstall(&amp;quot;C:\_AutoIt\v7000\plink.exe&amp;quot;, $plinkFile, 1)&lt;br /&gt;
&lt;br /&gt;
$runThis = @ComSpec &amp;amp; &amp;quot; /c &amp;quot; &amp;amp; $plinkFile &amp;amp; &amp;quot; -batch &amp;quot; &amp;amp; $plinkUser &amp;amp; &amp;quot;@&amp;quot; &amp;amp; $plinkHost&lt;br /&gt;
If $password &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then $runThis &amp;amp;= &amp;quot; -pw &amp;quot; &amp;amp; $password&lt;br /&gt;
$runThis &amp;amp;= &amp;quot; &amp;quot; &amp;amp; $command&lt;br /&gt;
&lt;br /&gt;
$plinkHandle = Run($runThis, &amp;quot;&amp;quot;, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)&lt;br /&gt;
&lt;br /&gt;
$plinkFeedback = &amp;quot;&amp;quot;&lt;br /&gt;
$waitForOutputStartTime = TimerInit()&lt;br /&gt;
Do&lt;br /&gt;
Sleep(5)&lt;br /&gt;
$plinkFeedback &amp;amp;= StdoutRead($plinkHandle)&lt;br /&gt;
$stdoutReadError = @error&lt;br /&gt;
Until $stdoutReadError Or ($timeoutInMs And TimerDiff($waitForOutputStartTime) &amp;gt; $timeoutInMs)&lt;br /&gt;
&lt;br /&gt;
If ProcessExists(&amp;quot;plink.exe&amp;quot;) Then ProcessClose(&amp;quot;plink.exe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
If $stdoutReadError &amp;lt;&amp;gt; 0 Then Return $plinkFeedback&lt;br /&gt;
&lt;br /&gt;
ConsoleWrite(_ANSI2OEM(&amp;quot;Timeout während plink-Befehl!&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
Return &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EndFunc ;==&amp;gt;_runSshCommand&lt;br /&gt;
&lt;br /&gt;
;###########################################################################################################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
; H I L F E&lt;br /&gt;
; ###################################################################################&lt;br /&gt;
&lt;br /&gt;
;testen ob wir überhaupt mit einem Parameter gestartet wurden - sonst Hilfe ausgeben&lt;br /&gt;
If $CmdLine[0] = 0 Then&lt;br /&gt;
	_HilfeAusgeben()&lt;br /&gt;
	Exit&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
;testen ob der Parameter 1 ist auf &amp;quot;/?&amp;quot; testen und ebenfalls Hilfe ausgeben&lt;br /&gt;
If $CmdLine[1] = &amp;quot;/?&amp;quot; Then&lt;br /&gt;
	_HilfeAusgeben()&lt;br /&gt;
	Exit&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Restliche Parameter auswerten und Variablen füllen ########################################################&lt;br /&gt;
For $i1 = 1 To $CmdLine[0]&lt;br /&gt;
	Select&lt;br /&gt;
		Case StringLeft($CmdLine[$i1],3) = &amp;quot;/H:&amp;quot;&lt;br /&gt;
			$s_V7000Hostname = StringTrimLeft($CmdLine[$i1],3)&lt;br /&gt;
		Case StringLeft($CmdLine[$i1],3) = &amp;quot;/U:&amp;quot;&lt;br /&gt;
			$s_v7000Username = StringTrimLeft($CmdLine[$i1],3)&lt;br /&gt;
		Case StringLeft($CmdLine[$i1],3) = &amp;quot;/P:&amp;quot;&lt;br /&gt;
			$s_v7000Password = StringTrimLeft($CmdLine[$i1],3)&lt;br /&gt;
		Case StringLeft($CmdLine[$i1],3) = &amp;quot;/F:&amp;quot;&lt;br /&gt;
			$s_Ausgabedatei = StringTrimLeft($CmdLine[$i1],3)&lt;br /&gt;
		Case $CmdLine[$i1] = &amp;quot;/T:CSV&amp;quot;&lt;br /&gt;
			$s_Trennzeichen = &amp;quot;;&amp;quot;&lt;br /&gt;
		Case $CmdLine[$i1] = &amp;quot;/T:TAB&amp;quot;&lt;br /&gt;
			$s_Trennzeichen = Chr(9)&lt;br /&gt;
		Case $CmdLine[$i1] = &amp;quot;/MDISK&amp;quot;&lt;br /&gt;
			$b_mdiskinfos = True&lt;br /&gt;
		Case $CmdLine[$i1] = &amp;quot;/WEB&amp;quot;&lt;br /&gt;
			ShellExecute (&amp;quot;http://znil.net/index.php?title=ZnilTools:v7000-driveinfo.exe&amp;quot;)&lt;br /&gt;
			Exit 0&lt;br /&gt;
		Case Else&lt;br /&gt;
			ConsoleWrite(_ANSI2OEM(&amp;quot;Unbekannter Parameter: &amp;quot; &amp;amp; $CmdLine[$i1] &amp;amp; @CRLF))&lt;br /&gt;
			Exit 1&lt;br /&gt;
	EndSelect&lt;br /&gt;
Next&lt;br /&gt;
&lt;br /&gt;
; Variablen / Parameter überprüfen ##########################################################################&lt;br /&gt;
; Ist der Host angegeben und erreichbar?&lt;br /&gt;
If $s_V7000Hostname &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;br /&gt;
	If Ping($s_V7000Hostname) &amp;gt; 0 Then&lt;br /&gt;
		; Testverbindung - nebenbei wird der RSA-Key in der Registry gespeichert&lt;br /&gt;
		_saveplinkRSAkey($s_V7000Hostname)&lt;br /&gt;
	Else&lt;br /&gt;
		ConsoleWrite(_ANSI2OEM(&amp;quot;Kann Storage &amp;#039;&amp;quot; &amp;amp; $s_v7000Password &amp;amp; &amp;quot;&amp;#039; nicht erreichen (Ping-Test)&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
		Exit 1&lt;br /&gt;
	EndIf&lt;br /&gt;
Else&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM(&amp;quot;Fehler: Parameter /H: fehlt (/? für Hilfe)&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
	Exit 1&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Wurde ein Benutzername angegeben?&lt;br /&gt;
If $s_v7000Username = &amp;quot;&amp;quot; Then&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM(&amp;quot;Fehler: Parameter /U: fehlt (/? für Hilfe)&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
	Exit 1&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Wurde ein Passwort angegeben?&lt;br /&gt;
If $s_v7000Password = &amp;quot;&amp;quot; Then&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM(&amp;quot;Fehler: Parameter /P: fehlt (/? für Hilfe)&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
	Exit 1&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Wurde ein Dateiname angegeben?&lt;br /&gt;
If $s_Ausgabedatei = &amp;quot;&amp;quot; Then&lt;br /&gt;
	$s_Ausgabedatei = $s_V7000Hostname&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Wurde der Parameter CSV oder TAB angegeben&lt;br /&gt;
If $s_Trennzeichen = &amp;quot;&amp;quot; Then&lt;br /&gt;
	$s_Trennzeichen = &amp;quot;;&amp;quot;&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Dateiendung setzen bei Bedarf&lt;br /&gt;
If StringRight($s_Ausgabedatei,4) &amp;lt;&amp;gt; &amp;quot;.txt&amp;quot; And StringRight($s_Ausgabedatei,4) &amp;lt;&amp;gt; &amp;quot;.csv&amp;quot; Then&lt;br /&gt;
	If $s_Trennzeichen = &amp;quot;;&amp;quot; Then&lt;br /&gt;
		$s_Ausgabedatei = $s_Ausgabedatei &amp;amp; &amp;quot;.csv&amp;quot;&lt;br /&gt;
	Else&lt;br /&gt;
		$s_Ausgabedatei = $s_Ausgabedatei &amp;amp; &amp;quot;.txt&amp;quot;&lt;br /&gt;
	EndIf&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
; Testen ob die Ausgabedatei erstellt werden darf (zum schreiben)&lt;br /&gt;
$h_Ausgabedatei = FileOpen($s_Ausgabedatei,1)&lt;br /&gt;
If $h_Ausgabedatei = -1 Then&lt;br /&gt;
	ConsoleWrite(_ANSI2OEM(&amp;quot;Fehler: Kann Ausgabedatei &amp;#039;&amp;quot; &amp;amp; $s_Ausgabedatei &amp;amp; &amp;quot;&amp;#039; nicht erstellen&amp;quot; &amp;amp; @CRLF))&lt;br /&gt;
	Exit 1&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; ### Schritt 1: Festplatten-Infos auslesen - Allgemein #######################################################################&lt;br /&gt;
$s_sshCommand = &amp;quot;lsdrive -delim :&amp;quot;&lt;br /&gt;
While 1&lt;br /&gt;
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)&lt;br /&gt;
	$a_RawText = StringSplit($answer, @LF)&lt;br /&gt;
	If $a_RawText[0] = 1 Then&lt;br /&gt;
		;Sleep(30000)&lt;br /&gt;
		ConsoleWrite(&amp;quot;Fehler beim Einlesen der Anzahl der Festplatten ... wiederhole&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
		;_ArrayDisplay($a_RawText)&lt;br /&gt;
	Else&lt;br /&gt;
		ConsoleWrite(&amp;quot;Anzahl Festplatten: &amp;quot;)&lt;br /&gt;
		ExitLoop&lt;br /&gt;
	EndIf&lt;br /&gt;
WEnd&lt;br /&gt;
&lt;br /&gt;
For $i1 = 1 To $a_RawText[0]&lt;br /&gt;
	;ConsoleWrite($i1 &amp;amp; &amp;quot;, &amp;quot;)&lt;br /&gt;
	$a_Helfer = StringSplit($a_RawText[$i1], &amp;quot;:&amp;quot;)&lt;br /&gt;
	; 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&lt;br /&gt;
	If $a_Helfer[0] &amp;gt;= 13 Then&lt;br /&gt;
		$a_drives[$i1-1][0] = $a_Helfer[1] ; id&lt;br /&gt;
		$a_drives[$i1-1][1] = $a_Helfer[2] ; status&lt;br /&gt;
		$a_drives[$i1-1][2] = $a_Helfer[3] ; error_sequence_number&lt;br /&gt;
		$a_drives[$i1-1][3] = $a_Helfer[4] ; use&lt;br /&gt;
		$a_drives[$i1-1][4] = $a_Helfer[5] ; tech_type&lt;br /&gt;
		$a_drives[$i1-1][5] = $a_Helfer[6] ; capacity&lt;br /&gt;
		$a_drives[$i1-1][6] = $a_Helfer[7] ; mdisk_id&lt;br /&gt;
		$a_drives[$i1-1][7] = $a_Helfer[8] ; mdisk_name&lt;br /&gt;
		$a_drives[$i1-1][8] = $a_Helfer[9] ; member_id&lt;br /&gt;
		$a_drives[$i1-1][9] = $a_Helfer[10] ; enclosure_id&lt;br /&gt;
		$a_drives[$i1-1][10] = $a_Helfer[11] ; slot_id&lt;br /&gt;
		$a_drives[$i1-1][11] = $a_Helfer[12] ; node_id&lt;br /&gt;
		$a_drives[$i1-1][12] = $a_Helfer[13] ; node_name&lt;br /&gt;
	EndIf&lt;br /&gt;
Next&lt;br /&gt;
ConsoleWrite(($i1 - 3) &amp;amp; @CRLF)&lt;br /&gt;
&lt;br /&gt;
;_ArrayDisplay($a_drives)&lt;br /&gt;
&lt;br /&gt;
; ### Schritt 2: Festplatten-Infos auslesen - Details zu einzelnen Platten #######################################################################&lt;br /&gt;
$a_drives[0][13] = &amp;quot;UID&amp;quot;&lt;br /&gt;
$a_drives[0][14] = &amp;quot;block_size&amp;quot;&lt;br /&gt;
$a_drives[0][15] = &amp;quot;vendor_id&amp;quot;&lt;br /&gt;
$a_drives[0][16] = &amp;quot;product_id&amp;quot;&lt;br /&gt;
$a_drives[0][17] = &amp;quot;FRU_part_number&amp;quot;&lt;br /&gt;
$a_drives[0][18] = &amp;quot;FRU_identity&amp;quot;&lt;br /&gt;
$a_drives[0][19] = &amp;quot;RPM&amp;quot;&lt;br /&gt;
$a_drives[0][20] = &amp;quot;firmware_level&amp;quot;&lt;br /&gt;
$a_drives[0][21] = &amp;quot;FPGA_level&amp;quot;&lt;br /&gt;
$a_drives[0][22] = &amp;quot;quorum_id&amp;quot;&lt;br /&gt;
$a_drives[0][23] = &amp;quot;port_1_status&amp;quot;&lt;br /&gt;
$a_drives[0][24] = &amp;quot;port_2_status&amp;quot;&lt;br /&gt;
&lt;br /&gt;
$i1 = 1&lt;br /&gt;
ConsoleWrite (&amp;quot;Rufe Disk ab: &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
While $a_drives[$i1][0] &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
	$s_sshCommand = &amp;quot;lsdrive &amp;quot; &amp;amp; $a_drives[$i1][0]&lt;br /&gt;
	ConsoleWrite ($i1 &amp;amp; &amp;quot;, &amp;quot;)&lt;br /&gt;
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)&lt;br /&gt;
	$a_RawText = StringSplit($answer, @LF)&lt;br /&gt;
	If $a_RawText[0] &amp;gt;= 25 Then&lt;br /&gt;
		For $i2 = 1 to $a_RawText[0]&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;UID&amp;quot;)) = &amp;quot;UID&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][13] = StringReplace(StringMid($a_RawText[$i2],StringLen(&amp;quot;UID&amp;quot;) + 1 ),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; UID 5000c50059e12cc3&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;block_size&amp;quot;)) = &amp;quot;block_size&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][14] = StringReplace(StringMid($a_RawText[$i2],StringLen(&amp;quot;block_size&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; block_size 512&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;vendor_id&amp;quot;)) = &amp;quot;vendor_id&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][15] = StringReplace(StringMid($a_RawText[$i2],StringLen(&amp;quot;vendor_id&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; vendor_id IBM-207x&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;product_id&amp;quot;)) = &amp;quot;product_id&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][16] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;product_id&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; product_id ST9300653SS&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;FRU_part_number&amp;quot;)) = &amp;quot;FRU_part_number&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][17] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;FRU_part_number&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; FRU_part_number 85Y6185&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;FRU_identity&amp;quot;)) = &amp;quot;FRU_identity&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][18] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;FRU_identity&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; FRU_identity 11S49Y7433YXXX6XN20W3J&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;RPM&amp;quot;)) = &amp;quot;RPM&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][19] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;RPM&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; RPM 15000&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;firmware_level&amp;quot;)) = &amp;quot;firmware_level&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][20] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;firmware_level&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; firmware_level B63B&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;FPGA_level&amp;quot;)) = &amp;quot;FPGA_level&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][21] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;FPGA_level&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; FPGA_level&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;quorum_id&amp;quot;)) = &amp;quot;quorum_id&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][22] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;quorum_id&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; quorum_id 1&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;port_1_status&amp;quot;)) = &amp;quot;port_1_status&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][23] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;port_1_status&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; port_1_status online&lt;br /&gt;
			EndIf&lt;br /&gt;
			If StringLeft($a_RawText[$i2], StringLen(&amp;quot;port_2_status&amp;quot;)) = &amp;quot;port_2_status&amp;quot; Then&lt;br /&gt;
				$a_drives[$i1][24] = StringReplace(StringMid($a_RawText[$i2], StringLen(&amp;quot;port_2_status&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; port_2_status online&lt;br /&gt;
			EndIf&lt;br /&gt;
		Next&lt;br /&gt;
	Else&lt;br /&gt;
		;Sleep(30000)&lt;br /&gt;
		ConsoleWrite(&amp;quot;Fehler - wiederhole: &amp;quot;)&lt;br /&gt;
		;_ArrayDisplay($a_RawText)&lt;br /&gt;
		$i1 = $i1 - 1&lt;br /&gt;
	EndIf&lt;br /&gt;
	;Sleep(1000)&lt;br /&gt;
	$i1 = $i1 + 1&lt;br /&gt;
WEnd&lt;br /&gt;
ConsoleWrite(@CRLF)&lt;br /&gt;
&lt;br /&gt;
; ### Schritt 3: Drive Chains ermitteln und zuordnen #######################################################################&lt;br /&gt;
; Drive Chain ermitteln - und damit welches Gehäuse in welcher Chain sitzt:&lt;br /&gt;
ConsoleWrite(&amp;quot;Ermittle welches Enclosure in welcher Chain hängt ...&amp;quot;)&lt;br /&gt;
$a_drives[0][25] = &amp;quot;Chain&amp;quot;&lt;br /&gt;
While 1&lt;br /&gt;
	$s_sshCommand = &amp;quot;lssasfabric -delim :&amp;quot;&lt;br /&gt;
	$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)&lt;br /&gt;
	$a_RawText = StringSplit($answer, @LF)&lt;br /&gt;
	;_ArrayDisplay($a_RawText)&lt;br /&gt;
	If $a_RawText[0] = 1 Then&lt;br /&gt;
		Sleep(2000)&lt;br /&gt;
		ConsoleWrite(&amp;quot;Fehler - wiederhole ... &amp;quot;)&lt;br /&gt;
		;_ArrayDisplay($a_RawText)&lt;br /&gt;
	Else&lt;br /&gt;
		ExitLoop&lt;br /&gt;
	EndIf&lt;br /&gt;
WEnd&lt;br /&gt;
&lt;br /&gt;
ConsoleWrite(&amp;quot; fertig!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
ConsoleWrite(&amp;quot;Ordne die Chain den Laufwerken zu ... &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
$i1 = 1&lt;br /&gt;
While $a_drives[$i1][0] &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
	For $i2 = 1 To $a_RawText[0]&lt;br /&gt;
		$a_Helfer = StringSplit($a_RawText[$i2],&amp;quot;:&amp;quot;)&lt;br /&gt;
		; $a_Helfer[1] = enclosure_id&lt;br /&gt;
		; $a_Helfer[2] = canister_id&lt;br /&gt;
		; $a_Helfer[3] = canister_port_id&lt;br /&gt;
		; $a_Helfer[4] = control_enclosure_id&lt;br /&gt;
		; $a_Helfer[5] = node_canister_id&lt;br /&gt;
		; $a_Helfer[6] = node_canister_port_id&lt;br /&gt;
		; $a_Helfer[7] = position:IO_group_id&lt;br /&gt;
		; $a_Helfer[8] = IO_group_name&lt;br /&gt;
		; $a_Helfer[9] = node_id&lt;br /&gt;
		; $a_Helfer[10] = node_name&lt;br /&gt;
		If $a_Helfer[0] &amp;gt; 1 Then ; gab es doch den Fall das ein Geisterlaufwerk im System war ... ohne diese Prüfung stürzt mein Tool ab ....&lt;br /&gt;
			If $a_drives[$i1][9] = $a_Helfer[1] Then&lt;br /&gt;
				$a_drives[$i1][25] = $a_Helfer[6]&lt;br /&gt;
			EndIf&lt;br /&gt;
		EndIf&lt;br /&gt;
	Next&lt;br /&gt;
	$i1 = $i1 + 1&lt;br /&gt;
	ConsoleWrite(&amp;quot;.&amp;quot;)&lt;br /&gt;
WEnd&lt;br /&gt;
ConsoleWrite(@CRLF)&lt;br /&gt;
&lt;br /&gt;
;_ArrayDisplay($a_drives)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; ### Schritt 4: Raidsets ermitteln und zuordnen #######################################################################&lt;br /&gt;
; Abfragen welche Raidsets die mdisk haben und in welchen Pool diese sind&lt;br /&gt;
If $b_mdiskinfos = True Then&lt;br /&gt;
	ConsoleWrite(&amp;quot;Ermittle die Anzahl der mdisks: &amp;quot;)&lt;br /&gt;
	$a_drives[0][26] = &amp;quot;mdisk_status&amp;quot;&lt;br /&gt;
    $a_drives[0][27] = &amp;quot;mdisk_mode&amp;quot;&lt;br /&gt;
	$a_drives[0][28] = &amp;quot;mdisk_grp_id&amp;quot;&lt;br /&gt;
	$a_drives[0][29] = &amp;quot;mdisk_grp_name_Poolname&amp;quot;&lt;br /&gt;
	$a_drives[0][30] = &amp;quot;mdisk_Pool_capacity&amp;quot;&lt;br /&gt;
	$a_drives[0][31] = &amp;quot;mdisk_fast_write_state&amp;quot;&lt;br /&gt;
	$a_drives[0][32] = &amp;quot;mdisk_raidstatus&amp;quot;&lt;br /&gt;
	$a_drives[0][33] = &amp;quot;mdisk_raid_level&amp;quot;&lt;br /&gt;
	$a_drives[0][34] = &amp;quot;mdisk_redundancy&amp;quot;&lt;br /&gt;
	$a_drives[0][35] = &amp;quot;mdisk_strip_size&amp;quot;&lt;br /&gt;
	$a_drives[0][36] = &amp;quot;mdisk_spare_goal&amp;quot;&lt;br /&gt;
	$a_drives[0][37] = &amp;quot;mdisk_spare_protection_min&amp;quot;&lt;br /&gt;
	$a_drives[0][38] = &amp;quot;mdisk_balanced&amp;quot;&lt;br /&gt;
	$a_drives[0][39] = &amp;quot;mdisk_tier&amp;quot;&lt;br /&gt;
	;Anzahl der MDisk ermitteln und deren Namen&lt;br /&gt;
	$s_mdisk = &amp;quot;&amp;quot;&lt;br /&gt;
	$a_mdisk[0] = &amp;quot;&amp;quot;&lt;br /&gt;
	$i1 = 1&lt;br /&gt;
	While $a_drives[$i1][0] &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
		If $a_drives[$i1][7] &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then ;Wenn im mdisk_namen Feld etwas steht ...&lt;br /&gt;
			If UBound($a_mdisk) = 1 And $a_mdisk[0] = &amp;quot;&amp;quot; Then&lt;br /&gt;
				$a_mdisk[0] = $a_drives[$i1][7]&lt;br /&gt;
			Else&lt;br /&gt;
				; Prüfen ob es diese mdisk schon gibt ... hatte einfachere Lösung ... aber da kam es zu verwechslungen zwischen mdisk1 und mdisk10 :-)&lt;br /&gt;
				; deshalb Einzelvergleichm, so mühsam es auch sein mag&lt;br /&gt;
				$b_mdisk_gibt_es_schon = False&lt;br /&gt;
				For $i2 = 0 To (UBound($a_mdisk) - 1)&lt;br /&gt;
					If $a_mdisk[$i2] = $a_drives[$i1][7] Then&lt;br /&gt;
						$b_mdisk_gibt_es_schon = True&lt;br /&gt;
					EndIf&lt;br /&gt;
				Next&lt;br /&gt;
				If $b_mdisk_gibt_es_schon = False Then&lt;br /&gt;
					_ArrayAdd($a_mdisk, $a_drives[$i1][7])&lt;br /&gt;
				EndIf&lt;br /&gt;
			EndIf&lt;br /&gt;
		EndIf&lt;br /&gt;
		$i1 = $i1 + 1&lt;br /&gt;
	WEnd&lt;br /&gt;
&lt;br /&gt;
	ConsoleWrite(UBound($a_mdisk) &amp;amp; @CRLF)&lt;br /&gt;
&lt;br /&gt;
	;mdisks Details abrufen	.... wenn es überhaupt welche gibt&lt;br /&gt;
	If $a_mdisk[0] &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then ; wenn es mindestens eine gibt funzt es ....&lt;br /&gt;
		For $i1 = 0 To (UBound($a_mdisk) - 1)&lt;br /&gt;
			$s_sshCommand = &amp;quot;lsmdisk &amp;quot; &amp;amp; $a_mdisk[$i1]&lt;br /&gt;
			ConsoleWrite(&amp;quot;Rufe Details zu mdisk &amp;#039;&amp;quot; &amp;amp; $a_mdisk[$i1] &amp;amp; &amp;quot;&amp;#039; ab ...&amp;quot;)&lt;br /&gt;
			While 1&lt;br /&gt;
				$answer = _runSshCommand($s_v7000Username, $s_V7000Hostname, $s_sshCommand, $s_v7000Password, 10000)&lt;br /&gt;
				$a_RawText = StringSplit($answer, @LF)&lt;br /&gt;
				;_ArrayDisplay($a_RawText)&lt;br /&gt;
				If $a_RawText[0] &amp;gt;= 27 Then&lt;br /&gt;
					ConsoleWrite(_ANSI2OEM(&amp;quot; und ordne die Daten den zugehörigen Laufwerken zu ...&amp;quot;))&lt;br /&gt;
					$i2 = 1&lt;br /&gt;
					While $a_drives[$i2][0] &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
						If $a_mdisk[$i1] = $a_drives[$i2][7] Then&lt;br /&gt;
							$a_drives[$i2][26] = StringReplace(StringMid($a_RawText[3],StringLen(&amp;quot;status&amp;quot;) + 1 ),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; mdisk_status&lt;br /&gt;
							$a_drives[$i2][27] = StringReplace(StringMid($a_RawText[4],StringLen(&amp;quot;mode&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; mdisk_mode&lt;br /&gt;
							$a_drives[$i2][28] = StringReplace(StringMid($a_RawText[5],StringLen(&amp;quot;mdisk_grp_id&amp;quot;) + 1 ),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; mdisk_grp_id&lt;br /&gt;
							$a_drives[$i2][29] = StringMid($a_RawText[6],StringLen(&amp;quot;mdisk_grp_name&amp;quot;) + 1)  ; mdisk_grp_name_Poolname&lt;br /&gt;
							$a_drives[$i2][30] = StringReplace(StringMid($a_RawText[7],StringLen(&amp;quot;capacity&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;)  ; mdisk_Pool_capacity&lt;br /&gt;
							$a_drives[$i2][31] = StringReplace(StringMid($a_RawText[20], StringLen(&amp;quot;fast_write_state&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_fast_write_state&lt;br /&gt;
							$a_drives[$i2][32] = StringReplace(StringMid($a_RawText[21], StringLen(&amp;quot;raid_status&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_raidstatus&lt;br /&gt;
							$a_drives[$i2][33] = StringReplace(StringMid($a_RawText[22], StringLen(&amp;quot;raid_level&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_raid_level&lt;br /&gt;
							$a_drives[$i2][34] = StringReplace(StringMid($a_RawText[23], StringLen(&amp;quot;redundancy&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_redundancy&lt;br /&gt;
							$a_drives[$i2][35] = StringReplace(StringMid($a_RawText[24], StringLen(&amp;quot;strip_size&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_strip_size&lt;br /&gt;
							$a_drives[$i2][36] = StringReplace(StringMid($a_RawText[25], StringLen(&amp;quot;spare_goal&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_spare_goal&lt;br /&gt;
							$a_drives[$i2][37] = StringReplace(StringMid($a_RawText[26], StringLen(&amp;quot;spare_protection_min&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_spare_protection_min&lt;br /&gt;
							$a_drives[$i2][38] = StringReplace(StringMid($a_RawText[27], StringLen(&amp;quot;balanced&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_balanced&lt;br /&gt;
							$a_drives[$i2][39] = StringReplace(StringMid($a_RawText[28], StringLen(&amp;quot;tier&amp;quot;) + 1),&amp;quot; &amp;quot;,&amp;quot;&amp;quot;) ; mdisk_tier&lt;br /&gt;
						EndIf&lt;br /&gt;
						$i2 = $i2 + 1&lt;br /&gt;
					WEnd&lt;br /&gt;
					ConsoleWrite(&amp;quot; Fertig!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
					ExitLoop&lt;br /&gt;
				Else&lt;br /&gt;
					;Sleep(30000)&lt;br /&gt;
					ConsoleWrite(&amp;quot; Fehler - wiederhole ...&amp;quot;)&lt;br /&gt;
					;_ArrayDisplay($a_RawText)&lt;br /&gt;
				EndIf&lt;br /&gt;
			WEnd&lt;br /&gt;
		Next&lt;br /&gt;
	Else&lt;br /&gt;
		ConsoleWrite(@CRLF &amp;amp; &amp;quot;!!!!!! Konnte keine Daten zu mdisk abrufen da es keine gibt!!!!!!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
	EndIf&lt;br /&gt;
&lt;br /&gt;
	ConsoleWrite(&amp;quot;Abrufen der mdisk Daten abgeschlossen!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
	;_ArrayDisplay($a_drives)&lt;br /&gt;
EndIf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; ### Schritt 5: in Textdatei ausgeben #######################################################################&lt;br /&gt;
; und das ganze in eine Text-Datei schreiben:&lt;br /&gt;
$h_Ausgabedatei = FileOpen($s_Ausgabedatei, 2)&lt;br /&gt;
If $h_Ausgabedatei = -1 Then&lt;br /&gt;
	ConsoleWrite(&amp;quot;Konnte Ausgabedatei &amp;#039;&amp;quot; &amp;amp; $s_Ausgabedatei &amp;amp; &amp;quot;&amp;#039; nicht erstellen!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
	Exit 1&lt;br /&gt;
EndIf&lt;br /&gt;
ConsoleWrite(&amp;quot;Schreibe Ausgabedatei: &amp;quot; &amp;amp; $s_Ausgabedatei &amp;amp; @CRLF)&lt;br /&gt;
ConsoleWrite(&amp;quot;Fortschritt .&amp;quot;)&lt;br /&gt;
$s_TempZeile = &amp;quot;&amp;quot;&lt;br /&gt;
If $b_mdiskinfos = False Then&lt;br /&gt;
	$i_drivesArrayDim = 26 ;mdisk Felder abschneiden&lt;br /&gt;
EndIf&lt;br /&gt;
For $i1 = 0 To ($i_drivesArrayDim -1)&lt;br /&gt;
	$s_TempZeile = $s_TempZeile &amp;amp; $a_drives[0][$i1] &amp;amp; $s_Trennzeichen&lt;br /&gt;
Next&lt;br /&gt;
$s_TempZeile = StringTrimRight($s_TempZeile, StringLen($s_Trennzeichen))&lt;br /&gt;
ConsoleWrite(&amp;quot;.&amp;quot;)&lt;br /&gt;
FileWriteLine($h_Ausgabedatei, $s_TempZeile)&lt;br /&gt;
$i1 = 1&lt;br /&gt;
While $a_drives[$i1][0] &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
	ConsoleWrite(&amp;quot;.&amp;quot;)&lt;br /&gt;
	$s_TempZeile = &amp;quot;&amp;quot;&lt;br /&gt;
	For $i2 = 0 To ($i_drivesArrayDim -1)&lt;br /&gt;
		$s_TempZeile = $s_TempZeile &amp;amp; $a_drives[$i1][$i2] &amp;amp; $s_Trennzeichen&lt;br /&gt;
	Next&lt;br /&gt;
	$s_TempZeile = StringTrimRight($s_TempZeile, StringLen($s_Trennzeichen))&lt;br /&gt;
	FileWriteLine($h_Ausgabedatei, $s_TempZeile)&lt;br /&gt;
	$i1 = $i1 + 1&lt;br /&gt;
WEnd&lt;br /&gt;
FileClose($h_Ausgabedatei)&lt;br /&gt;
ConsoleWrite(&amp;quot; Fertig!&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
&lt;br /&gt;
Exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kommentare==&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>BLinz</name></author>
	</entry>
</feed>