diff --git a/html/includes/print-map.inc.php b/html/includes/print-map.inc.php index 8470e7a32c..21c3850948 100644 --- a/html/includes/print-map.inc.php +++ b/html/includes/print-map.inc.php @@ -32,10 +32,10 @@ if (is_admin() === false && is_read() === false) { $sql_array[] = $_SESSION['user_id']; } -$tmp_devices = array(); -$tmp_ids = array(); -$tmp_links = array(); -$tmp_link_ids = array(); +$devices_by_id = array(); +$links = array(); +$link_assoc_seen = array(); +$device_assoc_seen = array(); $ports = array(); $devices = array(); @@ -74,12 +74,15 @@ if (in_array('mac',$config['network_map_items'])) { `P2`.`ifOperStatus` AS `remote_ifoperstatus`, `P2`.`ifAdminStatus` AS `remote_ifadminstatus`, `P2`.`ifInOctets_rate` AS `remote_ifinoctets_rate`, - `P2`.`ifOutOctets_rate` AS `remote_ifoutoctets_rate` + `P2`.`ifOutOctets_rate` AS `remote_ifoutoctets_rate`, + SUM(IF(`P2_ip`.`ipv4_address` = `M`.`ipv4_address`, 1, 0)) + AS `remote_matching_ips` FROM `ipv4_mac` AS `M` LEFT JOIN `ports` AS `P1` ON `P1`.`port_id`=`M`.`port_id` LEFT JOIN `ports` AS `P2` ON `P2`.`ifPhysAddress`=`M`.`mac_address` LEFT JOIN `devices` AS `D1` ON `P1`.`device_id`=`D1`.`device_id` LEFT JOIN `devices` AS `D2` ON `P2`.`device_id`=`D2`.`device_id` + LEFT JOIN `ipv4_addresses` AS `P2_ip` ON `P2_ip`.`port_id` = `P2`.`port_id` $join_sql WHERE `M`.`mac_address` NOT IN ('000000000000','ffffffffffff') AND @@ -89,6 +92,7 @@ if (in_array('mac',$config['network_map_items'])) { $where $sql GROUP BY `P1`.`port_id`,`P2`.`port_id` + ORDER BY `remote_matching_ips` DESC, `local_ifname`, `remote_ifname` ", $sql_array); } @@ -131,11 +135,14 @@ if (in_array('xdp', $config['network_map_items'])) { $where $sql GROUP BY `P1`.`port_id`,`P2`.`port_id` + ORDER BY `local_ifname`, `remote_ifname` ", $sql_array); } $list = array_merge($ports,$devices); +// Iterate though ports and links, generating a set of devices (nodes) +// and links (edges) that make up the topology graph. foreach ($list as $items) { $local_device = array('device_id'=>$items['local_device_id'], 'os'=>$items['local_os'], 'hostname'=>$items['local_hostname']); $remote_device = array('device_id'=>$items['remote_device_id'], 'os'=>$items['remote_os'], 'hostname'=>$items['remote_hostname']); @@ -143,14 +150,16 @@ foreach ($list as $items) { $local_port = array('port_id'=>$items['local_port_id'],'device_id'=>$items['local_port_device_id'],'ifName'=>$items['local_ifname'],'ifSpeed'=>$items['local_ifspeed'],'ifOperStatus'=>$items['local_ifoperstatus'],'ifAdminStatus'=>$items['local_adminstatus']); $remote_port = array('port_id'=>$items['remote_port_id'],'device_id'=>$items['remote_port_device_id'],'ifName'=>$items['remote_ifname'],'ifSpeed'=>$items['remote_ifspeed'],'ifOperStatus'=>$items['remote_ifoperstatus'],'ifAdminStatus'=>$items['remote_adminstatus']); - if (!in_array($items['local_device_id'],$tmp_ids)) { - $tmp_devices[] = array('id'=>$items['local_device_id'],'label'=>$items['local_hostname'],'title'=>generate_device_link($local_device,'',array(),'','','',0),'shape'=>'box'); + $local_device_id = $items['local_device_id']; + if (!array_key_exists($local_device_id, $devices_by_id)) { + $devices_by_id[$local_device_id] = array('id'=>$local_device_id,'label'=>$items['local_hostname'],'title'=>generate_device_link($local_device,'',array(),'','','',0),'shape'=>'box'); } - array_push($tmp_ids,$items['local_device_id']); - if (!in_array($items['remote_device_id'],$tmp_ids)) { - $tmp_devices[] = array('id'=>$items['remote_device_id'],'label'=>$items['remote_hostname'],'title'=>generate_device_link($remote_device,'',array(),'','','',0),'shape'=>'box'); + + $remote_device_id = $items['remote_device_id']; + if (!array_key_exists($remote_device_id, $devices_by_id)) { + $devices_by_id[$remote_device_id] = array('id'=>$remote_device_id,'label'=>$items['remote_hostname'],'title'=>generate_device_link($remote_device,'',array(),'','','',0),'shape'=>'box'); } - array_push($tmp_ids,$items['remote_device_id']); + $speed = $items['local_ifspeed']/1000/1000; if ($speed == 100) { $width = 3; @@ -183,22 +192,30 @@ foreach ($list as $items) { $link_used = 100; } $link_color = $config['network_map_legend'][$link_used]; - $id1 = $items['local_port_id'].':'.$items['remote_port_id']; - $id2 = $items['remote_port_id'].':'.$items['local_port_id']; - if (!in_array($id1,$tmp_link_ids) || !in_array($id2,$tmp_link_ids)) { + $link_id1 = $items['local_port_id'].':'.$items['remote_port_id']; + $link_id2 = $items['remote_port_id'].':'.$items['local_port_id']; + $device_id1 = $items['local_device_id'].':'.$items['remote_device_id']; + $device_id2 = $items['remote_device_id'].':'.$items['local_device_id']; + + // Ensure only one link exists between any two ports, or any two devices. + if (!array_key_exists($link_id1, $link_assoc_seen) && + !array_key_exists($link_id2, $link_assoc_seen) && + !array_key_exists($device_id1, $device_assoc_seen) && + !array_key_exists($device_id2, $device_assoc_seen)) { $local_port = ifNameDescr($local_port); $remote_port = ifNameDescr($remote_port); - $tmp_links[] = array('from'=>$items['local_device_id'],'to'=>$items['remote_device_id'],'label'=>shorten_interface_type($local_port['ifName']) . ' > ' . shorten_interface_type($remote_port['ifName']),'title'=>generate_port_link($local_port, "\n",'',0,1),'width'=>$width,'color'=>$link_color); + $links[] = array('from'=>$items['local_device_id'],'to'=>$items['remote_device_id'],'label'=>shorten_interface_type($local_port['ifName']) . ' > ' . shorten_interface_type($remote_port['ifName']),'title'=>generate_port_link($local_port, "\n",'',0,1),'width'=>$width,'color'=>$link_color); } - array_push($tmp_link_ids,$id1); - array_push($tmp_link_ids,$id2); + $link_assoc_seen[$link_id1] = 1; + $link_assoc_seen[$link_id2] = 1; + $device_assoc_seen[$device_id1] = 1; + $device_assoc_seen[$device_id2] = 1; } -$node_devices = $tmp_devices; -$nodes = json_encode($node_devices); -$edges = json_encode($tmp_links); +$nodes = json_encode(array_values($devices_by_id)); +$edges = json_encode($links); -if (count($node_devices) > 1 && count($tmp_links) > 0) { +if (count($devices_by_id) > 1 && count($links) > 0) { ?>