add creating peerings (inside serverside config)
this doesn't actually add the peerings just saves the parameters to disk
This commit is contained in:
parent
2c9cac02e0
commit
cb8ed9eeca
2 changed files with 64 additions and 35 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
from flask import Flask, Response, redirect, render_template, request, session, abort
|
from flask import Flask, Response, redirect, render_template, request, session, abort
|
||||||
import werkzeug.exceptions as werkzeug_exceptions
|
import werkzeug.exceptions as werkzeug_exceptions
|
||||||
import json, os, base64, logging
|
import json, os, base64, logging, random
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from ipaddress import ip_address, ip_network
|
from ipaddress import ip_address, ip_network
|
||||||
import kioubit_verify
|
import kioubit_verify
|
||||||
|
@ -50,50 +50,78 @@ class Config (dict):
|
||||||
self._config["peering-data"] = "./peerings"
|
self._config["peering-data"] = "./peerings"
|
||||||
logging.info(self._config)
|
logging.info(self._config)
|
||||||
|
|
||||||
class PeeringManager(dict):
|
class PeeringManager:
|
||||||
|
|
||||||
def __init__(self, peering_dir):
|
def __init__(self, peering_dir):
|
||||||
self._peering_dir = peering_dir
|
self._peering_dir = peering_dir
|
||||||
|
|
||||||
self._load_peerings()
|
self._load_peerings()
|
||||||
self.keys = self._peerings
|
|
||||||
|
|
||||||
def __contains__(self, o):
|
|
||||||
return self._peerings.__contains__(o)
|
|
||||||
|
|
||||||
def __getitem__(self, k):
|
|
||||||
return self._peerings[k]
|
|
||||||
|
|
||||||
def __setitem__(self, k, v):
|
|
||||||
pass
|
|
||||||
def __delitem__(self, v):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _load_peerings(self):
|
def _load_peerings(self):
|
||||||
if not os.path.exists(self._peering_dir):
|
if not os.path.exists(self._peering_dir):
|
||||||
os.mkdir(self._peering_dir)
|
os.mkdir(self._peering_dir)
|
||||||
if not os.path.exists(f"{self._peering_dir}/peerings.json"):
|
if not os.path.exists(f"{self._peering_dir}/peerings.json"):
|
||||||
with open(f"{self._peering_dir}/peerings.json", "x") as p:
|
with open(f"{self._peering_dir}/peerings.json", "x") as p:
|
||||||
json.dump([], p)
|
json.dump({"mnter":{},"asn":{}}, p)
|
||||||
|
try:
|
||||||
with open(f"{self._peering_dir}/peerings.json","r") as p:
|
with open(f"{self._peering_dir}/peerings.json","r") as p:
|
||||||
self._peerings = json.load(p)
|
self.peerings = json.load(p)
|
||||||
self.peerings = {}
|
except json.decoder.JSONDecodeError:
|
||||||
missing_peerings = False
|
with open(f"{self._peering_dir}/peerings.json", "w") as p:
|
||||||
for peering in self._peerings:
|
json.dump({"mnter":{},"asn":{}}, p)
|
||||||
if os.path.exists(f"{self._peering_dir}/{peering}.json"):
|
with open(f"{self._peering_dir}/peerings.json","r") as p:
|
||||||
with open(f"{self._peering_dir}/{peering}.json") as peer_cfg:
|
self.peerings = json.load(p)
|
||||||
self.peerings[peering] = json.load(peer_cfg)
|
|
||||||
else:
|
# self.peerings = {}
|
||||||
logging.warning(f"peering with id {peering} doesn't exist. removing reference in `{self._peering_dir}/peerings.json`")
|
# missing_peerings = False
|
||||||
self._peerings.remove(peering)
|
# for peering in self._peerings:
|
||||||
missing_peerings = True
|
# if os.path.exists(f"{self._peering_dir}/{peering}.json"):
|
||||||
if missing_peerings:
|
# with open(f"{self._peering_dir}/{peering}.json") as peer_cfg:
|
||||||
with open(f"{self._peering_dir}/peerings.json","w") as p:
|
# self.peerings[peering] = json.load(peer_cfg)
|
||||||
json.dump(self._peerings, p, indent=4)
|
# else:
|
||||||
|
# logging.warning(f"peering with id {peering} doesn't exist. removing reference in `{self._peering_dir}/peerings.json`")
|
||||||
|
# self._peerings.remove(peering)
|
||||||
|
# missing_peerings = True
|
||||||
|
# if missing_peerings:
|
||||||
|
# with open(f"{self._peering_dir}/peerings.json","w") as p:
|
||||||
|
# json.dump(self._peerings, p, indent=4)
|
||||||
|
def _save_peerings(self):
|
||||||
|
with open(f"{self._peering_dir}/peerings.json", "w") as p:
|
||||||
|
json.dump(self.peerings, p, indent=4)
|
||||||
|
|
||||||
def get_peerings_by_mnt(self, mnt):
|
def get_peerings_by_mnt(self, mnt):
|
||||||
return [{}]
|
# print(self.peerings)
|
||||||
raise NotImplementedError()
|
try:
|
||||||
|
out = []
|
||||||
|
for asn in self.peerings["mnter"][mnt]:
|
||||||
|
try:
|
||||||
|
for peering in self.peerings["asn"][asn]:
|
||||||
|
out.append(peering)
|
||||||
|
except KeyError as e:
|
||||||
|
pass
|
||||||
|
return out
|
||||||
|
except KeyError:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def add_peering(self, mnt, asn, node, wg_key, endpoint=None, ipv6ll=None, ipv4=None, ipv6=None):
|
||||||
|
try:
|
||||||
|
if not asn in self.peerings["mnter"][mnt]:
|
||||||
|
self.peerings[mnt].append(asn)
|
||||||
|
except KeyError:
|
||||||
|
self.peerings["mnter"][mnt] = [asn]
|
||||||
|
try:
|
||||||
|
if not asn in self.peerings["asn"]:
|
||||||
|
self.peerings["asn"][asn] = []
|
||||||
|
except KeyError:
|
||||||
|
self.peerings["asn"][asn] = []
|
||||||
|
|
||||||
|
# deny more than one peering per ASN to one node
|
||||||
|
for peering in self.peerings["asn"][asn]:
|
||||||
|
if peering["node"] == node: return False
|
||||||
|
self.peerings["asn"][asn].append({"MNT":mnt,"ASN":asn, "node": node, "wg_key":wg_key, "endpoint": endpoint,"ipv6ll":ipv6ll,"ipv4":ipv4,"ipv6":ipv6})
|
||||||
|
|
||||||
|
self._save_peerings()
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
config = Config()
|
config = Config()
|
||||||
|
@ -205,6 +233,7 @@ def peerings_new():
|
||||||
|
|
||||||
## check if all required (and enabled) options are specified
|
## check if all required (and enabled) options are specified
|
||||||
try:
|
try:
|
||||||
|
new_peering["peer-asn"] = session["user-data"]["asn"]
|
||||||
new_peering["peer-wgkey"] = request.form["peer-wgkey"]
|
new_peering["peer-wgkey"] = request.form["peer-wgkey"]
|
||||||
if request.form["peer-endpoint-enabled"] == "on":
|
if request.form["peer-endpoint-enabled"] == "on":
|
||||||
new_peering["peer-endpoint"] = request.form["peer-endpoint"]
|
new_peering["peer-endpoint"] = request.form["peer-endpoint"]
|
||||||
|
@ -286,7 +315,7 @@ def peerings_new():
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return render_template("peerings-new.html", session=session,config=config, peerings=peerings, msg="invalid ip address(es) supplied"), 400
|
return render_template("peerings-new.html", session=session,config=config, peerings=peerings, msg="invalid ip address(es) supplied"), 400
|
||||||
|
|
||||||
|
peerings.add_peering(session["user-data"]["mnt"], session["user-data"]["asn"], request.args["node"], new_peering["peer-wgkey"], new_peering["peer-endpoint"], new_peering["peer-v6ll"], new_peering["peer-v4"], new_peering["peer-v6"])
|
||||||
|
|
||||||
return """<div>creating peerings is not (yet) implemented</div><div><a href="../">return</a>"""
|
return """<div>creating peerings is not (yet) implemented</div><div><a href="../">return</a>"""
|
||||||
return f"{request.method} /peerings/new {str(request.args)}{str(request.form)}"
|
return f"{request.method} /peerings/new {str(request.args)}{str(request.form)}"
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<link rel="stylesheet" href="{{config['base-dir']}}static/style.css">
|
<link rel="stylesheet" href="{{config['base-dir']}}static/style.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="flex flex-row"><div></div><a href="{{config['base-dir']}}">{{config["MNT"]}} Autopeering</a>{% if "login" in session %}<a href="{{config['base-dir']}}logout">logout</a>{% else %} <a href="{{config['base-dir']}}login?return=/peerings">login</a>{%endif%}</header>
|
<header class="flex flex-row"><div></div><a href="{{config['base-dir']}}">{{config["MNT"]}} Autopeering</a>{% if "login" in session %} <div><a href="{{config['base-dir']}}peerings">manage</a> <a href="{{config['base-dir']}}logout">logout</a></div>{% else %} <a href="{{config['base-dir']}}login?return=/peerings">login</a>{%endif%}</header>
|
||||||
<div class="content flex">
|
<div class="content flex">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Add table
Reference in a new issue