diff --git a/autoinstall.sh b/autoinstall.sh old mode 100644 new mode 100755 diff --git a/cogs/monitoring.py b/cogs/monitoring.py old mode 100644 new mode 100755 diff --git a/cogs/utility.py b/cogs/utility.py index e56df5c..4fe7a3d 100755 --- a/cogs/utility.py +++ b/cogs/utility.py @@ -7,12 +7,15 @@ import ipinfo as ipinfoio import pydig +import telnetlib +from graphviz import Digraph + from ipwhois.net import Net from ipwhois.asn import IPASN import ipwhois import discord -import requests +import requests, re from discord.ext import commands import socket @@ -325,6 +328,8 @@ class Utility(commands.Cog): embed.add_field(name="Ooops", value="Pas de résultat") await ctx.send(embed=embed) + """---------------------------------------------------------------------""" + """---------------------------------------------------------------------""" @commands.command(name='getheaders', pass_context=True) async def _getheaders(self, ctx, *, adresse): @@ -443,6 +448,125 @@ class Utility(commands.Cog): await ctx.send(f"L'AS{asn} est introuvable dans la base de données de PeeringDB.") await loadingmsg.delete() + """---------------------------------------------------------------------""" + @commands.command(name='shroute', pass_context=True) + async def _shroute(self, ctx, srv, ipaddress): + if not srv in ["opentransit", 'he', 'att', "oregonuniv", "warian", 'csaholdigs', 'iamageeknz']: + await ctx.send("Requêtes supportées : opentransit (Orange), he (Huricanne Electric), att (AT&T), oregonuniv, warian, csaholdigs, iamageeknz") + return + print("k") + 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 {}" + + ip = ipaddress + await ctx.send("Connexion en cours au route server...") + tn = telnetlib.Telnet(host) + + if user != "none": + if(srv == "att"): + tn.read_until("login: ".encode()) + tn.write((user + "\n").encode()) + 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()) + + await ctx.send("Connecté ! Récupération des données...") + + # 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()) + + await ctx.send("Données récupérées ! Traitement en cours") + + # 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() + with open('hello.png', 'rb') as fp: + await ctx.send(file=discord.File(fp, 'hello.png')) + """---------------------------------------------------------------------""" @commands.command(name='git', pass_context=True) diff --git a/hello b/hello new file mode 100755 index 0000000..a3fb17a --- /dev/null +++ b/hello @@ -0,0 +1,14 @@ +digraph G { + graph [concentrate=true rankdir=LR] + AS200780 -> AS57199 + AS174 -> AS200780 + AS701 -> AS174 + AS3582 -> AS701 + AS35280 -> AS57199 + AS1299 -> AS35280 + AS3267 -> AS1299 + AS3582 -> AS3267 + AS6461 -> AS57199 + AS1403 -> AS6461 + AS3582 -> AS1403 +} diff --git a/hello.png b/hello.png new file mode 100755 index 0000000..7e3d067 Binary files /dev/null and b/hello.png differ diff --git a/requirements.txt b/requirements.txt index 2590937..521afe3 100755 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,5 @@ wikipedia pillow ipwhois ipinfo -pydig \ No newline at end of file +pydig +networkx \ No newline at end of file diff --git a/test.py b/test.py new file mode 100755 index 0000000..f8a260d --- /dev/null +++ b/test.py @@ -0,0 +1,117 @@ +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() \ No newline at end of file diff --git a/test2.py b/test2.py new file mode 100755 index 0000000..46b329f --- /dev/null +++ b/test2.py @@ -0,0 +1,30 @@ +import networkx as nx +import matplotlib.pyplot as plt +from graphviz import Digraph + +import ipinfo as ipinfoio + +as_list = ['701 2914 395747', '3267 1299 395747', '3257 395747'] + +g = Digraph('G', filename='hello', format='png', graph_attr={'rankdir':'LR'}) + +lg_asn = "5511" + +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) + print(as_path) + print("\n") + + + +g.render() \ No newline at end of file