%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/library/OPNsense/System/Status/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/library/OPNsense/System/Status/DiskSpaceStatus.php |
<?php
/*
* Copyright (C) 2025 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\System\Status;
use OPNsense\System\AbstractStatus;
use OPNsense\System\SystemStatusCode;
use OPNsense\Core\Backend;
class DiskSpaceStatus extends AbstractStatus
{
public function __construct()
{
$this->internalPriority = 5;
$this->internalPersistent = true;
$this->internalTitle = gettext('Disk Space');
}
public function collectStatus()
{
/**
* If live media, disk space status should be muted,
* use the same (inverted) logic as LiveMediaStatus
*/
$file = '/.probe.for.readonly';
if (!file_exists($file)) {
return;
}
$fd = @fopen($file, 'w');
if (!$fd) {
return;
}
fclose($fd);
$backend = new Backend();
$output = json_decode($backend->configdRun('system diag disk'), true);
if (!isset($output['storage-system-information']) || !isset($output['storage-system-information']['filesystem'])) {
return;
}
foreach ($output['storage-system-information']['filesystem'] as $filesystem) {
if ($filesystem['mounted-on'] === '/') {
$used = $this->convertToGB($filesystem['used']);
$available = $this->convertToGB($filesystem['available']);
$usedPercent = intval($filesystem['used-percent']);
$totalSpace = $used + $available;
$warningThresholdGB = min(10, 0.2 * $totalSpace);
$errorThresholdGB = min(5, 0.1 * $totalSpace);
if ($available <= $warningThresholdGB && $available > $errorThresholdGB) {
$this->internalStatus = SystemStatusCode::WARNING;
$this->internalMessage = sprintf(
gettext('Disk space on the root filesystem is nearly full (' .
'%.2fG or %d%% used, %.2fG available). Please consider cleaning up or expanding storage.'),
$used,
$usedPercent,
$available
);
} elseif ($available <= $errorThresholdGB) {
$this->internalStatus = SystemStatusCode::ERROR;
$this->internalMessage = sprintf(
gettext('Disk space on the root filesystem is critically full (' .
'%.2fG or %d%% used, %.2fG available). Please consider cleaning up or expanding storage.'),
$used,
$usedPercent,
$available
);
}
break;
}
}
}
private function convertToGB($value)
{
preg_match('/([0-9.]+)([a-zA-Z]+)/', $value, $matches);
if (count($matches) < 3) {
return floatval($value);
}
$number = floatval($matches[1]);
$unit = strtoupper($matches[2]);
switch ($unit) {
case 'B':
return $number / 1024 / 1024 / 1024;
case 'K':
return $number / 1024 / 1024;
case 'M':
return $number / 1024;
case 'T':
return $number * 1024;
case 'P':
return $number * 1024 * 1024;
case 'E':
return $number * 1024 * 1024 * 1024;
default:
return $number; // Default GB
}
}
}