From 47c59ddf14692a2e87a297a84fab5c8a99b9f1a2 Mon Sep 17 00:00:00 2001 From: laf Date: Sat, 28 Mar 2015 13:08:55 +0000 Subject: [PATCH 1/3] Updated to show map only if links exist Conflicts: html/includes/print-menubar.php --- html/includes/print-menubar.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/html/includes/print-menubar.php b/html/includes/print-menubar.php index 5e60d0aff0..b71bc2cf63 100644 --- a/html/includes/print-menubar.php +++ b/html/includes/print-menubar.php @@ -5,6 +5,12 @@ $service_alerts = dbFetchCell("SELECT COUNT(service_id) FROM services WHERE service_status = '0'"); $if_alerts = dbFetchCell("SELECT COUNT(port_id) FROM `ports` WHERE `ifOperStatus` = 'down' AND `ifAdminStatus` = 'up' AND `ignore` = '0'"); +if ($_SESSION['userlevel'] >= 5) { + $links['count'] = dbFetchCell("SELECT COUNT(*) FROM `links`"); +} else { + $links['count'] = dbFetchCell("SELECT COUNT(*) FROM `links` AS `L`, `devices` AS `D`, `devices_perms` AS `P` WHERE `P`.`user_id` = ? AND `P`.`device_id` = `D`.`device_id` AND `L`.`local_device_id` = `D`.`device_id`", array($_SESSION['user_id'])); +} + if (isset($config['enable_bgp']) && $config['enable_bgp']) { $bgp_alerts = dbFetchCell("SELECT COUNT(bgpPeer_id) FROM bgpPeers AS B where (bgpPeerAdminStatus = 'start' OR bgpPeerAdminStatus = 'running') AND bgpPeerState != 'established'"); @@ -118,6 +124,16 @@ if ($config['show_locations'])
  • Add Device
  • Delete Device
  • '); } + +if ($links['count'] > 0) { + +?> + +
  • Network Map Network Map
  • + From 60138aded5eb7a8277678f7d23cce5eaca3d132c Mon Sep 17 00:00:00 2001 From: laf Date: Sat, 28 Mar 2015 13:59:23 +0000 Subject: [PATCH 2/3] Added webui files for new map pages --- html/css/styles.css | 5 + html/css/vis.min.css | 1 + html/includes/print-map.inc.php | 102 +++++++++++++ html/index.php | 1 + html/js/vis.min.js | 1 + html/map.php | 249 -------------------------------- html/pages/device/map.inc.php | 23 ++- html/pages/map.inc.php | 15 ++ 8 files changed, 142 insertions(+), 255 deletions(-) create mode 120000 html/css/vis.min.css create mode 100644 html/includes/print-map.inc.php create mode 120000 html/js/vis.min.js delete mode 100755 html/map.php create mode 100644 html/pages/map.inc.php diff --git a/html/css/styles.css b/html/css/styles.css index c74ef30774..254c6935de 100644 --- a/html/css/styles.css +++ b/html/css/styles.css @@ -1609,3 +1609,8 @@ tr.search:nth-child(odd) { padding-left: 15px !important; padding-top: 8px !important; } + +#visualization { + width: 600px; + height: 600px; +} diff --git a/html/css/vis.min.css b/html/css/vis.min.css new file mode 120000 index 0000000000..29583e8c5c --- /dev/null +++ b/html/css/vis.min.css @@ -0,0 +1 @@ +../../lib/vis/dist/vis.min.css \ No newline at end of file diff --git a/html/includes/print-map.inc.php b/html/includes/print-map.inc.php new file mode 100644 index 0000000000..c94e15e778 --- /dev/null +++ b/html/includes/print-map.inc.php @@ -0,0 +1,102 @@ + + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ + +$tmp_devices = array(); +$tmp_id = 0; +if (!empty($device['hostname'])) { + $sql = ' WHERE `devices`.`hostname`=?'; + $sql_array = array($device['hostname']); +} +foreach (dbFetchRows("SELECT DISTINCT least(`devices`.`hostname`, `remote_hostname`) AS `remote_hostname`, GREATEST(`remote_hostname`,`devices`.`hostname`) AS `hostname` FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id` $sql", $sql_array) as $link_devices) { + $link_dev = dbFetchRow("SELECT `location` FROM `devices` WHERE `hostname`=?",array($link_devices['hostname'])); + $tmp_devices[] = array('id'=>$link_devices['hostname'],'label'=>$link_devices['hostname'],'title'=>$link_devices['hostname'],'group'=>$link_dev['location']); + $tmp_id++; + $link_dev = dbFetchRow("SELECT `location` FROM `devices` WHERE `hostname`=?",array($link_devices['remote_hostname'])); + $tmp_devices[] = array('id'=>$link_devices['remote_hostname'],'label'=>$link_devices['remote_hostname'],'title'=>$link_devices['remote_hostname'],'group'=>$link_dev['location']); + $tmp_id++; +} + +$nodes = json_encode($tmp_devices); + +if (is_array($tmp_devices[0])) { + $tmp_links = array(); + foreach (dbFetchRows("SELECT `devices`.`hostname` AS `hostname`, `remote_hostname`,`ports`.`ifName` AS `local_port`, `remote_port`,`ports`.`ifSpeed` AS ifSpeed FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id`") as $link_devices) { + foreach ($tmp_devices as $k=>$v) { + if ($v['label'] == $link_devices['hostname']) { + $from = $v['id']; + $port = $link_devices['local_port']; + } + if ($v['label'] == $link_devices['remote_hostname']) { + $to = $v['id']; + $port .= ' > ' .$link_devices['remote_port']; + } + } + $speed = $link_devices['ifSpeed']/1000/1000; + if ($speed == 100) { + $width = 3; + } elseif ($speed == 1000) { + $width = 5; + } elseif ($speed == 10000) { + $width = 10; + } elseif ($speed == 40000) { + $width = 15; + } elseif ($speed == 100000) { + $width = 20; + } else { + $width = 1; + } + $tmp_links[] = array('from'=>$from,'to'=>$to,'label'=>$port,'title'=>$port,'width'=>$width); + } + + $edges = json_encode($tmp_links); + +?> + +
    + + + diff --git a/html/index.php b/html/index.php index 3a589e7f8b..950541fb2d 100755 --- a/html/index.php +++ b/html/index.php @@ -167,6 +167,7 @@ if (empty($config['favicon'])) { + diff --git a/html/js/vis.min.js b/html/js/vis.min.js new file mode 120000 index 0000000000..b1dcb3fef4 --- /dev/null +++ b/html/js/vis.min.js @@ -0,0 +1 @@ +../../lib/vis/dist/vis.min.js \ No newline at end of file diff --git a/html/map.php b/html/map.php deleted file mode 100755 index c004af6228..0000000000 --- a/html/map.php +++ /dev/null @@ -1,249 +0,0 @@ - - * @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("
    $map
    ");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(" - - -'); - } -} - -?> diff --git a/html/pages/device/map.inc.php b/html/pages/device/map.inc.php index 0e6ae3ed50..522de36a51 100644 --- a/html/pages/device/map.inc.php +++ b/html/pages/device/map.inc.php @@ -1,8 +1,19 @@ -
    - - -
    - + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ + $pagetitle[] = "Map"; -?> \ No newline at end of file + +require_once "includes/print-map.inc.php"; + +?> diff --git a/html/pages/map.inc.php b/html/pages/map.inc.php new file mode 100644 index 0000000000..0fa1cbb5f7 --- /dev/null +++ b/html/pages/map.inc.php @@ -0,0 +1,15 @@ + + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ +$pagetitle[] = "Map"; +require_once "includes/print-map.inc.php"; +?> From 374107b81290a668c910f7778a5fd61674a4247b Mon Sep 17 00:00:00 2001 From: laf Date: Sat, 28 Mar 2015 00:53:35 +0000 Subject: [PATCH 3/3] Final bits to the map Conflicts: html/css/styles.css html/includes/print-map.inc.php --- html/css/styles.css | 2 +- html/includes/print-map.inc.php | 38 ++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/html/css/styles.css b/html/css/styles.css index 254c6935de..e7a0f1a9fe 100644 --- a/html/css/styles.css +++ b/html/css/styles.css @@ -1611,6 +1611,6 @@ tr.search:nth-child(odd) { } #visualization { - width: 600px; + width: 90%; height: 600px; } diff --git a/html/includes/print-map.inc.php b/html/includes/print-map.inc.php index c94e15e778..d216be5a5a 100644 --- a/html/includes/print-map.inc.php +++ b/html/includes/print-map.inc.php @@ -13,25 +13,36 @@ */ $tmp_devices = array(); -$tmp_id = 0; if (!empty($device['hostname'])) { $sql = ' WHERE `devices`.`hostname`=?'; $sql_array = array($device['hostname']); +} else { + $sql = ' WHERE 1'; } -foreach (dbFetchRows("SELECT DISTINCT least(`devices`.`hostname`, `remote_hostname`) AS `remote_hostname`, GREATEST(`remote_hostname`,`devices`.`hostname`) AS `hostname` FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id` $sql", $sql_array) as $link_devices) { - $link_dev = dbFetchRow("SELECT `location` FROM `devices` WHERE `hostname`=?",array($link_devices['hostname'])); - $tmp_devices[] = array('id'=>$link_devices['hostname'],'label'=>$link_devices['hostname'],'title'=>$link_devices['hostname'],'group'=>$link_dev['location']); - $tmp_id++; - $link_dev = dbFetchRow("SELECT `location` FROM `devices` WHERE `hostname`=?",array($link_devices['remote_hostname'])); - $tmp_devices[] = array('id'=>$link_devices['remote_hostname'],'label'=>$link_devices['remote_hostname'],'title'=>$link_devices['remote_hostname'],'group'=>$link_dev['location']); - $tmp_id++; + +$sql .= ' AND `local_device_id` != 0 AND `remote_device_id` != 0'; + +$tmp_ids = array(); +foreach (dbFetchRows("SELECT DISTINCT least(`devices`.`device_id`, `remote_device_id`) AS `remote_device_id`, GREATEST(`remote_device_id`,`devices`.`device_id`) AS `local_device_id` FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id` $sql", $sql_array) as $link_devices) { + if (!in_array($link_devices['local_device_id'], $tmp_ids)) { + $link_dev = dbFetchRow("SELECT `hostname`,`location` FROM `devices` WHERE `device_id`=?",array($link_devices['local_device_id'])); + $tmp_devices[] = array('id'=>$link_devices['local_device_id'],'label'=>$link_dev['hostname'],'title'=>$link_dev['hostname'],'group'=>$link_dev['location']); + } + if (!in_array($link_devices['remote_device_id'], $tmp_ids)) { + $link_dev = dbFetchRow("SELECT `hostname`,`location` FROM `devices` WHERE `device_id`=?",array($link_devices['remote_device_id'])); + $tmp_devices[] = array('id'=>$link_devices['remote_device_id'],'label'=>$link_dev['hostname'],'title'=>$link_dev['hostname'],'group'=>$link_dev['location']); + } + array_push($tmp_ids,$link_devices['local_device_id']); + array_push($tmp_ids,$link_devices['remote_device_id']); } + +$tmp_ids = implode(',',$tmp_ids); $nodes = json_encode($tmp_devices); if (is_array($tmp_devices[0])) { $tmp_links = array(); - foreach (dbFetchRows("SELECT `devices`.`hostname` AS `hostname`, `remote_hostname`,`ports`.`ifName` AS `local_port`, `remote_port`,`ports`.`ifSpeed` AS ifSpeed FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id`") as $link_devices) { + foreach (dbFetchRows("SELECT `devices`.`hostname` AS `hostname`, `remote_hostname`,`ports`.`ifName` AS `local_port`, `remote_port`,`ports`.`ifSpeed` AS ifSpeed FROM `links` LEFT JOIN `ports` ON `local_port_id`=`ports`.`port_id` LEFT JOIN `devices` ON `ports`.`device_id`=`devices`.`device_id` WHERE (`local_device_id` IN ($tmp_ids) AND `remote_device_id` IN ($tmp_ids))") as $link_devices) { foreach ($tmp_devices as $k=>$v) { if ($v['label'] == $link_devices['hostname']) { $from = $v['id']; @@ -89,9 +100,12 @@ echo $edges; }; var options = {physics: {barnesHut: {gravitationalConstant: -11900, centralGravity: 1.4, springLength: 203, springConstant: 0.05, damping: 0.3}}, smoothCurves: false}; var network = new vis.Network(container, data, options); - //network.on('click', function (properties) { - // window.location.href = "/device/device=" - //}); + network.on("resize", function(params) {console.log(params.width,params.height)}); + network.on('click', function (properties) { + if (properties.nodes > 0) { + window.location.href = "/device/device="+properties.nodes+"/tab=map/" + } + });