blob: 2a6f240e3d12e4b822cc326bd01ae55b32937ca5 [file] [log] [blame]
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +02001import logging
2
3import arrow
4import grpc
5from flask import Flask, render_template
6from flask.logging import default_handler
7
8from bgpwtf.cccampix.proto import ix_pb2 as ipb
9from bgpwtf.cccampix.proto import ix_pb2_grpc as ipb_grpc
10
11from bgpwtf.cccampix.frontend.channel import Channel
12
13
14logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(message)s')
15logger = logging.getLogger(__name__)
16
17
18check_info = {
19 'irr': ('IRR', 'Required IRR entires are present for this AS'),
20}
21
22
23def create_app(config=None):
24 app = Flask(__name__)
25 app.config.update(config or {})
26 app.logger.removeHandler(default_handler)
27 verifier = Channel(app, config['verifier'])
28
29
30 @app.route('/')
31 def view_index():
32 req = ipb.ProcessorStatusRequest()
33 processors = verifier.stub(ipb_grpc.VerifierStub).ProcessorStatus.future(req)
34 req = ipb.PeerSummaryRequest()
35 peers = verifier.stub(ipb_grpc.VerifierStub).PeerSummary(req)
36
37 processors = sorted(processors.result().processors, key=lambda el: el.name)
38 peers = sorted(list(peers), key=lambda el: el.peeringdb_info.asn)
39
40 return render_template('index.html',
41 processors=processors, peers=peers)
42
43 @app.route('/asn/<int:asn>')
44 def view_asn(asn):
45 req = ipb.PeerDetailsRequest()
46 req.asn = asn
47
48 details = None
49 try:
50 details = verifier.stub(ipb_grpc.VerifierStub).PeerDetails(req)
51 except grpc.RpcError as e:
52 if e.code() == grpc.StatusCode.NOT_FOUND:
53 return 'No such ASN.'
54 else:
55 return 'Internal server error.'
56
57 return render_template('asn.html', details=details, asn=asn, check_info=check_info)
58
59
60 @app.template_filter()
61 def from_nano(v):
62 return arrow.get(v/1e9)
63
64 return app