2009-09-07 11:07:59 +00:00
< ? php
2009-03-11 14:54:13 +00:00
2012-05-09 10:01:42 +00:00
/**
2013-10-29 05:38:12 +10:00
* Observium
2012-05-09 10:01:42 +00:00
*
2013-10-29 05:38:12 +10:00
* This file is part of Observium .
2012-05-09 10:01:42 +00:00
*
2013-10-29 05:38:12 +10:00
* @ package observium
* @ subpackage map
* @ author Adam Armstrong < adama @ memetic . org >
* @ copyright ( C ) 2006 - 2012 Adam Armstrong
2012-05-09 10:01:42 +00:00
*
*/
2012-04-22 16:37:14 +00:00
ini_set ( 'display_errors' , 1 );
ini_set ( 'display_startup_errors' , 1 );
ini_set ( 'log_errors' , 1 );
ini_set ( 'error_reporting' , E_ALL );
2010-07-28 19:43:02 +00:00
2010-08-14 20:20:35 +00:00
$links = 1 ;
2011-05-12 19:09:46 +00:00
include_once ( " ../includes/defaults.inc.php " );
include_once ( " ../config.php " );
2012-05-09 10:01:42 +00:00
include_once ( " ../includes/definitions.inc.php " );
2011-05-12 19:09:46 +00:00
include_once ( " ../includes/functions.php " );
include_once ( " ../includes/dbFacile.php " );
include_once ( " includes/functions.inc.php " );
include_once ( " includes/authenticate.inc.php " );
2009-03-11 14:54:13 +00:00
2012-05-03 15:18:02 +00:00
if ( strpos ( $_SERVER [ 'REQUEST_URI' ], " anon " )) { $anon = 1 ; }
2011-03-17 11:48:03 +00:00
if ( is_array ( $config [ 'branding' ]))
{
2011-03-23 09:54:56 +00:00
if ( $config [ 'branding' ][ $_SERVER [ 'SERVER_NAME' ]])
{
foreach ( $config [ 'branding' ][ $_SERVER [ 'SERVER_NAME' ]] as $confitem => $confval )
2011-03-17 11:48:03 +00:00
{
2011-03-23 09:54:56 +00:00
eval ( " \$ config[' " . $confitem . " '] = \$ confval; " );
}
} else {
foreach ( $config [ 'branding' ][ 'default' ] as $confitem => $confval )
{
eval ( " \$ config[' " . $confitem . " '] = \$ confval; " );
2011-03-17 11:48:03 +00:00
}
2011-03-23 09:54:56 +00:00
}
2011-03-17 11:48:03 +00:00
}
2010-07-04 13:33:38 +00:00
2011-05-12 19:09:46 +00:00
if ( isset ( $_GET [ 'device' ])) { $where = " WHERE device_id = " . mres ( $_GET [ 'device' ]); } else { $where = " " ; }
2012-05-25 12:24:34 +00:00
// FIXME this shit probably needs tidied up.
2009-03-11 14:54:13 +00:00
2010-01-17 21:30:12 +00:00
if ( isset ( $_GET [ 'format' ]) && preg_match ( " /^[a-z]* $ / " , $_GET [ 'format' ]))
2010-01-09 18:23:39 +00:00
{
2011-10-17 10:33:06 +00:00
$map = ' digraph G { bgcolor = transparent ; splines = true ; overlap = scale ; concentrate = 0 ; epsilon = 0.001 ; rankdir = LR ;
2011-10-08 23:49:24 +00:00
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 ];
' ;
2011-03-23 09:54:56 +00:00
if ( ! $_SESSION [ 'authenticated' ])
{
2011-10-08 23:49:24 +00:00
$map .= " \" Not authenticated \" [fontsize=20 fillcolor= \" lightblue \" , URL= \" / \" shape=box3d] \n " ;
2011-03-23 09:54:56 +00:00
}
else
{
2011-10-11 12:19:08 +00:00
$loc_count = 1 ;
2011-10-17 10:22:51 +00:00
2011-05-12 19:09:46 +00:00
foreach ( dbFetch ( " SELECT * from devices " . $where ) as $device )
2011-03-22 20:27:39 +00:00
{
2011-03-23 09:54:56 +00:00
if ( $device )
{
2012-05-16 13:25:50 +00:00
$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' ]));
2011-05-12 19:09:46 +00:00
if ( count ( $links ))
2010-01-09 18:23:39 +00:00
{
2012-05-07 16:23:43 +00:00
if ( $anon ) { $device [ 'hostname' ] = md5 ( $device [ 'hostname' ]); }
2012-04-06 15:01:58 +00:00
if ( ! isset ( $locations [ $device [ 'location' ]])) { $locations [ $device [ 'location' ]] = $loc_count ; $loc_count ++ ; }
2011-10-11 12:19:08 +00:00
$loc_id = $locations [ $device [ 'location' ]];
2012-04-30 23:19:55 +00:00
$map .= " \" " . $device [ 'hostname' ] . " \" [fontsize=20, fillcolor= \" lightblue \" , group= " . $loc_id . " URL= \" { $config [ 'base_url' ] } /device/device= " . $device [ 'device_id' ] . " /tab=map/ \" shape=box3d] \n " ;
2011-03-23 09:54:56 +00:00
}
2011-05-12 19:09:46 +00:00
foreach ( $links as $link )
2011-03-23 09:54:56 +00:00
{
2012-05-16 13:25:50 +00:00
$local_port_id = $link [ 'local_port_id' ];
$remote_port_id = $link [ 'remote_port_id' ];
2011-03-23 09:54:56 +00:00
2011-10-17 10:22:51 +00:00
$i = 0 ; $done = 0 ;
2012-05-16 13:25:50 +00:00
if ( $linkdone [ $remote_port_id ][ $local_port_id ]) { $done = 1 ; }
2011-03-23 09:54:56 +00:00
2011-10-17 10:22:51 +00:00
if ( ! $done )
2011-10-11 12:19:08 +00:00
{
2012-05-16 13:25:50 +00:00
$linkdone [ $local_port_id ][ $remote_port_id ] = TRUE ;
2011-03-23 09:54:56 +00:00
2011-10-17 10:22:51 +00:00
$links ++ ;
2011-10-11 12:19:08 +00:00
2011-10-17 10:22:51 +00:00
if ( $link [ 'ifSpeed' ] >= " 10000000000 " )
2011-03-23 09:54:56 +00:00
{
2011-10-17 10:22:51 +00:00
$info = " color=red3 style= \" setlinewidth(6) \" " ;
} elseif ( $link [ 'ifSpeed' ] >= " 1000000000 " ) {
$info = " color=lightblue style= \" setlinewidth(4) \" " ;
} elseif ( $link [ 'ifSpeed' ] >= " 100000000 " ) {
$info = " color=lightgrey style= \" setlinewidth(2) \" " ;
} elseif ( $link [ 'ifSpeed' ] >= " 10000000 " ) {
$info = " style= \" setlinewidth(1) \" " ;
} else {
$info = " style= \" setlinewidth(1) \" " ;
2011-03-23 09:54:56 +00:00
}
2011-10-17 10:22:51 +00:00
$src = $device [ 'hostname' ];
2012-05-07 16:23:43 +00:00
if ( $anon ) { $src = md5 ( $src ); }
2012-05-16 13:25:50 +00:00
if ( $remote_port_id )
2011-10-17 10:22:51 +00:00
{
2012-05-16 13:25:50 +00:00
$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 ));
2011-04-20 11:19:46 +00:00
} else {
2011-10-17 10:22:51 +00:00
unset ( $dst_host );
$dst = $link [ 'remote_hostname' ];
2011-04-20 11:19:46 +00:00
}
2011-03-23 09:54:56 +00:00
2012-05-07 16:23:43 +00:00
if ( $anon ) { $dst = md5 ( $dst ); $src = md5 ( $src );}
2012-05-03 15:18:02 +00:00
2012-05-16 13:25:50 +00:00
$sif = ifNameDescr ( dbFetchRow ( " SELECT * FROM ports WHERE `port_id` = ? " , array ( $link [ 'local_port_id' ])), $device );
if ( $remote_port_id )
2011-03-27 10:21:19 +00:00
{
2012-05-16 13:25:50 +00:00
$dif = ifNameDescr ( dbFetchRow ( " SELECT * FROM ports WHERE `port_id` = ? " , array ( $link [ 'remote_port_id' ])));
2011-03-23 09:54:56 +00:00
} else {
2011-10-17 10:22:51 +00:00
$dif [ 'label' ] = $link [ 'remote_port' ];
2012-05-16 13:25:50 +00:00
$dif [ 'port_id' ] = $link [ 'remote_hostname' ] . '/' . $link [ 'remote_port' ];
2011-03-23 09:54:56 +00:00
}
2012-04-06 15:01:58 +00:00
if ( $where == " " )
2011-03-23 09:54:56 +00:00
{
2012-05-16 13:25:50 +00:00
if ( ! $ifdone [ $dst ][ $dif [ 'port_id' ]] && ! $ifdone [ $src ][ $sif [ 'port_id' ]])
2012-04-30 23:19:55 +00:00
{
$map .= " \" $src\ " -> \ " " . $dst . " \" [weight=500000, arrowsize=0, len=0]; \n " ;
}
2012-05-16 13:25:50 +00:00
$ifdone [ $src ][ $sif [ 'port_id' ]] = 1 ;
2011-10-17 10:22:51 +00:00
} else {
2012-05-16 13:25:50 +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' ]])
2011-10-17 10:22:51 +00:00
{
2012-05-16 13:25:50 +00:00
$map .= " \" $src\ " -> \ " " . $sif [ 'port_id' ] . " \" [weight=500000, arrowsize=0, len=0]; \n " ;
$ifdone [ $src ][ $sif [ 'port_id' ]] = 1 ;
2011-10-17 10:22:51 +00:00
}
if ( $dst_host )
{
2012-04-30 23:19:55 +00:00
$map .= " \" $dst\ " [ URL = \ " { $config [ 'base_url' ] } /device/device= $dst_host /tab=map/ \" , fontsize=20, shape=box3d] \n " ;
2011-10-17 10:22:51 +00:00
} else {
$map .= " \" $dst\ " [ fontsize = 20 shape = box3d ] \n " ;
}
if ( $dst_host == $device [ 'device_id' ] || $where == '' )
{
2012-05-16 13:25:50 +00:00
$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 " ;
2011-10-17 10:22:51 +00:00
} else {
2012-05-16 13:25:50 +00:00
$map .= " \" " . $dif [ 'port_id' ] . " \" [label= \" " . $dif [ 'label' ] . " \" , fontsize=12, fillcolor=lightgray " ;
2012-04-22 16:37:14 +00:00
if ( $dst_host )
{
2012-05-16 13:25:50 +00:00
$map .= " , URL= \" { $config [ 'base_url' ] } /device/device= $dst_host /tab=port/port= $remote_port_id / \" " ;
2012-04-22 16:37:14 +00:00
}
$map .= " ] \n " ;
2011-10-17 10:22:51 +00:00
}
2012-05-16 13:25:50 +00:00
if ( ! $ifdone [ $dst ][ $dif [ 'port_id' ]])
2011-10-17 10:22:51 +00:00
{
2012-05-16 13:25:50 +00:00
$map .= " \" " . $dif [ 'port_id' ] . " \" -> \" $dst\ " [ weight = 500000 , arrowsize = 0 , len = 0 ]; \n " ;
$ifdone [ $dst ][ $dif [ 'port_id' ]] = 1 ;
2011-10-17 10:22:51 +00:00
}
2012-05-16 13:25:50 +00:00
$map .= " \" " . $sif [ 'port_id' ] . " \" -> \" " . $dif [ 'port_id' ] . " \" [weight=1, arrowhead=normal, arrowtail=normal, len=2, $info ] \n " ;
2011-03-23 09:54:56 +00:00
}
}
2010-01-09 18:23:39 +00:00
}
2011-03-23 09:54:56 +00:00
$done = 0 ;
}
2010-01-09 18:23:39 +00:00
}
2011-03-23 09:54:56 +00:00
}
2009-03-11 14:54:13 +00:00
2012-04-22 16:37:14 +00:00
$map .= " \n }; " ;
2009-03-11 14:54:13 +00:00
2011-10-10 15:40:54 +00:00
if ( $_GET [ 'debug' ] == 1 )
{
echo ( " <pre> $map </pre> " ); exit ();
}
2009-03-11 14:54:13 +00:00
2011-03-23 09:54:56 +00:00
switch ( $_GET [ 'format' ])
{
case 'svg' :
2011-10-11 12:19:08 +00:00
break ;
2010-06-18 17:29:02 +00:00
case 'png' :
2011-10-11 12:19:08 +00:00
$_GET [ 'format' ] = 'png:gd' ;
2011-03-23 09:54:56 +00:00
break ;
2011-10-11 12:19:08 +00:00
case 'dot' :
echo ( $map ); exit ();
2010-06-19 13:29:47 +00:00
default :
2011-10-11 12:19:08 +00:00
$_GET [ 'format' ] = 'png:gd' ;
2011-03-23 09:54:56 +00:00
}
2010-06-18 17:29:02 +00:00
2012-05-25 12:24:34 +00:00
if ( $links > 30 ) // Unflatten if there are more than 10 links. beyond that it gets messy
2011-03-23 09:54:56 +00:00
{
2011-11-19 15:50:42 +00:00
$maptool = $config [ 'dot' ];
2011-03-23 09:54:56 +00:00
} else {
2011-10-10 15:40:54 +00:00
$maptool = $config [ 'dot' ];
2011-03-23 09:54:56 +00:00
}
2010-08-05 23:21:57 +00:00
2011-10-11 12:19:08 +00:00
if ( $where == '' )
{
# $maptool = $config['unflatten'] . ' -f -l 5 | ' . $config['sfdp'] . ' -Gpack -Goverlap=prism -Gcharset=latin1 | dot';
2012-05-25 13:49:59 +00:00
$maptool = $config [ 'sfdp' ] . ' -Gpack -Goverlap=prism -Gcharset=latin1 -Gsize=20,20' ;
2011-10-17 10:33:06 +00:00
$maptool = $config [ 'dot' ];
2011-10-17 10:22:51 +00:00
}
2010-07-30 15:04:44 +00:00
2011-10-08 23:49:24 +00:00
$descriptorspec = array ( 0 => array ( " pipe " , " r " ), 1 => array ( " pipe " , " w " ) );
2011-10-09 11:59:10 +00:00
2011-10-11 12:19:08 +00:00
$mapfile = $config [ 'temp_dir' ] . " / " . strgen () . " .png " ;
2011-10-10 15:40:54 +00:00
$process = proc_open ( $maptool . ' -T' . $_GET [ 'format' ], $descriptorspec , $pipes );
2011-10-08 23:49:24 +00:00
2011-10-17 10:22:51 +00:00
if ( is_resource ( $process ))
{
2011-10-08 23:49:24 +00:00
fwrite ( $pipes [ 0 ], " $map " );
fclose ( $pipes [ 0 ]);
while ( ! feof ( $pipes [ 1 ])) { $img .= fgets ( $pipes [ 1 ]);}
fclose ( $pipes [ 1 ]);
$return_value = proc_close ( $process );
}
2011-10-11 12:19:08 +00:00
if ( $_GET [ 'format' ] == " png:gd " )
2011-03-27 10:21:19 +00:00
{
2011-10-09 11:59:10 +00:00
header ( " Content-type: image/png " );
2011-03-23 09:54:56 +00:00
} elseif ( $_GET [ 'format' ] == " svg " ) {
2010-01-09 18:23:39 +00:00
header ( " Content-type: image/svg+xml " );
2010-11-19 22:46:24 +00:00
$img = str_replace ( " <a " , '<a target="_parent" ' , $img );
2011-03-23 09:54:56 +00:00
}
echo ( " $img " );
2009-03-11 14:54:13 +00:00
}
2010-01-17 21:30:12 +00:00
else
{
2012-05-25 12:24:34 +00:00
if ( $_SESSION [ 'authenticated' ]) // FIXME level 10 only?
2011-03-23 09:54:56 +00:00
{
echo ( ' < center >
2011-10-09 11:59:10 +00:00
< object width = 1200 height = 1000 data = " '. $config['base_url'] . '/map.php?format=svg " type = " image/svg+xml " >
2011-03-23 09:54:56 +00:00
</ object >
</ center > ' );
}
2010-01-17 21:30:12 +00:00
}
2011-03-17 11:48:03 +00:00
2011-04-20 11:19:46 +00:00
?>