def make_graph_from_nmap_parser(parser): """ """ hosts = parser.get_root().search_children('host', deep=True) graph = Graph() nodes = list() index = 1 # setting initial reference host nodes.append(NetNode(0)) node = nodes[-1] node.set_info({'ip':'127.0.0.1/8', 'hostname':'localhost'}) node.set_draw_info({'color':(0,0,0), 'radius':NONE_RADIUS}) # for each host in hosts just mount the graph for host in hosts: trace = host.search_children('trace', True, True) # if host has traceroute information mount graph if trace != None: prev_node = nodes[0] hops = trace.search_children('hop') ttls = [int(hop.get_attr('ttl')) for hop in hops] # getting nodes of host by ttl for ttl in range(1, max(ttls) + 1): if ttl in ttls: hop = trace.query_children('hop', 'ttl', ttl, True) for node in nodes: if hop.get_attr('ipaddr') == node.get_info('ip'): break else: nodes.append(NetNode(index)) node = nodes[-1] index += 1 node.set_draw_info({'valid':True}) node.set_info({'ip':hop.get_attr('ipaddr')}) node.set_draw_info({'color':(1,1,1), 'radius':NONE_RADIUS}) if hop.get_attr('host') != None: node.set_info({'hostname':hop.get_attr('host')}) rtt = hop.get_attr('rtt') if rtt != '--': graph.set_connection(node, prev_node, float(rtt)) else: graph.set_connection(node, prev_node) else: nodes.append(NetNode(index)) node = nodes[-1] index += 1 node.set_draw_info({'valid':False}) node.set_info({'ip':None, 'hostname':None}) node.set_draw_info({'color':(1,1,1), 'radius':NONE_RADIUS}) graph.set_connection(node, prev_node) prev_node = node # for each full scanned host for host in hosts: ip = host.query_children('address', 'addrtype', 'ipv4', True) if ip == None: ip = host.query_children('address', 'addrtype', 'ipv6', True) for node in nodes: if ip.get_attr('addr') == node.get_info('ip'): break else: nodes.append(NetNode(index)) node = nodes[-1] index += 1 node.set_draw_info({'no_route':True}) graph.set_connection(node, nodes[0]) node.set_draw_info({'valid':True}) node.set_info({'scanned':True}) set_node_info(node, host) graph.set_nodes(nodes) graph.set_main_node_by_id(0) return graph