2019-06-19 16:01:53 -05:00
< ? php
namespace App\Http\Controllers ;
2019-09-21 07:25:02 +02:00
use App\Models\Device ;
2019-06-19 16:01:53 -05:00
use App\Models\DeviceGroup ;
use Illuminate\Http\Request ;
2020-09-21 14:54:51 +02:00
use Illuminate\Validation\Rule ;
2019-06-19 16:01:53 -05:00
use LibreNMS\Alerting\QueryBuilderFilter ;
use LibreNMS\Alerting\QueryBuilderFluentParser ;
use Toastr ;
class DeviceGroupController extends Controller
{
public function __construct ()
{
$this -> authorizeResource ( DeviceGroup :: class , 'device_group' );
}
/**
* Display a listing of the resource .
*
* @ return \Illuminate\Http\Response
*/
public function index ()
{
$this -> authorize ( 'manage' , DeviceGroup :: class );
2019-09-21 07:25:02 +02:00
$ungrouped_devices = Device :: orderBy ( 'hostname' ) -> whereNotIn ( 'device_id' , function ( $query ) {
$query -> select ( 'device_id' ) -> from ( 'device_group_device' );
}) -> get ();
2019-06-19 16:01:53 -05:00
return view ( 'device-group.index' , [
'device_groups' => DeviceGroup :: orderBy ( 'name' ) -> withCount ( 'devices' ) -> get (),
2019-09-21 07:25:02 +02:00
'ungrouped_devices' => $ungrouped_devices ,
2019-06-19 16:01:53 -05:00
]);
}
/**
* Show the form for creating a new resource .
*
* @ return \Illuminate\Http\Response
*/
public function create ()
{
return view ( 'device-group.create' , [
'device_group' => new DeviceGroup (),
'filters' => json_encode ( new QueryBuilderFilter ( 'group' )),
]);
}
/**
* Store a newly created resource in storage .
*
* @ param \Illuminate\Http\Request $request
* @ return \Illuminate\Http\Response
*/
public function store ( Request $request )
{
$this -> validate ( $request , [
'name' => 'required|string|unique:device_groups' ,
'type' => 'required|in:dynamic,static' ,
'devices' => 'array|required_if:type,static' ,
'devices.*' => 'integer' ,
'rules' => 'json|required_if:type,dynamic' ,
]);
$deviceGroup = DeviceGroup :: make ( $request -> only ([ 'name' , 'desc' , 'type' ]));
$deviceGroup -> rules = json_decode ( $request -> rules );
$deviceGroup -> save ();
if ( $request -> type == 'static' ) {
$deviceGroup -> devices () -> sync ( $request -> devices );
}
Toastr :: success ( __ ( 'Device Group :name created' , [ 'name' => $deviceGroup -> name ]));
return redirect () -> route ( 'device-groups.index' );
}
/**
* Display the specified resource .
*
* @ param \App\Models\DeviceGroup $deviceGroup
* @ return \Illuminate\Http\Response
*/
public function show ( DeviceGroup $deviceGroup )
{
return redirect ( url ( '/devices/group=' . $deviceGroup -> id ));
}
/**
* Show the form for editing the specified resource .
*
* @ param \App\Models\DeviceGroup $deviceGroup
* @ return \Illuminate\Http\Response
*/
public function edit ( DeviceGroup $deviceGroup )
{
// convert old rules on edit
if ( is_null ( $deviceGroup -> rules )) {
$query_builder = QueryBuilderFluentParser :: fromOld ( $deviceGroup -> pattern );
$deviceGroup -> rules = $query_builder -> toArray ();
}
return view ( 'device-group.edit' , [
'device_group' => $deviceGroup ,
'filters' => json_encode ( new QueryBuilderFilter ( 'group' )),
]);
}
/**
* Update the specified resource in storage .
*
* @ param \Illuminate\Http\Request $request
* @ param \App\Models\DeviceGroup $deviceGroup
* @ return \Illuminate\Http\Response
*/
public function update ( Request $request , DeviceGroup $deviceGroup )
{
$this -> validate ( $request , [
'name' => [
'required' ,
'string' ,
Rule :: unique ( 'device_groups' ) -> where ( function ( $query ) use ( $deviceGroup ) {
$query -> where ( 'id' , '!=' , $deviceGroup -> id );
}),
],
'type' => 'required|in:dynamic,static' ,
'devices' => 'array|required_if:type,static' ,
'devices.*' => 'integer' ,
'rules' => 'json|required_if:type,dynamic' ,
]);
$deviceGroup -> fill ( $request -> only ([ 'name' , 'desc' , 'type' ]));
$devices_updated = false ;
if ( $deviceGroup -> type == 'static' ) {
// sync device_ids from input
2019-11-20 08:59:13 +00:00
$updated = $deviceGroup -> 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 ;
2019-06-19 16:01:53 -05:00
} else {
$deviceGroup -> rules = json_decode ( $request -> rules );
}
if ( $deviceGroup -> isDirty () || $devices_updated ) {
try {
if ( $deviceGroup -> save () || $devices_updated ) {
Toastr :: success ( __ ( 'Device Group :name updated' , [ 'name' => $deviceGroup -> name ]));
} else {
Toastr :: error ( __ ( 'Failed to save' ));
2020-09-21 14:54:51 +02:00
2019-06-19 16:01:53 -05:00
return redirect () -> back () -> withInput ();
}
} catch ( \Illuminate\Database\QueryException $e ) {
return redirect () -> back () -> withInput () -> withErrors ([
2020-09-21 14:54:51 +02:00
'rules' => __ ( 'Rules resulted in invalid query: ' ) . $e -> getMessage (),
2019-06-19 16:01:53 -05:00
]);
}
} else {
Toastr :: info ( __ ( 'No changes made' ));
}
return redirect () -> route ( 'device-groups.index' );
}
/**
* Remove the specified resource from storage .
*
* @ param \App\Models\DeviceGroup $deviceGroup
* @ return \Illuminate\Http\Response
*/
public function destroy ( DeviceGroup $deviceGroup )
{
2021-02-02 06:40:11 +00:00
if ( $deviceGroup -> serviceTemplates () -> exists ()) {
$msg = __ ( 'Device Group :name still has Service Templates associated with it. Please remove or update the Service Template accordingly' , [ 'name' => $deviceGroup -> name ]);
return response ( $msg , 200 );
}
2019-06-19 16:01:53 -05:00
$deviceGroup -> delete ();
2020-10-19 12:27:17 +02:00
$msg = __ ( 'Device Group :name deleted' , [ 'name' => $deviceGroup -> name ]);
2019-06-19 16:01:53 -05:00
2020-10-19 12:27:17 +02:00
return response ( $msg , 200 );
2019-06-19 16:01:53 -05:00
}
}