BGP-Ranking/website/web/__init__.py

162 lines
4.9 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
2018-05-31 15:48:11 +02:00
import json
2018-07-30 14:40:42 +02:00
from flask import Flask, render_template, request, session, Response
from flask_bootstrap import Bootstrap
from bgpranking.querying import Querying
2018-04-12 18:09:04 +02:00
from datetime import date, timedelta
2018-07-30 14:40:42 +02:00
import pycountry
2018-07-31 10:54:38 +02:00
from collections import defaultdict
2018-04-12 18:09:04 +02:00
app = Flask(__name__)
2018-04-12 18:09:04 +02:00
app.secret_key = '\xeb\xfd\x1b\xee\xed<\xa5~\xd5H\x85\x00\xa5r\xae\x80t5@\xa2&>\x03S'
Bootstrap(app)
app.config['BOOTSTRAP_SERVE_LOCAL'] = True
2018-04-12 18:09:04 +02:00
2018-06-01 17:13:56 +02:00
def get_request_parameter(parameter):
if request.method == 'POST':
d = request.form
elif request.method == 'GET':
d = request.args
return d.get(parameter, None)
2018-04-12 18:09:04 +02:00
def load_session():
if request.method == 'POST':
d = request.form
elif request.method == 'GET':
d = request.args
2018-04-12 18:09:04 +02:00
if 'date' in d:
session['date'] = d['date']
if 'ipversion' in d:
session['ipversion'] = d['ipversion']
if 'source' in d:
if '_all' in d.getlist('source'):
session.pop('source', None)
else:
session['source'] = d.getlist('source')
2018-04-12 18:09:04 +02:00
if 'asn' in d:
session['asn'] = d['asn']
2018-07-30 14:40:42 +02:00
session.pop('country', None)
elif 'country' in d:
if '_all' in d.getlist('country'):
session.pop('country', None)
else:
session['country'] = d.getlist('country')
2018-07-30 14:40:42 +02:00
session.pop('asn', None)
2018-04-12 18:09:04 +02:00
set_default_date_session()
2018-04-12 18:09:04 +02:00
def set_default_date_session():
if 'date' not in session:
session['date'] = (date.today() - timedelta(days=1)).isoformat()
2018-07-30 14:40:42 +02:00
def get_country_codes():
for c in pycountry.countries:
yield c.alpha_2, c.name
2018-04-12 18:09:04 +02:00
@app.route('/', methods=['GET', 'POST'])
def index():
2018-04-12 18:09:04 +02:00
load_session()
q = Querying()
2018-04-12 18:09:04 +02:00
sources = q.get_sources(date=session['date'])
session.pop('asn', None)
2018-07-27 14:33:25 +02:00
session.pop('country', None)
2018-05-31 15:48:11 +02:00
ranks = q.asns_global_ranking(limit=100, **session)
2018-04-13 18:02:44 +02:00
descriptions = [q.get_asn_descriptions(int(asn)) for asn, rank in ranks]
r = zip(ranks, descriptions)
2018-07-30 14:40:42 +02:00
return render_template('index.html', ranks=r, sources=sources, countries=get_country_codes(), **session)
2018-04-11 15:31:34 +02:00
2018-04-11 16:16:19 +02:00
@app.route('/asn', methods=['GET', 'POST'])
def asn_details():
2018-04-12 18:09:04 +02:00
load_session()
2018-04-11 15:31:34 +02:00
q = Querying()
2018-06-07 16:52:05 +02:00
asn_descriptions = q.get_asn_descriptions(asn=session['asn'], all_descriptions=True)
2018-06-07 16:18:50 +02:00
sources = q.get_sources(date=session['date'])
2018-04-12 18:09:04 +02:00
ranks = q.asn_details(**session)
2018-06-01 17:13:56 +02:00
prefix = get_request_parameter('prefix')
if prefix:
prefix_ips = q.get_prefix_ips(prefix=prefix, **session)
prefix_ips = [(ip, sorted(sources)) for ip, sources in prefix_ips.items()]
prefix_ips.sort(key=lambda entry: len(entry[1]), reverse=True)
else:
prefix_ips = []
2018-06-07 16:52:05 +02:00
return render_template('asn.html', sources=sources, ranks=ranks, prefix_ips=prefix_ips, asn_descriptions=asn_descriptions, **session)
2018-05-31 15:48:11 +02:00
2018-08-03 18:04:35 +02:00
@app.route('/asn_description', methods=['POST'])
def asn_description():
load_session()
asn = None
if request.form.get('asn'):
asn = request.form.get('asn')
elif session.get('asn'):
asn = session.get('asn')
else:
to_return = {'error': 'asn required'}
if asn:
q = Querying()
to_return = q.get_asn_descriptions(asn, session.get('all_descriptions'))
return Response(json.dumps(to_return), mimetype='application/json')
2018-05-31 15:48:11 +02:00
@app.route('/asn_history', methods=['GET', 'POST'])
def asn_history():
load_session()
q = Querying()
2018-07-30 14:40:42 +02:00
return Response(json.dumps(q.get_asn_history(**session)), mimetype='application/json')
2018-07-27 14:33:25 +02:00
2018-07-31 10:54:38 +02:00
@app.route('/country_history_callback', methods=['GET', 'POST'])
def country_history_callback():
history_data = json.loads(request.data)
to_display = []
mapping = defaultdict(dict)
dates = []
all_asns = set([])
for country, data in history_data.items():
for d, r_sum, details in data:
dates.append(d)
for detail in details:
asn, r = detail
all_asns.add(asn)
mapping[asn][d] = r
to_display_temp = [[country] + dates]
for a in sorted(list(all_asns), key=int):
line = [a]
for d in dates:
if mapping[a].get(d) is not None:
line.append(round(mapping[a].get(d), 3))
else:
line.append('N/A')
to_display_temp.append(line)
to_display.append(to_display_temp)
2018-07-31 10:54:38 +02:00
return json.dumps(render_template('country_asn_map.html', to_display=to_display))
2018-07-27 14:33:25 +02:00
@app.route('/country_history', methods=['GET', 'POST'])
def country_history():
load_session()
q = Querying()
2018-07-30 14:40:42 +02:00
return Response(json.dumps(q.country_history(**session)), mimetype='application/json')
2018-07-27 14:33:25 +02:00
@app.route('/country', methods=['GET', 'POST'])
def country():
load_session()
q = Querying()
sources = q.get_sources(date=session['date'])
2018-07-30 14:40:42 +02:00
return render_template('country.html', sources=sources, countries=get_country_codes(), **session)