mirror of
https://github.com/sileht/bird-lg.git
synced 2024-11-22 06:54:43 +01:00
Add history and traceroute
This commit is contained in:
parent
bf6dbe8d73
commit
914eb489bf
5
lg.cfg
5
lg.cfg
|
@ -1,8 +1,9 @@
|
||||||
|
|
||||||
|
DOMAIN = "tetaneutral.net"
|
||||||
|
|
||||||
HOST_MAPPING={
|
HOST_MAPPING={
|
||||||
"gw": { "ipv4" : 9994, "ipv6": 9996 },
|
"gw": { "ipv4" : 9994, "ipv6": 9996, "traceroute":5000 },
|
||||||
"h3": { "ipv4" : 9994, "ipv6": 9996 },
|
"h3": { "ipv4" : 9994, "ipv6": 9996, "traceroute":5000 },
|
||||||
}
|
}
|
||||||
|
|
||||||
SESSION_KEY = '\xd77\xf9\xfa\xc2\xb5\xcd\x85)`+H\x9d\xeeW\\%\xbe/\xbaT\x89\xe8\xa7'
|
SESSION_KEY = '\xd77\xf9\xfa\xc2\xb5\xcd\x85)`+H\x9d\xeeW\\%\xbe/\xbaT\x89\xe8\xa7'
|
||||||
|
|
29
lg.py
29
lg.py
|
@ -4,6 +4,7 @@ import sys
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
|
import urllib2
|
||||||
|
|
||||||
from toolbox import mask_is_valid, ipv6_is_valid, ipv4_is_valid, resolve
|
from toolbox import mask_is_valid, ipv6_is_valid, ipv4_is_valid, resolve
|
||||||
|
|
||||||
|
@ -14,6 +15,13 @@ app = Flask(__name__)
|
||||||
app.config.from_pyfile('lg.cfg')
|
app.config.from_pyfile('lg.cfg')
|
||||||
|
|
||||||
|
|
||||||
|
#def same_origin_policy_hander(resp):
|
||||||
|
# resp.headers["Access-Control-Allow-Origin"] = "*"
|
||||||
|
# return resp
|
||||||
|
#
|
||||||
|
#app.after_request(same_origin_policy_hander)
|
||||||
|
#
|
||||||
|
|
||||||
def add_links(text):
|
def add_links(text):
|
||||||
if type(text) in [ str, unicode ]:
|
if type(text) in [ str, unicode ]:
|
||||||
text = text.split("\n")
|
text = text.split("\n")
|
||||||
|
@ -24,6 +32,7 @@ def add_links(text):
|
||||||
line.strip().startswith("Neighbor AS:") :
|
line.strip().startswith("Neighbor AS:") :
|
||||||
ret_text.append(re.sub(r'(\d+)',r'<a href="/whois/\1" class="whois">\1</a>',line))
|
ret_text.append(re.sub(r'(\d+)',r'<a href="/whois/\1" class="whois">\1</a>',line))
|
||||||
else:
|
else:
|
||||||
|
line = re.sub(r'([a-zA-Z0-9\-]*\.([a-zA-Z]{2,3}){1,2})(\s|$)', r'<a href="/whois/\1" class="whois">\1</a>',line)
|
||||||
line = re.sub(r'AS(\d+)', r'<a href="/whois/\1" class="whois">AS\1</a>',line)
|
line = re.sub(r'AS(\d+)', r'<a href="/whois/\1" class="whois">AS\1</a>',line)
|
||||||
line = re.sub(r'(\d+\.\d+\.\d+\.\d+)', r'<a href="/whois/\1" class="whois">\1</a>',line)
|
line = re.sub(r'(\d+\.\d+\.\d+\.\d+)', r'<a href="/whois/\1" class="whois">\1</a>',line)
|
||||||
ret_text.append(line)
|
ret_text.append(line)
|
||||||
|
@ -36,6 +45,11 @@ def set_session(req_type, hosts, proto, request_args):
|
||||||
"proto": proto,
|
"proto": proto,
|
||||||
"request_args": request_args,
|
"request_args": request_args,
|
||||||
})
|
})
|
||||||
|
history = session.get("history", {})
|
||||||
|
req_hist = history.get(req_type, [])
|
||||||
|
if request_args and request_args not in req_hist: req_hist.insert(0, request_args)
|
||||||
|
if not history: session["history"] = {}
|
||||||
|
session["history"][req_type] = req_hist[:10]
|
||||||
|
|
||||||
def bird_command(host, proto, command):
|
def bird_command(host, proto, command):
|
||||||
conf = app.config["HOST_MAPPING"].get(host, None)
|
conf = app.config["HOST_MAPPING"].get(host, None)
|
||||||
|
@ -116,6 +130,21 @@ def detail(hosts, proto):
|
||||||
|
|
||||||
return render_template('detail.html', detail=detail, command=command)
|
return render_template('detail.html', detail=detail, command=command)
|
||||||
|
|
||||||
|
@app.route("/traceroute/<hosts>/<proto>")
|
||||||
|
def traceroute(hosts, proto):
|
||||||
|
q = request.args.get('q', '')
|
||||||
|
set_session("traceroute", hosts, proto, q)
|
||||||
|
|
||||||
|
infos = {}
|
||||||
|
for host in hosts.split("+"):
|
||||||
|
url = "http://%s.%s:%s/traceroute%s?q=%s" % ( host, app.config["DOMAIN"], app.config["HOST_MAPPING"].get(host).get("traceroute","5000"), (proto == "ipv6" and "6" or ""), q)
|
||||||
|
try:
|
||||||
|
f = urllib2.urlopen(url)
|
||||||
|
infos[host] = add_links(f.read())
|
||||||
|
except IOError:
|
||||||
|
infos[host] = "Failed retreive url: %s" % url
|
||||||
|
return render_template('traceroute.html', infos=infos)
|
||||||
|
|
||||||
@app.route("/where/<hosts>/<proto>")
|
@app.route("/where/<hosts>/<proto>")
|
||||||
def show_route_where(hosts, proto):
|
def show_route_where(hosts, proto):
|
||||||
return show_route("where", hosts, proto)
|
return show_route("where", hosts, proto)
|
||||||
|
|
|
@ -66,6 +66,9 @@ ul li{
|
||||||
background: #FFF;
|
background: #FFF;
|
||||||
border-bottom: 1px solid #AFAFAF;
|
border-bottom: 1px solid #AFAFAF;
|
||||||
}
|
}
|
||||||
|
ul#popup_menu li{
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
ul li.current{
|
ul li.current{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,15 @@ $( function() {
|
||||||
$("#submit").click()
|
$("#submit").click()
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
txt = $("#" + $("#req_type").val() ).html().replace("...", '<input type="text" id="ipopup" name="ipopup" value="' + $("#request_args").val() + '">')
|
menu_html = ""
|
||||||
|
data = {{session.history|tojson|safe}}[next_req_type]
|
||||||
|
for (var item in data){
|
||||||
|
menu_html += "<li>" + data[item] + "</li>"
|
||||||
|
}
|
||||||
|
txt = $("#" + $("#req_type").val() ).html().replace("...",
|
||||||
|
'<input type="text" id="ipopup" name="ipopup" value="' + $("#request_args").val() + '">') +
|
||||||
|
'<br />History:' +
|
||||||
|
'<ul id="popup_menu">' + menu_html + '</ul>'
|
||||||
$.prompt(txt,
|
$.prompt(txt,
|
||||||
{
|
{
|
||||||
prefix: 'popup',
|
prefix: 'popup',
|
||||||
|
@ -43,7 +50,10 @@ $( function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
$("#popup_menu li").click(function(event){
|
||||||
|
$("#ipopup").val($(this).html())
|
||||||
|
$("#ipopup").focus()
|
||||||
|
});
|
||||||
$("#ipopup").keyup(function(event) {
|
$("#ipopup").keyup(function(event) {
|
||||||
if (event.which == 13) {
|
if (event.which == 13) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -57,7 +67,7 @@ $( function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$("ul li").click(function(){
|
$("#menu ul li").click(function(){
|
||||||
// set hiddent field with class value
|
// set hiddent field with class value
|
||||||
p = $(this).parent() // lu
|
p = $(this).parent() // lu
|
||||||
c = p.attr("class")
|
c = p.attr("class")
|
||||||
|
@ -107,8 +117,8 @@ $( function() {
|
||||||
</script>
|
</script>
|
||||||
<div id="page">
|
<div id="page">
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<h1>Tetaneutral.net<br />Looking Glass</h1>
|
<h1>{{config.DOMAIN|capitalize}}<br />Looking Glass</h1>
|
||||||
<form>
|
<form id="menu">
|
||||||
<input id="hosts" type="hidden" value="{{session.hosts}}" />
|
<input id="hosts" type="hidden" value="{{session.hosts}}" />
|
||||||
<input id="proto" type="hidden" value="{{session.proto}}" />
|
<input id="proto" type="hidden" value="{{session.proto}}" />
|
||||||
<input id="req_type" type="hidden" value="{{session.req_type}}" />
|
<input id="req_type" type="hidden" value="{{session.req_type}}" />
|
||||||
|
@ -123,6 +133,7 @@ $( function() {
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="req_type">
|
<ul class="req_type">
|
||||||
|
<li id="traceroute">traceroute ...</li>
|
||||||
<li id="summary">show protocols</li>
|
<li id="summary">show protocols</li>
|
||||||
<li id="detail">show protocols ... all</li>
|
<li id="detail">show protocols ... all</li>
|
||||||
<li id="prefix">show route for ...</li>
|
<li id="prefix">show route for ...</li>
|
||||||
|
|
7
templates/traceroute.html
Normal file
7
templates/traceroute.html
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block body %}
|
||||||
|
{% for host in infos %}
|
||||||
|
<h2 id="traceroute_cmd_{{host}}">{{host}}/{{session.proto}}: traceroute {{session.request_args}}</h3>
|
||||||
|
<div class="detail">{{infos[host]|safe}}</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
Loading…
Reference in a new issue