206 lines
8.4 KiB
PHP
206 lines
8.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Facades\DeviceCache;
|
|
use App\Models\Device;
|
|
use App\Models\Port;
|
|
use App\Models\Vminfo;
|
|
use Auth;
|
|
use Carbon\Carbon;
|
|
use Gate;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
use LibreNMS\Config;
|
|
use LibreNMS\Util\Graph;
|
|
use LibreNMS\Util\Url;
|
|
|
|
class DeviceController extends Controller
|
|
{
|
|
private $tabs = [
|
|
'overview' => \App\Http\Controllers\Device\Tabs\OverviewController::class,
|
|
'graphs' => \App\Http\Controllers\Device\Tabs\GraphsController::class,
|
|
'health' => \App\Http\Controllers\Device\Tabs\HealthController::class,
|
|
'apps' => \App\Http\Controllers\Device\Tabs\AppsController::class,
|
|
'processes' => \App\Http\Controllers\Device\Tabs\ProcessesController::class,
|
|
'collectd' => \App\Http\Controllers\Device\Tabs\CollectdController::class,
|
|
'ports' => \App\Http\Controllers\Device\Tabs\PortsController::class,
|
|
'port' => \App\Http\Controllers\Device\Tabs\PortController::class,
|
|
'slas' => \App\Http\Controllers\Device\Tabs\SlasController::class,
|
|
'wireless' => \App\Http\Controllers\Device\Tabs\WirelessController::class,
|
|
'accesspoints' => \App\Http\Controllers\Device\Tabs\AccessPointsController::class,
|
|
'vlans' => \App\Http\Controllers\Device\Tabs\VlansController::class,
|
|
'vm' => \App\Http\Controllers\Device\Tabs\VmInfoController::class,
|
|
'mef' => \App\Http\Controllers\Device\Tabs\MefController::class,
|
|
'tnmsne' => \App\Http\Controllers\Device\Tabs\TnmsneController::class,
|
|
'loadbalancer' => \App\Http\Controllers\Device\Tabs\LoadBalancerController::class,
|
|
'routing' => \App\Http\Controllers\Device\Tabs\RoutingController::class,
|
|
'pseudowires' => \App\Http\Controllers\Device\Tabs\PseudowiresController::class,
|
|
'neighbours' => \App\Http\Controllers\Device\Tabs\NeighboursController::class,
|
|
'stp' => \App\Http\Controllers\Device\Tabs\StpController::class,
|
|
'packages' => \App\Http\Controllers\Device\Tabs\PackagesController::class,
|
|
'inventory' => \App\Http\Controllers\Device\Tabs\InventoryController::class,
|
|
'services' => \App\Http\Controllers\Device\Tabs\ServicesController::class,
|
|
'printer' => \App\Http\Controllers\Device\Tabs\PrinterController::class,
|
|
'logs' => \App\Http\Controllers\Device\Tabs\LogsController::class,
|
|
'alerts' => \App\Http\Controllers\Device\Tabs\AlertsController::class,
|
|
'alert-stats' => \App\Http\Controllers\Device\Tabs\AlertStatsController::class,
|
|
'showconfig' => \App\Http\Controllers\Device\Tabs\ShowConfigController::class,
|
|
'netflow' => \App\Http\Controllers\Device\Tabs\NetflowController::class,
|
|
'latency' => \App\Http\Controllers\Device\Tabs\LatencyController::class,
|
|
'nac' => \App\Http\Controllers\Device\Tabs\NacController::class,
|
|
'notes' => \App\Http\Controllers\Device\Tabs\NotesController::class,
|
|
'mib' => \App\Http\Controllers\Device\Tabs\MibController::class,
|
|
'edit' => \App\Http\Controllers\Device\Tabs\EditController::class,
|
|
'capture' => \App\Http\Controllers\Device\Tabs\CaptureController::class,
|
|
];
|
|
|
|
public function index(Request $request, $device_id, $current_tab = 'overview', $vars = '')
|
|
{
|
|
|
|
$device_id = (int)str_replace('device=', '', $device_id);
|
|
$current_tab = str_replace('tab=', '', $current_tab);
|
|
$current_tab = array_key_exists($current_tab, $this->tabs) ? $current_tab : 'overview';
|
|
DeviceCache::setPrimary($device_id);
|
|
$device = DeviceCache::getPrimary();
|
|
if ($current_tab == 'port') {
|
|
$vars = Url::parseLegacyPath($request->path());
|
|
$port = Port::findOrFail($vars->get('port'));
|
|
$this->authorize('view', $port);
|
|
} else {
|
|
$this->authorize('view', $device);
|
|
}
|
|
|
|
$alert_class = $device->disabled ? 'alert-info' : ($device->status ? '' : 'alert-danger');
|
|
$parent_id = Vminfo::query()->whereIn('vmwVmDisplayName', [$device->hostname, $device->hostname . '.' . Config::get('mydomain')])->value('device_id');
|
|
$overview_graphs = $this->buildDeviceGraphArrays($device);
|
|
|
|
$tabs = array_map(function ($class) {
|
|
return app()->make($class);
|
|
}, array_filter($this->tabs, 'class_exists')); // TODO remove filter
|
|
$title = $tabs[$current_tab]->name();
|
|
$data = $tabs[$current_tab]->data($device);
|
|
|
|
// Device Link Menu, select the primary link
|
|
$device_links = $this->deviceLinkMenu($device);
|
|
$primary_device_link_name = Config::get('html.device.primary_link', 'edit');
|
|
if (!isset($device_links[$primary_device_link_name])) {
|
|
$primary_device_link_name = array_key_first($device_links);
|
|
}
|
|
$primary_device_link = $device_links[$primary_device_link_name];
|
|
unset($device_links[$primary_device_link_name], $primary_device_link_name);
|
|
|
|
if (view()->exists('device.tabs.' . $current_tab)) {
|
|
return view('device.tabs.' . $current_tab, get_defined_vars());
|
|
}
|
|
|
|
$tab_content = $this->renderLegacyTab($current_tab, $device, $data);
|
|
return view('device.tabs.legacy', get_defined_vars());
|
|
}
|
|
|
|
private function renderLegacyTab($tab, Device $device, $data)
|
|
{
|
|
ob_start();
|
|
$device = $device->toArray();
|
|
set_debug(false);
|
|
chdir(base_path());
|
|
$init_modules = ['web', 'auth'];
|
|
require base_path('/includes/init.php');
|
|
|
|
$vars['device'] = $device['device_id'];
|
|
$vars['tab'] = $tab;
|
|
|
|
extract($data); // set preloaded data into variables
|
|
include "includes/html/pages/device/$tab.inc.php";
|
|
$output = ob_get_clean();
|
|
ob_end_clean();
|
|
|
|
return $output;
|
|
}
|
|
|
|
private function buildDeviceGraphArrays($device)
|
|
{
|
|
$graph_array = [
|
|
'width' => 150,
|
|
'height' => 45,
|
|
'device' => $device->device_id,
|
|
'type' => 'device_bits',
|
|
'from' => Carbon::now()->subDay()->timestamp,
|
|
'legend' => 'no',
|
|
'bg' => 'FFFFFF00',
|
|
];
|
|
|
|
$graphs = [];
|
|
foreach (Graph::getOverviewGraphsForDevice($device) as $graph) {
|
|
$graph_array['type'] = $graph['graph'];
|
|
$graph_array['popup_title'] = __($graph['text']);
|
|
$graphs[] = $graph_array;
|
|
}
|
|
|
|
return $graphs;
|
|
}
|
|
|
|
private function deviceLinkMenu(Device $device)
|
|
{
|
|
$device_links = [];
|
|
|
|
if (Gate::allows('update', $device)) {
|
|
$device_links['edit'] = [
|
|
'icon' => 'fa-gear',
|
|
'url' => route('device', [$device->device_id, 'edit']),
|
|
'title' => __('Edit'),
|
|
'external' => false,
|
|
];
|
|
}
|
|
|
|
// User defined device links
|
|
foreach (array_values(Arr::wrap(Config::get('html.device.links'))) as $index => $link) {
|
|
$device_links['custom' . ($index + 1)] = [
|
|
'icon' => $link['icon'] ?? 'fa-external-link',
|
|
'url' => view(['template' => $link['url']], ['device' => $device])->__toString(),
|
|
'title' => $link['title'],
|
|
'external' => $link['external'] ?? true,
|
|
];
|
|
}
|
|
|
|
// Web
|
|
$device_links['web'] = [
|
|
'icon' => 'fa-globe',
|
|
'url' => 'https://' . $device->hostname,
|
|
'title' => __('Web'),
|
|
'external' => true,
|
|
'onclick' => 'http_fallback(this); return false;',
|
|
];
|
|
|
|
// SSH
|
|
$ssh_url = Config::has('gateone.server')
|
|
? Config::get('gateone.server') . '?ssh=ssh://' . (Config::get('gateone.use_librenms_user') ? Auth::user()->username . '@' : '') . $device['hostname'] . '&location=' . $device['hostname']
|
|
: 'ssh://' . $device->hostname;
|
|
$device_links['ssh'] = [
|
|
'icon' => 'fa-lock',
|
|
'url' => $ssh_url,
|
|
'title' => __('SSH'),
|
|
'external' => true,
|
|
];
|
|
|
|
// Telnet
|
|
$device_links['telnet'] = [
|
|
'icon' => 'fa-terminal',
|
|
'url' => 'telnet://' . $device->hostname,
|
|
'title' => __('Telnet'),
|
|
'external' => true,
|
|
];
|
|
|
|
if (Gate::allows('admin')) {
|
|
$device_links['capture'] = [
|
|
'icon' => 'fa-bug',
|
|
'url' => route('device', [$device->device_id, 'capture']),
|
|
'title' => __('Capture'),
|
|
'external' => false,
|
|
];
|
|
}
|
|
|
|
return $device_links;
|
|
}
|
|
}
|