Sebastian Kraus — 11.07.2012
Da der von Ubuntu bereitgestellte SNMP-Server per Default kein Software-Raid (mdadm) unterstützt und abfragen kann, habe ich etwas nachgeholfen.
Folgendes PHP-Script liest den Status von /proc/mdstat aus und meldet ausgefallene Festplatten in einem Nagios-kompatiblen Format:
#!/usr/bin/php <?PHP $tmp = implode("", file("/proc/mdstat")); $pattern = "/md(.*?) : (.*?) (.*?) .*? .*?\[.*?\] \[(.*?)\]/ius"; preg_match_all($pattern, $tmp, $pt1); $degraded = 0; foreach($pt1[1] as $index=>$mdId) { $u = $pt1[4][$index]; $faulty = 0; for($i = 0; $i < strlen($u); $i++) { if(substr($u, $i, 1) != "U") { $faulty = 1; $degraded = "MD".$mdId; } } $md[$mdId] = array( 'device'=> "md".$mdId, 'status'=> $pt1[2][$index], 'level'=> $pt1[3][$index], 'disks'=> $pt1[4][$index], 'faulty'=> $faulty ); } if($degraded == "") { echo("OK: "); foreach($md as $mdinfo) { echo($mdinfo['device'].": ".$mdinfo['status']); echo(" [".$mdinfo['disks']."]; "); } } else { echo("CRITICAL: "); foreach($md as $mdinfo) { echo($mdinfo['device'].": ".$mdinfo['status']); echo(" [".$mdinfo['disks']."]; "); } } echo(" "); die(); ?>
Wird das Script ausgeführt, erhält man, bei einem funktionierendem RAID, folgende Ausgabe:
# ./checkraid.php
OK: md2: active [UUUUUUU]; md0: active [UUUUUUU]; md1: active [UUUUUUU];
Ein defektes Raid erwirkt die Ausgabe:
# ./checkraid.php
CRITICAL: md2: active [UUUUU_U]; md0: active [UUUUU_U]; md1: active [UUUUU_U];
In die SNMP-Konfiguration (/etc/snmp/snmpd.conf) lässt es sich folgendermaßen einbinden:
exec raid-status /bin/sh -c "/srv/snmp-raid-detect/checkraid.php"