diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/styles.css | 4 | ||||
-rw-r--r-- | src/wan.html | 113 | ||||
-rw-r--r-- | src/wan.js | 117 |
3 files changed, 232 insertions, 2 deletions
diff --git a/src/styles.css b/src/styles.css index f0cae8d..fe1e0e2 100644 --- a/src/styles.css +++ b/src/styles.css @@ -98,6 +98,10 @@ input { width: 30em; } +.row label { + padding-right: 0.5em; +} + @media (prefers-color-scheme: dark) { :root { color: #f6f6f6; diff --git a/src/wan.html b/src/wan.html index b8b533b..fdfc943 100644 --- a/src/wan.html +++ b/src/wan.html @@ -116,6 +116,119 @@ <p id="credentials-status">Warte auf Initialisierung...</p> </fieldset> </form> + + <br /> + + <form id="dhcpv6-form"> + <fieldset> + <legend>DHCPv6-Client</legend> + + <div class="row"> + <label for="dhcpv6-timestamp" form="dhcpv6-form">Letzte Gültigkeitsbestätigung:</label> + <output id="dhcpv6-timestamp">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-srvaddr" form="dhcpv6-form">Serveradresse für weitere Anfragen:</label> + <output id="dhcpv6-srvaddr">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-srvid" form="dhcpv6-form">Server-DUID (Hexadezimal):</label> + <output id="dhcpv6-srvid">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-t1" form="dhcpv6-form">Verlängerung (Renew):</label> + <output id="dhcpv6-t1">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-t2" form="dhcpv6-form">Verlängerung mit Serversuche (Rebind):</label> + <output id="dhcpv6-t2">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-prefix" form="dhcpv6-form">Präfix:</label> + <output id="dhcpv6-prefix">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-wanaddr" form="dhcpv6-form">WAN-Adresse (aus Präfix abgeleitet):</label> + <output id="dhcpv6-wanaddr">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-preflft" form="dhcpv6-form">Verwendungsdauer:</label> + <output id="dhcpv6-preflft">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-validlft" form="dhcpv6-form">Gültigkeitsdauer:</label> + <output id="dhcpv6-validlft">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-dns1" form="dhcpv6-form">Primärer DNS-Server (nur für DS-Lite AFTR):</label> + <output id="dhcpv6-dns1">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-dns2" form="dhcpv6-form">Sekundärer DNS-Server (nur für DS-Lite AFTR):</label> + <output id="dhcpv6-dns2">❓ Abfrage...</output> + </div> + + <div class="row"> + <label for="dhcpv6-aftr" form="dhcpv6-form">DS-Lite:</label> + <output id="dhcpv6-aftr">❓ Abfrage...</output> + </div> + + <br /> + + <div class="row"> + <button id="dhcpv6-kill">🔄 Verlängerung mit Serversuche</button> + </div> + + <p>Information: Nur bei einem grünen Haken bei "Letzte + Gültigkeitsbestätigung" ist das Präfix gültig und eine Verbindung mit + dem IPv6-Internet hergestellt (die reine Einwahl, s. oben, genügt + nicht). Bei abgelaufener Verwendungsdauer sollen laut Standard keine + neuen Verbindungen mehr aufgebaut werden. Diese Implementation + ignoriert diese Begrenzung, um im (anbieterseitigen + Software-)Störungsfall eine höhere Verfügbarkeit zu erreichen. Eine + Verlängerung mit Serversuche startet den DHCPv6-Client vollständig + neu und dauert ca. 30 Sekunden, sollte die Internetverbindung aber + nicht beeinträchtigen. Sie kann Abhilfe schaffen, wenn die + IPv6-Einwahl gelingt, aber keine Verbindung zum IPv6-Internet besteht + oder in dieser Übersicht das Präfix als ungültig angezeigt wird.</p> + + <label for="dhcpv6-duid" form="dhcpv6-form">Client-DUID (Hexadezimal):</label> + <div class="row"> + <input id="dhcpv6-duid" /> + </div> + + <br /> + + <div class="row"> + <button id="dhcpv6-submit" type="submit">Client-DUID ändern</button> + </div> + + <p id="dhcpv6-status">Warte auf Initialisierung...</p> + + <p>Information: Der Client-DUID (<b>D</b>HCP <b>U</b>nique + <b>ID</b>entifier) ist ein eindeutiger Wert, den der Internetanbieter + für die IPv6-Präfixvergabe verwenden kann. Dieser Wert sollte + konstant sein, um das Präfix konstant zu halten und somit weniger oft + die Einträge des dynamisches DNS (für Serververfügbarkeit) + aktualisieren zu müssen. Die eingesetzte Implementation nutzt den + DUID-UUID-Untertyp, der hier eingegebene Wert bezieht sich aber auf + den vollständigen DUID, nicht nur auf den UUID-Bestandteil. Er wird + zufällig generiert, falls noch kein Wert gespeichert ist oder der + gespeicherte Wert ungültig ist. Falls nötig kann der DUID hier + eingesehen und verändert werden. Einige Internetanbieter schreiben + die Nutzung eines bestimmten DUIDs vor.</p> + </fieldset> + </form> </div> </body> </html> @@ -10,6 +10,23 @@ let credentialsPasswordEl; let credentialsSubmitEl; let credentialsStatusEl; +let dhcpv6TimestampEl; +let dhcpv6SrvAddrEl; +let dhcpv6SrvIdEl; +let dhcpv6T1El; +let dhcpv6T2El; +let dhcpv6PrefixEl; +let dhcpv6WanAddrEl; +let dhcpv6PrefLftEl; +let dhcpv6ValidLftEl; +let dhcpv6Dns1El; +let dhcpv6Dns2El; +let dhcpv6AftrEl; + +let dhcpv6DuidEl; +let dhcpv6SubmitEl; +let dhcpv6StatusEl; + async function refreshConnectionStatus() { const connectionStatus = await invoke("connection_status", {}); @@ -104,13 +121,77 @@ async function changeCredentials() { } } -window.addEventListener("DOMContentLoaded", () => { - refreshConnectionStatus(); +async function refreshDhcpv6Status() { + const dhcpv6Status = await invoke("dhcpv6_status", {}); + + dhcpv6TimestampEl.innerText = dhcpv6Status.timestamp; + dhcpv6SrvAddrEl.innerText = dhcpv6Status.srvaddr; + dhcpv6SrvIdEl.innerText = dhcpv6Status.srvid; + dhcpv6T1El.innerText = dhcpv6Status.t1; + dhcpv6T2El.innerText = dhcpv6Status.t2; + dhcpv6PrefixEl.innerText = dhcpv6Status.prefix; + dhcpv6WanAddrEl.innerText = dhcpv6Status.wanaddr; + dhcpv6PrefLftEl.innerText = dhcpv6Status.preflft; + dhcpv6ValidLftEl.innerText = dhcpv6Status.validlft; + dhcpv6Dns1El.innerText = dhcpv6Status.dns1; + dhcpv6Dns2El.innerText = dhcpv6Status.dns2; + dhcpv6AftrEl.innerText = dhcpv6Status.aftr; +} + +async function loadDuid() { + dhcpv6StatusEl.innerText = "Lade aktuellen Client-DUID..."; + document.body.style.cursor = "progress"; + + const currentDuid = await invoke("load_duid", {}); + + dhcpv6DuidEl.value = currentDuid.duid; + dhcpv6StatusEl.innerText = currentDuid.status_text; + document.body.style.cursor = "default"; +} + +async function changeDuid() { + dhcpv6DuidEl.disabled = true; + dhcpv6SubmitEl.disabled = true; + dhcpv6StatusEl.innerText = "Änderungsanfrage..."; + document.body.style.cursor = "progress"; + + const statusText = await invoke("change_duid", { duid: dhcpv6DuidEl.value }); + + dhcpv6DuidEl.disabled = false; + dhcpv6SubmitEl.disabled = false; + dhcpv6StatusEl.innerText = statusText; + document.body.style.cursor = "default"; + + if (statusText === "Änderung erfolgreich") { + const apply = await ask("Zum Übernehmen des neuen Client-DUID muss der DHCPv6-Client neu gestartet werden. Dies dauert ca. 30 Sekunden, sollte die Internetverbindung aber nicht unterbrechen. Dabei wird eine Verlängerung mit Serversuche durchgeführt. Möchten Sie den DHCPv6-Client jetzt neu starten?", { + kind: "info", + title: "DHCPv6-Client-Neustart erforderlich", + }); + + if (apply) { + await killDhcpv6(); + } + } +} + +async function killDhcpv6() { + const error = await invoke("kill", { process: "rsdsl_dhcp6", signal: "term" }); + if (error !== "") { + await message("Befehl konnte nicht erteilt werden: " + error, { + kind: "error", + title: "DHCPv6-Client-Neustart nicht erfolgt", + }); + } +} + +window.addEventListener("DOMContentLoaded", () => { connectionStatusEl = document.querySelector("#connection-status"); connectionIpv4El = document.querySelector("#connection-ipv4"); connectionIpv6El = document.querySelector("#connection-ipv6"); + refreshConnectionStatus(); + document.querySelector("#connection-warm-reconnect").addEventListener("click", (e) => { e.preventDefault(); warmReconnect(); @@ -140,6 +221,38 @@ window.addEventListener("DOMContentLoaded", () => { }); loadCredentials(); + + dhcpv6TimestampEl = document.querySelector("#dhcpv6-timestamp"); + dhcpv6SrvAddrEl = document.querySelector("#dhcpv6-srvaddr"); + dhcpv6SrvIdEl = document.querySelector("#dhcpv6-srvid"); + dhcpv6T1El = document.querySelector("#dhcpv6-t1"); + dhcpv6T2El = document.querySelector("#dhcpv6-t2"); + dhcpv6PrefixEl = document.querySelector("#dhcpv6-prefix"); + dhcpv6WanAddrEl = document.querySelector("#dhcpv6-wanaddr"); + dhcpv6PrefLftEl = document.querySelector("#dhcpv6-preflft"); + dhcpv6ValidLftEl = document.querySelector("#dhcpv6-validlft"); + dhcpv6Dns1El = document.querySelector("#dhcpv6-dns1"); + dhcpv6Dns2El = document.querySelector("#dhcpv6-dns2"); + dhcpv6AftrEl = document.querySelector("#dhcpv6-aftr"); + + refreshDhcpv6Status(); + + document.querySelector("#dhcpv6-kill").addEventListener("click", (e) => { + e.preventDefault(); + killDhcpv6(); + }); + + dhcpv6DuidEl = document.querySelector("#dhcpv6-duid"); + dhcpv6SubmitEl = document.querySelector("#dhcpv6-submit"); + dhcpv6StatusEl = document.querySelector("#dhcpv6-status"); + + document.querySelector("#dhcpv6-form").addEventListener("submit", (e) => { + e.preventDefault(); + changeDuid(); + }); + + loadDuid(); }); setInterval(refreshConnectionStatus, 3000); +setInterval(refreshDhcpv6Status, 3000); |