Move Config loading to a service provider (#13927)

* Move Config loading to a service provider
That way other service providers can depend on it
Move various random listener registrations into the EventServiceProvider
Various startup cleanup

* Config::persist Set live variable before persisting incase db update fail

* Disable strict mode for legacy code (init.php)

* Disable debug after os test data is gathered

* remove Eloquent::boot it is never used

* remove Eloquent::version

* lint fixes

* style fixes

* there is no c_echo here
This commit is contained in:
Tony Murray 2022-04-22 19:12:07 -05:00 committed by GitHub
parent d4479e12dd
commit 014213680f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 251 additions and 352 deletions

View File

@ -31,7 +31,6 @@ use Illuminate\Database\QueryException;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use LibreNMS\Data\Store\Rrd;
use LibreNMS\DB\Eloquent;
use LibreNMS\Util\Debug;
use LibreNMS\Util\Version;
use Log;
@ -254,11 +253,11 @@ class Config
public static function persist($key, $value)
{
try {
Arr::set(self::$config, $key, $value);
\App\Models\Config::updateOrCreate(['config_name' => $key], [
'config_name' => $key,
'config_value' => $value,
]);
Arr::set(self::$config, $key, $value);
// delete any children (there should not be any unless it is legacy)
\App\Models\Config::query()->where('config_name', 'like', "$key.%")->delete();
@ -338,10 +337,6 @@ class Config
*/
private static function loadDB()
{
if (! Eloquent::isConnected()) {
return;
}
try {
\App\Models\Config::get(['config_name', 'config_value'])
->each(function ($item) {
@ -462,15 +457,10 @@ class Config
self::persist('device_display_default', $display_value);
}
$persist = Eloquent::isConnected();
// make sure we have full path to binaries in case PATH isn't set
foreach (['fping', 'fping6', 'snmpgetnext', 'rrdtool', 'traceroute', 'traceroute6'] as $bin) {
if (! is_executable(self::get($bin))) {
if ($persist) {
self::persist($bin, self::locateBinary($bin));
} else {
self::set($bin, self::locateBinary($bin));
}
self::persist($bin, self::locateBinary($bin));
}
}

View File

@ -25,59 +25,19 @@
namespace LibreNMS\DB;
use Dotenv\Dotenv;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Database\Events\StatementPrepared;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Arr;
use DB;
use Illuminate\Database\Connection;
use LibreNMS\Util\Laravel;
use PDOException;
class Eloquent
{
/** @var Capsule static reference to capsule */
private static $capsule;
public static function boot()
{
// boot Eloquent outside of Laravel
if (! Laravel::isBooted() && is_null(self::$capsule)) {
$install_dir = realpath(__DIR__ . '/../../');
Dotenv::createMutable($install_dir)->load();
$db_config = include $install_dir . '/config/database.php';
$settings = $db_config['connections'][$db_config['default']];
self::$capsule = new Capsule;
self::$capsule->addConnection($settings);
self::$capsule->setEventDispatcher(new Dispatcher());
self::$capsule->setAsGlobal();
self::$capsule->bootEloquent();
}
self::initLegacyListeners();
self::setStrictMode(false); // set non-strict mode if for legacy code
}
public static function initLegacyListeners()
{
if (self::isConnected()) {
// set FETCH_ASSOC for queries that required by setting the global variable $PDO_FETCH_ASSOC (for dbFacile)
self::DB()->getEventDispatcher()->listen(StatementPrepared::class, function ($event) {
global $PDO_FETCH_ASSOC;
if ($PDO_FETCH_ASSOC) {
$event->statement->setFetchMode(\PDO::FETCH_ASSOC);
}
});
}
}
/**
* Set the strict mode for the current connection (will not persist)
*
* @param bool $strict
*/
public static function setStrictMode($strict = true)
public static function setStrictMode(bool $strict = true): void
{
if (self::isConnected() && self::getDriver() == 'mysql') {
if ($strict) {
@ -88,14 +48,16 @@ class Eloquent
}
}
public static function isConnected($name = null)
public static function isConnected(?string $name = null): bool
{
try {
$conn = self::DB($name);
if ($conn) {
return ! is_null($conn->getPdo());
$conn->getPdo();
return true;
}
} catch (\PDOException $e) {
} catch (PDOException $e) {
return false;
}
@ -105,31 +67,39 @@ class Eloquent
/**
* Access the Database Manager for Fluent style queries. Like the Laravel DB facade.
*
* @param string $name
* @param string|null $name
* @return \Illuminate\Database\Connection|null
*/
public static function DB($name = null)
public static function DB(?string $name = null): ?Connection
{
// check if Laravel is booted
if (Laravel::isBooted()) {
return \DB::connection($name);
return DB::connection($name);
}
if (is_null(self::$capsule)) {
return null;
}
return self::$capsule->getDatabaseManager()->connection($name);
return null;
}
public static function getDriver()
public static function getDriver(): ?string
{
$connection = config('database.default');
return config("database.connections.{$connection}.driver");
}
public static function setConnection($name, $db_host = null, $db_user = '', $db_pass = '', $db_name = '', $db_port = null, $db_socket = null)
/**
* Set the active connection, used during install
*
* @param string $name
* @param string $db_host
* @param string $db_user
* @param string $db_pass
* @param string $db_name
* @param int|string $db_port
* @param string $db_socket
* @return void
*/
public static function setConnection($name, $db_host = null, $db_user = '', $db_pass = '', $db_name = '', $db_port = null, $db_socket = null): void
{
\Config::set("database.connections.$name", [
'driver' => 'mysql',
@ -147,9 +117,4 @@ class Eloquent
]);
\Config::set('database.default', $name);
}
public static function version($name = null)
{
return Arr::first(self::DB($name)->selectOne('select version()'));
}
}

View File

@ -602,7 +602,7 @@ class IRCBot
{
if (! Eloquent::isConnected()) {
try {
Eloquent::boot();
Eloquent::DB()->statement('SELECT VERSION()');
} catch (\PDOException $e) {
$this->log('Cannot connect to MySQL: ' . $e->getMessage());

View File

@ -43,6 +43,7 @@ use LibreNMS\Util\Debug;
use LibreNMS\Util\Dns;
use LibreNMS\Util\Git;
use LibreNMS\Util\StringHelpers;
use LibreNMS\Util\Version;
use Psr\Log\LoggerInterface;
use Throwable;
@ -371,7 +372,7 @@ EOH,
Git::localDate(),
vsprintf('%s (%s)', $version->database()),
phpversion(),
\LibreNMS\DB\Eloquent::isConnected() ? \LibreNMS\DB\Eloquent::version() : '?',
Version::get()->databaseServer(),
$version->rrdtool(),
$version->netSnmp()
));

View File

@ -26,20 +26,16 @@
namespace LibreNMS\Util;
use App;
use Illuminate\Database\Events\QueryExecuted;
use LibreNMS\DB\Eloquent;
use Log;
class Debug
{
/**
* @var bool
*/
/** @var bool */
private static $debug = false;
/**
* @var bool
*/
/** @var bool */
private static $verbose = false;
/** @var bool */
private static $sql_debug_enabled = false;
/**
* Enable/disable debug output
@ -52,8 +48,6 @@ class Debug
{
self::$debug = (bool) $debug;
restore_error_handler(); // disable Laravel error handler
if (self::$debug) {
self::enableErrorReporting();
self::enableCliDebugOutput();
@ -92,18 +86,15 @@ class Debug
public static function disableQueryDebug(): void
{
$db = Eloquent::DB();
if ($db) {
// remove all query executed event handlers
$db->getEventDispatcher()->flush('Illuminate\Database\Events\QueryExecuted');
}
self::$sql_debug_enabled = false;
}
public static function enableCliDebugOutput(): void
{
if (Laravel::isBooted() && App::runningInConsole()) {
Log::setDefaultDriver('console_debug');
} else {
putenv('LOG_CHANNEL=console_debug');
}
}
@ -116,28 +107,12 @@ class Debug
public static function enableQueryDebug(): void
{
static $sql_debug_enabled;
$db = Eloquent::DB();
self::$sql_debug_enabled = true;
}
if ($db && ! $sql_debug_enabled) {
$db->listen(function (QueryExecuted $query) {
// collect bindings and make them a little more readable
$bindings = collect($query->bindings)->map(function ($item) {
if ($item instanceof \Carbon\Carbon) {
return $item->toDateTimeString();
}
return $item;
})->toJson();
if (Laravel::isBooted()) {
Log::debug("SQL[%Y{$query->sql} %y$bindings%n {$query->time}ms] \n", ['color' => true]);
} else {
c_echo("SQL[%Y{$query->sql} %y$bindings%n {$query->time}ms] \n");
}
});
$sql_debug_enabled = true;
}
public static function queryDebugIsEnabled(): bool
{
return self::$sql_debug_enabled;
}
/**

View File

@ -25,7 +25,9 @@
namespace LibreNMS\Util;
use DB;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Arr;
use LibreNMS\Config;
use LibreNMS\DB\Eloquent;
use Symfony\Component\Process\Process;
@ -100,7 +102,7 @@ class Version
public function databaseServer(): string
{
return \LibreNMS\DB\Eloquent::isConnected() ? \LibreNMS\DB\Eloquent::version() : 'Not Connected';
return Eloquent::isConnected() ? Arr::first(DB::selectOne('select version()')) : 'Not Connected';
}
public function database(): array

View File

@ -100,7 +100,7 @@ class Database extends BaseValidation
private function checkVersion(Validator $validator)
{
$version = Eloquent::version();
$version = \LibreNMS\Util\Version::get()->databaseServer();
$version = explode('-', $version);
if (isset($version[1]) && $version[1] == 'MariaDB') {

View File

@ -53,7 +53,6 @@ use App\Models\WirelessSensor;
use Illuminate\Http\Request;
use LibreNMS\Config;
use LibreNMS\Data\Store\Rrd;
use LibreNMS\DB\Eloquent;
use LibreNMS\Util\Version;
class AboutController extends Controller
@ -73,7 +72,7 @@ class AboutController extends Controller
'project_name' => Config::get('project_name'),
'version_local' => $version->local(),
'version_mysql' => Eloquent::version(),
'version_mysql' => $version->databaseServer(),
'version_php' => phpversion(),
'version_laravel' => App::VERSION(),
'version_python' => $version->python(),

View File

@ -28,12 +28,10 @@ use Config;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event;
use Laravel\Socialite\Contracts\User as SocialiteUser;
use Laravel\Socialite\Facades\Socialite;
use LibreNMS\Config as LibreNMSConfig;
use LibreNMS\Exceptions\AuthenticationException;
use Log;
class SocialiteController extends Controller
{
@ -45,23 +43,6 @@ class SocialiteController extends Controller
$this->injectConfig();
}
public static function registerEventListeners(): void
{
foreach (LibreNMSConfig::get('auth.socialite.configs', []) as $provider => $config) {
// Treat not set as "disabled"
if (! isset($config['listener'])) {
continue;
}
$listener = $config['listener'];
if (class_exists($listener)) {
Event::listen(\SocialiteProviders\Manager\SocialiteWasCalled::class, "$listener@handle");
} else {
Log::error("Wrong value for auth.socialite.configs.$provider.listener set, class: '$listener' does not exist!");
}
}
}
/**
* @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/

View File

@ -0,0 +1,33 @@
<?php
namespace App\Listeners;
use Illuminate\Database\Events\StatementPrepared;
class LegacyQueryListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* set FETCH_ASSOC for queries that required by setting the global variable $PDO_FETCH_ASSOC (for dbFacile)
*
* @param \Illuminate\Database\Events\StatementPrepared $event
* @return void
*/
public function handle(StatementPrepared $event)
{
global $PDO_FETCH_ASSOC;
if ($PDO_FETCH_ASSOC) {
$event->statement->setFetchMode(\PDO::FETCH_ASSOC);
}
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
use LibreNMS\Util\Debug;
use Log;
class QueryDebugListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param \Illuminate\Database\Events\QueryExecuted $query
* @return void
*/
public function handle(QueryExecuted $query)
{
if (Debug::queryDebugIsEnabled()) {
// collect bindings and make them a little more readable
$bindings = collect($query->bindings)->map(function ($item) {
if ($item instanceof \Carbon\Carbon) {
return $item->toDateTimeString();
}
return $item;
})->toJson();
Log::debug("SQL[%Y{$query->sql} %y$bindings%n {$query->time}ms] \n", ['color' => true]);
}
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Listeners;
use App\Polling\Measure\Measurement;
use App\Polling\Measure\MeasurementManager;
use Illuminate\Database\Events\QueryExecuted;
class QueryMetricListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param \Illuminate\Database\Events\QueryExecuted $event
* @return void
*/
public function handle(QueryExecuted $event)
{
$type = strtolower(substr($event->sql, 0, strpos($event->sql, ' ')));
app(MeasurementManager::class)->recordDb(Measurement::make($type, $event->time ? $event->time / 100 : 0));
}
}

View File

@ -25,8 +25,6 @@
namespace App\Polling\Measure;
use DB;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Collection;
use Log;
@ -51,17 +49,6 @@ class MeasurementManager
}
}
/**
* Register DB listener to record sql query stats
*/
public function listenDb(): void
{
DB::listen(function (QueryExecuted $event) {
$type = strtolower(substr($event->sql, 0, strpos($event->sql, ' ')));
$this->recordDb(Measurement::make($type, $event->time ? $event->time / 100 : 0));
});
}
/**
* Update statistics for the given category
*/

View File

@ -3,7 +3,6 @@
namespace App\Providers;
use App\Models\Sensor;
use App\Polling\Measure\MeasurementManager;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Log;
@ -46,15 +45,10 @@ class AppServiceProvider extends ServiceProvider
*
* @return void
*/
public function boot(MeasurementManager $measure)
public function boot()
{
$measure->listenDb();
\Illuminate\Pagination\Paginator::useBootstrap();
$this->app->booted('\LibreNMS\DB\Eloquent::initLegacyListeners');
$this->app->booted('\LibreNMS\Config::load');
$this->app->booted('\App\Http\Controllers\Auth\SocialiteController::registerEventListeners');
$this->bootCustomBladeDirectives();
$this->bootCustomValidators();
$this->configureMorphAliases();

View File

@ -0,0 +1,29 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use LibreNMS\Config;
class ConfigServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
Config::load();
}
}

View File

@ -23,6 +23,13 @@ class EventServiceProvider extends ServiceProvider
\App\Listeners\CheckAlerts::class,
\App\Listeners\UpdateDeviceGroups::class,
],
\Illuminate\Database\Events\QueryExecuted::class => [
\App\Listeners\QueryDebugListener::class,
\App\Listeners\QueryMetricListener::class,
],
\Illuminate\Database\Events\StatementPrepared::class => [
\App\Listeners\LegacyQueryListener::class,
],
];
/**

View File

@ -0,0 +1,41 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use LibreNMS\Config;
class SocialiteListenersServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
foreach (Config::get('auth.socialite.configs', []) as $provider => $config) {
// Treat not set as "disabled"
if (! isset($config['listener'])) {
continue;
}
$listener = $config['listener'];
if (class_exists($listener)) {
$this->app['events']->listen(\SocialiteProviders\Manager\SocialiteWasCalled::class, "$listener@handle");
} else {
$this->app['log']->error("Wrong value for auth.socialite.configs.$provider.listener set, class: '$listener' does not exist!");
}
}
}
}

View File

@ -176,7 +176,7 @@ return [
\SocialiteProviders\Manager\ServiceProvider::class,
/*
* Application Service Providers...
* LibreNMS Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\CliServiceProvider::class,
@ -184,12 +184,12 @@ return [
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\ConfigServiceProvider::class,
App\Providers\SocialiteListenersServiceProvider::class,
App\Providers\ComposerServiceProvider::class,
App\Providers\DatastoreServiceProvider::class,
/*
* LibreNMS Service Providers...
*/
App\Providers\SnmptrapProvider::class,
App\Providers\PluginProvider::class,
],

View File

@ -386,8 +386,6 @@ if ($options['f'] === 'recalculate_device_dependencies') {
$lock = Cache::lock('recalculate_device_dependencies', 86000);
if ($lock->get()) {
\LibreNMS\DB\Eloquent::boot();
// update all root nodes and recurse, chunk so we don't blow up
Device::doesntHave('parents')->with('children')->chunk(100, function (Collection $devices) {
// anonymous recursive function

View File

@ -22,73 +22,8 @@
use Illuminate\Database\QueryException;
use LibreNMS\DB\Eloquent;
use LibreNMS\Exceptions\DatabaseConnectException;
use LibreNMS\Util\Laravel;
/**
* @deprecated Please use Eloquent instead; https://laravel.com/docs/eloquent
* @see https://laravel.com/docs/eloquent
*/
function dbIsConnected()
{
return Eloquent::isConnected();
}
/**
* Connect to the database.
* Will use global config variables if they are not sent: db_host, db_user, db_pass, db_name, db_port, db_socket
*
* @param string $db_host
* @param string $db_user
* @param string $db_pass
* @param string $db_name
* @param string $db_port
* @param string $db_socket
* @return \Illuminate\Database\Connection
*
* @throws DatabaseConnectException
*
* @deprecated Please use Eloquent instead; https://laravel.com/docs/eloquent
* @see https://laravel.com/docs/eloquent
*/
function dbConnect($db_host = null, $db_user = '', $db_pass = '', $db_name = '', $db_port = null, $db_socket = null)
{
if (Eloquent::isConnected()) {
return Eloquent::DB();
}
if (! extension_loaded('pdo_mysql')) {
throw new DatabaseConnectException('PHP pdo_mysql extension not loaded!');
}
try {
if (! is_null($db_host) || ! empty($db_name)) {
// legacy connection override
\Config::set('database.connections.setup', [
'driver' => 'mysql',
'host' => $db_host,
'port' => $db_port,
'database' => $db_name,
'username' => $db_user,
'password' => $db_pass,
'unix_socket' => $db_socket,
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
]);
\Config::set('database.default', 'setup');
}
Eloquent::boot();
} catch (PDOException $e) {
throw new DatabaseConnectException($e->getMessage(), $e->getCode(), $e);
}
return Eloquent::DB();
}
/**
* Performs a query using the given string.
*

View File

@ -30,6 +30,7 @@
use LibreNMS\Authentication\LegacyAuth;
use LibreNMS\Config;
use LibreNMS\Util\Debug;
use LibreNMS\Util\Laravel;
global $vars, $console_color;
@ -77,22 +78,18 @@ if (module_selected('polling', $init_modules)) {
require_once $install_dir . '/includes/polling/functions.inc.php';
}
if (module_selected('alerts', $init_modules)) {
require_once $install_dir . '/LibreNMS/Alert/RunAlerts.php';
}
Debug::set($debug ?? false); // disable debug initially
// Boot Laravel
if (module_selected('web', $init_modules)) {
\LibreNMS\Util\Laravel::bootWeb(module_selected('auth', $init_modules));
Laravel::bootWeb(module_selected('auth', $init_modules));
} else {
\LibreNMS\Util\Laravel::bootCli();
Laravel::bootCli();
}
Debug::set(false); // disable debug initially (hides legacy errors too)
Debug::set($debug ?? false); // override laravel configured settings (hides legacy errors too)
restore_error_handler(); // disable Laravel error handler
if (! module_selected('nodb', $init_modules)) {
\LibreNMS\DB\Eloquent::boot();
if (! \LibreNMS\DB\Eloquent::isConnected()) {
echo "Could not connect to database, check logs/librenms.log.\n";
@ -104,18 +101,7 @@ if (! module_selected('nodb', $init_modules)) {
exit;
}
}
// Display config.php errors instead of http 500
$display_bak = ini_get('display_errors');
ini_set('display_errors', 1);
// Load config if not already loaded (which is the case if inside Laravel)
if (! Config::has('install_dir')) {
Config::load();
}
// set display_errors back
ini_set('display_errors', $display_bak);
\LibreNMS\DB\Eloquent::setStrictMode(false); // disable strict mode for legacy code...
if (is_numeric(Config::get('php_memory_limit')) && Config::get('php_memory_limit') > 128) {
ini_set('memory_limit', Config::get('php_memory_limit') . 'M');
@ -129,15 +115,9 @@ try {
exit();
}
if (module_selected('discovery', $init_modules) && ! \LibreNMS\Util\OS::updateCache(false)) {
// OS::loadAllDefinitions() is called by update_os_cache() if updated, no need to call twice
\LibreNMS\Util\OS::loadAllDefinitions(false, true);
} elseif (module_selected('web', $init_modules)) {
if (module_selected('web', $init_modules)) {
require $install_dir . '/includes/html/vars.inc.php';
\LibreNMS\Util\OS::loadAllDefinitions(! module_selected('nodb', $init_modules), true);
}
if (module_selected('web', $init_modules)) {
require $install_dir . '/includes/html/vars.inc.php';
}
$console_color = new Console_Color2();

View File

@ -1740,101 +1740,6 @@ parameters:
count: 1
path: LibreNMS/Config.php
-
message: "#^Call to function is_null\\(\\) with Illuminate\\\\Database\\\\Capsule\\\\Manager will always evaluate to false\\.$#"
count: 2
path: LibreNMS/DB/Eloquent.php
-
message: "#^Call to function is_null\\(\\) with PDO will always evaluate to false\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:boot\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:getDriver\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:initLegacyListeners\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:isConnected\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:isConnected\\(\\) has parameter \\$name with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_host with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_name with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_pass with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_port with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_socket with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$db_user with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setConnection\\(\\) has parameter \\$name with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:setStrictMode\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:version\\(\\) has no return type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Eloquent\\:\\:version\\(\\) has parameter \\$name with no type specified\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Result of && is always false\\.$#"
count: 1
path: LibreNMS/DB/Eloquent.php
-
message: "#^Method LibreNMS\\\\DB\\\\Schema\\:\\:columnExists\\(\\) has no return type specified\\.$#"
count: 1

View File

@ -126,6 +126,8 @@ class OSDiscoveryTest extends TestCase
$os = Core::detectOS($this->genDevice($community));
$output = ob_get_contents();
ob_end_clean();
Debug::set(false);
Debug::setVerbose(false);
$this->assertLessThan(5, microtime(true) - $start, "OS $expected_os took longer than 5s to detect");
$this->assertEquals($expected_os, $os, "Test file: $community.snmprec\n$output");