Add device group filter to widgets (#9692)

This commit is contained in:
Jellyfrog
2019-08-08 02:59:14 +02:00
committed by Tony Murray
parent b8c96abc35
commit fc281ccc4b
35 changed files with 262 additions and 64 deletions

View File

@@ -36,6 +36,7 @@ class EventlogController extends TableController
{
return [
'device' => 'nullable|int',
'device_group' => 'nullable|int',
'eventtype' => 'nullable|string',
];
}
@@ -61,7 +62,11 @@ class EventlogController extends TableController
*/
public function baseQuery($request)
{
return Eventlog::hasAccess($request->user())->with('device');
return Eventlog::hasAccess($request->user())
->with('device')
->when($request->device_group, function ($query) use ($request) {
$query->inDeviceGroup($request->device_group);
});
}
public function formatItem($eventlog)

View File

@@ -34,6 +34,7 @@ class SyslogController extends TableController
{
return [
'device' => 'nullable|int',
'device_group' => 'nullable|int',
'program' => 'nullable|string',
'priority' => 'nullable|string',
'to' => 'nullable|date',
@@ -64,17 +65,17 @@ class SyslogController extends TableController
public function baseQuery($request)
{
/** @var Builder $query */
$query = Syslog::hasAccess($request->user())->with('device');
if ($from = $request->get('from')) {
$query->where('timestamp', '>=', $from);
}
if ($to = $request->get('to')) {
$query->where('timestamp', '<=', $to);
}
return $query;
return Syslog::hasAccess($request->user())
->with('device')
->when($request->device_group, function ($query) use ($request) {
$query->inDeviceGroup($request->device_group);
})
->when($request->from, function ($query) use ($request) {
$query->where('timestamp', '>=', $request->from);
})
->when($request->to, function ($query) use ($request) {
$query->where('timestamp', '<=', $request->to);
});
}
public function formatItem($syslog)

View File

@@ -25,7 +25,6 @@
namespace App\Http\Controllers\Widgets;
use App\Models\DeviceGroup;
use Illuminate\Http\Request;
class AlertsController extends WidgetController
@@ -38,7 +37,7 @@ class AlertsController extends WidgetController
'fired' => null,
'min_severity' => null,
'state' => null,
'group' => null,
'device_group' => null,
'proc' => 0,
'location' => 1,
'sort' => 1,
@@ -51,7 +50,7 @@ class AlertsController extends WidgetController
public function getSettingsView(Request $request)
{
$data = $this->getSettings();
$data = $this->getSettings(true);
$data['severities'] = [
// alert_rules.status is enum('ok','warning','critical')
'ok' => 1,
@@ -69,7 +68,6 @@ class AlertsController extends WidgetController
'worse' => '3',
'better' => '4',
];
$data['device_group'] = DeviceGroup::find($data['group']);
return view('widgets.settings.alerts', $data);
}

View File

@@ -45,7 +45,7 @@ class AvailabilityMapController extends WidgetController
'show_disabled_and_ignored' => 0,
'mode_select' => 0,
'order_by' => Config::get('webui.availability_map_sort_status') ? 'status' : 'hostname',
'device_group' => 0,
'device_group' => null,
];
}
@@ -80,10 +80,7 @@ class AvailabilityMapController extends WidgetController
public function getSettingsView(Request $request)
{
$settings = $this->getSettings();
$settings['device_group'] = DeviceGroup::find($settings['device_group']);
return view('widgets.settings.availability-map', $settings);
return view('widgets.settings.availability-map', $this->getSettings(true));
}
/**
@@ -95,8 +92,8 @@ class AvailabilityMapController extends WidgetController
$settings = $this->getSettings();
// filter for by device group or show all
if ($group_id = $settings['device_group']) {
$device_query = DeviceGroup::find($group_id)->devices()->hasAccess($request->user());
if ($settings['device_group']) {
$device_query = DeviceGroup::find($settings['device_group'])->devices()->hasAccess($request->user());
} else {
$device_query = Device::hasAccess($request->user());
}
@@ -143,8 +140,8 @@ class AvailabilityMapController extends WidgetController
$settings = $this->getSettings();
// filter for by device group or show all
if ($group_id = $settings['device_group']) {
$services_query = DeviceGroup::find($group_id)->services()->hasAccess($request->user());
if ($settings['device_group']) {
$services_query = DeviceGroup::find($settings['device_group'])->services()->hasAccess($request->user());
} else {
$services_query = Service::hasAccess($request->user());
}

View File

@@ -33,6 +33,9 @@ use Illuminate\View\View;
class ComponentStatusController extends WidgetController
{
protected $title = 'Component Status';
protected $defaults = [
'device_group' => null,
];
/**
* @param Request $request
@@ -40,6 +43,7 @@ class ComponentStatusController extends WidgetController
*/
public function getView(Request $request)
{
$data = $this->getSettings();
$status = [
[
'color' => 'text-success',
@@ -59,6 +63,9 @@ class ComponentStatusController extends WidgetController
->select('status', DB::raw("count('status') as total"))
->groupBy('status')
->where('disabled', "!=", 0)
->when($data['device_group'], function ($query) use ($data) {
$query->inDeviceGroup($data['device_group']);
})
->get()->pluck('total', 'status')->toArray();
foreach ($status as $key => $value) {
@@ -67,4 +74,9 @@ class ComponentStatusController extends WidgetController
return view('widgets.component-status', compact('status'));
}
public function getSettingsView(Request $request)
{
return view('widgets.settings.component-status', $this->getSettings(true));
}
}

View File

@@ -47,9 +47,7 @@ abstract class DeviceSummaryController extends WidgetController
public function getSettingsView(Request $request)
{
$settings = $this->getSettings();
return view('widgets.settings.device-summary', $settings);
return view('widgets.settings.device-summary', $this->getSettings(true));
}
protected function getData(Request $request)

View File

@@ -34,12 +34,13 @@ class EventlogController extends WidgetController
protected $defaults = [
'title' => null,
'device' => null,
'device_group' => null,
'eventtype' => null,
];
public function getSettingsView(Request $request)
{
$data = $this->getSettings();
$data = $this->getSettings(true);
$data['device'] = Device::hasAccess($request->user())->find($data['device']);

View File

@@ -42,12 +42,13 @@ class GlobeController extends WidgetController
'markers' => Config::get('frontpage_globe.markers', 'devices'),
'region' => Config::get('frontpage_globe.region', 'world'),
'resolution' => Config::get('frontpage_globe.resolution', 'countries'),
'device_group' => null,
];
}
public function getSettingsView(Request $request)
{
return view('widgets.settings.globe', $this->getSettings());
return view('widgets.settings.globe', $this->getSettings(true));
}
/**
@@ -60,9 +61,14 @@ class GlobeController extends WidgetController
$locations = collect();
$eager_load = $data['markers'] == 'ports' ? ['devices.ports'] : ['devices'];
$query = Location::hasAccess($request->user())
->with($eager_load)
->when($data['device_group'], function ($query) use ($data) {
$query->inDeviceGroup($data['device_group']);
});
/** @var Location $location */
foreach (Location::hasAccess($request->user())->with($eager_load)->get() as $location) {
foreach ($query->get() as $location) {
$count = 0;
$up = 0;
$down_items = collect();

View File

@@ -105,7 +105,7 @@ class GraphController extends WidgetController
public function getSettingsView(Request $request)
{
$data = $this->getSettings();
$data = $this->getSettings(true);
// format display name for selected graph type
$type_parts = explode('_', $data['graph_type']);
@@ -249,7 +249,7 @@ class GraphController extends WidgetController
return false; // non-custom aggregate types require no additional settings
}
public function getSettings()
public function getSettings($settingsView = false)
{
if (is_null($this->settings)) {
$id = \Request::get('id');

View File

@@ -51,7 +51,7 @@ class GraylogController extends WidgetController
public function getSettingsView(Request $request)
{
$data = $this->getSettings();
$data = $this->getSettings(true);
if ($data['device']) {
$data['device'] = Device::find($data['device']);

View File

@@ -62,10 +62,10 @@ class ImageController extends WidgetController
public function getSettingsView(Request $request)
{
return view('widgets.settings.image', $this->getSettings());
return view('widgets.settings.image', $this->getSettings(true));
}
public function getSettings()
public function getSettings($settingsView = false)
{
if (is_null($this->settings)) {
parent::getSettings();

View File

@@ -58,6 +58,6 @@ class NotesController extends WidgetController
public function getSettingsView(Request $request)
{
return view('widgets.settings.notes', $this->getSettings());
return view('widgets.settings.notes', $this->getSettings(true));
}
}

View File

@@ -77,15 +77,15 @@ class ServerStatsController extends WidgetController
public function getSettingsView(Request $request)
{
$settings = $this->getSettings();
$settings = $this->getSettings(true);
$settings['device'] = Device::hasAccess($request->user())->find($settings['device']) ?: null;
return view('widgets.settings.server-stats', $settings);
}
public function getSettings()
public function getSettings($settingsView = false)
{
$settings = parent::getSettings();
$settings = parent::getSettings($settingsView);
$settings['columns'] = 12 / $settings['columnsize'];
return $settings;

View File

@@ -34,11 +34,12 @@ class SyslogController extends WidgetController
protected $defaults = [
'title' => null,
'device' => null,
'device_group' => null,
];
public function getSettingsView(Request $request)
{
$data = $this->getSettings();
$data = $this->getSettings(true);
$data['device'] = Device::hasAccess($request->user())->find($data['device']);

View File

@@ -50,6 +50,7 @@ class TopDevicesController extends WidgetController
'sort_order' => 'asc',
'device_count' => 5,
'time_interval' => 15,
'device_group' => null,
];
public function title()
@@ -98,7 +99,7 @@ class TopDevicesController extends WidgetController
public function getSettingsView(Request $request)
{
return view('widgets.settings.top-devices', $this->getSettings());
return view('widgets.settings.top-devices', $this->getSettings(true));
}
/**
@@ -130,7 +131,10 @@ class TopDevicesController extends WidgetController
->select("$left_table.device_id")
->leftJoin('devices', "$left_table.device_id", 'devices.device_id')
->groupBy("$left_table.device_id")
->where('devices.last_polled', '>', Carbon::now()->subMinutes($settings['time_interval']));
->where('devices.last_polled', '>', Carbon::now()->subMinutes($settings['time_interval']))
->when($settings['device_group'], function ($query) use ($settings) {
$query->inDeviceGroup($settings['device_group']);
});
}
/**
@@ -143,6 +147,9 @@ class TopDevicesController extends WidgetController
return Device::hasAccess(Auth::user())->select('device_id', 'hostname', 'sysName', 'status')
->where('devices.last_polled', '>', Carbon::now()->subMinutes($settings['time_interval']))
->when($settings['device_group'], function ($query) use ($settings) {
$query->inDeviceGroup($settings['device_group']);
})
->limit($settings['device_count']);
}
@@ -179,7 +186,11 @@ class TopDevicesController extends WidgetController
->select('device_id')
->groupBy('device_id')
->where('poll_time', '>', Carbon::now()->subMinutes($settings['time_interval'])->timestamp)
->has('device')
->when($settings['device_group'], function ($query) use ($settings) {
$query->inDeviceGroup($settings['device_group']);
}, function ($query) {
$query->has('device');
})
->orderByRaw('SUM(ifInOctets_rate + ifOutOctets_rate) ' . $sort)
->limit($settings['device_count']);
@@ -275,10 +286,12 @@ class TopDevicesController extends WidgetController
->leftJoin('devices', 'storage.device_id', 'devices.device_id')
->select('storage.device_id', 'storage_id', 'storage_descr', 'storage_perc', 'storage_perc_warn')
->where('devices.last_polled', '>', Carbon::now()->subMinutes($settings['time_interval']))
->when($settings['device_group'], function ($query) use ($settings) {
$query->inDeviceGroup($settings['device_group']);
})
->orderBy('storage_perc', $sort)
->limit($settings['device_count']);
$results = $query->get()->map(function ($storage) {
$device = $storage->device;

View File

@@ -37,6 +37,7 @@ class TopInterfacesController extends WidgetController
'interface_count' => 5,
'time_interval' => 15,
'interface_filter' => null,
'device_group' => null,
];
/**
@@ -53,7 +54,11 @@ class TopInterfacesController extends WidgetController
->select('port_id', 'device_id', 'ifName', 'ifDescr', 'ifAlias')
->groupBy('port_id', 'device_id', 'ifName', 'ifDescr', 'ifAlias')
->where('poll_time', '>', Carbon::now()->subMinutes($data['time_interval'])->timestamp)
->has('device')
->when($data['device_group'], function ($query) use ($data) {
$query->inDeviceGroup($data['device_group']);
}, function ($query) {
$query->has('device');
})
->orderByRaw('SUM(LEAST(ifInOctets_rate, 9223372036854775807) + LEAST(ifOutOctets_rate, 9223372036854775807)) DESC')
->limit($data['interface_count']);
@@ -69,6 +74,6 @@ class TopInterfacesController extends WidgetController
public function getSettingsView(Request $request)
{
return view('widgets.settings.top-interfaces', $this->getSettings());
return view('widgets.settings.top-interfaces', $this->getSettings(true));
}
}

View File

@@ -26,6 +26,7 @@
namespace App\Http\Controllers\Widgets;
use App\Http\Controllers\Controller;
use App\Models\DeviceGroup;
use App\Models\UserWidget;
use Illuminate\Http\Request;
use Illuminate\View\View;
@@ -81,13 +82,17 @@ abstract class WidgetController extends Controller
*
* @return array
*/
public function getSettings()
public function getSettings($settingsView = false)
{
if (is_null($this->settings)) {
$id = \Request::get('id');
$widget = UserWidget::find($id);
$this->settings = array_replace($this->defaults, $widget ? (array)$widget->settings : []);
$this->settings['id'] = $id;
if ($settingsView && isset($this->settings['device_group'])) {
$this->settings['device_group'] = DeviceGroup::find($this->settings['device_group']);
}
}
return $this->settings;

View File

@@ -45,6 +45,7 @@ class WorldMapController extends WidgetController
'init_zoom' => Config::get('leaflet.default_zoom', 2),
'group_radius' => Config::get('leaflet.group_radius', 80),
'status' => '0,1',
'device_group' => null,
];
}
@@ -60,6 +61,9 @@ class WorldMapController extends WidgetController
->with('location')
->isActive()
->whereIn('status', $status)
->when($settings['device_group'], function ($query) use ($settings) {
$query->inDeviceGroup($settings['device_group']);
})
->get()
->filter(function ($device) use ($status) {
/** @var Device $device */
@@ -94,6 +98,6 @@ class WorldMapController extends WidgetController
public function getSettingsView(Request $request)
{
return view('widgets.settings.worldmap', $this->getSettings());
return view('widgets.settings.worldmap', $this->getSettings(true));
}
}

View File

@@ -429,6 +429,15 @@ class Device extends BaseModel
return $this->hasDeviceAccess($query, $user);
}
public function scopeInDeviceGroup($query, $deviceGroup)
{
return $query->whereIn('device_id', function ($query) use ($deviceGroup) {
$query->select('device_id')
->from('device_group_device')
->where('device_group_id', $deviceGroup);
});
}
// ---- Define Relationships ----
public function alerts()

View File

@@ -36,8 +36,11 @@ class DeviceRelatedModel extends BaseModel
public function scopeInDeviceGroup($query, $deviceGroup)
{
$groups = $deviceGroup instanceof DeviceGroup ? $deviceGroup->devices()->pluck('devices.device_id') : [];
return $query->whereIn($this->getTable() . '.device_id', $groups);
return $query->whereIn('device_id', function ($query) use ($deviceGroup) {
$query->select('device_id')
->from('device_group_device')
->where('device_group_id', $deviceGroup);
});
}
// ---- Define Relationships ----

View File

@@ -141,6 +141,14 @@ class Location extends Model
return $query->whereIn('id', $ids);
}
public function scopeInDeviceGroup($query, $deviceGroup)
{
return $query->whereHas('devices.groups', function ($query) use ($deviceGroup) {
$query->where('device_groups.id', $deviceGroup);
});
}
// ---- Define Relationships ----
public function devices()

View File

@@ -6,7 +6,7 @@ use DB;
use Illuminate\Database\Eloquent\Builder;
use LibreNMS\Util\Rewrite;
class Port extends BaseModel
class Port extends DeviceRelatedModel
{
public $timestamps = false;
protected $primaryKey = 'port_id';
@@ -211,11 +211,6 @@ class Port extends BaseModel
// ---- Define Relationships ----
public function device()
{
return $this->belongsTo('App\Models\Device', 'device_id', 'device_id');
}
public function events()
{
return $this->morphMany(Eventlog::class, 'events', 'type', 'reference');