-
Thibault Debatty authoredThibault Debatty authored
Disks.php 2.99 KiB
<?php
namespace App\Sensor;
use \App\Sensor;
/**
* Description of Update
*
* @author tibo
*/
class Disks extends Sensor
{
const REGEXP = "/\\n([A-z\/0-9:\\-\\.]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)%\s*([A-z\/0-9]+)/";
public function report(array $records) : string
{
$record = end($records);
if (! isset($record->data['disks'])) {
return "<p>No data available...</p>";
}
$partitions = self::parse($record->data["disks"]);
$return = "<table class='table table-sm'>";
$return .= "<tr><th></th><th></th><th>Usage</th></tr>";
foreach ($partitions as $partition) {
$return .= "<tr><td>" . $partition->filesystem . "</td><td>"
. $partition->mounted . "</td><td>" . $partition->usedPercent()
. "%</td></tr>";
}
$return .= "</table>";
return $return;
}
public function status(array $records) : int
{
$record = end($records);
if (! isset($record->data['disks'])) {
return \App\Status::UNKNOWN;
}
$all_status = [];
foreach (self::parse($record->data["disks"]) as $partition) {
/* @var $partition Partition */
$status = \App\Status::OK;
if ($partition->usedPercent() > 80) {
$status = \App\Status::WARNING;
} elseif ($partition->usedPercent() > 95) {
$status = \App\Status::ERROR;
}
$all_status[] = $status;
}
return max($all_status);
}
public static $skip_fs = ["none", "tmpfs", "shm", "udev", "overlay", '/dev/loop'];
public static function parse(string $string) : array
{
$values = array();
preg_match_all(self::REGEXP, $string, $values);
$partitions = array();
$count = count($values[1]);
for ($i = 0; $i < $count; $i++) {
$fs = $values[1][$i];
if (self::shouldSkip($fs)) {
continue;
}
$partition = new Partition();
$partition->filesystem = $fs;
$partition->blocks = $values[2][$i];
$partition->used = $values[3][$i];
$partition->mounted = $values[6][$i];
$partitions[] = $partition;
}
return $partitions;
}
public static function fromRecord($record) : array
{
$partitions = self::parse($record->data["disks"]);
$time = $record->time;
foreach ($partitions as $partition) {
$partition->time = $time;
}
return $partitions;
}
public static function shouldSkip(string $fs) : bool
{
foreach (self::$skip_fs as $should_skip) {
if (self::startsWith($should_skip, $fs)) {
return true;
}
}
return false;
}
public static function startsWith(string $needle, string $haystack) : bool
{
return substr($haystack, 0, strlen($needle)) === $needle;
}
}