2007-04-03 14:10:23 +00:00
<? php
2017-12-24 21:58:59 +02:00
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version. Please see LICENSE.txt at the top level of
* the source code distribution for details.
*
* @package LibreNMS
* @subpackage webui
2021-02-09 00:29:04 +01:00
* @link https://www.librenms.org
2017-12-24 21:58:59 +02:00
* @copyright 2017 LibreNMS
* @author LibreNMS Contributors
*/
2007-04-03 14:10:23 +00:00
2019-12-30 12:11:26 +01:00
use App\Models\Port ;
2020-04-16 09:19:58 -05:00
use Illuminate\Database\Eloquent\ModelNotFoundException ;
2019-12-30 12:11:26 +01:00
2011-10-18 14:41:19 +00:00
$pagetitle [] = 'Ports' ;
2012-05-25 12:24:34 +00:00
// Set Defaults here
2007-04-03 14:10:23 +00:00
2016-08-18 20:28:22 -05:00
if ( ! isset ( $vars [ 'format' ])) {
2011-09-14 13:38:01 +00:00
$vars [ 'format' ] = 'list_basic' ;
}
2007-04-03 14:10:23 +00:00
2022-09-07 15:33:29 -05:00
$displayLists = '<span style="font-weight: bold;">Ports lists</span> » ' ;
2014-01-13 10:05:19 +00:00
$menu_options = [ 'basic' => 'Basic' , 'detail' => 'Detail' ];
$sep = '' ;
foreach ( $menu_options as $option => $text ) {
2017-12-24 21:58:59 +02:00
$displayLists .= $sep ;
if ( $vars [ 'format' ] == 'list_' . $option ) {
$displayLists .= '<span class="pagemenu-selected">' ;
2014-01-13 10:05:19 +00:00
}
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'format' => 'list_' . $option ]) . '">' . $text . '</a>' ;
2017-12-24 21:58:59 +02:00
if ( $vars [ 'format' ] == 'list_' . $option ) {
$displayLists .= '</span>' ;
2014-01-13 10:05:19 +00:00
}
$sep = ' | ' ;
}
2018-01-08 21:54:21 +02:00
$displayLists .= ' <span style="font-weight: bold;">Graphs</span> » ' ;
2014-01-13 10:05:19 +00:00
$menu_options = [ 'bits' => 'Bits' ,
'upkts' => 'Unicast Packets' ,
'nupkts' => 'Non-Unicast Packets' ,
'errors' => 'Errors' , ];
$sep = '' ;
foreach ( $menu_options as $option => $text ) {
2017-12-24 21:58:59 +02:00
$displayLists .= $sep ;
if ( $vars [ 'format' ] == 'graph_' . $option ) {
$displayLists .= '<span class="pagemenu-selected">' ;
2014-01-13 10:05:19 +00:00
}
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'format' => 'graph_' . $option ]) . '">' . $text . '</a>' ;
2017-12-24 21:58:59 +02:00
if ( $vars [ 'format' ] == 'graph_' . $option ) {
$displayLists .= '</span>' ;
2014-01-13 10:05:19 +00:00
}
$sep = ' | ' ;
}
2017-12-24 21:58:59 +02:00
$displayLists .= '<div style="float: right;">' ;
2021-05-05 04:51:19 +02:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'format' => '' , 'page' => 'csv.php' , 'report' => 'ports' ]) . '" title="Export as CSV" target="_blank" rel="noopener">Export CSV</a> | <a href="' . \LibreNMS\Util\Url :: generate ( $vars ) . '" title="Update the browser URL to reflect the search criteria.">Update URL</a> | ' ;
2014-01-13 10:05:19 +00:00
2015-03-01 17:06:38 +00:00
if ( isset ( $vars [ 'searchbar' ]) && $vars [ 'searchbar' ] == 'hide' ) {
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'searchbar' => '' ]) . '">Search</a>' ;
2016-08-18 20:28:22 -05:00
} else {
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'searchbar' => 'hide' ]) . '">Search</a>' ;
2014-01-13 10:05:19 +00:00
}
2017-12-24 21:58:59 +02:00
$displayLists .= ' | ' ;
2014-01-13 10:05:19 +00:00
2015-03-01 17:06:38 +00:00
if ( isset ( $vars [ 'bare' ]) && $vars [ 'bare' ] == 'yes' ) {
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'bare' => '' ]) . '">Header</a>' ;
2016-08-18 20:28:22 -05:00
} else {
2021-03-28 17:25:30 -05:00
$displayLists .= '<a href="' . \LibreNMS\Util\Url :: generate ( $vars , [ 'bare' => 'yes' ]) . '">Header</a>' ;
2014-01-13 10:05:19 +00:00
}
2017-12-24 21:58:59 +02:00
$displayLists .= ' | ' ;
$displayLists .= '<span style="font-weight: bold;">Bulk actions</span> »' ;
2021-09-30 02:41:12 -05:00
$displayLists .= '<a href="ports/deleted=1/purge=all" title="Delete ports"> Purge all deleted</a>' ;
2014-01-13 10:05:19 +00:00
2017-12-24 21:58:59 +02:00
$displayLists .= '</div>' ;
2014-01-13 10:05:19 +00:00
2016-08-18 20:28:22 -05:00
if (( isset ( $vars [ 'searchbar' ]) && $vars [ 'searchbar' ] != 'hide' ) || ! isset ( $vars [ 'searchbar' ])) {
2022-09-07 15:33:29 -05:00
$output = "<form method='post' action='' class='form-inline' role='form'>" ;
2019-07-18 08:29:42 -05:00
$output .= addslashes ( csrf_field ());
2017-12-24 21:58:59 +02:00
$output .= "<div style='margin-bottom:4px;text-align:left;'>" ;
$output .= "<div class='form-group'>" ;
2022-09-16 10:40:03 -03:00
$output .= "<select name='device_id' id='device_id' class='form-control input-sm'></select> " ;
2011-09-14 14:28:42 +00:00
2022-08-30 12:55:37 -05:00
$hasvalue = ! empty ( $vars [ 'hostname' ]) ? "value='" . $vars [ 'hostname' ] . "'" : '' ;
2015-04-22 21:35:16 +01:00
2017-12-24 21:58:59 +02:00
$output .= "<input type='text' name='hostname' id='hostname' title='Hostname' class='form-control input-sm' " . $hasvalue . " placeholder='Hostname'>" ;
$output .= '</div> ' ;
2022-08-30 12:55:37 -05:00
switch ( $vars [ 'state' ] ?? '' ) {
2017-12-24 21:58:59 +02:00
case 'up' :
$isup = 'selected' ;
$isdown = '' ;
$admindown = '' ;
break ;
case 'down' :
$isup = '' ;
$isdown = 'selected' ;
$admindown = '' ;
break ;
case 'admindown' :
$isup = '' ;
$isdown = '' ;
$admindown = 'selected' ;
break ;
2022-08-30 12:55:37 -05:00
default :
$isup = '' ;
$isdown = '' ;
$admindown = '' ;
2011-09-14 13:38:01 +00:00
}
2015-04-22 21:35:16 +01:00
2017-12-24 21:58:59 +02:00
$output .= "<div class='form-group'>" ;
$output .= "<select name='state' id='state' class='form-control input-sm'>" ;
$output .= "<option value=''>All States</option>" ;
$output .= "<option value='up' " . $isup . '>Up</option>' ;
$output .= "<option value='down' " . $isdown . '>Down</option>' ;
$output .= "<option value='admindown' " . $admindown . '>Shutdown</option>' ;
$output .= '</select> ' ;
2018-05-24 01:13:13 +01:00
$output .= "<select name='ifSpeed' id='ifSpeed' class='form-control input-sm'>" ;
2017-12-24 21:58:59 +02:00
$output .= "<option value=''>All Speeds</option>" ;
2019-12-30 12:11:26 +01:00
$ifSpeed = Port :: select ( 'ifSpeed' )
-> hasAccess ( Auth :: user ())
-> groupBy ( 'ifSpeed' )
-> orderBy ( 'ifSpeed' )
-> get ();
2017-12-24 21:58:59 +02:00
2019-12-30 12:11:26 +01:00
foreach ( $ifSpeed as $data ) {
2017-12-24 21:58:59 +02:00
if ( $data [ 'ifSpeed' ]) {
2022-08-30 12:55:37 -05:00
$speedselected = isset ( $vars [ 'ifSpeed' ]) && $data [ 'ifSpeed' ] == $vars [ 'ifSpeed' ] ? 'selected' : '' ;
2021-03-28 17:25:30 -05:00
$output .= "<option value='" . $data [ 'ifSpeed' ] . "'" . $speedselected . '>' . \LibreNMS\Util\Number :: formatSi ( $data [ 'ifSpeed' ], 2 , 3 , 'bps' ) . '</option>' ;
2011-09-14 13:38:01 +00:00
}
}
2015-04-22 21:35:16 +01:00
2017-12-24 21:58:59 +02:00
$output .= '</select> ' ;
$output .= '</div>' ;
$output .= "<div class='form-group'>" ;
$output .= "<select name='ifType' id='ifType' class='form-control input-sm'>" ;
$output .= "<option value=''>All Media</option>" ;
2019-12-30 12:11:26 +01:00
$ifType = Port :: select ( 'ifType' )
-> hasAccess ( Auth :: user ())
-> groupBy ( 'ifType' )
-> orderBy ( 'ifType' )
-> get ();
2017-05-05 12:25:58 +01:00
2019-12-30 12:11:26 +01:00
foreach ( $ifType as $data ) {
2017-12-24 21:58:59 +02:00
if ( $data [ 'ifType' ]) {
2022-08-30 12:55:37 -05:00
$dataselected = isset ( $vars [ 'ifType' ]) && $data [ 'ifType' ] == $vars [ 'ifType' ] ? 'selected' : '' ;
2018-01-21 04:26:31 +00:00
$output .= "<option value='" . clean_bootgrid ( $data [ 'ifType' ]) . "' " . $dataselected . '>' . clean_bootgrid ( $data [ 'ifType' ]) . '</option>' ;
2011-09-14 14:28:42 +00:00
}
}
2015-07-13 20:10:26 +02:00
2017-12-24 21:58:59 +02:00
$output .= '</select> ' ;
$output .= "<select name='port_descr_type' id='port_descr_type' class='form-control input-sm'>" ;
$output .= "<option value=''>All Port Types</option>" ;
2019-08-05 14:16:05 -05:00
if ( Auth :: user () -> hasGlobalRead ()) {
2017-12-24 21:58:59 +02:00
$sql = 'SELECT `port_descr_type` FROM `ports` GROUP BY `port_descr_type` ORDER BY `port_descr_type`' ;
} else {
$sql = 'SELECT `port_descr_type` FROM `ports` AS `I`, `devices` AS `D`, `devices_perms` AS `P`, `ports_perms` AS `PP` WHERE ((`P`.`user_id` = ? AND `P`.`device_id` = `D`.`device_id`) OR (`PP`.`user_id` = ? AND `PP`.`port_id` = `I`.`port_id` AND `I`.`device_id` = `D`.`device_id`)) AND `D`.`device_id` = `I`.`device_id` GROUP BY `port_descr_type` ORDER BY `port_descr_type`' ;
2019-08-05 14:16:05 -05:00
$param [] = [ Auth :: id (), Auth :: id ()];
2011-09-19 11:15:01 +00:00
}
2019-12-30 12:11:26 +01:00
$port_descr_type = Port :: select ( 'port_descr_type' )
-> hasAccess ( Auth :: user ())
-> groupBy ( 'port_descr_type' )
-> orderBy ( 'port_descr_type' )
-> get ();
2017-12-24 21:58:59 +02:00
2019-12-30 12:11:26 +01:00
foreach ( $port_descr_type as $data ) {
2017-12-24 21:58:59 +02:00
if ( $data [ 'port_descr_type' ]) {
2022-08-30 12:55:37 -05:00
if ( isset ( $vars [ 'port_descr_type' ]) && $data [ 'port_descr_type' ] == $vars [ 'port_descr_type' ]) {
2017-12-24 21:58:59 +02:00
$portdescrib = 'selected' ;
} else {
$portdescrib = '' ;
2017-11-29 02:23:19 -06:00
}
2018-01-21 04:26:31 +00:00
$output .= "<option value='" . clean_bootgrid ( $data [ 'port_descr_type' ]) . "' " . $portdescrib . '>' . ucfirst ( clean_bootgrid ( $data [ 'port_descr_type' ])) . '</option>' ;
2017-12-24 21:58:59 +02:00
}
}
$output .= '</select> ' ;
$output .= '</div>' ;
$output .= "<div class='form-group'>" ;
2022-08-30 12:55:37 -05:00
$ifaliasvalue = isset ( $vars [ 'ifAlias' ]) ? "value='" . $vars [ 'ifAlias' ] . "'" : '' ;
2017-12-24 21:58:59 +02:00
$output .= '</div>' ;
$output .= '</div>' ;
$output .= "<div style='text-align:left;'>" ;
$output .= "<input title='Port Description' type='text' name='ifAlias' id='ifAlias' class='form-control input-sm' " . $ifaliasvalue . " placeholder='Port Description'> " ;
$output .= "<select title='Location' name='location' id='location' class='form-control input-sm'> " ;
$output .= "<option value=''>All Locations</option>" ;
2018-11-28 16:49:18 -06:00
foreach ( getlocations () as $location_row ) {
$location = $location_row [ 'location' ];
$location_id = $location_row [ 'id' ];
2017-12-24 21:58:59 +02:00
if ( $location ) {
2022-08-30 12:55:37 -05:00
if ( isset ( $vars [ 'location' ]) && $location_id == $vars [ 'location' ]) {
2017-12-24 21:58:59 +02:00
$locationselected = 'selected' ;
} else {
$locationselected = '' ;
2017-11-29 02:23:19 -06:00
}
2017-12-24 21:58:59 +02:00
$ui_location = strlen ( $location ) > 15 ? substr ( $location , 0 , 15 ) . '...' : $location ;
2018-11-28 16:49:18 -06:00
$output .= "<option value=' $location_id ' $locationselected >" . clean_bootgrid ( $ui_location ) . '</option>' ;
2017-12-24 21:58:59 +02:00
}
}
2011-09-14 13:38:01 +00:00
2017-12-24 21:58:59 +02:00
$output .= '</select> ' ;
2022-08-30 12:55:37 -05:00
$ignorecheck = isset ( $vars [ 'ignore' ]) ? 'checked' : '' ;
$disabledcheck = isset ( $vars [ 'disabled' ]) ? 'checked' : '' ;
$deletedcheck = isset ( $vars [ 'deleted' ]) ? 'checked' : '' ;
2017-12-24 21:58:59 +02:00
$output .= "<label for='ignore'>Ignored</label> " ;
$output .= "<input type='checkbox' id='ignore' name='ignore' value='1' " . $ignorecheck . '> ' ;
$output .= "<label for='disabled'>Disabled</label> " ;
$output .= "<input type='checkbox' id='disabled' name='disabled' value='1' " . $disabledcheck . '> ' ;
$output .= "<label for='deleted'>Deleted</label> " ;
$output .= "<input type='checkbox' id='deleted' name='deleted' value='1' " . $deletedcheck . '> ' ;
$output .= "<button type='submit' class='btn btn-default btn-sm'>Search</button> " ;
2022-08-30 12:55:37 -05:00
$output .= "<a class='btn btn-default btn-sm' href='" . \LibreNMS\Util\Url :: generate ([ 'page' => 'ports' , 'section' => $vars [ 'section' ] ?? '' , 'bare' => $vars [ 'bare' ] ?? '' ]) . "' title='Reset critera to default.'>Reset</a>" ;
2017-12-24 21:58:59 +02:00
$output .= '</div>' ;
$output .= '</form>' ;
}
2011-09-14 13:38:01 +00:00
2016-08-18 20:28:22 -05:00
if ( ! isset ( $vars [ 'ignore' ])) {
2011-09-19 11:15:01 +00:00
$vars [ 'ignore' ] = '0' ;
}
2016-08-18 20:28:22 -05:00
if ( ! isset ( $vars [ 'disabled' ])) {
2011-09-19 11:15:01 +00:00
$vars [ 'disabled' ] = '0' ;
}
2016-08-18 20:28:22 -05:00
if ( ! isset ( $vars [ 'deleted' ])) {
2011-09-19 11:15:01 +00:00
$vars [ 'deleted' ] = '0' ;
}
2011-09-14 14:28:42 +00:00
2022-09-07 15:33:29 -05:00
if ( isset ( $vars [ 'purge' ])) {
if ( $vars [ 'purge' ] === 'all' ) {
Port :: hasAccess ( Auth :: user ()) -> with ([ 'device' => function ( $query ) {
$query -> select ( 'device_id' , 'hostname' );
}]) -> isDeleted () -> chunk ( 100 , function ( $ports ) {
foreach ( $ports as $port ) {
$port -> delete ();
}
});
} else {
try {
Port :: hasAccess ( Auth :: user ()) -> where ( 'port_id' , $vars [ 'purge' ]) -> firstOrFail () -> delete ();
} catch ( ModelNotFoundException $e ) {
echo "<div class='alert alert-danger'>Port ID { $vars [ 'purge' ] } not found! Could not purge port.</div>" ;
2015-06-18 23:16:53 +01:00
}
2011-09-20 16:03:54 +00:00
}
2011-09-14 13:38:01 +00:00
}
2019-04-11 23:26:42 -05:00
[ $format , $subformat ] = explode ( '_' , basename ( $vars [ 'format' ]));
2012-05-25 10:34:01 +00:00
2019-04-11 23:26:42 -05:00
if ( file_exists ( 'includes/html/pages/ports/' . $format . '.inc.php' )) {
require 'includes/html/pages/ports/' . $format . '.inc.php' ;
2011-09-14 13:38:01 +00:00
}