%PDF- %PDF-
| Direktori : /proc/self/root/backups/router/usr/local/opnsense/mvc/app/library/OPNsense/System/ |
| Current File : //proc/self/root/backups/router/usr/local/opnsense/mvc/app/library/OPNsense/System/SystemStatus.php |
<?php
/*
* Copyright (C) 2022-2024 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;
/**
* SystemStatus: Crawl through the \OPNsense\System\Status namespace and
* instantiate every class that correctly extends AbstractStatus. Every created
* object is responsible for detecting problems in its own defined category.
*/
class SystemStatus
{
/**
* @throws \Exception
*/
private function collectClasses()
{
$objectMap = [];
$all = glob(__DIR__ . '/Status/*.php');
$classes = array_map(function ($file) {
if (strpos($file, 'Status') !== false) {
return '\\OPNsense\\System\\Status\\' . basename($file, '.php');
}
}, $all);
$statuses = array_filter($classes, function ($class) {
return class_exists($class) && is_subclass_of($class, '\\OPNsense\\System\\AbstractStatus');
});
foreach ($statuses as $statusClass) {
$obj = new $statusClass();
$reflect = new \ReflectionClass($obj);
$shortName = strtolower(str_replace('Status', '', $reflect->getShortName()));
if ($shortName == 'System') {
/* reserved for front-end usage */
throw new \Exception("SystemStatus classname is reserved");
}
$objectMap[$shortName] = $obj;
}
return $objectMap;
}
public function collectStatus($scope = null)
{
$result = [];
$objectMap = $this->collectClasses();
foreach ($objectMap as $shortName => $obj) {
$objScope = $obj->getScope();
if (!empty($objScope) && !$this->matchPath($scope, $objScope)) {
/* don't probe if unnecessary */
continue;
}
$obj->collectStatus();
if ($obj->getStatus() == SystemStatusCode::OK) {
continue;
}
$result[$shortName] = [
'title' => $obj->getTitle(),
'statusCode' => $obj->getStatus(),
'message' => $obj->getMessage(),
'location' => $obj->getLocation(),
'timestamp' => $obj->getTimestamp(),
'persistent' => $obj->getPersistent(),
'isBanner' => $obj->isBanner(),
'priority' => $obj->getPriority(),
'scope' => $obj->getScope(),
];
}
return $result;
}
public function dismissStatus($subsystem)
{
$objectMap = $this->collectClasses();
if (array_key_exists($subsystem, $objectMap) && !$objectMap[$subsystem]->getPersistent()) {
$objectMap[$subsystem]->dismissStatus();
}
}
private function matchPath($input, $paths)
{
foreach ($paths as $path) {
$pattern = preg_quote($path, '/');
$pattern = str_replace('\*', '.*', $pattern);
if (preg_match('/^' . $pattern . '$/', $input)) {
return true;
}
}
return false;
}
}