HP Raidcontroller überwachen

Begonnen von chris1284, 03 Dezember 2016, 09:23:18

Vorheriges Thema - Nächstes Thema

chris1284

Hallo zusammen,

per console kann ich mit dem  hp-tool den status des controllers, des raids und der platten abfragen:

hpssacli ctrl all show config

ergebniss

ZitatSmart Array P410 in Slot 1                (sn: PACCRCN810D1QOZ)


   Port Name: 1I

   Port Name: 2I
   array A (SATA, Unused Space: 0  MB)


      logicaldrive 1 (3.6 TB, RAID 5, OK)

      physicaldrive 2I:0:5 (port 2I:box 0:bay 5, SATA, 2 TB, OK)
      physicaldrive 2I:0:6 (port 2I:box 0:bay 6, SATA, 2 TB, OK)
      physicaldrive 2I:0:7 (port 2I:box 0:bay 7, SATA, 2 TB, OK)

   SEP (Vendor ID PMCSIERA, Model  SRC 8x6G) 250  (WWID: 50014380131040CF)

wie kann ich das am besten in einen dummy schreiben? gibts da schon fertiges module? aktuell wüsste ich nicht welches modul geeignet wäre und bin eigentlich der meinung mir selber eine funktion schreiben zu müssen.

gruß
christian

Wernieman

Wenn Du meine persöhnliche Meinung wissen willst:

Meistens sind für solche Abfragen doch root rechte erforderlich. Schreibe Dir einen Cron-Job, der alle 5 (x) Minuten den Status abfragt und per telnet (set) den Status zu FHENM reinpusht ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

chris1284

ja, du hast recht. gestern hatte ich ein at angelegt und prompt die meldung fehlender rechte bekommen. fhem bekommt natürlich keine root-rechte von mir somit wird nur der job bleiben.

Wernieman

Und man muß nicht immer pullen, manchmal ist push einfach "besser" ;o)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

chris1284

ich habe es nun per perl script gelöst welches per cronjob aufgerufen wird. falls mal jemand ein ähnliches problem hat:
raid.pm

use IO::Socket::INET;
my $strCmdErg = `hpssacli ctrl all show config`;
my @arrCmdErg = split(/\n/, $strCmdErg );
#my $i = 0;
#print scalar(@arrCmdErg), " Felder im Array \n";

my @driveone = split(', ', $arrCmdErg[12] );
my @driveone_health = split('\)', $driveone[3] );
my @driveone_location = split('\(', $driveone[0] );
my @drivetwo = split(', ', $arrCmdErg[13] );
my @drivetwo_health = split('\)', $drivetwo[3] );
my @drivetwo_location = split('\(', $drivetwo[0] );
my @drivethree = split(', ', $arrCmdErg[14] );
my @drivethree_health = split('\)', $drivethree[3] );
my @drivethree_location = split('\(', $drivethree[0] );

my $HOSTNAME = "127.0.0.1";
my $HOSTPORT = "7072";
my $socket = IO::Socket::INET->new('PeerAddr' => $HOSTNAME,'PeerPort' => $HOSTPORT,'Proto' => 'tcp') ;
print $socket "setreading dummyRaidHealth controller ".$arrCmdErg[1]."\n";
#print $socket "setreading dummyRaidHealth p_0 ".$arrCmdErg[4]."\n";
print $socket "setreading dummyRaidHealth p_1 ".$arrCmdErg[6]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA ".$arrCmdErg[7]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_logicaldrive_1 ".$arrCmdErg[10]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_1_location ".$driveone_location[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_1_type ".$driveone[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_1_size ".$driveone[2]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_1_health ".$driveone_health[0]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_2_location ".$drivetwo_location[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_2_type ".$drivetwo[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_2_size ".$drivetwo[2]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_2_health ".$drivetwo_health[0]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_3_location ".$drivethree_location[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_3_type ".$drivethree[1]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_3_size ".$drivethree[2]."\n";
print $socket "setreading dummyRaidHealth p_1_arrA_physdrive_3_health ".$drivethree_health[0]."\n";
if (($driveone_health[0] eq "OK") && ($drivetwo_health[0] eq "OK") && ($drivethree_health[0] eq "OK")){
print $socket "setreading dummyRaidHealth state OK \n";}
else{print $socket "setreading dummyRaidHealth state ERROR \n";}
$socket->close;


list des devices:
Zitat
Internals:
   NAME       dummyRaidHealth
   NR         145
   STATE      OK
   TYPE       dummy
   Readings:
     2016-12-05 10:29:54   controller      Smart Array P410 in Slot 1                (sn: PACCRCN810D1QOZ)
     2016-12-05 10:29:54   p_1             Port Name: 2I
     2016-12-05 10:29:54   p_1_arrA        array A (SATA, Unused Space: 0  MB)
     2016-12-05 10:29:54   p_1_arrA_logicaldrive_1 logicaldrive 1 (3.6 TB, RAID 5, OK)
     2016-12-05 10:29:54   p_1_arrA_physdrive_1_health OK
     2016-12-05 10:29:54   p_1_arrA_physdrive_1_location port 2I:box 0:bay 5
     2016-12-05 10:29:54   p_1_arrA_physdrive_1_size 2 TB
     2016-12-05 10:29:54   p_1_arrA_physdrive_1_type SATA
     2016-12-05 10:29:54   p_1_arrA_physdrive_2_health OK
     2016-12-05 10:29:54   p_1_arrA_physdrive_2_location port 2I:box 0:bay 6
     2016-12-05 10:29:54   p_1_arrA_physdrive_2_size 2 TB
     2016-12-05 10:29:54   p_1_arrA_physdrive_2_type SATA
     2016-12-05 10:29:54   p_1_arrA_physdrive_3_health OK
     2016-12-05 10:29:54   p_1_arrA_physdrive_3_location port 2I:box 0:bay 7
     2016-12-05 10:29:54   p_1_arrA_physdrive_3_size 2 TB
     2016-12-05 10:29:54   p_1_arrA_physdrive_3_type SATA
     2016-12-05 10:29:54   state           OK
Attributes:
   DbLogExclude .*
   room       dummy


chris1284

wenn ich das skript per hand ausführe läuft alles einwandfrei . wenn cron das macht wird nur state aktualisiert (also wird offenbar das hp-tool nicht ausgeführt).
leider konnte ich keine logs vom job finden. irgendwelche ideen den fehler zu finden?

Wernieman

Wenn Du ein Script per Cron aufrufst, sind die Umgebungsvariablen nicht gesetzt, er findet also das hp-tool nicht, da der PATH nicht gesetzt.

Du hast jetzt 2 Möglichkeiten (eigentlich noch mehr)
1. Umgebungsvariablen setzen lassen
2. (besser): Volle Pfadangaben in einem Cron-Script!
Du kannst übrigens rausfinden, wo etwas luegt per whereis. Also in Deinem Falle: "whereis hpssacli"

Generell gilt: Volle Pfadangaben in einem Script sind zu bevorzugen. Sonst macht man es "den Bösen" doch etwas zu leicht ....  8)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

chris1284

jawohl, danke, das mit der pfadangabe wars! ;D