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 = &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 %}
\ 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