diff --git a/README.md b/README.md index 2de1ab1dea7b91ad68b08f77694f7ffcb9228544..79dce28a85f488014c0114adba6784ccabeac93a 100755 --- a/README.md +++ b/README.md @@ -270,7 +270,7 @@ commands and parse data in JSON format, that Telegraf can parse and forward to I [you@host <repo location>]$cp telegraf_configs/twping_json.py /opt/twping_json.py ``` -Copy Telegraf configuation template, edit and adapt to you deployment as needed. +Copy Telegraf configuration template, edit and adapt to you deployment as needed. ``` [you@host <repo location>]$sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig @@ -278,6 +278,10 @@ Copy Telegraf configuation template, edit and adapt to you deployment as needed. [you@host <repo location>]$sudo nano /etc/telegraf/telegraf.conf ``` +Copy Telegraf testlist generated by the init script in the telegraf config fragments locations + +[you@host <repo location>]$sudo cp testlist.conf /etc/telegraf/telegraf.d/geant_tests.conf + Once done test the data acquisition process works without errors ``` diff --git a/telegraf_configs/telegraf.conf b/telegraf_configs/telegraf.conf index 4a4627ac3d5de7420843853225c7fab2bb1e6237..569be2720195351806fe0465e5124d57772dc39a 100644 --- a/telegraf_configs/telegraf.conf +++ b/telegraf_configs/telegraf.conf @@ -21,74 +21,3 @@ data_format = "json" -# -# TWAMP script runner - TWAMP server-client running on network devices -# -[[inputs.exec]] - commands = [ - "/opt/rpm_twamp_snmp.py 62.40.96.47 62.40.97.7 TWAMP 3VfrNKak rt1.pra.cz--mx1.vie.at mx1.vie.at", - "/opt/rpm_twamp_snmp.py 62.40.96.47 62.40.97.12 TWAMP 3VfrNKak rt1.pra.cz--mx1.fra.de mx1.fra.de", - "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.97.10 TWAMP 3VfrNKak mx1.vie.at--mx1.poz.pl mx1.poz.pl", - "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.97.1 TWAMP 3VfrNKak mx1.vie.at--mx1.bud.hu mx1.bud.hu", - "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.97.15 TWAMP 3VfrNKak mx1.vie.at--mx1.mil2.it mx1.mil2.it", - "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.96.39 TWAMP 3VfrNKak mx1.vie.at--mx1.ath2.gr mx1.ath2.gr", - "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.96.21 TWAMP 3VfrNKak mx1.vie.at--mx1.sof.bg mx1.sof.bg", - "/opt/rpm_twamp_snmp.py 62.40.97.12 62.40.96.19 TWAMP 3VfrNKak mx1.fra.de--mx1.buc.ro mx1.buc.ro", - "/opt/rpm_twamp_snmp.py 62.40.97.12 62.40.97.11 TWAMP 3VfrNKak mx1.fra.de--mx1.ams.nl mx1.ams.nl", - "/opt/rpm_twamp_snmp.py 62.40.97.10 62.40.97.12 TWAMP 3VfrNKak mx1.poz.pl--mx1.fra.de mx1.fra.de", - "/opt/rpm_twamp_snmp.py 62.40.97.15 62.40.97.14 TWAMP 3VfrNKak mx1.mil2.it--mx1.gen.ch mx1.gen.ch", - "/opt/rpm_twamp_snmp.py 62.40.96.21 62.40.96.19 TWAMP 3VfrNKak mx1.sof.bg--mx1.buc.ro mx1.buc.ro", - "/opt/rpm_twamp_snmp.py 62.40.96.19 62.40.97.1 TWAMP 3VfrNKak mx1.buc.ro--mx1.bud.hu mx1.bud.hu", - "/opt/rpm_twamp_snmp.py 62.40.96.5 62.40.96.6 TWAMP 3VfrNKak rt1.mar.fr--rt1.mil2.it rt1.mil2.it", - "/opt/rpm_twamp_snmp.py 62.40.96.5 62.40.97.16 TWAMP 3VfrNKak rt1.mar.fr--mx1.mad.es mx1.mad.es", - "/opt/rpm_twamp_snmp.py 62.40.96.5 62.40.97.14 TWAMP 3VfrNKak rt1.mar.fr--mx1.gen.ch mx1.gen.ch", - "/opt/rpm_twamp_snmp.py 62.40.96.6 62.40.97.7 TWAMP 3VfrNKak rt1.mil2.it--mx1.vie.at mx1.vie.at", - "/opt/rpm_twamp_snmp.py 62.40.96.6 62.40.97.14 TWAMP 3VfrNKak rt1.mil2.it--mx1.gen.ch mx1.gen.ch", - "/opt/rpm_twamp_snmp.py 62.40.97.14 62.40.97.12 TWAMP 3VfrNKak mx1.gen.ch--mx1.fra.de mx1.fra.de", - "/opt/rpm_twamp_snmp.py 62.40.96.54 62.40.97.4 TWAMP 3VfrNKak rt1.bra.sk--mx2.bra.sk mx2.bra.sk", - "/opt/rpm_twamp_snmp.py 62.40.97.4 62.40.97.7 TWAMP 3VfrNKak mx2.bra.sk--mx1.vie.at mx1.vie.at", - "/opt/rpm_twamp_snmp.py 62.40.97.4 62.40.97.1 TWAMP 3VfrNKak mx2.bra.sk--mx1.bud.hu mx1.bud.hu", - "/opt/rpm_twamp_snmp.py 62.40.96.4 62.40.96.2 TWAMP 3VfrNKak rt2.chi.md--rt1.chi.md rt1.chi.md", - "/opt/rpm_twamp_snmp.py 62.40.96.4 62.40.96.68 TWAMP 3VfrNKak rt2.chi.md--rt2.kie.ua rt2.kie.ua", - "/opt/rpm_twamp_snmp.py 62.40.96.2 62.40.96.19 TWAMP 3VfrNKak rt1.chi.md--mx1.buc.ro mx1.buc.ro", - "/opt/rpm_twamp_snmp.py 62.40.96.68 62.40.96.1 TWAMP 3VfrNKak rt2.kie.ua--rt1.kie.ua rt1.kie.ua", - "/opt/rpm_twamp_snmp.py 62.40.96.1 62.40.97.10 TWAMP 3VfrNKak rt1.kie.ua--mx1.poz.pl mx1.poz.pl", - "/opt/rpm_twamp_snmp.py 62.40.96.60 62.40.96.51 TWAMP 3VfrNKak rt2.tal.ee--rt1.tal.ee rt1.tal.ee", - "/opt/rpm_twamp_snmp.py 62.40.96.60 62.40.96.26 TWAMP 3VfrNKak rt2.tal.ee--mx1.ham.de mx1.ham.de", - "/opt/rpm_twamp_snmp.py 62.40.96.51 62.40.96.59 TWAMP 3VfrNKak rt1.tal.ee--rt2.rig.lv rt2.rig.lv", - "/opt/rpm_twamp_snmp.py 62.40.96.26 62.40.97.12 TWAMP 3VfrNKak mx1.ham.de--mx1.fra.de mx1.fra.de", - "/opt/rpm_twamp_snmp.py 62.40.96.26 62.40.97.11 TWAMP 3VfrNKak mx1.ham.de--mx1.ams.nl mx1.ams.nl", - "/opt/rpm_twamp_snmp.py 62.40.96.59 62.40.96.58 TWAMP 3VfrNKak rt2.rig.lv--rt1.rig.lv rt1.rig.lv", - "/opt/rpm_twamp_snmp.py 62.40.96.58 62.40.96.52 TWAMP 3VfrNKak rt1.rig.lv--rt1.kau.lt rt1.kau.lt", - "/opt/rpm_twamp_snmp.py 62.40.96.36 62.40.96.42 TWAMP 3VfrNKak rt1.por.pt--rt1.bil.es rt1.bil.es", - "/opt/rpm_twamp_snmp.py 62.40.96.36 62.40.96.17 TWAMP 3VfrNKak rt1.por.pt--mx2.lis.pt mx2.lis.pt", - "/opt/rpm_twamp_snmp.py 62.40.96.42 62.40.97.16 TWAMP 3VfrNKak rt1.bil.es--mx1.mad.es mx1.mad.es", - "/opt/rpm_twamp_snmp.py 62.40.96.42 62.40.97.13 TWAMP 3VfrNKak rt1.bil.es--mx1.par.fr mx1.par.fr", - "/opt/rpm_twamp_snmp.py 62.40.96.17 62.40.97.16 TWAMP 3VfrNKak mx2.lis.pt--mx1.mad.es mx1.mad.es", - "/opt/rpm_twamp_snmp.py 62.40.97.13 62.40.97.14 TWAMP 3VfrNKak mx1.par.fr--mx1.gen.ch mx1.gen.ch", - "/opt/rpm_twamp_snmp.py 62.40.97.13 62.40.96.15 TWAMP 3VfrNKak mx1.par.fr--mx1.lon2.uk mx1.lon2.uk", - "/opt/rpm_twamp_snmp.py 62.40.96.53 62.40.97.10 TWAMP 3VfrNKak rt2.kau.lt--mx1.poz.pl mx1.poz.pl", - "/opt/rpm_twamp_snmp.py 62.40.96.53 62.40.96.52 TWAMP 3VfrNKak rt2.kau.lt--rt1.kau.lt rt1.kau.lt", - "/opt/rpm_twamp_snmp.py 62.40.96.62 62.40.97.11 TWAMP 3VfrNKak rt2.ams.nl--mx1.ams.nl mx1.ams.nl", - "/opt/rpm_twamp_snmp.py 62.40.96.62 62.40.97.5 TWAMP 3VfrNKak rt2.ams.nl--mx1.lon.uk mx1.lon.uk", - "/opt/rpm_twamp_snmp.py 62.40.97.5 62.40.97.11 TWAMP 3VfrNKak mx1.lon.uk--mx1.ams.nl mx1.ams.nl", - "/opt/rpm_twamp_snmp.py 62.40.97.5 62.40.97.14 TWAMP 3VfrNKak mx1.lon.uk--mx1.gen.ch mx1.gen.ch", - "/opt/rpm_twamp_snmp.py 62.40.97.5 62.40.96.15 TWAMP 3VfrNKak mx1.lon.uk--mx1.lon2.uk mx1.lon2.uk", - "/opt/rpm_twamp_snmp.py 62.40.97.5 62.40.96.25 TWAMP 3VfrNKak mx1.lon.uk--mx1.dub2.ie mx1.dub2.ie", - "/opt/rpm_twamp_snmp.py 62.40.96.15 62.40.96.3 TWAMP 3VfrNKak mx1.lon2.uk--mx1.dub.ie mx1.dub.ie", - "/opt/rpm_twamp_snmp.py 62.40.96.25 62.40.96.3 TWAMP 3VfrNKak mx1.dub2.ie--mx1.dub.ie mx1.dub.ie", - "/opt/rpm_twamp_snmp.py 62.40.96.8 62.40.97.7 TWAMP 3VfrNKak mx2.zag.hr--mx1.vie.at mx1.vie.at", - "/opt/rpm_twamp_snmp.py 62.40.96.8 62.40.97.1 TWAMP 3VfrNKak mx2.zag.hr--mx1.bud.hu mx1.bud.hu", - "/opt/rpm_twamp_snmp.py 62.40.96.10 62.40.97.1 TWAMP 3VfrNKak mx2.lju.si--mx1.bud.hu mx1.bud.hu", - "/opt/rpm_twamp_snmp.py 62.40.96.10 62.40.97.15 TWAMP 3VfrNKak mx2.lju.si--mx1.mil2.it mx1.mil2.it", - "/opt/rpm_twamp_snmp.py 62.40.96.20 62.40.97.11 TWAMP 3VfrNKak mx2.bru.be--mx1.ams.nl mx1.ams.nl", - "/opt/rpm_twamp_snmp.py 62.40.96.20 62.40.97.5 TWAMP 3VfrNKak mx2.bru.be--mx1.lon.uk mx1.lon.uk", - "/opt/rpm_twamp_snmp.py 62.40.96.11 62.40.97.15 TWAMP 3VfrNKak mx2.ath.gr--mx1.mil2.it mx1.mil2.it", - "/opt/rpm_twamp_snmp.py 62.40.96.11 62.40.96.39 TWAMP 3VfrNKak mx2.ath.gr--mx1.ath2.gr mx1.ath2.gr", -] - - name_suffix = "_twamp" - timeout = "2m" - data_format = "json" - tag_keys = ["src", "dst", "src_ip", "dst_ip"] -# fielddrop = ["sample_is_valid"] \ No newline at end of file diff --git a/tools/init_timemap_v3.py b/tools/init_timemap_v3.py index 1b6358cd9c9172c4f40269ea362dd62539713428..076d8a58ab93bc3d06c73b6a72d4d59783a85dda 100755 --- a/tools/init_timemap_v3.py +++ b/tools/init_timemap_v3.py @@ -4,51 +4,57 @@ import json import socket import xml.etree.ElementTree as ET + def get_nodes(tree): cy_nodes_list = [] addr_map = {} svg_nodes = tree.findall(".//*[@class='node']/{http://www.w3.org/2000/svg}text") for svg_node in svg_nodes: nid = svg_node.text - x = svg_node.attrib.get('x', None) - y = svg_node.attrib.get('y', None) + x = svg_node.attrib.get("x", None) + y = svg_node.attrib.get("y", None) if x is None or y is None: print(f"WARN - Unable to get positions for {nid}: {x},{y}") continue try: - addr = socket.gethostbyname( nid+".geant.net" ) + addr = socket.gethostbyname(nid + ".geant.net") fqdn = socket.gethostbyaddr(addr)[0] except: - fqdn = nid+".geant.net" + fqdn = nid + ".geant.net" addr = "" - + addr_map[nid] = addr # Fill the data structure to plot the node on Timemap page with Cytoscape - cy_nodes_list.append( { - 'data': { - 'id': nid, - 'name': nid, - 'fqdn': fqdn, - 'ip': addr, - }, - 'position': { - 'x': int(float(x)), - 'y': int(float(y)/2), - }, - 'locked': True, - }) + cy_nodes_list.append( + { + "data": { + "id": nid, + "name": nid, + "fqdn": fqdn, + "ip": addr, + }, + "position": { + "x": int(float(x)), + "y": int(float(y) / 2), + }, + "locked": True, + } + ) return cy_nodes_list, addr_map + def get_edges(tree): cy_edges_list = [] svg_edges = tree.findall(".//*[@class='edge']") for svg_edge in svg_edges: title = svg_edge.find("./{http://www.w3.org/2000/svg}title").text - att = svg_edge.find(".//{http://www.w3.org/2000/svg}a").attrib.get('{http://www.w3.org/1999/xlink}title', None) + att = svg_edge.find(".//{http://www.w3.org/2000/svg}a").attrib.get( + "{http://www.w3.org/1999/xlink}title", None + ) if not att: print(f"WARN - Unable to get link attribute Element for {title}") continue @@ -64,51 +70,80 @@ def get_edges(tree): continue # Fill the data structure to plot the link on the Timemap page wit Cytoscape - cy_edges_list.append( { - 'data': { - 'id': title, - 'label': title.replace("--","-"), # G.edges.get(e)['label'].replace('"', ''), - 'source': source, - 'source_ip': source_ip, - 'target': target, - 'target_ip': target_ip, - }, - 'pannable': True, - }) + cy_edges_list.append( + { + "data": { + "id": title, + "label": title.replace( + "--", "-" + ), # G.edges.get(e)['label'].replace('"', ''), + "source": source, + "source_ip": source_ip, + "target": target, + "target_ip": target_ip, + }, + "pannable": True, + } + ) return cy_edges_list def generate_test_list(dyngraph, address_map): - testlist = [] - for edge in dyngraph['elements']['edges']: - data = edge['data'] - src, dst = data.get('id',"").split("--") - src = address_map.get(src,"") - dst = address_map.get(dst,"") - if not(src and dst): + # Telegraf testlist header + testlist = [ + "# TWAMP script runner - TWAMP server-client running on network devices", + "[[inputs.exec]]", + "commands = [", + ] + + for edge in dyngraph["elements"]["edges"]: + data = edge["data"] + src, dst = data.get("id", "").split("--") + src = address_map.get(src, "") + dst = address_map.get(dst, "") + if not (src and dst): continue # Prepare the entry for the test list testlist.append( # "/opt/rpm_twamp_snmp.py 62.40.97.7 62.40.97.1 TWAMP 3VfrNKak mx1.vie.at--mx1.bud.hu mx1.bud.hu" - f"\"/opt/rpm_twamp_snmp.py {src} {dst} TWAMP 3VfrNKak {data['id']} {data['source']}\"," + f" \"/opt/rpm_twamp_snmp.py {src} {dst} TWAMP 3VfrNKak {data['id']} {data['source']}\"," ) + + # Telegraf testlist footer + testlist.append("]") + testlist.append(' name_suffix = "_twamp"') + testlist.append(' timeout = "2m"') + testlist.append(' data_format = "json"') + testlist.append(' tag_keys = ["src", "dst", "src_ip", "dst_ip"]') + return testlist + # Main # Usage example: python3 init_timemap_v2.py -s ./dotfiles/geantISIS_latest.svg -o ./dotfiles/latest_graph.json -t ./dotfiles/tests.txt parser = argparse.ArgumentParser() -parser.add_argument("-s", "--svgfile", help="topology SVG input file") -parser.add_argument("-o", "--output", default="latest_graph.json", help="output json file (default latest_graph.json)") -parser.add_argument("-t", "--testlist", default="testlist.conf", help="test list config file to simplofy Telegraf setup (default testlist.conf)") +parser.add_argument("-s", "--svgfile", help="topology SVG input file") +parser.add_argument( + "-o", + "--output", + default="latest_graph.json", + help="output json file (default latest_graph.json)", +) +parser.add_argument( + "-t", + "--testlist", + default="testlist.conf", + help="test list config file to simplofy Telegraf setup (default testlist.conf)", +) args = parser.parse_args() # Parse input file -dyngraph = { - 'elements': { - 'nodes': [], - 'edges': [], +dyngraph = { + "elements": { + "nodes": [], + "edges": [], }, } @@ -117,21 +152,20 @@ tree = ET.parse(args.svgfile) # Add nodes from dot graph nodes, address_map = get_nodes(tree) if nodes: - dyngraph['elements']['nodes'] = nodes + dyngraph["elements"]["nodes"] = nodes # Add edges from ISIS dynamic topology edges = get_edges(tree) if nodes: - dyngraph['elements']['edges'] = edges + dyngraph["elements"]["edges"] = edges # Write JSON topology used in Timemap GUI -json.dump(dyngraph, open(args.output, 'w'), indent=2) +json.dump(dyngraph, open(args.output, "w"), indent=2) # Create testlist to be used in Telegraf configurations testlist = generate_test_list(dyngraph, address_map) outF = open(args.testlist, "w") for t in testlist: - outF.write( t+"\n" ) + outF.write(t + "\n") outF.close() -