mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	
		
			
	
	
		
			254 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			254 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Observium | ||
|  |  * | ||
|  |  *   This file is part of Observium. | ||
|  |  * | ||
|  |  * @package    observium | ||
|  |  * @subpackage map | ||
|  |  * @author     Adam Armstrong <adama@memetic.org> | ||
|  |  * @copyright  (C) 2006 - 2012 Adam Armstrong | ||
|  |  * | ||
|  |  */ | ||
|  | 
 | ||
|  | ini_set('display_errors', 1); | ||
|  | ini_set('display_startup_errors', 1); | ||
|  | ini_set('log_errors', 1); | ||
|  | ini_set('error_reporting', E_ALL); | ||
|  | 
 | ||
|  | $links = 1; | ||
|  | 
 | ||
|  | include_once '../includes/defaults.inc.php'; | ||
|  | include_once '../config.php'; | ||
|  | include_once '../includes/definitions.inc.php'; | ||
|  | include_once '../includes/functions.php'; | ||
|  | include_once '../includes/dbFacile.php'; | ||
|  | include_once 'includes/functions.inc.php'; | ||
|  | include_once 'includes/authenticate.inc.php'; | ||
|  | 
 | ||
|  | if (strpos($_SERVER['REQUEST_URI'], 'anon')) { | ||
|  |     $anon = 1; | ||
|  | } | ||
|  | 
 | ||
|  | if (is_array($config['branding'])) { | ||
|  |     if ($config['branding'][$_SERVER['SERVER_NAME']]) { | ||
|  |         foreach ($config['branding'][$_SERVER['SERVER_NAME']] as $confitem => $confval) { | ||
|  |             eval("\$config['" . $confitem . "'] = \$confval;"); | ||
|  |         } | ||
|  |     } | ||
|  |     else { | ||
|  |         foreach ($config['branding']['default'] as $confitem => $confval) { | ||
|  |             eval("\$config['" . $confitem . "'] = \$confval;"); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | if (isset($_GET['device'])) { | ||
|  |     $where = 'WHERE device_id = '.mres($_GET['device']); | ||
|  | } | ||
|  | else { | ||
|  |     $where = ''; | ||
|  | } | ||
|  | 
 | ||
|  | // 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]; | ||
|  | '; | ||
|  | 
 | ||
|  |     if (!$_SESSION['authenticated']) { | ||
|  |         $map .= "\"Not authenticated\" [fontsize=20 fillcolor=\"lightblue\", URL=\"/\" shape=box3d]\n"; | ||
|  |     } | ||
|  |     else { | ||
|  |         $loc_count = 1; | ||
|  | 
 | ||
|  |         foreach (dbFetch("SELECT * from devices ".$where) as $device) { | ||
|  |             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']])) { | ||
|  |                         $locations[$device['location']] = $loc_count; $loc_count++; | ||
|  |                     } | ||
|  |                     $loc_id = $locations[$device['location']]; | ||
|  | 
 | ||
|  |                     $map .= "\"".$device['hostname']."\" [fontsize=20, fillcolor=\"lightblue\", group=".$loc_id." URL=\"{$config['base_url']}/device/device=".$device['device_id']."/tab=map/\" shape=box3d]\n"; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 foreach  ($links as $link) { | ||
|  |                     $local_port_id = $link['local_port_id']; | ||
|  |                     $remote_port_id = $link['remote_port_id']; | ||
|  | 
 | ||
|  |                     $i = 0; $done = 0; | ||
|  |                     if ($linkdone[$remote_port_id][$local_port_id]) { | ||
|  |                         $done = 1; | ||
|  |                     } | ||
|  | 
 | ||
|  |                     if (!$done) { | ||
|  |                         $linkdone[$local_port_id][$remote_port_id] = TRUE; | ||
|  | 
 | ||
|  |                         $links++; | ||
|  | 
 | ||
|  |        	                if ($link['ifSpeed'] >= "10000000000") { | ||
|  |                             $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)\""; | ||
|  |                         } | ||
|  | 
 | ||
|  |                         $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)); | ||
|  |                         } | ||
|  |                         else { | ||
|  |                             unset($dst_host); | ||
|  |                             $dst = $link['remote_hostname']; | ||
|  |                         } | ||
|  | 
 | ||
|  |                         if ($anon) { | ||
|  |                             $dst = md5($dst); | ||
|  |                             $src = md5($src); | ||
|  |                         } | ||
|  | 
 | ||
|  |                         $sif = ifNameDescr(dbFetchRow("SELECT * FROM ports WHERE `port_id` = ?", array($link['local_port_id'])),$device); | ||
|  |                         if ($remote_port_id) { | ||
|  |                             $dif = ifNameDescr(dbFetchRow("SELECT * FROM ports WHERE `port_id` = ?", array($link['remote_port_id']))); | ||
|  |                         } | ||
|  |                         else { | ||
|  |                             $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; | ||
|  |                         } | ||
|  |                         else { | ||
|  |                             $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) { | ||
|  |                                 $map .= "\"$dst\" [URL=\"{$config['base_url']}/device/device=$dst_host/tab=map/\", fontsize=20, shape=box3d]\n"; | ||
|  |                             } | ||
|  |                             else { | ||
|  |                                 $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"; | ||
|  |                             } | ||
|  |                             else { | ||
|  |                                 $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']; | ||
|  |     } | ||
|  |     else { | ||
|  |         $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"; | ||
|  | 
 | ||
|  |     $process = proc_open($maptool.' -T'.$_GET['format'],$descriptorspec,$pipes); | ||
|  | 
 | ||
|  |     if (is_resource($process)) { | ||
|  |         fwrite($pipes[0],  "$map"); | ||
|  |         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"); | ||
|  |     } | ||
|  |     elseif ($_GET['format'] == "svg") { | ||
|  |         header("Content-type: image/svg+xml"); | ||
|  |         $img = str_replace("<a ", '<a target="_parent" ', $img); | ||
|  |     } | ||
|  |     echo $img; | ||
|  | } | ||
|  | else { | ||
|  |     if ($_SESSION['authenticated']) { | ||
|  |         // FIXME level 10 only?
 | ||
|  |         echo '<center> | ||
|  |                   <object width=1200 height=1000 data="'. $config['base_url'] . '/map.php?format=svg" type="image/svg+xml"></object> | ||
|  |               </center> | ||
|  |         '; | ||
|  |     } | ||
|  | } | ||
|  | 
 |