ISPConfig 3: Adaptec RAID-Status im Monitoring anzeigen

ISPConfig hat eine praktische Funktion im Backend: Es zeigt wichtige Informationen über den Systemstatus an, so unter anderem auch den Status des Software- oder Hardware-RAIDs. Leider wird bisher nur mdraid (Software), mpt-status (LSI), sowie tw_cli (3ware) unterstützt, ich besitze allerdings einen Server mit einem Adaptec-RAID, welches mit dem Tool arcconf überwacht werden kann.

Den Status Quo fand ich also nicht so toll und fand auch keine fertigen Lösungen, die auf eine aktuelle Version (derzeit 3.0.5.4p5) von ISPConfig passen. Also erweiterte ich die Abfrage und stelle sie nun hier zur Verfügung.

Voraussetzung: die Datei arcconf muss auf dem Server im Verzeichnis /sbin vorhanden sein.

ISPConfig ist modular aufgebaut, die Abfrage des Systemstatus wird über die Datei monitor_core_module.inc.php im Ordner /usr/local/ispconfig/server/mods-available realisiert, diese fragt allerdings nur Daten aus den monitor_tools ab, welche sich in der Datei monitor_tools.inc.php im Ordner /usr/local/ispconfig/server/lib/classes befindet.

Hier findet sich auch die Funktion monitorRaid(), welche hier benötigt wird. Hier suchen wir folgende Zeile (am Anfang der Funktion):

/*
* Check, if Software-RAID is enabled
*/

Davor fügen wir nun die Abfrage von arcconf ein:

/*
* Check, if arcconf is present
*/
if (file_exists('/sbin/arcconf')) {
	/*
	* Fetch the output
	*/
	$data['output'] = shell_exec('arcconf GETCONFIG 1 LD');
	$state = 'ok';
	if(is_array($data['output'])) {
		foreach ($data['output'] as $item) {
			/*
			* The output contains information for every RAID and every HDD.
			* We only need the state of the RAID
			*/
			if (strpos($item, 'Logical device name                      : RAID') !== false) {
				/*
				* We found a raid, process the state of it
				*/
				if (strpos($item, 'Optimal') !== false) {
					$this->_setState($state, 'ok');
				} else {
					/* we don't know the state. so we set the state to critical, that the
					* admin is warned, that something is wrong
					*/
					$this->_setState($state, 'critical');
				}
			}					
		}
	}
}

Ich habe versucht, mich an die in der Datei vorhandenen Strukturen zu halten. Der Code prüft, ob die Datei /sbin/arcconf existiert. Wenn ja, führt es die Datei mit den Parametern GETCONFIG 1 LD aus, was uns die Info über den RAID-Controller zurück gibt.

Adaptec RAID: Ausgabe von arcconf wird im ISPConfig-Monitoring angezeigt
Adaptec RAID: Ausgabe von arcconf wird im ISPConfig-Monitoring angezeigt

Nun wird geprüft, ob der Controller ein RAID enthält und dann, ob der Status „Optimal“ ist. Wenn ja, wird $state als „ok“ zurück gegeben, wenn nein, als „critical“. Meine Ausgabe kennt bisher nur diese beiden Stadien, da ich leider bisher die anderen Outputs von arcconf nicht kenne (falls sie mir jemand nennen kann: bitte einen Kommentar hinterlassen). Mir reicht das bisher so, wenn das RAID nicht optimal ist, bekomme ich so eine kritische Warnung.

Fragen und Anregungen nehme ich natürlich immer gerne in den Kommentaren entgegen.