add example-configs and form on peering/new

This commit is contained in:
lare 2022-11-21 19:41:28 +01:00
parent 33e49bc0b6
commit a04d17e766
5 changed files with 118 additions and 19 deletions

View file

@ -1,7 +1,7 @@
{ {
"nodes": { "nodes": {
"<nodename>": { "<nodename>": {
"pub-endpoint": "<clearnet-fqdn/ip-address>", //optional, recommended, default: None/null "endpoint": "<clearnet-fqdn/ip-address>", //optional, recommended, default: None/null
"api-con": "http://<node-(internal)-ip/hostname>:<port>/", // required "api-con": "http://<node-(internal)-ip/hostname>:<port>/", // required
"#comment": "/* from here: data to be displayed on the webinterface */", "#comment": "/* from here: data to be displayed on the webinterface */",
"country": "...", // Countrycode: 2 capital letters "country": "...", // Countrycode: 2 capital letters
@ -16,6 +16,7 @@
} }
}, },
"MNT": "YOUR-MNT", // your MNT tag "MNT": "YOUR-MNT", // your MNT tag
"ASN": "424242000", //Your ASN (used to generate default peer ListenPorts)
"listen": "0.0.0.0", "listen": "0.0.0.0",
"port": 8042, "port": 8042,
"domain": "example.org", // domain to use for kioubit verification service "domain": "example.org", // domain to use for kioubit verification service

View file

@ -91,6 +91,7 @@ class PeeringManager(dict):
json.dump(self._peerings, p, indent=4) json.dump(self._peerings, p, indent=4)
def get_peerings_by_mnt(self, mnt): def get_peerings_by_mnt(self, mnt):
return [{}]
raise NotImplementedError() raise NotImplementedError()
@ -143,6 +144,10 @@ def login():
return render_template("login.html", session=session, config=config, return_addr=session["return_url"]) return render_template("login.html", session=session, config=config, return_addr=session["return_url"])
elif request.method == "POST" and config["debug-mode"]: elif request.method == "POST" and config["debug-mode"]:
try: try:
print(request.form)
if request.form["theanswer"] != "42":
msg = "what is the answer for everything?"
return render_template("login.html", session=session,config=config,return_addr=session["return_url"], msg=msg)
mnt = request.form["mnt"] mnt = request.form["mnt"]
asn = request.form["asn"] asn = request.form["asn"]
asn = asn[2:] if asn[:1].lower() == "as" else asn asn = asn[2:] if asn[:1].lower() == "as" else asn
@ -175,17 +180,23 @@ def peerings_delete():
@app.route("/peerings/new", methods=["GET","POST"]) @app.route("/peerings/new", methods=["GET","POST"])
@auth_required() @auth_required()
def peerings_new(): def peerings_new():
return render_template("peerings-new.html", session=session,config=config) if request.method == "GET":
print(session)
return f"{request.method} /peerings/new {str(request.args)}{str(request.form)}" 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)
else:
return render_template("peerings-new.html", session=session,config=config, peerings=peerings)
elif request.method == "POST":
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)}"
@app.route("/peerings", methods=["GET","POST","DELETE"]) @app.route("/peerings", methods=["GET","POST","DELETE"])
@auth_required() @auth_required()
def peerings(): def peerings_view():
if request.method == "GET": if request.method == "GET":
if "node" in request.args and request.args["node"] in config["nodes"]: if "node" in request.args and request.args["node"] in config["nodes"]:
return render_template("peerings.html", config=config, selected_node=request.args["node"]) return render_template("peerings.html", config=config, selected_node=request.args["node"], peerings=peerings)
else: else:
return render_template("peerings.html", session=session,config=config) return render_template("peerings.html", session=session,config=config, peerings=peerings)
elif request.method == "POST": elif request.method == "POST":
return peerings_new() return peerings_new()
elif request.method == "DELETE": elif request.method == "DELETE":
@ -205,11 +216,11 @@ def main():
app.template_folder=config["flask-template-dir"] app.template_folder=config["flask-template-dir"]
app.secret_key = config["flask-secret-key"] app.secret_key = config["flask-secret-key"]
if "production" in config and config["production"] == False: if "production" in config and config["production"] == False:
logging.getLogger(__name__).setLevel(logging.INFO) logging.getLogger(__name__).setLevel(0)
app.run(host=config["listen"], port=config["port"], debug=config["debug-mode"], threaded=True) app.run(host=config["listen"], port=config["port"], debug=config["debug-mode"], threaded=True)
else: else:
from waitress import serve from waitress import serve
logging.getLogger(__name__).setLevel(logging.NOTSET) logging.getLogger(__name__).setLevel(logging.INFO)
serve(app, host=config["listen"], port=config["port"]) serve(app, host=config["listen"], port=config["port"])

View file

