mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			250 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?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['unflatten'] . ' -f -l 5 | ' . $config['sfdp'] . ' -Gpack -Goverlap=prism -Gcharset=latin1 | dot';
 | |
|      $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>');
 | |
|   }
 | |
| }
 | |
| 
 | |
| ?>
 |