From 107644cbd7fc4bd5eb4522dc6b840d4f94040af8 Mon Sep 17 00:00:00 2001 From: lare <lare@lare.cc> Date: Mon, 21 Nov 2022 19:41:28 +0100 Subject: [PATCH] add example-configs and form on peering/new --- web/backend/config.sample.json | 3 +- web/backend/main.py | 27 +++++++---- web/frontend/peerings-new.html | 83 +++++++++++++++++++++++++++++++--- web/frontend/peerings.html | 7 ++- web/frontend/static/style.css | 17 +++++++ 5 files changed, 118 insertions(+), 19 deletions(-) diff --git a/web/backend/config.sample.json b/web/backend/config.sample.json index b2a9a3d..aa7a872 100644 --- a/web/backend/config.sample.json +++ b/web/backend/config.sample.json @@ -1,7 +1,7 @@ { "nodes": { "<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 "#comment": "/* from here: data to be displayed on the webinterface */", "country": "...", // Countrycode: 2 capital letters @@ -16,6 +16,7 @@ } }, "MNT": "YOUR-MNT", // your MNT tag + "ASN": "424242000", //Your ASN (used to generate default peer ListenPorts) "listen": "0.0.0.0", "port": 8042, "domain": "example.org", // domain to use for kioubit verification service diff --git a/web/backend/main.py b/web/backend/main.py index 08ac158..5eaf57f 100644 --- a/web/backend/main.py +++ b/web/backend/main.py @@ -91,6 +91,7 @@ class PeeringManager(dict): json.dump(self._peerings, p, indent=4) def get_peerings_by_mnt(self, mnt): + return [{}] raise NotImplementedError() @@ -143,6 +144,10 @@ def login(): return render_template("login.html", session=session, config=config, return_addr=session["return_url"]) elif request.method == "POST" and config["debug-mode"]: 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"] asn = request.form["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"]) @auth_required() def peerings_new(): - return render_template("peerings-new.html", session=session,config=config) - - return f"{request.method} /peerings/new {str(request.args)}{str(request.form)}" + if request.method == "GET": + print(session) + 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"]) @auth_required() -def peerings(): +def peerings_view(): if request.method == "GET": 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: - return render_template("peerings.html", session=session,config=config) + return render_template("peerings.html", session=session,config=config, peerings=peerings) elif request.method == "POST": return peerings_new() elif request.method == "DELETE": @@ -205,11 +216,11 @@ def main(): app.template_folder=config["flask-template-dir"] app.secret_key = config["flask-secret-key"] 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) else: from waitress import serve - logging.getLogger(__name__).setLevel(logging.NOTSET) + logging.getLogger(__name__).setLevel(logging.INFO) serve(app, host=config["listen"], port=config["port"]) diff --git a/web/frontend/peerings-new.html b/web/frontend/peerings-new.html index ffdba39..99b1cd9 100644 --- a/web/frontend/peerings-new.html +++ b/web/frontend/peerings-new.html @@ -1,13 +1,84 @@ {% extends 'base.html' %} {% block content %} +<script> + function form_validate(form) { + + } +</script> -<form action="" method="post"> - <select name="node" id="node"> - {% for node in config["nodes"] %} - <option value="{{node}}" {% if selected_node %}{% if selected_node == node %}selected{% endif %}{% endif %} >{{node}}</option> - {% endfor %} - </select> +<div> + {% for node in config["nodes"] %} + <a href="?node={{node}}"> + <button {% if selected_node %}{% if selected_node == node %}class="button-selected"{% endif %}{% endif %} > + {{node}} + </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> +<div class="example-config"> + + <p>wg-quick:</p> + <div id="node-wireguard"> + <code> + [Interface] <br> + PrivateKey = <your private key> <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> + 	neighbor {% if selected_node %}{{config["nodes"][selected_node]["internal-v6ll"]}} {% else %} ... {% endif %} as {{config["ASN"]}};<br> + 	interface "dn42_{{config["MNT"][:-4].lower()}}";<br> + } <br> + </code> + </div> +</div> {% endblock %} \ No newline at end of file diff --git a/web/frontend/peerings.html b/web/frontend/peerings.html index 578194b..d2ffe75 100644 --- a/web/frontend/peerings.html +++ b/web/frontend/peerings.html @@ -1,14 +1,13 @@ {% extends 'base.html' %} {% block content %} -<script> - -</script> <div> <a href="peerings/new"><button>add new</button></a> </div> <div> - +{% for peering in peerings.get_peerings_by_mnt(session["login"]) %} + {{peering}} <br> +{% endfor %} </div> {% endblock %} \ No newline at end of file diff --git a/web/frontend/static/style.css b/web/frontend/static/style.css index 0cf0b2c..30e3211 100644 --- a/web/frontend/static/style.css +++ b/web/frontend/static/style.css @@ -24,6 +24,7 @@ a { width: 100%; height: calc(100% - 55px); margin: auto; + padding-bottom: 50px; } .content>* { padding: 5%; @@ -54,4 +55,20 @@ footer { } footer.flex { 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; } \ No newline at end of file