2022-11-11 20:17:37 +01:00
#! /usr/bin/env python3
from flask import Flask , Response , redirect , render_template , request , session , abort
2022-11-23 16:47:55 +01:00
import werkzeug . exceptions as werkzeug_exceptions
2022-12-07 17:00:52 +01:00
import json
import os
import base64
import logging
import random
2022-11-12 14:50:18 +01:00
from functools import wraps
2022-12-04 18:37:35 +01:00
from ipaddress import ip_address , ip_network , IPv4Network , IPv6Network
2022-11-12 17:36:11 +01:00
import kioubit_verify
2022-12-12 19:40:30 +01:00
from peering_manager import PeeringManager
2022-11-12 17:36:11 +01:00
2022-11-11 20:17:37 +01:00
app = Flask ( __name__ )
2022-12-07 17:00:52 +01:00
2022-11-11 20:17:37 +01:00
class Config ( dict ) :
2022-12-07 17:00:52 +01:00
def __init__ ( self , configfile : str = None ) :
2022-11-11 20:17:37 +01:00
if configfile :
self . configfile = configfile
else :
2022-12-07 17:00:52 +01:00
if os . path . exists ( " ./config.json " ) :
self . configfile = " ./config.json "
elif os . path . exists ( " /etc/dn42-autopeer/config.json " ) :
2022-12-12 19:40:30 +01:00
self . configfile = " /etc/dn42-autopeer/config.json "
2022-12-07 17:00:52 +01:00
else :
raise FileNotFoundError (
" no config file found in ./config.json or /etc/dn42-autopeer/config.json " )
2022-11-20 10:57:33 +01:00
self . _load_config ( )
2022-11-11 20:17:37 +01:00
self . keys = self . _config . keys
#self.__getitem__ = self._config.__getitem__
super ( ) . __init__ ( self )
2022-11-19 18:12:01 +01:00
def __contains__ ( self , o ) :
return self . _config . __contains__ ( o )
2022-11-11 20:17:37 +01:00
def __delitem__ ( self , v ) :
raise NotImplementedError ( )
2022-12-07 17:00:52 +01:00
super ( ) . __delitem__ ( self , v )
2022-11-11 20:17:37 +01:00
def __getitem__ ( self , k ) :
return self . _config [ k ]
2022-12-07 17:00:52 +01:00
2022-11-20 10:57:33 +01:00
def _load_config ( self ) :
2022-11-11 20:17:37 +01:00
with open ( self . configfile ) as cf :
try :
self . _config = json . load ( cf )
except json . decoder . JSONDecodeError :
raise SyntaxError ( f " no valid JSON found in ' { cf . name } ' " )
2022-12-07 17:00:52 +01:00
2022-11-11 20:17:37 +01:00
if not " flask-template-dir " in self . _config :
2022-12-07 17:00:52 +01:00
self . _config [ " flask-template-dir " ] = " ../frontend "
2022-11-17 07:20:03 +01:00
if not " debug-mode " in self . _config :
2022-12-07 17:00:52 +01:00
self . _config [ " debug-mode " ] = False
2022-11-17 07:20:03 +01:00
if not " base-dir " in self . _config :
self . _config [ " base-dir " ] = " / "
2022-12-07 17:00:52 +01:00
2022-11-20 10:57:33 +01:00
if not " peerings-data " in self . _config :
self . _config [ " peering-data " ] = " ./peerings "
2022-12-12 19:40:30 +01:00
if not " nodes " in self . _config :
self , _config = { }
for node in self . _config [ " nodes " ] :
if not " capacity " in self . _config [ " nodes " ] [ node ] :
self . _config [ " nodes " ] [ node ] [ " capacity " ] = - 1
2022-11-20 10:57:33 +01:00
logging . info ( self . _config )
2022-11-11 20:17:37 +01:00
2022-12-07 17:00:52 +01:00
2022-11-12 17:36:11 +01:00
2022-11-20 10:57:33 +01:00
config = Config ( )
2022-12-12 19:40:30 +01:00
peerings = PeeringManager ( config )
2022-12-03 13:31:47 +01:00
kverifyer = kioubit_verify . AuthVerifyer ( config [ " domain " ] )
2022-12-07 17:00:52 +01:00
2022-12-03 13:31:47 +01:00
def check_peering_data ( form ) :
new_peering = { }
# errors = 0
2022-12-07 17:00:52 +01:00
# check if all required (and enabled) options are specified
2022-12-03 13:31:47 +01:00
try :
new_peering [ " peer-asn " ] = session [ " user-data " ] [ " asn " ]
new_peering [ " peer-wgkey " ] = form [ " peer-wgkey " ]
if " peer-endpoint-enabled " in form and form [ " peer-endpoint-enabled " ] == " on " :
new_peering [ " peer-endpoint " ] = form [ " peer-endpoint " ]
if new_peering [ " peer-endpoint " ] == " " :
raise ValueError ( " peer-endpoint " )
else :
new_peering [ " peer-endpoint " ] = None
2022-12-07 17:00:52 +01:00
2022-12-03 13:31:47 +01:00
if " peer-v6ll-enabled " in form and form [ " peer-v6ll-enabled " ] == " on " :
new_peering [ " peer-v6ll " ] = form [ " peer-v6ll " ]
if new_peering [ " peer-v6ll " ] == " " :
raise ValueError ( " peer-v6ll " )
else :
new_peering [ " peer-v6ll " ] = None
if " peer-v4-enabled " in form and form [ " peer-v4-enabled " ] == " on " :
new_peering [ " peer-v4 " ] = form [ " peer-v4 " ]
if new_peering [ " peer-v4 " ] == " " :
raise ValueError ( " peer-v4 " )
else :
new_peering [ " peer-v4 " ] = None
if " peer-v6-enabled " in form and form [ " peer-v6-enabled " ] == " on " :
new_peering [ " peer-v6 " ] = form [ " peer-v6 " ]
if new_peering [ " peer-v6 " ] == " " :
raise ValueError ( " peer-v6 " )
else :
new_peering [ " peer-v6 " ] = None
new_peering [ " bgp-mp " ] = form [ " bgp-multi-protocol " ] if " bgp-multi-protocol " in form else " off "
2022-12-12 19:40:30 +01:00
new_peering [ " bgp-mp " ] = True if new_peering [ " bgp-mp " ] == " on " else False
2022-12-03 13:31:47 +01:00
new_peering [ " bgp-enh " ] = form [ " bgp-extended-next-hop " ] if " bgp-extended-next-hop " in form else " off "
2022-12-12 19:40:30 +01:00
new_peering [ " bgp-enh " ] = True if new_peering [ " bgp-enh " ] == " on " else False
2022-12-03 13:31:47 +01:00
#new_peering[""] = form["peer-wgkey"]
except ValueError as e :
print ( f " error: { e . args } " )
return False , " at least one of the required/enabled fields was not filled out "
print ( new_peering )
2022-12-07 17:00:52 +01:00
# check wireguard key
2022-12-03 13:31:47 +01:00
wg_key_invalid = False
if len ( new_peering [ " peer-wgkey " ] ) != 44 :
wg_key_invalid = True
try :
base64 . b64decode ( new_peering [ " peer-wgkey " ] )
except :
wg_key_invalid = True
2022-12-07 17:00:52 +01:00
if wg_key_invalid :
2022-12-03 13:31:47 +01:00
return False , " invalid wireguard Key "
2022-12-07 17:00:52 +01:00
# check endpoint
2022-12-03 13:31:47 +01:00
if new_peering [ " peer-endpoint " ] :
if not new_peering [ " peer-endpoint " ] . split ( " : " ) [ - 1 ] . isnumeric ( ) :
return False , " no port number in endpoint "
elif len ( new_peering [ " peer-endpoint " ] . split ( " : " ) ) < 2 and not " . " in new_peering [ " peer-endpoint " ] :
return False , " endpoint doesn ' t look like a ip address or fqdn "
2022-12-07 17:00:52 +01:00
# check if at least one ip is specified/enabled
2022-12-03 13:31:47 +01:00
try :
if not ( new_peering [ " peer-v6ll " ] or new_peering [ " peer-v4 " ] or new_peering [ " peer-v6 " ] ) :
return False , " at least one of the ip addresses must be enabled and specified "
except KeyError :
return False , " one of the values isn ' t valid "
2022-12-07 17:00:52 +01:00
# check if supplied ip addresses are valid
2022-12-03 13:31:47 +01:00
try :
if new_peering [ " peer-v6ll " ] :
ipv6ll = ip_address ( new_peering [ " peer-v6ll " ] )
2022-12-07 17:00:52 +01:00
if not ipv6ll . version == 6 :
raise ValueError ( )
if not ipv6ll . is_link_local :
raise ValueError ( )
2022-12-03 13:31:47 +01:00
if new_peering [ " peer-v4 " ] :
ipv4 = ip_address ( new_peering [ " peer-v4 " ] )
2022-12-07 17:00:52 +01:00
if not ipv4 . version == 4 :
raise ValueError ( )
2022-12-03 13:31:47 +01:00
if ipv4 . is_link_local :
pass
elif ipv4 . is_private :
if not ( ipv4 . compressed . startswith ( " 172.2 " ) or ipv4 . compressed . startswith ( " 10. " ) ) :
raise ValueError ( )
is_in_allowed = False
if session [ " user-data " ] [ " allowed4 " ] :
2022-12-10 11:42:31 +01:00
for allowed4 in session [ " user-data " ] [ " allowed4 " ] :
2022-12-03 13:31:47 +01:00
if ipv4 in ip_network ( allowed4 ) :
is_in_allowed = True
if not is_in_allowed :
return False , " supplied ipv4 addr not in allowed ip range "
2022-12-07 17:00:52 +01:00
else :
raise ValueError ( )
2022-12-03 13:31:47 +01:00
if new_peering [ " peer-v6 " ] :
ipv6 = ip_address ( new_peering [ " peer-v6 " ] )
2022-12-07 17:00:52 +01:00
if not ipv6 . version == 6 :
raise ValueError ( )
if not ipv6 . is_private :
raise ValueError ( )
if ipv6 . is_link_local :
raise ValueError ( )
2022-12-03 13:31:47 +01:00
is_in_allowed = False
if session [ " user-data " ] [ " allowed6 " ] :
2022-12-10 11:42:31 +01:00
for allowed6 in session [ " user-data " ] [ " allowed6 " ] :
2022-12-03 13:31:47 +01:00
if ipv6 in ip_network ( allowed6 ) :
is_in_allowed = True
if not is_in_allowed :
return False , " supplied ipv6 addr not in allowed ip range "
except ValueError :
return False , " invalid ip address(es) supplied "
# check bgp options
try :
2022-12-12 19:40:30 +01:00
if new_peering [ " bgp-mp " ] == False and new_peering [ " bgp-enh " ] == True :
2022-12-03 13:31:47 +01:00
return False , " extended next hop requires multiprotocol bgp "
2022-12-12 19:40:30 +01:00
if new_peering [ " bgp-mp " ] == False :
2022-12-03 13:31:47 +01:00
if not ( new_peering [ " peer-v4 " ] and ( new_peering [ " peer-v6 " ] or new_peering [ " peer-v6ll " ] ) ) :
return False , " ipv4 and ipv6 addresses required when not having MP-BGP "
except ValueError :
2022-12-12 19:40:30 +01:00
pass
2022-12-03 13:31:47 +01:00
return True , new_peering
2022-12-07 17:00:52 +01:00
2022-11-12 14:50:18 +01:00
def auth_required ( ) :
def wrapper ( f ) :
@wraps ( f )
def decorated ( * args , * * kwargs ) :
2022-11-17 06:43:43 +01:00
if not " login " in session :
2023-01-15 19:31:26 +01:00
request_url = f " { config [ ' base-dir ' ] } { request . full_path } " . replace ( " // " , " / " )
2022-12-27 19:01:07 +01:00
return redirect ( f " { config [ ' base-dir ' ] } login?return= { request_url } " )
2022-11-12 14:50:18 +01:00
else :
return f ( * args , * * kwargs )
return decorated
return wrapper
2022-11-12 17:36:11 +01:00
@app.route ( " /api/auth/kverify " , methods = [ " GET " , " POST " ] )
def kioubit_auth ( ) :
2022-12-07 17:00:52 +01:00
try :
2022-11-17 06:43:43 +01:00
params = request . args [ " params " ]
signature = request . args [ " signature " ]
except KeyError :
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] , msg = ' " params " or " signature " missing ' )
2022-11-12 17:36:11 +01:00
2022-11-17 06:43:43 +01:00
success , msg = kverifyer . verify ( params , signature )
2022-12-07 17:00:52 +01:00
try :
logging . debug ( base64 . b64decode ( params ) )
except :
logging . debug ( " invalid Base64 data provided " )
2022-11-17 06:43:43 +01:00
if success :
session [ " user-data " ] = msg
session [ " login " ] = msg [ ' mnt ' ]
2022-11-24 16:02:07 +01:00
try :
return redirect ( session [ " return_url " ] )
except KeyError :
return redirect ( f " { config [ ' base-dir ' ] } peerings " )
2022-11-17 06:43:43 +01:00
else :
2022-11-24 16:02:07 +01:00
try :
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] , msg = msg )
2022-11-24 16:02:07 +01:00
except KeyError :
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = f " { config [ ' base-dir ' ] } peerings " , msg = msg )
2022-11-17 06:43:43 +01:00
@app.route ( " /logout " )
def logout ( ) :
session . clear ( )
2022-12-27 19:01:07 +01:00
return redirect ( config [ " base-dir " ] )
2022-11-12 17:36:11 +01:00
2022-12-07 17:00:52 +01:00
@app.route ( " /login " , methods = [ " GET " , " POST " ] )
2022-11-12 14:50:18 +01:00
def login ( ) :
2022-11-22 17:16:20 +01:00
print ( session )
2022-11-12 14:50:18 +01:00
if request . method == " GET " :
2022-11-17 06:43:43 +01:00
session [ " return_url " ] = request . args [ " return " ] if " return " in request . args else " "
2022-12-07 17:00:52 +01:00
2022-11-17 06:43:43 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] )
2022-11-18 10:25:58 +01:00
elif request . method == " POST " and config [ " debug-mode " ] :
try :
2022-11-21 19:41:28 +01:00
print ( request . form )
if request . form [ " theanswer " ] != " 42 " :
2022-12-08 07:18:43 +01:00
msg = """ what is the answer for everything? <a href= " https://en.wikipedia.org/wiki/42_(answer) " >hint</a> """
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] , msg = msg )
2022-11-18 10:25:58 +01:00
mnt = request . form [ " mnt " ]
2022-12-07 17:00:52 +01:00
if not mnt . upper ( ) . endswith ( " -MNT " ) :
raise ValueError
2022-11-18 10:25:58 +01:00
asn = request . form [ " asn " ]
2022-11-27 00:00:01 +01:00
asn = asn [ 2 : ] if asn [ : 2 ] . lower ( ) == " as " else asn
2022-12-04 18:37:35 +01:00
int ( asn )
2022-11-18 10:25:58 +01:00
if " allowed4 " in request . form :
allowed4 = request . form [ " allowed4 " ]
2022-12-10 11:42:31 +01:00
v4_ranges = allowed4 . split ( " , " ) if " , " in allowed4 else [ allowed4 ]
2022-12-04 18:37:35 +01:00
for v4_range in v4_ranges :
IPv4Network ( v4_range )
2022-11-18 10:25:58 +01:00
else :
allowed4 = None
if " allowed6 " in request . form :
allowed6 = request . form [ " allowed6 " ]
2022-12-10 11:42:31 +01:00
v6_ranges = allowed6 . split ( " , " ) if " , " in allowed6 else [ allowed6 ]
2022-12-04 18:37:35 +01:00
for v6_range in v6_ranges :
IPv6Network ( v6_range )
2022-11-18 10:25:58 +01:00
else :
allowed6 = None
2022-12-07 17:00:52 +01:00
session [ " user-data " ] = { ' asn ' : asn , ' allowed4 ' : allowed4 ,
' allowed6 ' : allowed6 , ' mnt ' : mnt , ' authtype ' : " debug " }
2022-11-18 10:25:58 +01:00
session [ " login " ] = mnt
return redirect ( session [ " return_url " ] )
2022-12-04 18:37:35 +01:00
except ValueError :
msg = " at least one of the values provided is wrong/invalid "
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] , msg = msg )
2022-11-18 10:25:58 +01:00
except KeyError :
msg = " not all required field were specified "
2022-12-07 17:00:52 +01:00
return render_template ( " login.html " , session = session , config = config , return_addr = session [ " return_url " ] , msg = msg )
2022-11-18 10:25:58 +01:00
elif request . method == " POST " and not config [ " debug-mode " ] :
abort ( 405 )
return redirect ( request . args [ " return " ] )
2022-11-12 14:50:18 +01:00
2022-12-07 17:00:52 +01:00
@app.route ( " /peerings/delete " , methods = [ " GET " , " POST " , " DELETE " ] )
2022-11-12 14:50:18 +01:00
@auth_required ( )
2022-11-18 10:25:58 +01:00
def peerings_delete ( ) :
2022-12-07 17:00:52 +01:00
if request . method == " GET " :
return render_template ( " peerings-delete.html " , session = session , config = config , request_args = request . args )
return f " { request . method } /peerings/delete? { str ( request . args ) } { str ( request . form ) } "
elif request . method in [ " POST " , " DELETE " ] :
if not request . form [ " confirm " ] == " on " :
return render_template ( " peerings-delete.html " , session = session , config = config , request_args = request . args , msg = " you have to confirm the deletion first " )
if not peerings . exists ( request . args [ " asn " ] , request . args [ " node " ] , mnt = session [ " login " ] ) :
return render_template ( " peerings-delete.html " , session = session , config = config , request_args = request . args , msg = " the peering you requested to delete doesn ' t exist (anymore) or you are not authorized to delete it " )
print ( str ( request ) )
if not peerings . delete_peering ( request . args [ " asn " ] , request . args [ " node " ] , mnt = session [ " login " ] ) :
return render_template ( " peerings-delete.html " , session = session , config = config , request_args = request . args , msg = " deletion of the peering requested failed, maybe you are not authorized or that peering doesn ' t exist " )
session [ " msg " ] = { " msg " : " peer-del " ,
" node " : request . args [ " node " ] , " asn " : request . args [ " asn " ] }
return redirect ( " ../peerings " )
return f " { request . method } /peerings/delete { request . args } { request . form } "
@app.route ( " /peerings/edit " , methods = [ " GET " , " POST " ] )
2022-11-27 00:00:01 +01:00
@auth_required ( )
def peerings_edit ( ) :
print ( session )
if request . method == " GET " :
2022-12-26 14:52:48 +01:00
if not " node " in request . args or not request . args [ " node " ] :
return render_template ( " peerings-edit.html " , session = session , config = config , peerings = peerings , msg = " no peering selected, please click one of the buttons above " )
2022-12-03 23:26:04 +01:00
mnt_peerings = peerings . get_peerings_by_mnt ( session [ " login " ] )
# print(mnt_peerings)
2022-11-27 00:00:01 +01:00
if " node " in request . args and request . args [ " node " ] in config [ " nodes " ] :
2022-12-03 23:26:04 +01:00
selected_peering = None
for p in mnt_peerings :
if p [ " node " ] == request . args [ " node " ] and p [ " ASN " ] == request . args [ " asn " ] :
selected_peering = p
print ( p )
break
2023-01-15 19:31:26 +01:00
return render_template ( " peerings-edit.html " , session = session , config = config , mnt_peerings = mnt_peerings , selected_peering = selected_peering , selected_node = selected_peering [ " node " ] )
2022-12-07 17:00:52 +01:00
else :
2023-01-15 19:31:26 +01:00
print ( request . args )
2022-12-03 23:26:04 +01:00
return render_template ( " peerings-edit.html " , session = session , config = config , mnt_peerings = mnt_peerings , selected_peering = None )
2022-11-27 00:00:01 +01:00
elif request . method == " POST " :
2022-12-03 23:26:04 +01:00
print ( request . args )
print ( request . form )
if not " node " in request . args or not request . args [ " node " ] :
2022-12-26 14:52:48 +01:00
return render_template ( " peerings-edit.html " , session = session , config = config , peerings = peerings , msg = " no peering selected, please click one of the buttons above " )
2022-11-27 00:00:01 +01:00
2022-12-03 23:26:04 +01:00
peering_valid , peering_or_msg = check_peering_data ( request . form )
print ( peering_valid )
print ( peering_or_msg )
2022-12-07 17:00:52 +01:00
selected_peering = None
mnt_peerings = peerings . get_peerings_by_mnt ( session [ " login " ] )
for p in mnt_peerings :
if p [ " node " ] == request . args [ " node " ] and p [ " ASN " ] == request . args [ " asn " ] :
selected_peering = p
print ( p )
break
2022-12-03 23:26:04 +01:00
if not peering_valid :
2022-12-07 17:00:52 +01:00
return render_template ( " peerings-edit.html " , session = session , config = config , peerings = peerings , msg = peering_or_msg , selected_peering = selected_peering ) , 400
if not peerings . update_peering ( session [ " user-data " ] [ " asn " ] , request . args [ " node " ] , session [ " login " ] , peering_or_msg [ " peer-wgkey " ] , peering_or_msg [ " peer-endpoint " ] , peering_or_msg [ " peer-v6ll " ] , peering_or_msg [ " peer-v4 " ] , peering_or_msg [ " peer-v6 " ] , peering_or_msg [ " bgp-mp " ] , peering_or_msg [ " bgp-enh " ] ) :
return render_template ( " peerings-edit.html " , session = session , config = config , peerings = peerings , msg = " such a peering doesn ' t exist(yet) " , selected_peering = selected_peering ) , 400
2022-12-03 23:26:04 +01:00
return redirect ( f " { config [ ' base-dir ' ] } peerings " )
2022-11-27 00:00:01 +01:00
return f " { request . method } /peerings/edit? { str ( request . args ) } { str ( request . form ) } "
2022-12-07 17:00:52 +01:00
@app.route ( " /peerings/new " , methods = [ " GET " , " POST " ] )
2022-11-18 10:25:58 +01:00
@auth_required ( )
def peerings_new ( ) :
2022-11-22 17:16:20 +01:00
print ( session )
2022-11-21 19:41:28 +01:00
if request . method == " GET " :
if " node " in request . args and request . args [ " node " ] in config [ " nodes " ] :
return render_template ( " peerings-new.html " , config = config , selected_node = request . args [ " node " ] , peerings = peerings )
2022-12-07 17:00:52 +01:00
else :
return render_template ( " peerings-new.html " , session = session , config = config , peerings = peerings )
2022-11-21 19:41:28 +01:00
elif request . method == " POST " :
2022-11-23 16:47:55 +01:00
print ( request . args )
print ( request . form )
if not " node " in request . args or not request . args [ " node " ] :
2022-12-07 17:00:52 +01:00
return render_template ( " peerings-new.html " , session = session , config = config , peerings = peerings , msg = " no node specified, please click one of the buttons above " )
2022-11-23 16:47:55 +01:00
2022-12-03 13:31:47 +01:00
peering_valid , peering_or_msg = check_peering_data ( request . form )
2022-11-23 16:47:55 +01:00
2022-12-03 13:31:47 +01:00
if not peering_valid :
2022-12-07 17:00:52 +01:00
return render_template ( " peerings-new.html " , session = session , config = config , peerings = peerings , msg = peering_or_msg ) , 400
if not peerings . add_peering ( session [ " user-data " ] [ " asn " ] , request . args [ " node " ] , session [ " login " ] , peering_or_msg [ " peer-wgkey " ] , peering_or_msg [ " peer-endpoint " ] , peering_or_msg [ " peer-v6ll " ] , peering_or_msg [ " peer-v4 " ] , peering_or_msg [ " peer-v6 " ] , peering_or_msg [ " bgp-mp " ] , peering_or_msg [ " bgp-enh " ] ) :
return render_template ( " peerings-new.html " , session = session , config = config , peerings = peerings , msg = " this ASN already has a peering with the requested node " ) , 400
2022-11-23 16:47:55 +01:00
2022-11-25 21:43:28 +01:00
return redirect ( f " { config [ ' base-dir ' ] } peerings " )
2022-12-03 23:26:04 +01:00
2022-12-07 17:00:52 +01:00
@app.route ( " /peerings " , methods = [ " GET " , " POST " , " DELETE " ] )
2022-11-18 10:25:58 +01:00
@auth_required ( )
2022-11-21 19:41:28 +01:00
def peerings_view ( ) :
2022-11-22 17:16:20 +01:00
print ( session )
2022-11-17 06:43:43 +01:00
if request . method == " GET " :
if " node " in request . args and request . args [ " node " ] in config [ " nodes " ] :
2022-11-21 19:41:28 +01:00
return render_template ( " peerings.html " , config = config , selected_node = request . args [ " node " ] , peerings = peerings )
2022-12-07 17:00:52 +01:00
else :
return render_template ( " peerings.html " , session = session , config = config , peerings = peerings )
2022-11-17 06:43:43 +01:00
elif request . method == " POST " :
2022-11-18 10:25:58 +01:00
return peerings_new ( )
elif request . method == " DELETE " :
return peerings_delete ( )
2022-11-17 06:43:43 +01:00
else :
2022-11-18 10:25:58 +01:00
abort ( 405 )
2022-11-17 06:43:43 +01:00
2022-12-07 17:00:52 +01:00
2022-11-11 20:17:37 +01:00
@app.route ( " / " )
def index ( ) :
2022-11-22 17:16:20 +01:00
print ( session )
2022-11-12 14:50:18 +01:00
# print(config._config["nodes"])
# for node in config["nodes"].values():
# print (node)
2022-12-12 19:40:30 +01:00
return render_template ( " index.html " , session = session , config = config , peerings = peerings )
2022-11-11 20:17:37 +01:00
2022-12-07 17:00:52 +01:00
2022-12-12 19:40:30 +01:00
app . static_folder = config [ " flask-template-dir " ] + " /static/ "
app . template_folder = config [ " flask-template-dir " ]
app . secret_key = config [ " flask-secret-key " ]
2022-11-11 20:17:37 +01:00
def main ( ) :
2022-11-19 18:12:01 +01:00
if " production " in config and config [ " production " ] == False :
2022-11-21 19:41:28 +01:00
logging . getLogger ( __name__ ) . setLevel ( 0 )
2022-12-07 17:00:52 +01:00
app . run ( host = config [ " listen " ] , port = config [ " port " ] ,
debug = config [ " debug-mode " ] , threaded = True )
2022-11-19 18:12:01 +01:00
else :
from waitress import serve
2022-11-21 19:41:28 +01:00
logging . getLogger ( __name__ ) . setLevel ( logging . INFO )
2022-11-19 18:12:01 +01:00
serve ( app , host = config [ " listen " ] , port = config [ " port " ] )
2022-11-11 20:17:37 +01:00
if __name__ == " __main__ " :
2022-12-07 17:00:52 +01:00
main ( )