blob: c7558a76e3bb6ee645dc0322ab30f96453a9ec8a [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'),
Serge Bazanskiec71cb52019-08-22 18:13:13 +020020 'pgp': ('PGP', 'The PGP key defined in the IRR entry exists on PGP keyservers'),
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020021}
22
23
24def create_app(config=None):
25 app = Flask(__name__)
26 app.config.update(config or {})
27 app.logger.removeHandler(default_handler)
28 verifier = Channel(app, config['verifier'])
29
30
31 @app.route('/')
32 def view_index():
33 req = ipb.ProcessorStatusRequest()
34 processors = verifier.stub(ipb_grpc.VerifierStub).ProcessorStatus.future(req)
35 req = ipb.PeerSummaryRequest()
36 peers = verifier.stub(ipb_grpc.VerifierStub).PeerSummary(req)
37
38 processors = sorted(processors.result().processors, key=lambda el: el.name)
39 peers = sorted(list(peers), key=lambda el: el.peeringdb_info.asn)
40
41 return render_template('index.html',
42 processors=processors, peers=peers)
43
44 @app.route('/asn/<int:asn>')
45 def view_asn(asn):
46 req = ipb.PeerDetailsRequest()
47 req.asn = asn
48
49 details = None
50 try:
51 details = verifier.stub(ipb_grpc.VerifierStub).PeerDetails(req)
52 except grpc.RpcError as e:
53 if e.code() == grpc.StatusCode.NOT_FOUND:
54 return 'No such ASN.'
55 else:
56 return 'Internal server error.'
57
58 return render_template('asn.html', details=details, asn=asn, check_info=check_info)
Serge Bazanskiec71cb52019-08-22 18:13:13 +020059
60 @app.route('/asn/<int:asn>/config.gpg')
61 def view_asn_config(asn):
62 req = ipb.PeerSecretsRequest()
63 req.asn = asn
64
65 details = None
66 try:
67 details = verifier.stub(ipb_grpc.VerifierStub).PeerSecrets(req)
68 except grpc.RpcError as e:
69 if e.code() == grpc.StatusCode.NOT_FOUND:
70 return 'No such ASN.'
71 else:
72 return 'Internal server error.'
73
74 return details.pgp_data, 200, {'Content-Type': 'application/octet-stream'}
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020075
76 @app.template_filter()
77 def from_nano(v):
78 return arrow.get(v/1e9)
79
80 return app