1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-10 09:49:05 +00:00

Reduce Zenmap's Topology noise by collapsing equivalent 'anonymous' nodes

This commit is contained in:
jay
2014-07-30 06:37:24 +00:00
parent d98fd9c909
commit c613586570

View File

@@ -176,11 +176,21 @@ class TracerouteHostInfo(object):
hostnames = property(lambda self: self.hostname and [self.hostname] or [])
def find_hop_by_ttl(hops, ttl):
assert ttl >= 0, "ttl must be non-negative"
if ttl == 0: # Same machine (i.e. localhost)
return {"ipaddr": "127.0.0.1/8"}
for h in hops:
if ttl == int(h["ttl"]):
return h
return None
def make_graph_from_hosts(hosts):
#hosts = parser.get_root().search_children('host', deep=True)
graph = Graph()
nodes = list()
node_cache = {}
invalid_node_cache = {}
# Setting initial reference host
main_node = NetNode()
@@ -210,13 +220,7 @@ def make_graph_from_hosts(hosts):
# Getting nodes of host by ttl
for ttl in range(1, max(ttls) + 1):
if ttl in ttls:
# Find a hop by ttl
hop = None
for h in hops:
if ttl == int(h["ttl"]):
hop = h
break
hop = find_hop_by_ttl(hops, ttl)
node = node_cache.get(hop["ipaddr"])
if node is None:
node = NetNode()
@@ -245,14 +249,34 @@ def make_graph_from_hosts(hosts):
else:
graph.set_connection(node, prev_node)
else:
node = NetNode()
nodes.append(node)
# Add an "anonymous" node only if there isn't already a node
# equivalent to it (i.e. at same distance from the previous
# "real" node)
node.set_draw_info({"valid": False})
node.set_draw_info(
{"color": (1, 1, 1), "radius": NONE_RADIUS})
pre_hop = None
pre_hop_distance = 0
for i in range(1, ttl + 1):
pre_hop = find_hop_by_ttl(hops, ttl-i)
if pre_hop is not None:
pre_hop_distance = i
break
graph.set_connection(node, prev_node)
assert pre_hop is not None, "pre_hop should have become localhost if nothing else"
key = (pre_hop["ipaddr"], pre_hop_distance)
if key not in invalid_node_cache:
node = NetNode()
nodes.append(node)
node.set_draw_info({"valid":False})
node.set_draw_info({"color":(1,1,1), "radius":NONE_RADIUS})
graph.set_connection(node, prev_node)
invalid_node_cache[key] = node
node = invalid_node_cache[key]
prev_node = node
endpoints[host] = node