2015-08-01 18:14:55 +00:00
<? php
/**
2016-08-20 12:16:55 +01:00
* LibreNMS
2015-08-01 18:14:55 +00:00
*
2016-08-20 12:16:55 +01:00
* This file is part of LibreNMS.
2015-08-01 18:14:55 +00:00
*
2016-08-20 12:16:55 +01:00
* @package librenms
2015-08-01 18:14:55 +00:00
* @subpackage map
* @copyright (C) 2006 - 2012 Adam Armstrong
*
*/
2018-09-11 07:51:35 -05:00
use LibreNMS\Authentication\LegacyAuth ;
2018-04-07 15:55:28 -05:00
2015-08-01 18:14:55 +00:00
$links = 1 ;
2016-11-21 14:12:59 -06:00
$init_modules = array ( 'web' , 'auth' );
require realpath ( __DIR__ . '/..' ) . '/includes/init.php' ;
2015-08-01 18:14:55 +00:00
2019-04-11 23:26:42 -05:00
if ( ! LegacyAuth :: check ()) {
die ( 'Unauthorized' );
}
2018-07-13 17:08:00 -05:00
$options = getopt ( 'd::' );
if ( set_debug ( isset ( $options [ 'd' ]))) {
echo "DEBUG! \n " ;
}
2015-08-01 18:14:55 +00:00
if ( strpos ( $_SERVER [ 'REQUEST_URI' ], 'anon' )) {
$anon = 1 ;
}
2017-05-17 16:38:00 -05:00
if ( isset ( $config [ 'branding' ]) && is_array ( $config [ 'branding' ])) {
if ( isset ( $config [ 'branding' ][ $_SERVER [ 'SERVER_NAME' ]])) {
$config = array_replace_recursive ( $config , $config [ 'branding' ][ $_SERVER [ 'SERVER_NAME' ]]);
2016-08-18 20:28:22 -05:00
} else {
2017-05-17 16:38:00 -05:00
$config = array_replace_recursive ( $config , $config [ 'branding' ][ 'default' ]);
2015-08-01 18:14:55 +00:00
}
}
2018-11-28 16:49:18 -06:00
$where = '' ;
$param = [];
2018-11-29 13:04:11 -06:00
if ( isset ( $_GET [ 'device' ]) && is_numeric ( $_GET [ 'device' ])) {
2018-11-28 16:49:18 -06:00
$where = '&& device_id = ?' ;
$param [] = $_GET [ 'device' ];
2015-08-01 18:14:55 +00:00
}
// FIXME this shit probably needs tidied up.
if ( isset ( $_GET [ 'format' ]) && preg_match ( "/^[a-z]*$/" , $_GET [ 'format' ])) {
$map = '
digraph G { bgcolor=transparent; splines=true; overlap=scale; concentrate=0; epsilon=0.001; rankdir=LR;
node [ fontname="helvetica", fontstyle=bold, style=filled, color=white, fillcolor=lightgrey, overlap=false];
edge [ bgcolor=white, fontname="helvetica", fontstyle=bold, arrowhead=dot, arrowtail=dot];
graph [bgcolor=transparent];
' ;
2018-09-11 07:51:35 -05:00
if ( ! LegacyAuth :: check ()) {
2015-08-01 18:14:55 +00:00
$map .= " \" Not authenticated \" [fontsize=20 fillcolor= \" lightblue \" , URL= \" / \" shape=box3d] \n " ;
2016-08-18 20:28:22 -05:00
} else {
2019-05-10 11:02:39 -05:00
$locations = getlocations ();
2015-08-01 18:14:55 +00:00
$loc_count = 1 ;
2018-11-29 13:04:11 -06:00
foreach ( dbFetch ( "SELECT *, locations.location FROM devices LEFT JOIN locations ON devices.location_id = locations.id WHERE 1 " . $where , $param ) as $device ) {
2015-08-01 18:14:55 +00:00
if ( $device ) {
$links = dbFetch ( "SELECT * from ports AS I, links AS L WHERE I.device_id = ? AND L.local_port_id = I.port_id ORDER BY L.remote_hostname" , array ( $device [ 'device_id' ]));
if ( count ( $links )) {
if ( $anon ) {
$device [ 'hostname' ] = md5 ( $device [ 'hostname' ]);
}
if ( ! isset ( $locations [ $device [ 'location' ]])) {
2016-08-18 20:28:22 -05:00
$locations [ $device [ 'location' ]] = $loc_count ;
$loc_count ++ ;
2015-08-01 18:14:55 +00:00
}
$loc_id = $locations [ $device [ 'location' ]];
2018-11-29 13:04:11 -06:00
$map .= " \" " . $device [ 'hostname' ] . " \" [fontsize=20, fillcolor= \" lightblue \" , group=" . $loc_id . " URL= \" { $config [ 'base_url' ] } /device/device=" . $device [ 'device_id' ] . "/tab=neighbours/selection=map/ \" shape=box3d] \n " ;
2015-08-01 18:14:55 +00:00
}
2016-08-18 20:28:22 -05:00
foreach ( $links as $link ) {
2015-08-01 18:14:55 +00:00
$local_port_id = $link [ 'local_port_id' ];
$remote_port_id = $link [ 'remote_port_id' ];
2016-08-18 20:28:22 -05:00
$i = 0 ;
$done = 0 ;
2015-08-01 18:14:55 +00:00
if ( $linkdone [ $remote_port_id ][ $local_port_id ]) {
$done = 1 ;
}
if ( ! $done ) {
2016-08-18 20:28:22 -05:00
$linkdone [ $local_port_id ][ $remote_port_id ] = true ;
2015-08-01 18:14:55 +00:00
$links ++ ;
2016-08-18 20:28:22 -05:00
if ( $link [ 'ifSpeed' ] >= "10000000000" ) {
2015-08-01 18:14:55 +00:00
$info = "color=red3 style= \" setlinewidth(6) \" " ;
2016-08-18 20:28:22 -05:00
} elseif ( $link [ 'ifSpeed' ] >= "1000000000" ) {
2015-08-01 18:14:55 +00:00
$info = "color=lightblue style= \" setlinewidth(4) \" " ;
2016-08-18 20:28:22 -05:00
} elseif ( $link [ 'ifSpeed' ] >= "100000000" ) {
2015-08-01 18:14:55 +00:00
$info = "color=lightgrey style= \" setlinewidth(2) \" " ;
2016-08-18 20:28:22 -05:00
} elseif ( $link [ 'ifSpeed' ] >= "10000000" ) {
2015-08-01 18:14:55 +00:00
$info = "style= \" setlinewidth(1) \" " ;
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$info = "style= \" setlinewidth(1) \" " ;
}
$src = $device [ 'hostname' ];
if ( $anon ) {
$src = md5 ( $src );
}
if ( $remote_port_id ) {
$dst = dbFetchCell ( "SELECT `hostname` FROM `devices` AS D, `ports` AS I WHERE I.port_id = ? AND D.device_id = I.device_id" , array ( $remote_port_id ));
$dst_host = dbFetchCell ( "SELECT D.device_id FROM `devices` AS D, `ports` AS I WHERE I.port_id = ? AND D.device_id = I.device_id" , array ( $remote_port_id ));
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
unset ( $dst_host );
$dst = $link [ 'remote_hostname' ];
}
if ( $anon ) {
$dst = md5 ( $dst );
$src = md5 ( $src );
}
2017-04-04 08:08:23 +01:00
$sif = cleanPort ( dbFetchRow ( "SELECT * FROM ports WHERE `port_id` = ?" , array ( $link [ 'local_port_id' ])), $device );
2015-08-01 18:14:55 +00:00
if ( $remote_port_id ) {
2017-04-04 08:08:23 +01:00
$dif = cleanPort ( dbFetchRow ( "SELECT * FROM ports WHERE `port_id` = ?" , array ( $link [ 'remote_port_id' ])));
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$dif [ 'label' ] = $link [ 'remote_port' ];
$dif [ 'port_id' ] = $link [ 'remote_hostname' ] . '/' . $link [ 'remote_port' ];
}
if ( $where == "" ) {
if ( ! $ifdone [ $dst ][ $dif [ 'port_id' ]] && ! $ifdone [ $src ][ $sif [ 'port_id' ]]) {
$map .= " \" $src \" -> \" " . $dst . " \" [weight=500000, arrowsize=0, len=0]; \n " ;
}
$ifdone [ $src ][ $sif [ 'port_id' ]] = 1 ;
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$map .= " \" " . $sif [ 'port_id' ] . " \" [label= \" " . $sif [ 'label' ] . " \" , fontsize=12, fillcolor=lightblue, URL= \" { $config [ 'base_url' ] } /device/device=" . $device [ 'device_id' ] . "/tab=port/port= $local_port_id / \" ] \n " ;
if ( ! $ifdone [ $src ][ $sif [ 'port_id' ]]) {
$map .= " \" $src \" -> \" " . $sif [ 'port_id' ] . " \" [weight=500000, arrowsize=0, len=0]; \n " ;
$ifdone [ $src ][ $sif [ 'port_id' ]] = 1 ;
}
if ( $dst_host ) {
2018-11-29 13:04:11 -06:00
$map .= " \" $dst \" [URL= \" { $config [ 'base_url' ] } /device/device= $dst_host /tab=neighbours/selection=map/ \" , fontsize=20, shape=box3d] \n " ;
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$map .= " \" $dst \" [ fontsize=20 shape=box3d] \n " ;
}
if ( $dst_host == $device [ 'device_id' ] || $where == '' ) {
$map .= " \" " . $dif [ 'port_id' ] . " \" [label= \" " . $dif [ 'label' ] . " \" , fontsize=12, fillcolor=lightblue, URL= \" { $config [ 'base_url' ] } /device/device= $dst_host /tab=port/port= $remote_port_id / \" ] \n " ;
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$map .= " \" " . $dif [ 'port_id' ] . " \" [label= \" " . $dif [ 'label' ] . " \" , fontsize=12, fillcolor=lightgray" ;
if ( $dst_host ) {
$map .= ", URL= \" { $config [ 'base_url' ] } /device/device= $dst_host /tab=port/port= $remote_port_id / \" " ;
}
$map .= "] \n " ;
}
if ( ! $ifdone [ $dst ][ $dif [ 'port_id' ]]) {
$map .= " \" " . $dif [ 'port_id' ] . " \" -> \" $dst \" [weight=500000, arrowsize=0, len=0]; \n " ;
$ifdone [ $dst ][ $dif [ 'port_id' ]] = 1 ;
}
$map .= " \" " . $sif [ 'port_id' ] . " \" -> \" " . $dif [ 'port_id' ] . " \" [weight=1, arrowhead=normal, arrowtail=normal, len=2, $info ] \n " ;
}
}
}
$done = 0 ;
}
}
}
$map .= " \n };" ;
if ( $_GET [ 'debug' ] == 1 ) {
echo '<pre>$map</pre>' ;
exit ();
}
switch ( $_GET [ 'format' ]) {
case 'svg' :
break ;
case 'png' :
$_GET [ 'format' ] = 'png:gd' ;
break ;
case 'dot' :
echo ( $map );
exit ();
default :
$_GET [ 'format' ] = 'png:gd' ;
}
if ( $links > 30 ) {
// Unflatten if there are more than 10 links. beyond that it gets messy
$maptool = $config [ 'dot' ];
2016-08-18 20:28:22 -05:00
} else {
2015-08-01 18:14:55 +00:00
$maptool = $config [ 'dot' ];
}
if ( $where == '' ) {
$maptool = $config [ 'sfdp' ] . ' -Gpack -Goverlap=prism -Gcharset=latin1 -Gsize=20,20' ;
$maptool = $config [ 'dot' ];
}
$descriptorspec = array ( 0 => array ( "pipe" , "r" ), 1 => array ( "pipe" , "w" ) );
$mapfile = $config [ 'temp_dir' ] . "/" . strgen () . ".png" ;
2016-08-18 20:28:22 -05:00
$process = proc_open ( $maptool . ' -T' . $_GET [ 'format' ], $descriptorspec , $pipes );
2015-08-01 18:14:55 +00:00
if ( is_resource ( $process )) {
2016-08-18 20:28:22 -05:00
fwrite ( $pipes [ 0 ], " $map " );
2015-08-01 18:14:55 +00:00
fclose ( $pipes [ 0 ]);
while ( ! feof ( $pipes [ 1 ])) {
$img .= fgets ( $pipes [ 1 ]);
}
fclose ( $pipes [ 1 ]);
$return_value = proc_close ( $process );
}
if ( $_GET [ 'format' ] == "png:gd" ) {
header ( "Content-type: image/png" );
2016-08-18 20:28:22 -05:00
} elseif ( $_GET [ 'format' ] == "svg" ) {
2015-08-01 18:14:55 +00:00
header ( "Content-type: image/svg+xml" );
$img = str_replace ( "<a " , '<a target="_parent" ' , $img );
}
echo $img ;
2016-08-18 20:28:22 -05:00
} else {
2018-09-11 07:51:35 -05:00
if ( LegacyAuth :: check ()) {
2015-08-01 18:14:55 +00:00
// FIXME level 10 only?
echo '<center>
2018-11-29 13:04:11 -06:00
<object width=1200 height=1000 data="' . $config [ 'base_url' ] . '/network-map.php?format=svg" type="image/svg+xml"></object>
2015-08-01 18:14:55 +00:00
</center>
' ;
}
}