@ -1,13 +1,84 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<script>
function form_validate(form) {
}
</script>
<form action="" method="post"> <div>
<select name="node" id="node"> {% for node in config["nodes"] %}
{% for node in config["nodes"] %} <a href="?node={{node}}">
<option value="{{node}}" {% if selected_node %}{% if selected_node == node %}selected{% endif %}{% endif %} >{{node}}</option> <button {% if selected_node %}{% if selected_node == node %}class="button-selected"{% endif %}{% endif %} >
{% endfor %} {{node}}
</select> </button>
</a>
{% endfor %}
</div>
<form action="" method="post" class="flex" onsubmit="form_validate(this)">
<table>
<tr>
<td><label for="peer-asn">Your ASN</label></td>
<td></td>
<td><input type="text" name="peer-asn" id="peer-asn" disabled="disabled" value="{{session['user-data']['asn']}}"></td>
</tr>
<tr>
<td><label for="peer-wgkey">your Wireguard Publickey</label></td>
<td></td>
<td><input type="text" name="peer-wgkey" id="peer-wgkey"></td>
</tr>
<tr>
<td><label for="peer-endpoint">your Endpoint</label></td>
<td><input type="checkbox" name="peer-endpoint-enabled" id="peer-endpoint-enabled" checked></td>
<td><input type="text" name="peer-endpoint" id="peer-endpoint"></td>
</tr>
<tr>
<td><label for="peer-v6ll">your ipv6 LinkLocal</label></td>
<td><input type="checkbox" name="peer-v6ll-enabled" id="peer-v6ll-enabled" checked></td>
<td><input type="text" name="peer-v6ll" id="peer-v6ll"></td>
</tr>
<tr>
<td><label for="peer-v4">your ipv4</label></td>
<td><input type="checkbox" name="peer-v4-enabled" id="peer-v4-enabled"></td>
<td><input type="text" name="peer-v4" id="peer-v4"></td>
</tr>
<tr>
<td><label for="peer-v6">your ipv6</label></td>
<td><input type="checkbox" name="peer-v6-enabled" id="peer-v6-enabled"></td>
<td><input type="text" name="peer-v6" id="peer-v6"></td>
</tr>
</table>
</form> </form>
<div class="example-config">
<p>wg-quick:</p>
<div id="node-wireguard">
<code>
[Interface] <br>
PrivateKey = &ltyour private key&gt <br>
ListenPort = <span id="example-config-peer-port">2{{config["ASN"][-4:]}}</span><br>
<span class="example-config-ipv4">PostUp = ip address add <span class="example-config-peer-ipv4">...</span>/32 peer <span class="example-config-node-ipv4">{% if selected_node %}{{config["nodes"][selected_node]["internal-v4"]}} {% else %} ... {% endif %}</span><br></span>
<span class="example-config-ipv6">PostUp = ip address add <span class="example-config-peer-ipv6">...</span>/128 peer <span class="example-config-node-ipv6">{% if selected_node %}{{config["nodes"][selected_node]["internal-v6"]}} {% else %} ... {% endif %}</span><br></span>
<span class="example-config-ipv6ll">PostUp = ip address add <span class="example-config-peer-ipv6ll">...</span>/128 peer <span class="example-config-node-ipv6ll">{% if selected_node %}{{config["nodes"][selected_node]["internal-v6ll"]}} {% else %} ... {% endif %}</span><br></span>
Table = off <br>
<br>
[Peer] <br>
PublicKey = <span class="exmple-config-node-pubkey">{% if selected_node %}{{config["nodes"][selected_node]["wg-key"]}}{% else %} ... {% endif %}</span><br>
Endpoint = <span class="exmple-config-node-endpoint">{% if selected_node %}{{config["nodes"][selected_node]["endpoint"]}}{% else %} ... {% endif %}</span>:<span class="example-config-node-port">{% if selected_node %}{% if session["user-data"]["asn"].startswith("AS424242") %}5{{session["user-data"]["asn"][-4:]}}{% else %} ... {% endif %}{% else %} ... {% endif %}</span><br>
AllowedIPs = <span class="example-config-node-v6ll">{% if selected_node %}{{config["nodes"][selected_node]["internal-v6ll"]}} {% else %} ... {% endif %}</span>,172.20.0.0/14,172.31.0.0/16,10.0.0.0/8,fd00::/8 <br>
</code>
</div>
<p>bird(2) config:</p>
<div id="peer-bird">
<code id="example-config-bird">
protocol bgp dn42_{{config["MNT"][:-4].lower()}} from dnpeers { <br>
&#9;neighbor {% if selected_node %}{{config["nodes"][selected_node]["internal-v6ll"]}} {% else %} ... {% endif %} as {{config["ASN"]}};<br>
&#9;interface "dn42_{{config["MNT"][:-4].lower()}}";<br>
} <br>
</code>
</div>
</div>
{% endblock %} {% endblock %}

View file

@ -1,14 +1,13 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<script>
</script>
<div> <div>
<a href="peerings/new"><button>add new</button></a> <a href="peerings/new"><button>add new</button></a>
</div> </div>
<div> <div>
{% for peering in peerings.get_peerings_by_mnt(session["login"]) %}
{{peering}} <br>
{% endfor %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -24,6 +24,7 @@ a {
width: 100%; width: 100%;
height: calc(100% - 55px); height: calc(100% - 55px);
margin: auto; margin: auto;
padding-bottom: 50px;
} }
.content>* { .content>* {
padding: 5%; padding: 5%;
@ -54,4 +55,20 @@ footer {
} }
footer.flex { footer.flex {
flex-direction: row; flex-direction: row;
}
.example-config {
background-color: white;
padding: 1%;
}
.example-config > div{
border-color: var(--other-background);
border-radius: 10px;
padding: 10px;
border-style: groove;
}
form > div > * {
margin: 10px;
} }