Files
librenms-librenms/app/Http/Controllers/ServiceTemplateController.php
Anthony F. McInerney 5388a20c09 Add Service Templates (#12107)
* service templates - move to blade - jellyfrog fixes - revert get to find and fix discovery lookup

* service templates - move to blade - wip

* service templates - move to blade - wip

* service templates - move to blade - deprecate delete_service_template

* service templates - move to blade - deprecate delete_service_template

* service templates - move to blade - deprecate remove_service_template

* service templates - move to blade - deprecate remove_service_template

* service templates - move to blade - fix permisson lookup

* service templates - move to blade - fix remove route

* service templates - move to blade - fix remove route

* service templates - move to blade - fix permisson lookup

* service templates - move to blade - fix permisson lookup

* service templates - move to blade - fix permisson lookup

* service templates - move to blade - fix permisson lookup

* service templates - move to blade - fixs

* service templates - move to blade - fixes

* service templates - move to blade - fixes

* service templates - move to blade - fixes

* service templates - move to blade - nullable input?

* service templates - move to blade - nullable input?

* service templates - move to blade - nullable input?

* service templates - move to blade - add selected for device group id and type

* service templates - move to blade - add selected for device group id and type

* service templates - move to blade - add selected for device group id and type

* service templates - move to blade - fix discovery response

* service templates - move to blade - fix device group index display

* service templates - move to blade - add delete to discover_service_template

* service templates - move to blade - add discover all button - function foobar

* service templates - move to blade - add discover all button - function foobar

* service templates - move to blade - add discover all button - function foobar

* service templates - move to blade - fixes

* service templates - move to blade - fixes

* service templates - move to blade - fixes

* service templates - move to blade - button fixes

* service templates - move to blade - button fixes

* service templates - move to blade - button fixes

* service templates - move to blade - attempt route fix

* service templates - move to blade - attempt route fix

* service templates - move to blade - attempt route fix

* service templates - move to blade - attempt route fix

* service templates - move to blade - fix discovery function

* service templates - move to blade - fix discovery function

* service templates - move to blade - fix return values - thanks SourceDoctor

* service templates - move to blade - attempt route fix

* service templates - move to blade - button variable fix

* service templates - move to blade - button variable fix

* service templates - move to blade - button variable fix

* service templates - move to blade - function fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - move to blade - permissions fix

* service templates - add initial api - and model permissions fix

* service templates - add initial api - discovery too

* service templates - add initial api - discovery too

* service templates - merge fix

* service templates - api fixes

* service templates - api fixes

* service templates - remove bad fixe

* service templates - discover null? :)

* service templates - Policy requires Facade?

* service templates - Policy requires Facade?

* service templates - REVERT Policy requires Facade?

* service templates - REVERT Policy requires Facade?

* Revert "service templates - REVERT Policy requires Facade?"

This reverts commit 7752b3e4e5.

* service templates - clean up discover api call

* service templates - clean up discover api call

* service templates - clean up discover api call

* service templates - clean up discover api call

* service templates - clean up discover api call

* service templates - attempt route fix

* Revert "service templates - attempt route fix"

This reverts commit b48970351e.

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template

* service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template

* Revert "service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template"

This reverts commit ef93315db5.

* Revert "service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template"

This reverts commit 73af819a60.

* Revert "service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template"

This reverts commit dd019c3105.

* Revert "service templates - jellyfrog fixes - dbchanged - DeviceGroup relates to Service Template"

This reverts commit 94aaaf7976.

* service templates - jellyfrog fixes - DeviceGroup relates to Service Template

* service templates - fix permissions

* service templates - db service_templates_perms

* service templates - fix permissions

* service templates - fix permissions

* service templates - fix permissions

* service templates - fix permissions

* service templates - fix permissions

