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"