117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
|
import telnetlib
|
||
|
import re
|
||
|
from graphviz import Digraph
|
||
|
|
||
|
|
||
|
srv = "he"
|
||
|
|
||
|
if srv == "opentransit":
|
||
|
host = "route-server.opentransit.net"
|
||
|
user = "rviews"
|
||
|
password = "Rviews"
|
||
|
lg_asn = "5511"
|
||
|
cmd = "show bgp {}"
|
||
|
elif srv == "oregonuniv":
|
||
|
host = "route-views.routeviews.org"
|
||
|
user = "rviews"
|
||
|
password = "none"
|
||
|
lg_asn = "3582"
|
||
|
cmd = "show bgp {}"
|
||
|
elif srv == "warian":
|
||
|
host = "route-server.warian.net"
|
||
|
user = "none"
|
||
|
password = "rviews"
|
||
|
lg_asn = "56911"
|
||
|
cmd = "show bgp ipv4 unicast {}"
|
||
|
elif srv == "csaholdigs": #Blacklist des fois
|
||
|
host = "route-views.sg.routeviews.org"
|
||
|
user = "none"
|
||
|
password = "none"
|
||
|
lg_asn = "45494"
|
||
|
cmd = "show bgp ipv4 unicast {}"
|
||
|
elif srv == "he": #Blacklist des fois
|
||
|
host = "route-server.he.net"
|
||
|
user = "none"
|
||
|
password = "none"
|
||
|
lg_asn = "6939"
|
||
|
cmd = "show bgp ipv4 unicast {}"
|
||
|
elif srv == "iamageeknz": #Blacklist des fois
|
||
|
host = "rs.as45186.net"
|
||
|
user = "none"
|
||
|
password = "none"
|
||
|
lg_asn = "45186"
|
||
|
cmd = "show bgp ipv4 unicast {}"
|
||
|
elif srv == "att":
|
||
|
host = "route-server.ip.att.net"
|
||
|
user = "rviews"
|
||
|
password = "rviews"
|
||
|
lg_asn = "7018"
|
||
|
cmd = "show route {}"
|
||
|
|
||
|
|
||
|
# Récupération de l'IP dont on veux connaitre plus d'informations
|
||
|
ip = input("IP : ")
|
||
|
|
||
|
# Connexion à OpenTransit
|
||
|
tn = telnetlib.Telnet(host)
|
||
|
|
||
|
if user != "none":
|
||
|
if(srv == "att"):
|
||
|
tn.read_until("login: ".encode())
|
||
|
tn.write((user + "\n").encode())
|
||
|
print("ok")
|
||
|
else:
|
||
|
tn.read_until("Username: ".encode())
|
||
|
tn.write((user + "\n").encode())
|
||
|
|
||
|
if password != "none":
|
||
|
if(srv == "att"):
|
||
|
tn.read_until("Password:".encode())
|
||
|
tn.write((password + "\n").encode())
|
||
|
print("ok")
|
||
|
else:
|
||
|
tn.read_until("Password: ".encode())
|
||
|
tn.write((password + "\n").encode())
|
||
|
|
||
|
# Execution d'une commande d'information BGP
|
||
|
tn.write((cmd + "\n").format(ip).encode())
|
||
|
tn.write(chr(25).encode())
|
||
|
tn.write(chr(25).encode())
|
||
|
tn.write(chr(25).encode())
|
||
|
tn.write("q\n".encode())
|
||
|
tn.write("exit\n".encode())
|
||
|
|
||
|
|
||
|
# Decodage des données pour les adaptées à python
|
||
|
data = tn.read_all().decode("utf-8")
|
||
|
|
||
|
print(data)
|
||
|
|
||
|
# Récupération des données grâce à l'utilisation d'expression régulière (module re)
|
||
|
paths = {}
|
||
|
|
||
|
paths["as_list"] = re.findall(r" ([0-9][0-9 ]+),", data)
|
||
|
if(paths["as_list"] == []):
|
||
|
paths["as_list"] = re.findall(r" ([0-9][0-9 ]+)[^0-9.]", data)
|
||
|
|
||
|
if(srv == "att"):
|
||
|
paths["as_list"] = re.findall(r"(?<=AS path: 7018 )[0-9][0-9 ]+[^ I]", data)
|
||
|
|
||
|
as_list = paths['as_list']
|
||
|
|
||
|
g = Digraph('G', filename='hello', format='png', graph_attr={'rankdir':'LR', 'concentrate': 'true'})
|
||
|
|
||
|
for as_path in as_list:
|
||
|
as_path = as_path.split(" ")
|
||
|
as_path.reverse()
|
||
|
original_asn = as_path[0]
|
||
|
border_asn = as_path[-1]
|
||
|
precedent_asn = original_asn
|
||
|
for asn in as_path:
|
||
|
if asn != original_asn:
|
||
|
g.edge("AS" + asn, "AS" + precedent_asn)
|
||
|
precedent_asn = asn
|
||
|
if asn == border_asn:
|
||
|
g.edge("AS" + lg_asn, "AS" + asn)
|
||
|
|
||
|
g.render()
|