* service templates - fix edit.blade missing parameters - still 403 :(

* service templates - jellyfrog -fix route and construct

* service templates - jellyfrog -fix route and construct

* service templates - jellyfrog -fix route and construct

* Revert "service templates - jellyfrog -fix route and construct"

This reverts commit ec1eea7a99.

* service templates - jellyfrog -fix routes

* service templates - jellyfrog -fix services lookup

* service templates - edit blade fixes

* service templates - edit blade fixes - service or services or template or serviceTemplate or service_template good luck

* service templates - edit blade fixes

* service templates - index blade fixes

* service templates - discover return fix

* service templates - remove return fix

* service templates - fix discovery api returns

* service templates - fix discovery api returns

* service templates - fix discovery api returns

* service templates - fix discovery - test

* service templates - fix discovery

* service templates - fix checkbox integer

* service templates - fix checkbox integer

* service templates - fix checkbox integer

* service templates - fix checkbox integer

* service templates - fix checkbox integer

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover all

* service templates - fix discover

* service templates - fix discover

* service templates - fix discover

* service templates - fix discover

* service templates - fix discover

* service templates - move discover/apply to blade - last of the old functions - wip

* service templates - move discover/apply to blade - last of the old functions - wip

* service templates - move discover/apply to blade - last of the old functions - wip

* service templates - change all relevant to template for sanity

* service templates - inspection fixes

* service templates - inspection fixes

* service templates - inspection fixes

* service templates - murrant fixes - use createOrUpdate - add obervers - fix function call

* service templates - murrant fixes - add ServiceController store - not used

* service templates - murrant fixes - add Observers file)

* service templates - murrant fixes - correct ServiceController

* service templates - murrant fixes - fix observers load

* service templates - observer fix

* service templates - schedule discovery function call fix, cheeky, is this allowed?

* service templates - attempt route fix.

* service templates - attempt route fix 2

* service templates - blade route applyall missing url - ie the route lol

* service templates - blade route applyall missing url - ie the route lol

* service templates - fix routes - bingo!

* service templates - fix routes - bingo!

* service templates - fix blade missing quote

* service templates - jellyfrog fix - remove pluck

* service templates - missing template id on service update

* service templates - jellyfrog fix - add get

* service templates - fix service db defaults / null

* service templates - fix service update

* service templates - fix service update

* service templates - fix service update

* service templates - fix service devicegroup change - obsoletes service_template_change in servicesdb

* service templates - fix service devicegroup change - obsoletes service_template_change in servicesdb

* Add service templates - phpcs fixes - and attemp whereNotIn scope

* Add service templates - styleci

* Add service templates - styleci

* Add service templates - fix notindevicegroup scope

* Add service templates - removed service service_template_changed - not required for delete or update

* Add service templates - removed service service_template_changed - not required for delete or update

* Add service templates - murrant fixes - add protected casts - fix checkbox

* Add service templates - fix checkbox - attempt2

* Add service templates - fix checkbox - attempt3

* Add service templates - fix checkbox - attempt3

* Add service templates - fix checkbox - attempt4

* Add service templates - fix delete row selection

* Revert "Add service templates - fix delete row selection"

This reverts commit 4d9e4990f2.

* Add service templates - fix delete row selection

* Add service templates - fix automatic discovery

* Add service templates - fix automatic discovery

* Add service templates - checkbox - add hidden input

* Add service templates - checkbox - add old value back?

* Add service templates - checkbox - fix disabled

* Add service templates - checkbox - fix disabled

* Add service templates - service fixes - styleci

* Add service templates - make devicegroup required

* Add service templates - let Disable text wrap

* Add service templates - dont allow device group to be deleted when service templates exist

* Add service templates - dont allow device group to be deleted when service templates exist

* Add service templates - enable multiple device groups - wip

* Add service templates - enable multiple device groups - wip

* Add service templates - enable multiple device groups - wip

* Add service templates - enable multiple device groups - dbschema - wip

* Add service templates - enable multiple device groups - db migration - wip

* Add service templates - enable multiple device groups - db migration - wip

* Add service templates - enable multiple device groups - wip

* Add service templates - enable multiple device groups - wip

* Add service templates - enable service template Groups - relationships to device AND device groups

* Add service templates - styleci fixes

* Add service templates - styleci fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - fixes

* Add service templates - db - primarykey issues

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fix migrations

* Add service templates - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - blade view - fixes

* Add service templates - misc update for travis build trigger

* Add service templates - restrict view to only show device/groups that have templates applied

* Add service templates - fix devicegroup update

* remove permissions table stuff

* Fix schema rollback

* fix style

* Update ServiceTemplateController.php

Co-authored-by: Tony Murray <murraytony@gmail.com>
2021-02-02 00:40:11 -06:00

379 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Device;
use App\Models\DeviceGroup;
use App\Models\Service;
use App\Models\ServiceTemplate;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use LibreNMS\Alerting\QueryBuilderFilter;
use LibreNMS\Services;
use Toastr;
class ServiceTemplateController extends Controller
{
public function __construct()
{
$this->authorizeResource(ServiceTemplate::class, 'template');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response|\Illuminate\View\View
*/
public function index()
{
//$this->authorize('manage', ServiceTemplate::class);
return view(
'service-template.index', [
'service_templates' => ServiceTemplate::orderBy('name')->withCount('devices')->withCount('groups')->get(),
'groups' => DeviceGroup::orderBy('name')->has('serviceTemplates')->get(),
'devices' => Device::orderBy('hostname')->has('serviceTemplates')->get(),
]
);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response|\Illuminate\View\View
*/
public function create()
{
return view(
'service-template.create', [
'template' => new ServiceTemplate(),
'service_templates' => ServiceTemplate::orderBy('name')->get(),
'services' => Services::list(),
'filters' => json_encode(new QueryBuilderFilter('group')),
]
);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function store(Request $request)
{
$this->validate(
$request, [
'name' => 'required|string|unique:service_templates',
'groups' => 'array',
'groups.*' => 'integer',
'devices' => 'array',
'devices.*' => 'integer',
'type' => 'string',
'dtype' => 'required|in:dynamic,static',
'dgtype' => 'required|in:dynamic,static',
'drules' => 'json|required_if:dtype,dynamic',
'dgrules' => 'json|required_if:dgtype,dynamic',
'param' => 'nullable|string',
'ip' => 'nullable|string',
'desc' => 'nullable|string',
'changed' => 'integer',
'disabled' => 'integer',
'ignore' => 'integer',
]
);
$template = ServiceTemplate::make(
$request->only(
[
'name',
'type',
'dtype',
'dgtype',
'drules',
'dgrules',
'param',
'ip',
'desc',
'changed',
'disabled',
'ignore',
]
)
);
$template->drules = json_decode($request->drules);
$template->dgrules = json_decode($request->dgrules);
$template->save();
if ($request->dtype == 'static') {
$template->devices()->sync($request->devices);
}
if ($request->dgtype == 'static') {
$template->groups()->sync($request->groups);
}
Toastr::success(__('Service Template :name created', ['name' => $template->name]));
return redirect()->route('services.templates.index');
}
/**
* Display the specified resource.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function show(ServiceTemplate $template)
{
return redirect(url('/services/templates/' . $template->id));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\Response|\Illuminate\View\View
*/
public function edit(ServiceTemplate $template)
{
return view(
'service-template.edit', [
'template' => $template,
'filters' => json_encode(new QueryBuilderFilter('group')),
'services' => Services::list(),
]
//
);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function update(Request $request, ServiceTemplate $template)
{
$this->validate(
$request, [
'name' => [
'required',
'string',
Rule::unique('service_templates')->where(
function ($query) use ($template) {
$query->where('id', '!=', $template->id);
}
),
],
'dtype' => 'required|in:dynamic,static',
'drules' => 'json|required_if:dtype,dynamic',
'devices' => 'array',
'devices.*' => 'integer',
'dgtype' => 'required|in:dynamic,static',
'dgrules' => 'json|required_if:dgtype,dynamic',
'groups' => 'array',
'groups.*' => 'integer',
'type' => 'string',
'param' => 'nullable|string',
'ip' => 'nullable|string',
'desc' => 'nullable|string',
'changed' => 'integer',
'disabled' => 'integer',
'ignore' => 'integer',
]
);
$template->fill(
$request->only(
[
'name',
'type',
'dtype',
'dgtype',
'drules',
'dgrules',
'param',
'ip',
'desc',
'changed',
'ignore',
'disabled',
]
)
);
$devices_updated = false;
if ($template->dtype == 'static') {
// sync device_ids from input
$updated = $template->devices()->sync($request->get('devices', []));
// check for attached/detached/updated
$devices_updated = array_sum(array_map(function ($device_ids) {
return count($device_ids);
}, $updated)) > 0;
} else {
$template->drules = json_decode($request->drules);
}
$device_groups_updated = false;
if ($template->dgtype == 'static') {
// sync device_group_ids from input
$updated = $template->groups()->sync($request->get('groups', []));
// check for attached/detached/updated
$device_groups_updated = array_sum(array_map(function ($device_group_ids) {
return count($device_group_ids);
}, $updated)) > 0;
} else {
$template->dgrules = json_decode($request->dgrules);
}
if ($template->isDirty() || $devices_updated || $device_groups_updated) {
try {
if ($template->save() || $devices_updated || $device_groups_updated) {
Toastr::success(__('Service Template :name updated', ['name' => $template->name]));
} else {
Toastr::error(__('Failed to save'));
return redirect()->back()->withInput();
}
} catch (\Illuminate\Database\QueryException $e) {
return redirect()->back()->withInput()->withErrors([
'drules' => __('Rules resulted in invalid query: ') . $e->getMessage(),
'dgrules' => __('Rules resulted in invalid query: ') . $e->getMessage(),
]);
}
} else {
Toastr::info(__('No changes made'));
}
return redirect()->route('services.templates.index');
}
/**
* Apply specified Service Template to Device Groups.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function applyDeviceGroups(ServiceTemplate $template)
{
foreach (DeviceGroup::inServiceTemplate($template->id)->get() as $device_group) {
foreach (Device::inDeviceGroup($device_group->id)->get() as $device) {
$device->services()->updateOrCreate(
[
'service_template_id' => $template->id,
],
[
'service_name' => $template->name,
'service_type' => $template->type,
'service_template_id' => $template->id,
'service_param' => $template->param,
'service_ip' => $template->ip,
'service_desc' => $template->desc,
'service_disabled' => $template->disabled,
'service_ignore' => $template->ignore,
]
);
}
}
$msg = __('Services for Template :name have been updated', ['name' => $template->name]);
return response($msg, 200);
}
/**
* Apply specified Service Template to Devices.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function applyDevices(ServiceTemplate $template)
{
foreach (Device::inServiceTemplate($template->id)->get() as $device) {
$device->services()->updateOrCreate(
[
'service_template_id' => $template->id,
],
[
'service_name' => $template->name,
'service_type' => $template->type,
'service_template_id' => $template->id,
'service_param' => $template->param,
'service_ip' => $template->ip,
'service_desc' => $template->desc,
'service_disabled' => $template->disabled,
'service_ignore' => $template->ignore,
]
);
}
$msg = __('Services for Template :name have been updated', ['name' => $template->name]);
return response($msg, 200);
}
/**
* Apply all Service Templates.
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function applyAll()
{
foreach (ServiceTemplate::all() as $template) {
ServiceTemplateController::apply($template);
}
$msg = __('All Service Templates have been applied');
return response($msg, 200);
}
/**
* Apply specified Service Template.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function apply(ServiceTemplate $template)
{
ServiceTemplateController::applyDevices($template);
ServiceTemplateController::applyDeviceGroups($template);
// remove any remaining services no longer in the correct device group
foreach (Device::notInServiceTemplate($template->id)->notInDeviceGroup($template->groups)->get() as $device) {
Service::where('device_id', $device->device_id)->where('service_template_id', $template->id)->delete();
}
$msg = __('All Service Templates have been applied');
return response($msg, 200);
}
/**
* Remove specified Service Template.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function remove(ServiceTemplate $template)
{
Service::where('service_template_id', $template->id)->delete();
$msg = __('All Service Templates have been applied');
return response($msg, 200);
}
/**
* Destroy the specified resource from storage.
*
* @param \App\Models\ServiceTemplate $template
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\View\View
*/
public function destroy(ServiceTemplate $template)
{
Service::where('service_template_id', $template->id)->delete();
$template->delete();
$msg = __('Service Template :name deleted, Services removed', ['name' => $template->name]);
return response($msg, 200);
}
}