Skip to content
Snippets Groups Projects
Commit b053fc90 authored by Fabio Farina's avatar Fabio Farina
Browse files

Update init script with Telegraf configuration split

parent da9c4d52
No related branches found
No related tags found
No related merge requests found
...@@ -270,7 +270,7 @@ commands and parse data in JSON format, that Telegraf can parse and forward to I ...@@ -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 [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 [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. ...@@ -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 [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 Once done test the data acquisition process works without errors
``` ```
......
...@@ -21,74 +21,3 @@ ...@@ -21,74 +21,3 @@
data_format = "json" 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
...@@ -4,51 +4,57 @@ import json ...@@ -4,51 +4,57 @@ import json
import socket import socket
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
def get_nodes(tree): def get_nodes(tree):
cy_nodes_list = [] cy_nodes_list = []
addr_map = {} addr_map = {}
svg_nodes = tree.findall(".//*[@class='node']/{http://www.w3.org/2000/svg}text") svg_nodes = tree.findall(".//*[@class='node']/{http://www.w3.org/2000/svg}text")
for svg_node in svg_nodes: for svg_node in svg_nodes:
nid = svg_node.text nid = svg_node.text
x = svg_node.attrib.get('x', None) x = svg_node.attrib.get("x", None)
y = svg_node.attrib.get('y', None) y = svg_node.attrib.get("y", None)
if x is None or y is None: if x is None or y is None:
print(f"WARN - Unable to get positions for {nid}: {x},{y}") print(f"WARN - Unable to get positions for {nid}: {x},{y}")
continue continue
try: try:
addr = socket.gethostbyname( nid+".geant.net" ) addr = socket.gethostbyname(nid + ".geant.net")
fqdn = socket.gethostbyaddr(addr)[0] fqdn = socket.gethostbyaddr(addr)[0]
except: except:
fqdn = nid+".geant.net" fqdn = nid + ".geant.net"
addr = "" addr = ""
addr_map[nid] = addr addr_map[nid] = addr
# Fill the data structure to plot the node on Timemap page with Cytoscape # Fill the data structure to plot the node on Timemap page with Cytoscape
cy_nodes_list.append( { cy_nodes_list.append(
'data': { {
'id': nid, "data": {
'name': nid, "id": nid,
'fqdn': fqdn, "name": nid,
'ip': addr, "fqdn": fqdn,
}, "ip": addr,
'position': { },
'x': int(float(x)), "position": {
'y': int(float(y)/2), "x": int(float(x)),
}, "y": int(float(y) / 2),
'locked': True, },
}) "locked": True,
}
)
return cy_nodes_list, addr_map return cy_nodes_list, addr_map
def get_edges(tree): def get_edges(tree):
cy_edges_list = [] cy_edges_list = []
svg_edges = tree.findall(".//*[@class='edge']") svg_edges = tree.findall(".//*[@class='edge']")
for svg_edge in svg_edges: for svg_edge in svg_edges:
title = svg_edge.find("./{http://www.w3.org/2000/svg}title").text 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: if not att:
print(f"WARN - Unable to get link attribute Element for {title}") print(f"WARN - Unable to get link attribute Element for {title}")
continue continue
...@@ -64,51 +70,80 @@ def get_edges(tree): ...@@ -64,51 +70,80 @@ def get_edges(tree):
continue continue
# Fill the data structure to plot the link on the Timemap page wit Cytoscape # Fill the data structure to plot the link on the Timemap page wit Cytoscape
cy_edges_list.append( { cy_edges_list.append(
'data': { {
'id': title, "data": {
'label': title.replace("--","-"), # G.edges.get(e)['label'].replace('"', ''), "id": title,
'source': source, "label": title.replace(
'source_ip': source_ip, "--", "-"
'target': target, ), # G.edges.get(e)['label'].replace('"', ''),
'target_ip': target_ip, "source": source,
}, "source_ip": source_ip,
'pannable': True, "target": target,
}) "target_ip": target_ip,
},
"pannable": True,
}
)
return cy_edges_list return cy_edges_list
def generate_test_list(dyngraph, address_map): def generate_test_list(dyngraph, address_map):
testlist = [] # Telegraf testlist header
for edge in dyngraph['elements']['edges']: testlist = [
data = edge['data'] "# TWAMP script runner - TWAMP server-client running on network devices",
src, dst = data.get('id',"").split("--") "[[inputs.exec]]",
src = address_map.get(src,"") "commands = [",
dst = address_map.get(dst,"") ]
if not(src and dst):
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 continue
# Prepare the entry for the test list # Prepare the entry for the test list
testlist.append( 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" # "/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 return testlist
# Main # Main
# Usage example: python3 init_timemap_v2.py -s ./dotfiles/geantISIS_latest.svg -o ./dotfiles/latest_graph.json -t ./dotfiles/tests.txt # 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 = argparse.ArgumentParser()
parser.add_argument("-s", "--svgfile", help="topology SVG input file") 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(
parser.add_argument("-t", "--testlist", default="testlist.conf", help="test list config file to simplofy Telegraf setup (default testlist.conf)") "-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() args = parser.parse_args()
# Parse input file # Parse input file
dyngraph = { dyngraph = {
'elements': { "elements": {
'nodes': [], "nodes": [],
'edges': [], "edges": [],
}, },
} }
...@@ -117,21 +152,20 @@ tree = ET.parse(args.svgfile) ...@@ -117,21 +152,20 @@ tree = ET.parse(args.svgfile)
# Add nodes from dot graph # Add nodes from dot graph
nodes, address_map = get_nodes(tree) nodes, address_map = get_nodes(tree)
if nodes: if nodes:
dyngraph['elements']['nodes'] = nodes dyngraph["elements"]["nodes"] = nodes
# Add edges from ISIS dynamic topology # Add edges from ISIS dynamic topology
edges = get_edges(tree) edges = get_edges(tree)
if nodes: if nodes:
dyngraph['elements']['edges'] = edges dyngraph["elements"]["edges"] = edges
# Write JSON topology used in Timemap GUI # 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 # Create testlist to be used in Telegraf configurations
testlist = generate_test_list(dyngraph, address_map) testlist = generate_test_list(dyngraph, address_map)
outF = open(args.testlist, "w") outF = open(args.testlist, "w")
for t in testlist: for t in testlist:
outF.write( t+"\n" ) outF.write(t + "\n")
outF.close() outF.close()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment