Files
librenms-librenms/LibreNMS/Validations/Poller/CheckPythonWrapper.php
Tony Murray 1c2e446326 New Poller validations (#14148)
* New Poller validations
Seperated poller and distributed poller validations to make poller validations generally available
One auto fixer added
Translatable strings

* lint and style fixes

* and style

* and style

* Update LibreNMS/Validations/Poller/CheckLocking.php

Co-authored-by: Jellyfrog <Jellyfrog@users.noreply.github.com>

* Update CheckPythonWrapper.php

* Try to check if cron is even installed before warning about not being able to read the cron files.
Likely most systems they won't be readable, but also, it is very unlikely we hit the cron check and it is meaningfully different than the first Poller::exists() check.

* Work on poller validation
Remove errors/warnings when at least one poller of the other type is active.

* style fixes

Co-authored-by: Jellyfrog <Jellyfrog@users.noreply.github.com>
2022-08-02 16:02:37 -05:00

112 lines
3.7 KiB
PHP

<?php
/**
* CheckPythonWrapper.php
*
* -Description-
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* @link https://www.librenms.org
*
* @copyright 2022 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/
namespace LibreNMS\Validations\Poller;
use App\Models\Poller;
use App\Models\PollerCluster;
use LibreNMS\Config;
use LibreNMS\ValidationResult;
class CheckPythonWrapper implements \LibreNMS\Interfaces\Validation
{
/** @var bool */
private $could_not_check_cron = false;
/**
* @inheritDoc
*/
public function validate(): ValidationResult
{
if (Poller::exists()) {
return $this->checkPythonWrapper();
}
// check if cron is installed, then try to check if the cron entries are enabled.
$cron = Config::locateBinary('cron');
if ($cron !== 'cron') { // cron is installed
if ($this->wrapperCronEnabled()) {
return $this->checkPythonWrapper();
}
if ($this->could_not_check_cron) {
return ValidationResult::info(trans('validation.validations.poller.CheckPythonWrapper.cron_unread'));
}
$status = PollerCluster::isActive()->exists() ? ValidationResult::SUCCESS : ValidationResult::FAILURE;
return new ValidationResult(trans('validation.validations.poller.CheckPythonWrapper.not_detected'), $status);
}
$status = PollerCluster::isActive()->exists() ? ValidationResult::SUCCESS : ValidationResult::FAILURE;
return new ValidationResult(trans('validation.validations.poller.CheckPythonWrapper.no_pollers'), $status);
}
/**
* @inheritDoc
*/
public function enabled(): bool
{
return true;
}
private function checkPythonWrapper(): ValidationResult
{
if (! Poller::isActive()->exists()) {
$status = PollerCluster::isActive()->exists() ? ValidationResult::SUCCESS : ValidationResult::FAILURE;
return new ValidationResult(trans('validation.validations.poller.CheckPythonWrapper.fail'), $status);
}
$inactive_pollers = Poller::isInactive()->get();
if ($inactive_pollers->isNotEmpty()) {
return ValidationResult::fail(trans('validation.validations.poller.CheckPythonWrapper.nodes_down'))
->setList('Inactive Nodes', $inactive_pollers->pluck('poller_name')->toArray());
}
return ValidationResult::ok(trans('validation.validations.poller.CheckPythonWrapper.ok'));
}
private function wrapperCronEnabled(): bool
{
$files = glob('/etc/cron.d/*');
$files[] = '/etc/crontab';
$files[] = '/var/spool/cron/crontabs/librenms';
$this->could_not_check_cron = true; // set this in case we can't read any cron files
$cron_entries = array_reduce($files, function ($entries, $file) {
if (is_readable($file)) {
$entries .= file_get_contents($file) . PHP_EOL;
$this->could_not_check_cron = false;
}
return $entries;
}, '');
return (bool) preg_match('/^\s*[^#].*poller-wrapper\.py/', $cron_entries);
}
}