Skip to content

Commit

Permalink
feature: Added web validation (#7474)
Browse files Browse the repository at this point in the history
* refactor: convert validations to modules to prep for gui integration

* accidentally dropped, schema update

* fix accidental output to webui

* mention discovery-wrapper.py and re-arrange.

* refine some fix statements

* rename the Config validation group to Configuration.

* fix some scrutinizer issues
remove as many local functions from validator.php as possible
move extensions from pre-check
remove duplicate timezone check
looks like there is some db schema differences between mariadb 10.1 and 10.2, investigating

* mariadb version diff take2

* Check schema version first for database.
Remove stop to go back to command line for install docs.
Add helpful link when there is no devices added to /addhost

* fix incorrect validation for empty string defaults

* Fix style

* Add additional file permissions checks

* catch exception and fail for invalid timezone
Change visuals a bit.

* add php version warning

* fix space
  • Loading branch information
murrant authored and laf committed Oct 26, 2017
1 parent 383557f commit 51ba934
Show file tree
Hide file tree
Showing 36 changed files with 3,278 additions and 1,665 deletions.
4 changes: 2 additions & 2 deletions LibreNMS/IRCBot.php
Expand Up @@ -171,7 +171,7 @@ private function init()
if ($this->config['irc_alert']) {
$this->alertData();
}

if ($this->config['irc_conn_timeout']) {
$inactive_seconds = time() - $this->last_activity;
$max_inactive = $this->config['irc_conn_timeout'];
Expand Down Expand Up @@ -677,7 +677,7 @@ private function _help($params)

private function _version($params)
{
$versions = version_info(false);
$versions = version_info();
$schema_version = $versions['db_schema'];
$version = substr($versions['local_sha'], 0, 7);

Expand Down
46 changes: 46 additions & 0 deletions LibreNMS/Interfaces/ValidationGroup.php
@@ -0,0 +1,46 @@
<?php
/**
* ValidationGroup.php
*
* An interface for validation groups, this will be run by Validator.
*
* 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 <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2017 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/

namespace LibreNMS\Interfaces;

use LibreNMS\Validator;

interface ValidationGroup
{
/**
* Validate this module.
* To return ValidationResults, call ok, warn, fail, or result methods on the $validator
*
* @param Validator $validator
*/
public function validate(Validator $validator);

/**
* Returns if this test should be run by default or not.
*
* @return bool
*/
public function isDefault();
}
198 changes: 198 additions & 0 deletions LibreNMS/ValidationResult.php
@@ -0,0 +1,198 @@
<?php
/**
* ValidationResult.php
*
* Encapsulates the result of a validation test.
*
* 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 <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2017 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/

namespace LibreNMS;

class ValidationResult
{
const FAILURE = 0;
const WARNING = 1;
const SUCCESS = 2;

private $message;
private $status;
private $list_description = '';
private $list;
private $fix;

/**
* ValidationResult constructor.
* @param string $message The message to describe this result
* @param int $status The status of this result FAILURE, WARNING, or SUCCESS
* @param string $fix a suggested fix to highlight for the user
*/
public function __construct($message, $status, $fix = null)
{
$this->message = $message;
$this->status = $status;
$this->fix = $fix;
}

/**
* Create a new ok Validation result
* @param string $message The message to describe this result
* @param string $fix a suggested fix to highlight for the user
* @return ValidationResult
*/
public static function ok($message, $fix = null)
{
return new self($message, self::SUCCESS, $fix);
}

/**
* Create a new warning Validation result
* @param string $message The message to describe this result
* @param string $fix a suggested fix to highlight for the user
* @return ValidationResult
*/
public static function warn($message, $fix = null)
{
return new self($message, self::WARNING, $fix);
}

/**
* Create a new failure Validation result
* @param string $message The message to describe this result
* @param string $fix a suggested fix to highlight for the user
* @return ValidationResult
*/
public static function fail($message, $fix = null)
{
return new self($message, self::FAILURE, $fix);
}

/**
* Returns the status an int representing
* ValidationResult::FAILURE, ValidationResult::WARNING, or ValidationResult::SUCCESS
*
* @return int
*/
public function getStatus()
{
return $this->status;
}

public function getMessage()
{
return $this->message;
}

public function hasList()
{
return !empty($this->list);
}

public function getList()
{
return $this->list;
}

public function setList($description, array $list)
{
$this->list_description = $description;
$this->list = $list;
return $this;
}

public function hasFix()
{
return !empty($this->fix);
}

public function getFix()
{
return $this->fix;
}

public function setFix($fix)
{
$this->fix = $fix;
return $this;
}

/**
* Print out this result to the console. Formatted nicely and with color.
*/
public function consolePrint()
{
c_echo(str_pad('[' . $this->getStatusText($this->status) . ']', 12) . $this->message . PHP_EOL);

if (isset($this->fix)) {
c_echo("\t[%BFIX%n] %B$this->fix%n\n");
}

if (!empty($this->list)) {
echo "\t" . $this->getListDescription() . ":\n";
$this->printList();
}
}

/**
* Get the colorized string that represents the status of a ValidatonResult
*
* @return string
*/
public static function getStatusText($status)
{
if ($status === self::SUCCESS) {
return '%gOK%n';
} elseif ($status === self::WARNING) {
return '%YWARN%n';
} elseif ($status === self::FAILURE) {
return '%RFAIL%n';
}
return 'Unknown';
}

public function getListDescription()
{
return $this->list_description;
}

/**
* Print a list of items up to a max amount
* If over that number, a line will print the total items
*
* @param string $format format as consumed by printf()
* @param int $max the max amount of items to print, default 15
*/
private function printList($format = "\t %s\n", $max = 15)
{
if (is_array(current($this->list))) {
$this->list = array_map(function ($item) {
return implode(' ', $item);
}, $this->list);
}

foreach (array_slice($this->list, 0, $max) as $item) {
printf($format, $item);
}

$extra = count($this->list) - $max;
if ($extra > 0) {
printf($format, " and $extra more...");
}
}
}
57 changes: 57 additions & 0 deletions LibreNMS/Validations/Configuration.php
@@ -0,0 +1,57 @@
<?php
/**
* Configuration.php
*
* Checks various config settings are correct.
*
* 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 <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2017 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/

namespace LibreNMS\Validations;

use LibreNMS\Config;
use LibreNMS\Interfaces\ValidationGroup;
use LibreNMS\Validator;

class Configuration implements ValidationGroup
{
/**
* Validate this module.
* To return ValidationResults, call ok, warn, fail, or result methods on the $validator
*
* @param Validator $validator
*/
public function validate(Validator $validator)
{
// Test transports
if (Config::get('alerts.email.enable') == true) {
$validator->warn('You have the old alerting system enabled - this is to be deprecated on the 1st of June 2015: https://groups.google.com/forum/#!topic/librenms-project/1llxos4m0p4');
}
}

/**
* Returns if this test should be run by default or not.
*
* @return bool
*/
public function isDefault()
{
return true;
}
}

0 comments on commit 51ba934

Please sign in to comment.