aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/styles.css4
-rw-r--r--src/wan.html113
-rw-r--r--src/wan.js117
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>
diff --git a/src/wan.js b/src/wan.js
index 0605ee7..675ef18 100644
--- a/src/wan.js
+++ b/src/wan.js
@@ -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);