FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: chris1284 am 20 August 2017, 20:08:18

Titel: zfs überwachen
Beitrag von: chris1284 am 20 August 2017, 20:08:18
wer ein zfs am laufen hat und in fhem gerne zb bei plattenausfall eine info bekommen will kann sich zb an folgendem script orientieren.
es ist für einen pool mit 2 mirror zu je 2 platten erstellt und ehr als beispiel zu sehen. Ich lasse mich per push informieren wenn der status des dummy ERROR ist (also wenn der pool != online oder einer der mirrors). man kann dies im if/else auch noch um die einzelnen mirrordevs erweitern
zyklische ausführung des scripts alle 10 minuten per cronjob (eintrag per crontab -e)

*/10 * * * * perl /opt/fhem/scripts/zfs_status.pm

script:

use IO::Socket::INET;
my $strCmdErg = `/sbin/zpool status`;
my @arrCmdErg = split(/\n/, $strCmdErg );
my @pool = split(': ', $arrCmdErg[0] );
my @state = split(': ', $arrCmdErg[1] );
my @scan = split(': ', $arrCmdErg[2] );
my @mirror0 = split('  ', $arrCmdErg[7] );
my @mirror0dev1 = split('  ', $arrCmdErg[8] );
my @mirror0dev2 = split('  ', $arrCmdErg[9] );
my @mirror1 = split('  ', $arrCmdErg[10] );
my @mirror1dev1 = split('  ', $arrCmdErg[11] );
my @mirror1dev2 = split('  ', $arrCmdErg[12] );

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 pool0name ".$pool[1]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."state ".$state[1]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."poolscan ".$scan[1]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror0 ".$mirror0[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror0dev1 ".$mirror0dev1[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror0dev2 ".$mirror0dev2[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror0dev1state ".$mirror0dev1[4]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror0dev2state ".$mirror0dev2[4]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror1 ".$mirror1[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror1dev1 ".$mirror1dev1[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror1dev2 ".$mirror1dev2[2]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror1dev1state ".$mirror1dev1[4]."\n";
print $socket "setreading dummyRaidHealth ".$pool[1]."mirror1dev2state ".$mirror1dev2[4]."\n";
if (($state[1] eq "ONLINE") && ($mirror0[2] eq "ONLINE") && ($mirror0[2] eq "ONLINE")){
print $socket "setreading dummyRaidHealth state OK \n";}
else{print $socket "setreading dummyRaidHealth state ERROR \n";}
$socket->close;


evtl hilft es jemanden.
Titel: Antw:zfs überwachen
Beitrag von: Chaos am 26 Oktober 2017, 15:46:14
Hi,

Danke für die tolle Vorarbeit.
Hat mir echt Arbeit erspart, auch wenn ich das Skript ein wenig anpassend muss, da ich raidz verwende.

Ist das nicht ein wenig "falsch"bei?
if (($state[1] eq "ONLINE") && ($mirror0[2] eq "ONLINE") && ($mirror0[2] eq "ONLINE")){

MfG
Manuel