2018-05-09 08:05:17 -05:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Providers;
|
|
|
|
|
|
2020-05-14 11:27:59 -05:00
|
|
|
use App\Models\Sensor;
|
2018-09-24 02:07:00 -05:00
|
|
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
2018-05-09 08:05:17 -05:00
|
|
|
use Illuminate\Support\Facades\Blade;
|
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
use Illuminate\Support\ServiceProvider;
|
2020-10-28 16:07:03 -05:00
|
|
|
use LibreNMS\Cache\PermissionsCache;
|
2018-05-09 08:05:17 -05:00
|
|
|
use LibreNMS\Config;
|
2019-01-25 15:30:58 -06:00
|
|
|
use LibreNMS\Util\IP;
|
|
|
|
|
use LibreNMS\Util\Validate;
|
|
|
|
|
use Validator;
|
2018-05-09 08:05:17 -05:00
|
|
|
|
|
|
|
|
class AppServiceProvider extends ServiceProvider
|
|
|
|
|
{
|
|
|
|
|
/**
|
2019-03-19 08:14:01 -05:00
|
|
|
* Register any application services.
|
2018-05-09 08:05:17 -05:00
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2023-05-24 22:21:54 +02:00
|
|
|
public function register(): void
|
2018-05-09 08:05:17 -05:00
|
|
|
{
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->registerFacades();
|
|
|
|
|
$this->registerGeocoder();
|
2018-05-09 08:05:17 -05:00
|
|
|
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->app->singleton('permissions', function ($app) {
|
2020-10-28 16:07:03 -05:00
|
|
|
return new PermissionsCache();
|
2019-03-19 08:14:01 -05:00
|
|
|
});
|
2019-11-14 21:56:06 +00:00
|
|
|
$this->app->singleton('device-cache', function ($app) {
|
|
|
|
|
return new \LibreNMS\Cache\Device();
|
|
|
|
|
});
|
2022-10-02 00:41:56 -05:00
|
|
|
$this->app->singleton('git', function ($app) {
|
|
|
|
|
return new \LibreNMS\Util\Git();
|
2022-09-28 23:23:32 -05:00
|
|
|
});
|
2021-11-17 19:23:55 -06:00
|
|
|
|
|
|
|
|
$this->app->bind(\App\Models\Device::class, function () {
|
|
|
|
|
/** @var \LibreNMS\Cache\Device $cache */
|
|
|
|
|
$cache = $this->app->make('device-cache');
|
|
|
|
|
|
|
|
|
|
return $cache->hasPrimary() ? $cache->getPrimary() : new \App\Models\Device;
|
|
|
|
|
});
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2019-03-19 08:14:01 -05:00
|
|
|
* Bootstrap any application services.
|
2018-05-09 08:05:17 -05:00
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2023-05-24 22:21:54 +02:00
|
|
|
public function boot(): void
|
2018-05-09 08:05:17 -05:00
|
|
|
{
|
2020-11-03 17:18:31 +01:00
|
|
|
\Illuminate\Pagination\Paginator::useBootstrap();
|
|
|
|
|
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->bootCustomBladeDirectives();
|
|
|
|
|
$this->bootCustomValidators();
|
|
|
|
|
$this->configureMorphAliases();
|
2020-05-14 11:27:59 -05:00
|
|
|
$this->bootObservers();
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|
2018-09-24 02:07:00 -05:00
|
|
|
|
2019-02-12 17:45:04 -06:00
|
|
|
private function bootCustomBladeDirectives()
|
|
|
|
|
{
|
2022-12-15 19:52:22 -06:00
|
|
|
Blade::if('config', function ($key, $value = true) {
|
|
|
|
|
return \LibreNMS\Config::get($key) == $value;
|
2019-02-12 17:45:04 -06:00
|
|
|
});
|
|
|
|
|
Blade::if('notconfig', function ($key) {
|
|
|
|
|
return ! \LibreNMS\Config::get($key);
|
|
|
|
|
});
|
|
|
|
|
Blade::if('admin', function () {
|
|
|
|
|
return auth()->check() && auth()->user()->isAdmin();
|
|
|
|
|
});
|
2020-01-04 16:14:50 +01:00
|
|
|
|
|
|
|
|
Blade::directive('deviceUrl', function ($arguments) {
|
|
|
|
|
return "<?php echo \LibreNMS\Util\Url::deviceUrl($arguments); ?>";
|
|
|
|
|
});
|
2022-09-03 12:48:43 -05:00
|
|
|
|
|
|
|
|
// Graphing
|
|
|
|
|
Blade::directive('signedGraphUrl', function ($vars) {
|
|
|
|
|
return "<?php echo \LibreNMS\Util\Url::forExternalGraph($vars); ?>";
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Blade::directive('signedGraphTag', function ($vars) {
|
|
|
|
|
return "<?php echo '<img class=\"librenms-graph\" src=\"' . \LibreNMS\Util\Url::forExternalGraph($vars) . '\" />'; ?>";
|
|
|
|
|
});
|
|
|
|
|
|
2022-09-05 20:41:55 -05:00
|
|
|
Blade::directive('graphImage', function ($vars, $flags = 0) {
|
2022-09-06 07:33:57 -05:00
|
|
|
return "<?php echo \LibreNMS\Util\Graph::getImageData($vars, $flags); ?>";
|
2022-09-03 12:48:43 -05:00
|
|
|
});
|
2019-02-12 17:45:04 -06:00
|
|
|
}
|
|
|
|
|
|
2018-09-24 02:07:00 -05:00
|
|
|
private function configureMorphAliases()
|
|
|
|
|
{
|
2020-04-19 19:57:49 +02:00
|
|
|
$sensor_types = [];
|
|
|
|
|
foreach (Sensor::getTypes() as $sensor_type) {
|
|
|
|
|
$sensor_types[$sensor_type] = \App\Models\Sensor::class;
|
|
|
|
|
}
|
|
|
|
|
Relation::morphMap(array_merge([
|
2018-09-24 02:07:00 -05:00
|
|
|
'interface' => \App\Models\Port::class,
|
|
|
|
|
'sensor' => \App\Models\Sensor::class,
|
2019-01-03 16:42:12 -06:00
|
|
|
'device' => \App\Models\Device::class,
|
|
|
|
|
'device_group' => \App\Models\DeviceGroup::class,
|
2020-06-14 12:39:10 -05:00
|
|
|
'location' => \App\Models\Location::class,
|
2020-04-19 19:57:49 +02:00
|
|
|
], $sensor_types));
|
2018-09-24 02:07:00 -05:00
|
|
|
}
|
2018-11-28 16:49:18 -06:00
|
|
|
|
2019-03-12 23:59:03 -05:00
|
|
|
private function registerFacades()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-28 16:49:18 -06:00
|
|
|
private function registerGeocoder()
|
|
|
|
|
{
|
|
|
|
|
$this->app->alias(\LibreNMS\Interfaces\Geocoder::class, 'geocoder');
|
|
|
|
|
$this->app->bind(\LibreNMS\Interfaces\Geocoder::class, function ($app) {
|
|
|
|
|
$engine = Config::get('geoloc.engine');
|
|
|
|
|
|
|
|
|
|
switch ($engine) {
|
|
|
|
|
case 'mapquest':
|
|
|
|
|
Log::debug('MapQuest geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\MapquestApi::class);
|
|
|
|
|
case 'bing':
|
|
|
|
|
Log::debug('Bing geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\BingApi::class);
|
|
|
|
|
case 'openstreetmap':
|
|
|
|
|
Log::debug('OpenStreetMap geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\NominatimApi::class);
|
|
|
|
|
default:
|
|
|
|
|
case 'google':
|
|
|
|
|
Log::debug('Google Maps geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\GoogleMapsApi::class);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2019-01-25 15:30:58 -06:00
|
|
|
|
2020-05-14 11:27:59 -05:00
|
|
|
private function bootObservers()
|
|
|
|
|
{
|
|
|
|
|
\App\Models\Device::observe(\App\Observers\DeviceObserver::class);
|
2022-03-12 14:39:58 -06:00
|
|
|
\App\Models\Package::observe(\App\Observers\PackageObserver::class);
|
2021-02-02 06:40:11 +00:00
|
|
|
\App\Models\Service::observe(\App\Observers\ServiceObserver::class);
|
2022-01-30 16:28:18 -06:00
|
|
|
\App\Models\Stp::observe(\App\Observers\StpObserver::class);
|
2022-03-12 14:39:58 -06:00
|
|
|
\App\Models\User::observe(\App\Observers\UserObserver::class);
|
2023-10-05 19:49:26 -05:00
|
|
|
\App\Models\Vminfo::observe(\App\Observers\VminfoObserver::class);
|
2020-05-14 11:27:59 -05:00
|
|
|
}
|
|
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
private function bootCustomValidators()
|
|
|
|
|
{
|
2019-08-21 20:36:22 -05:00
|
|
|
Validator::extend('alpha_space', function ($attribute, $value) {
|
|
|
|
|
return preg_match('/^[\w\s]+$/u', $value);
|
|
|
|
|
});
|
|
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
Validator::extend('ip_or_hostname', function ($attribute, $value, $parameters, $validator) {
|
|
|
|
|
$ip = substr($value, 0, strpos($value, '/') ?: strlen($value)); // allow prefixes too
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
return IP::isValid($ip) || Validate::hostname($value);
|
2021-05-11 08:08:59 -05:00
|
|
|
});
|
2019-10-16 21:22:05 +00:00
|
|
|
|
2020-02-26 14:01:49 +01:00
|
|
|
Validator::extend('is_regex', function ($attribute, $value) {
|
2021-03-30 00:43:05 +02:00
|
|
|
return @preg_match($value, '') !== false;
|
2021-05-11 08:08:59 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Validator::extend('keys_in', function ($attribute, $value, $parameters, $validator) {
|
|
|
|
|
$extra_keys = is_array($value) ? array_diff(array_keys($value), $parameters) : [];
|
|
|
|
|
|
|
|
|
|
$validator->addReplacer('keys_in', function ($message, $attribute, $rule, $parameters) use ($extra_keys) {
|
|
|
|
|
return str_replace(
|
|
|
|
|
[':extra', ':values'],
|
|
|
|
|
[implode(',', $extra_keys), implode(',', $parameters)],
|
|
|
|
|
$message);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return is_array($value) && empty($extra_keys);
|
|
|
|
|
});
|
2020-02-26 14:01:49 +01:00
|
|
|
|
2019-10-16 21:22:05 +00:00
|
|
|
Validator::extend('zero_or_exists', function ($attribute, $value, $parameters, $validator) {
|
2021-08-31 13:43:02 -05:00
|
|
|
if ($value === 0 || $value === '0') {
|
2019-10-16 21:22:05 +00:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$validator = Validator::make([$attribute => $value], [$attribute => 'exists:' . implode(',', $parameters)]);
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2019-10-16 21:22:05 +00:00
|
|
|
return $validator->passes();
|
2021-05-11 08:08:59 -05:00
|
|
|
}, trans('validation.exists'));
|
2022-02-20 22:05:51 +01:00
|
|
|
|
|
|
|
|
Validator::extend('url_or_xml', function ($attribute, $value): bool {
|
|
|
|
|
if (! is_string($value)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (filter_var($value, FILTER_VALIDATE_URL) !== false) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
libxml_use_internal_errors(true);
|
|
|
|
|
$xml = simplexml_load_string($value);
|
|
|
|
|
if ($xml !== false) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
});
|
2019-01-25 15:30:58 -06:00
|
|
|
}
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|