commit dc7e9de16e7990053809d1d8abb42db636dd41a2 Author: Dom Date: Tue Nov 28 22:50:12 2023 +0000 Creating initial files diff --git a/main.py b/main.py new file mode 100755 index 0000000..47f56b7 --- /dev/null +++ b/main.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 + +from topology.topo import Topology + +if __name__ == '__main__': + topology = Topology() + topology.render() + topology.get_dns_records() \ No newline at end of file diff --git a/records.txt b/records.txt new file mode 100644 index 0000000..db05e1c --- /dev/null +++ b/records.txt @@ -0,0 +1,10 @@ +10.0.0.1 LAB-RELAY_GigabitEthernet0-->ge-0/0/0_LAB-SRX300 +10.0.0.0 LAB-SRX300_ge-0/0/0-->GigabitEthernet0_LAB-RELAY +10.0.0.3 LAB-RELAY_GigabitEthernet1-->GigabitEthernet8_LAB-897VA +10.0.0.2 LAB-897VA_GigabitEthernet8-->GigabitEthernet1_LAB-RELAY +192.168.0.249 LAB-RELAY_eth0-->GigabitEthernet8_UBUNTU +192.168.0.247 UBUNTU_GigabitEthernet8-->eth0_LAB-RELAY +10.0.0.4 LAB-SRX300_GigabitEthernet1-->ge-0/0/1_LAB-897VA +10.0.0.5 LAB-897VA_ge-0/0/1-->GigabitEthernet1_LAB-SRX300 +10.0.0.6 LAB-SRX300_GigabitEthernet2-->ge-0/0/2_LAB-897VA +10.0.0.7 LAB-897VA_ge-0/0/2-->GigabitEthernet2_LAB-SRX300 \ No newline at end of file diff --git a/topology.yaml b/topology.yaml new file mode 100644 index 0000000..d0ad89d --- /dev/null +++ b/topology.yaml @@ -0,0 +1,47 @@ +Lab: + nodes: + UBUNTU + LAB-RELAY + LAB-897VA + LAB-SRX300 + edges: + 1: + a_end: LAB-RELAY + b_end: LAB-SRX300 + a_end_ip: 10.0.0.0 + b_end_ip: 10.0.0.1 + a_end_interface: GigabitEthernet0 + b_end_interface: ge-0/0/0 + edge_index: 0 + 2: + a_end: LAB-RELAY + b_end: LAB-897VA + a_end_ip: 10.0.0.2 + b_end_ip: 10.0.0.3 + a_end_interface: GigabitEthernet1 + b_end_interface: GigabitEthernet8 + edge_index: 0 + 3: + a_end: UBUNTU + b_end: LAB-RELAY + a_end_ip: 192.168.0.247 + b_end_ip: 192.168.0.249 + a_end_interface: eth0 + b_end_interface: GigabitEthernet8 + edge_index: 0 + 4: + a_end: LAB-897VA + b_end: LAB-SRX300 + a_end_ip: 10.0.0.5 + b_end_ip: 10.0.0.4 + a_end_interface: GigabitEthernet1 + b_end_interface: ge-0/0/1 + edge_index: 0 + 5: + a_end: LAB-897VA + b_end: LAB-SRX300 + a_end_ip: 10.0.0.7 + b_end_ip: 10.0.0.6 + a_end_interface: GigabitEthernet2 + b_end_interface: ge-0/0/2 + edge_index: 1 diff --git a/topology/topo.py b/topology/topo.py new file mode 100644 index 0000000..5c43882 --- /dev/null +++ b/topology/topo.py @@ -0,0 +1,70 @@ +import networkx as nx +import yaml + +from networkx.drawing.nx_agraph import to_agraph + +class Topology(object): + def __init__(self): + self.G = nx.MultiGraph() + + def render(self): + ''' + Summary: + Builds a network topology from the topology.yaml file into memory, stored in a networkx Graph object. + Once the networkx Graph object has been built, it's drawn and saved as topology.png. + + Nodes: network devices + Edges: links between network devices + Edge attributes: dict of attributes assigned to a specific edge + ''' + topology_data = yaml.load(open('topology.yaml'), Loader=yaml.SafeLoader) + + for topology_name, topology_vars in topology_data.items(): + for node in topology_vars['nodes']: + self.G.add_node(node) + self.G.nodes[node]['shape'] = 'box' + + for edge_number, edge_attributes in topology_vars['edges'].items(): + self.G.add_edge(edge_attributes['a_end'], edge_attributes['b_end']) + nx.set_edge_attributes( + self.G, + { + (edge_attributes['a_end'], + edge_attributes['b_end'], + edge_attributes['edge_index']): edge_attributes + } + ) + + for node1, node2, edge_attributes in self.G.edges(data=True): + edge_attributes['label'] = f""" + {edge_attributes['a_end']} + {edge_attributes['a_end_ip']}, {edge_attributes['a_end_interface']}\n + {edge_attributes['b_end']} + {edge_attributes['b_end_ip']}, {edge_attributes['b_end_interface']} + """ + + vis = to_agraph(self.G) + vis.layout('dot') + vis_path = 'topology/topology.png' + vis.draw(vis_path) + + def get_dns_records(self): + ''' + Summary: + Creates & outputs Ubuntu DNS entries for each edge IP in the networkx Graph object. + Enabling operators to easily visualise the path traffic has taken across a network. + + dom@upsrv01:~/Python/T2DNS$ traceroute 10.0.0.3 --resolve -I + traceroute to 10.0.0.3 (10.0.0.3), 64 hops max + 1 192.168.0.249 (UBUNTU_eth0-->GigabitEthernet8_LAB-RELAY) 0.864ms 0.688ms 0.720ms + 2 10.0.0.3 (LAB-RELAY_GigabitEthernet1-->GigabitEthernet8_LAB-897VA) 1.431ms 1.372ms 1.363ms + ''' + records = {} + + print('Creating DNS records...') + for node1, node2, edge_attributes in self.G.edges(data=True): + records.update({edge_attributes['b_end_ip']: f"{node1}_{edge_attributes['a_end_interface']}-->{edge_attributes['b_end_interface']}_{node2}"}) + records.update({edge_attributes['a_end_ip']: f"{node2}_{edge_attributes['b_end_interface']}-->{edge_attributes['a_end_interface']}_{node1}"}) + + for ip, record in records.items(): + print(f'{ip} {record}') diff --git a/topology/topology.png b/topology/topology.png new file mode 100644 index 0000000..d5c492f Binary files /dev/null and b/topology/topology.png differ