2011-03-17 00:09:20 +00:00
<? php
2008-04-11 08:11:28 +00:00
2017-08-08 14:14:58 -05:00
use LibreNMS\Exceptions\InvalidIpException ;
use LibreNMS\Util\IPv6 ;
2019-08-05 14:16:05 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2019-04-11 23:26:42 -05:00
include 'includes/html/error-no-perm.inc.php' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
$link_array = array (
'page' => 'routing' ,
'protocol' => 'bgp' ,
);
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
print_optionbar_start ( '' , '' );
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
echo '<span style="font-weight: bold;">BGP</span> » ' ;
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
if ( ! $vars [ 'type' ]) {
$vars [ 'type' ] = 'all' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'type' ] == 'all' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'All' , $vars , array ( 'type' => 'all' ));
if ( $vars [ 'type' ] == 'all' ) {
echo '</span>' ;
}
2011-04-29 16:32:55 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'type' ] == 'internal' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'iBGP' , $vars , array ( 'type' => 'internal' ));
if ( $vars [ 'type' ] == 'internal' ) {
echo '</span>' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'type' ] == 'external' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-09-26 14:53:55 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'eBGP' , $vars , array ( 'type' => 'external' ));
if ( $vars [ 'type' ] == 'external' ) {
echo '</span>' ;
}
2011-09-26 14:53:55 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'adminstatus' ] == 'stop' ) {
echo "<span class='pagemenu-selected'>" ;
echo generate_link ( 'Shutdown' , $vars , array ( 'adminstatus' => null ));
echo '</span>' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo generate_link ( 'Shutdown' , $vars , array ( 'adminstatus' => 'stop' ));
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'adminstatus' ] == 'start' ) {
echo "<span class='pagemenu-selected'>" ;
echo generate_link ( 'Enabled' , $vars , array ( 'adminstatus' => null ));
echo '</span>' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo generate_link ( 'Enabled' , $vars , array ( 'adminstatus' => 'start' ));
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'state' ] == 'down' ) {
echo "<span class='pagemenu-selected'>" ;
echo generate_link ( 'Down' , $vars , array ( 'state' => null ));
echo '</span>' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo generate_link ( 'Down' , $vars , array ( 'state' => 'down' ));
}
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
// End BGP Menu
if ( ! isset ( $vars [ 'view' ])) {
$vars [ 'view' ] = 'details' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo '<div style="float: right;">' ;
2011-04-29 16:32:55 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'view' ] == 'details' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'No Graphs' , $vars , array ( 'view' => 'details' , 'graph' => 'NULL' ));
if ( $vars [ 'view' ] == 'details' ) {
echo '</span>' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo ' | ' ;
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'updates' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'Updates' , $vars , array ( 'view' => 'graphs' , 'graph' => 'updates' ));
if ( $vars [ 'graph' ] == 'updates' ) {
echo '</span>' ;
}
2011-04-29 16:32:55 +00:00
2015-07-13 20:10:26 +02:00
echo ' | Prefixes: Unicast (' ;
if ( $vars [ 'graph' ] == 'prefixes_ipv4unicast' ) {
echo "<span class='pagemenu-selected'>" ;
2017-03-11 23:16:49 +00:00
$extra_sql = " AND `bgpPeerIdentifier` NOT LIKE '%:%'" ;
2015-07-13 20:10:26 +02:00
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'IPv4' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv4unicast' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv4unicast' ) {
echo '</span>' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo '|' ;
2011-04-29 16:32:55 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'prefixes_ipv6unicast' ) {
echo "<span class='pagemenu-selected'>" ;
2017-03-11 23:16:49 +00:00
$extra_sql = " AND `bgpPeerIdentifier` LIKE '%:%'" ;
2015-07-13 20:10:26 +02:00
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'IPv6' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv6unicast' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv6unicast' ) {
echo '</span>' ;
}
2011-09-26 14:39:07 +00:00
2015-07-13 20:10:26 +02:00
echo '|' ;
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'prefixes_ipv4vpn' ) {
echo "<span class='pagemenu-selected'>" ;
}
2011-04-18 16:56:51 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'VPNv4' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv4vpn' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv4vpn' ) {
echo '</span>' ;
}
2011-04-18 16:56:51 +00:00
2019-04-09 14:44:48 +02:00
echo '|' ;
if ( $vars [ 'graph' ] == 'prefixes_ipv6vpn' ) {
echo "<span class='pagemenu-selected'>" ;
}
echo generate_link ( 'VPNv6' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv6vpn' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv6vpn' ) {
echo '</span>' ;
}
2015-07-13 20:10:26 +02:00
echo ')' ;
2010-01-10 14:55:28 +00:00
2015-07-13 20:10:26 +02:00
echo ' | Multicast (' ;
if ( $vars [ 'graph' ] == 'prefixes_ipv4multicast' ) {
echo "<span class='pagemenu-selected'>" ;
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'IPv4' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv4multicast' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv4multicast' ) {
echo '</span>' ;
}
2011-09-26 14:53:55 +00:00
2015-07-13 20:10:26 +02:00
echo '|' ;
2011-09-26 14:53:55 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'prefixes_ipv6multicast' ) {
echo "<span class='pagemenu-selected'>" ;
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'IPv6' , $vars , array ( 'view' => 'graphs' , 'graph' => 'prefixes_ipv6multicast' ));
if ( $vars [ 'graph' ] == 'prefixes_ipv6multicast' ) {
echo '</span>' ;
2010-01-13 00:23:31 +00:00
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
echo ')' ;
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
echo ' | MAC (' ;
if ( $vars [ 'graph' ] == 'macaccounting_bits' ) {
echo "<span class='pagemenu-selected'>" ;
}
echo generate_link ( 'Bits' , $vars , array ( 'view' => 'graphs' , 'graph' => 'macaccounting_bits' ));
if ( $vars [ 'graph' ] == 'macaccounting_bits' ) {
echo '</span>' ;
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
echo '|' ;
2011-04-03 17:07:17 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'macaccounting_pkts' ) {
echo "<span class='pagemenu-selected'>" ;
2015-06-09 09:54:49 +01:00
}
2011-04-03 17:07:17 +00:00
2015-07-13 20:10:26 +02:00
echo generate_link ( 'Packets' , $vars , array ( 'view' => 'graphs' , 'graph' => 'macaccounting_pkts' ));
if ( $vars [ 'graph' ] == 'macaccounting_pkts' ) {
echo '</span>' ;
2015-06-09 09:54:49 +01:00
}
2015-07-13 20:10:26 +02:00
echo ')' ;
echo '</div>' ;
print_optionbar_end ();
2011-04-03 17:07:17 +00:00
2017-04-12 17:30:01 -04:00
echo "<table border=0 cellspacing=0 cellpadding=5 width=100% class='table sortable'>" ;
2020-04-25 05:47:20 +02:00
echo '<tr style="height: 30px"><td width=1></td><th>Local address</th><th></th><th>Peer address</th><th>Type</th><th>Family</th><th>Remote AS</th><th>Peer description</th><th>State</th><th>Last error</th><th width=200>Uptime / Updates</th></tr>' ;
2011-04-19 21:54:43 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'type' ] == 'external' ) {
$where = 'AND D.bgpLocalAs != B.bgpPeerRemoteAs' ;
2016-08-18 20:28:22 -05:00
} elseif ( $vars [ 'type' ] == 'internal' ) {
2015-07-13 20:10:26 +02:00
$where = 'AND D.bgpLocalAs = B.bgpPeerRemoteAs' ;
}
if ( $vars [ 'adminstatus' ] == 'stop' ) {
$where .= " AND (B.bgpPeerAdminStatus = 'stop')" ;
2016-08-18 20:28:22 -05:00
} elseif ( $vars [ 'adminstatus' ] == 'start' ) {
2015-07-13 20:10:26 +02:00
$where .= " AND (B.bgpPeerAdminStatus = 'start' || B.bgpPeerAdminStatus = 'running')" ;
2011-04-29 16:32:55 +00:00
}
2015-07-13 20:10:26 +02:00
if ( $vars [ 'state' ] == 'down' ) {
$where .= " AND (B.bgpPeerState != 'established')" ;
}
2016-08-03 16:49:41 +01:00
$peer_query = "SELECT * FROM `bgpPeers` AS `B`, `devices` AS `D` WHERE `B`.`device_id` = `D`.`device_id` $where $extra_sql ORDER BY `D`.`hostname`, `B`.`bgpPeerRemoteAs`, `B`.`bgpPeerIdentifier`" ;
2015-07-13 20:10:26 +02:00
foreach ( dbFetchRows ( $peer_query ) as $peer ) {
unset ( $alert , $bg_image );
if ( $peer [ 'bgpPeerState' ] == 'established' ) {
$col = 'green' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
$col = 'red' ;
$peer [ 'alert' ] = 1 ;
}
if ( $peer [ 'bgpPeerAdminStatus' ] == 'start' || $peer [ 'bgpPeerAdminStatus' ] == 'running' ) {
$admin_col = 'green' ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
$admin_col = 'gray' ;
}
if ( $peer [ 'bgpPeerAdminStatus' ] == 'stop' ) {
$peer [ 'alert' ] = 0 ;
$peer [ 'disabled' ] = 1 ;
}
if ( $peer [ 'bgpPeerRemoteAs' ] == $peer [ 'bgpLocalAs' ]) {
$peer_type = "<span style='color: #00f;'>iBGP</span>" ;
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
$peer_type = "<span style='color: #0a0;'>eBGP</span>" ;
if ( $peer [ 'bgpPeerRemoteAS' ] >= '64512' && $peer [ 'bgpPeerRemoteAS' ] <= '65535' ) {
$peer_type = "<span style='color: #f00;'>Priv eBGP</span>" ;
}
}
2017-08-08 14:14:58 -05:00
try {
$peer_ip = new IPv6 ( $peer [ 'bgpLocalAddr' ]);
} catch ( InvalidIpException $e ) {
2015-07-13 20:10:26 +02:00
$peer_ip = $peer [ 'bgpLocalAddr' ];
}
2017-08-08 14:14:58 -05:00
try {
$peer_ident = new IPv6 ( $peer [ 'bgpPeerIdentifier' ]);
} catch ( InvalidIpException $e ) {
2015-07-13 20:10:26 +02:00
$peer_ident = $peer [ 'bgpPeerIdentifier' ];
}
2016-02-03 06:41:20 +10:00
// display overlib graphs
$graph_array = array ();
$graph_array [ 'type' ] = 'bgp_updates' ;
$graph_array [ 'id' ] = $peer [ 'bgpPeer_id' ];
2019-06-23 00:29:12 -05:00
$graph_array [ 'to' ] = \LibreNMS\Config :: get ( 'time.now' );
$graph_array [ 'from' ] = \LibreNMS\Config :: get ( 'time.day' );
2016-02-03 06:41:20 +10:00
$graph_array [ 'height' ] = '110' ;
$graph_array [ 'width' ] = $width ;
// Peer Address
$graph_array_zoom = $graph_array ;
$graph_array_zoom [ 'height' ] = '150' ;
$graph_array_zoom [ 'width' ] = '500' ;
$overlib_link = "device/device=" . $peer [ 'device_id' ] . "/tab=routing/proto=bgp/" ;
2016-08-18 20:28:22 -05:00
$peeraddresslink = "<span class=list-large>" . overlib_link ( $overlib_link , $peer_ident , generate_graph_tag ( $graph_array_zoom ), null ) . "</span>" ;
2016-02-03 06:41:20 +10:00
// Local Address
$graph_array [ 'afi' ] = 'ipv4' ;
$graph_array [ 'safi' ] = 'unicast' ;
$graph_array_zoom [ 'afi' ] = 'ipv4' ;
$graph_array_zoom [ 'safi' ] = 'unicast' ;
$overlib_link = "device/device=" . $peer [ 'device_id' ] . "/tab=routing/proto=bgp/" ;
2016-08-18 20:28:22 -05:00
$localaddresslink = "<span class=list-large>" . overlib_link ( $overlib_link , $peer_ip , generate_graph_tag ( $graph_array_zoom ), null ) . "</span>" ;
2015-07-13 20:10:26 +02:00
2020-04-25 05:47:20 +02:00
if ( $peer [ 'bgpPeerLastErrorCode' ] == 0 && $peer [ 'bgpPeerLastErrorSubCode' ] == 0 ) {
$last_error = $peer [ 'bgpPeerLastErrorText' ];
} else {
$last_error = describe_bgp_error_code ( $peer [ 'bgpPeerLastErrorCode' ], $peer [ 'bgpPeerLastErrorSubCode' ]) . "<br/>" . $peer [ 'bgpPeerLastErrorText' ];
}
2015-07-13 20:10:26 +02:00
echo '<tr class="bgp"' . ( $peer [ 'alert' ] ? ' bordercolor="#cc0000"' : '' ) . ( $peer [ 'disabled' ] ? ' bordercolor="#cccccc"' : '' ) . '>' ;
unset ( $sep );
foreach ( dbFetchRows ( 'SELECT * FROM `bgpPeers_cbgp` WHERE `device_id` = ? AND bgpPeerIdentifier = ?' , array ( $peer [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ])) as $afisafi ) {
$afi = $afisafi [ 'afi' ];
$safi = $afisafi [ 'safi' ];
$this_afisafi = $afi . $safi ;
$peer [ 'afi' ] .= $sep . $afi . '.' . $safi ;
$sep = '<br />' ;
$peer [ 'afisafi' ][ $this_afisafi ] = 1 ;
// Build a list of valid AFI/SAFI for this peer
}
unset ( $sep );
echo ' <td></td>
<td width=150>' . $localaddresslink . '<br />' . generate_device_link ( $peer , shorthost ( $peer [ 'hostname' ]), array ( 'tab' => 'routing' , 'proto' => 'bgp' )) . '</td>
2011-09-20 14:37:54 +00:00
<td width=30><b>»</b></td>
2015-07-13 20:10:26 +02:00
<td width=150>' . $peeraddresslink . "</td>
2011-09-20 14:37:54 +00:00
<td width=50><b> $peer_type </b></td>
2015-07-13 20:10:26 +02:00
<td width=50>" . $peer [ 'afi' ] . '</td>
<td><strong>AS' . $peer [ 'bgpPeerRemoteAs' ] . '</strong><br />' . $peer [ 'astext' ] . "</td>
2018-09-11 05:54:46 +02:00
<td>" . $peer [ 'bgpPeerDescr' ] . "</td>
2020-04-25 05:47:20 +02:00
<td><strong><span style='color: $admin_col ;'>" . $peer [ 'bgpPeerAdminStatus' ] . "</span><br /><span style='color: $col ;'>" . $peer [ 'bgpPeerState' ] . "</span></strong></td>
<td>" . $last_error . "</td>
<td>" . formatUptime ( $peer [ 'bgpPeerFsmEstablishedTime' ]) . "<br />
2017-02-15 17:16:03 -06:00
Updates <i class='fa fa-arrow-down icon-theme' aria-hidden='true'></i> " . format_si ( $peer [ 'bgpPeerInUpdates' ]) . "
<i class='fa fa-arrow-up icon-theme' aria-hidden='true'></i> " . format_si ( $peer [ 'bgpPeerOutUpdates' ]) . '</td></tr>' ;
2015-07-13 20:10:26 +02:00
unset ( $invalid );
switch ( $vars [ 'graph' ]) {
2016-08-18 20:28:22 -05:00
case 'prefixes_ipv4unicast' :
case 'prefixes_ipv4multicast' :
case 'prefixes_ipv4vpn' :
case 'prefixes_ipv6unicast' :
case 'prefixes_ipv6multicast' :
list (, $afisafi ) = explode ( '_' , $vars [ 'graph' ]);
if ( isset ( $peer [ 'afisafi' ][ $afisafi ])) {
$peer [ 'graph' ] = 1 ;
}
// fall-through
case 'updates' :
$graph_array [ 'type' ] = 'bgp_' . $vars [ 'graph' ];
$graph_array [ 'id' ] = $peer [ 'bgpPeer_id' ];
2011-04-29 16:32:55 +00:00
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
switch ( $vars [ 'graph' ]) {
2016-08-18 20:28:22 -05:00
case 'macaccounting_bits' :
case 'macaccounting_pkts' :
$acc = dbFetchRow ( 'SELECT * FROM `ipv4_mac` AS I, `mac_accounting` AS M, `ports` AS P, `devices` AS D WHERE I.ipv4_address = ? AND M.mac = I.mac_address AND P.port_id = M.port_id AND D.device_id = P.device_id' , array ( $peer [ 'bgpPeerIdentifier' ]));
$database = rrd_name ( $device [ 'hostname' ], array ( 'cip' , $acc [ 'ifIndex' ], $acc [ 'mac' ]));
if ( is_array ( $acc ) && is_file ( $database )) {
$peer [ 'graph' ] = 1 ;
$graph_array [ 'id' ] = $acc [ 'ma_id' ];
$graph_array [ 'type' ] = $vars [ 'graph' ];
}
2015-07-13 20:10:26 +02:00
}
2008-04-11 08:11:28 +00:00
2015-07-13 20:10:26 +02:00
if ( $vars [ 'graph' ] == 'updates' ) {
$peer [ 'graph' ] = 1 ;
}
2012-04-06 13:56:23 +00:00
2015-07-13 20:10:26 +02:00
if ( $peer [ 'graph' ]) {
$graph_array [ 'height' ] = '100' ;
$graph_array [ 'width' ] = '218' ;
2019-06-23 00:29:12 -05:00
$graph_array [ 'to' ] = \LibreNMS\Config :: get ( 'time.now' );
2015-07-13 20:10:26 +02:00
echo '<tr></tr><tr class="bgp"' . ( $bg_image ? ' background="' . $bg_image . '"' : '' ) . '"><td colspan="9">' ;
2012-04-06 13:56:23 +00:00
2019-04-11 23:26:42 -05:00
include 'includes/html/print-graphrow.inc.php' ;
2011-03-17 00:09:20 +00:00
2015-07-13 20:10:26 +02:00
echo '</td></tr>' ;
}
} //end foreach
2011-03-17 00:09:20 +00:00
2015-07-13 20:10:26 +02:00
echo '</table>' ;
} //end if