aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-04 19:36:50 +0200
committerHimbeer <himbeer@disroot.org>2024-08-04 19:36:50 +0200
commitf95e7453eb0424e900f369c458b58cb4370704ff (patch)
treec7ba1ddc7679dd72e86f40c6dc42777fa19e698b
parenta929c0bfd34097ca7054b972220d111c43e6db2a (diff)
Add WAN reconnecting (warm, cold, force)
-rw-r--r--src-tauri/Cargo.toml2
-rw-r--r--src-tauri/src/main.rs49
-rw-r--r--src-tauri/tauri.conf.json3
-rw-r--r--src/wan.html38
-rw-r--r--src/wan.js54
5 files changed, 138 insertions, 8 deletions
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 76504a9..f555043 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -11,7 +11,7 @@ edition = "2021"
tauri-build = { version = "1", features = [] }
[dependencies]
-tauri = { version = "1", features = [ "dialog-ask", "shell-open", "dialog"] }
+tauri = { version = "1", features = [ "dialog-message", "dialog-ask", "shell-open", "dialog"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
reqwest = { version = "0.12.5", features = ["json"] }
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 33c7fe0..64992e0 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -221,6 +221,52 @@ fn handle_change_wan_credentials_response(response: Response) -> String {
}
}
+#[tauri::command]
+async fn kill(
+ process: String,
+ signal: String,
+ state: State<'_, Mutex<Session>>,
+) -> Result<String, ()> {
+ let (client, instance) = {
+ let state = state.lock().unwrap();
+ (state.client.clone(), state.instance.clone())
+ };
+ let instance = match instance {
+ Some(instance) => instance,
+ None => {
+ return Ok(String::from(
+ "Keine Instanz ausgewählt, bitte melden Sie sich neu an!",
+ ))
+ }
+ };
+
+ let response = client
+ .post(instance.url.join("/proc/kill").unwrap())
+ .query(&[("process", process), ("signal", signal)])
+ .basic_auth("rustkrazy", Some(&instance.password))
+ .send();
+
+ Ok(match response.await {
+ Ok(response) => handle_kill_response(response),
+ Err(e) => format!("Signalversand an Dienst fehlgeschlagen: {}", e),
+ })
+}
+
+fn handle_kill_response(response: Response) -> String {
+ let status = response.status();
+ if status.is_success() {
+ String::new()
+ } else if status == StatusCode::UNAUTHORIZED {
+ String::from("Ungültiges Verwaltungspasswort, bitte melden Sie sich neu an!")
+ } else if status.is_client_error() {
+ format!("Clientseitiger Fehler: {}", status)
+ } else if status.is_server_error() {
+ format!("Serverseitiger Fehler: {}", status)
+ } else {
+ format!("Unerwarteter Statuscode: {}", status)
+ }
+}
+
fn main() {
tauri::Builder::default()
.manage(Mutex::new(Session {
@@ -234,7 +280,8 @@ fn main() {
connect,
disconnect,
load_wan_credentials,
- change_wan_credentials
+ change_wan_credentials,
+ kill
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index f1ef4b0..fc58349 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -17,7 +17,8 @@
},
"dialog": {
"all": false,
- "ask": true
+ "ask": true,
+ "message": true
}
},
"windows": [
diff --git a/src/wan.html b/src/wan.html
index 5f88050..ed86438 100644
--- a/src/wan.html
+++ b/src/wan.html
@@ -45,6 +45,42 @@
<br />
+ <form id="connection-form">
+ <fieldset>
+ <legend>Einwahl</legend>
+
+ <div class="row">
+ <button id="connection-warm-reconnect">Verbindungsparameter neu synchronisieren</button>
+ <button id="connection-cold-reconnect">Neu einwählen</button>
+ <button id="connection-force-reconnect">Neueinwahl erzwingen</button>
+ </div>
+
+ <p>Information: Eine Neueinwahl dauert ca. 30 Sekunden und übernimmt
+ Änderungen an den Zugangsdaten. Während diesem Zeitraum besteht keine
+ Verbindung zum Internetanbieter. Eine Neusynchronisation der
+ Verbindungsparameter dauert meist ca. 3 Sekunden oder weniger,
+ übernimmt aber keine Änderungen an den Zugangsdaten und kann bei der
+ Umstellung zwischen dynamischer und statischer Adressierung oder
+ zwischen IPv4 und IPv6 hilfreich sein. Beide Vorgänge führen in der
+ Regel zu einem Wechsel der öffentlichen IPv4-Adresse (ggf. mehrmals
+ wiederholen) und in selteneren Fällen auch zu einem Wechsel des
+ IPv6-Präfixes, falls die Einwahl erst nach über eine Stunde
+ erfolgreich ist.</p>
+
+ <p>In einigen Fällen kann die Software einfrieren, insbesondere nach
+ schnell aufeinander folgenden Verbindungsabbrüchen durch äußere
+ Einflüsse. Meist genügt es, nur den Einwahldienst anstelle des ganzen
+ Gerätes neu zu starten. Die Auswirkungen sind die gleichen wie bei
+ einer Neueinwahl, allerdings wird nicht auf das Beenden der aktuellen
+ Einwahl gewartet und ein Neustart des Einwahldienstes erzwungen. Wird
+ diese Operation bei funktionierender Internetverbindung genutzt, kann
+ es über 1 Minute dauern, bis der Anbieter die Einwahl wieder zulässt.
+ Das gleiche gilt für Neustarts mittels Stromkabel.</p>
+ </fieldset>
+ </form>
+
+ <br />
+
<form id="credentials-form">
<fieldset>
<legend>PPPoE-Zugangsdaten</legend>
@@ -62,7 +98,7 @@
</div>
<br />
<div class="row">
- <button id="credentials-show" type="default">🔒Passwort ein-/ausblenden</button>
+ <button id="credentials-show">🔒Passwort ein-/ausblenden</button>
</div>
<br />
diff --git a/src/wan.js b/src/wan.js
index ec73e8d..60ba0b7 100644
--- a/src/wan.js
+++ b/src/wan.js
@@ -1,11 +1,44 @@
const { invoke } = window.__TAURI__.tauri;
-const { ask } = window.__TAURI__.dialog;
+const { ask, message } = window.__TAURI__.dialog;
let credentialsUsernameEl;
let credentialsPasswordEl;
let credentialsSubmitEl;
let credentialsStatusEl;
+async function warmReconnect() {
+ const error = await invoke("kill", { process: "rsdsl_pppoe3", signal: "hup" });
+
+ if (error !== "") {
+ await message("Befehl konnte nicht erteilt werden: " + error, {
+ kind: "error",
+ title: "Neusynchronisation nicht erfolgt"
+ });
+ }
+}
+
+async function coldReconnect() {
+ const error = await invoke("kill", { process: "rsdsl_pppoe3", signal: "term" });
+
+ if (error !== "") {
+ await message("Befehl konnte nicht erteilt werden: " + error, {
+ kind: "error",
+ title: "Neueinwahl nicht erfolgt"
+ });
+ }
+}
+
+async function forceReconnect() {
+ const error = await invoke("kill", { process: "rsdsl_pppoe3", signal: "kill" });
+
+ if (error !== "") {
+ await message("Befehl konnte nicht erteilt werden: " + error, {
+ kind: "error",
+ title: "Neueinwahl nicht erfolgt"
+ });
+ }
+}
+
function showCredentials() {
switch (credentialsPasswordEl.type) {
case "password":
@@ -50,16 +83,29 @@ async function changeCredentials() {
document.body.style.cursor = "default";
const reconnect = await ask("Zum Übernehmen der neuen Zugangsdaten muss die Einwahl zum Internetanbieter neu aufgebaut werden. Dies dauert ca. 30 Sekunden. Möchten Sie die Einwahl jetzt neu herstellen?", {
- kind: "warning",
- title: "Neueinwahl erforderlich",
+ kind: "info",
+ title: "Neueinwahl erforderlich"
});
if (reconnect) {
- await wanColdReconnect();
+ await coldReconnect();
}
}
window.addEventListener("DOMContentLoaded", () => {
+ document.querySelector("#connection-warm-reconnect").addEventListener("click", (e) => {
+ e.preventDefault();
+ warmReconnect();
+ });
+ document.querySelector("#connection-cold-reconnect").addEventListener("click", (e) => {
+ e.preventDefault();
+ coldReconnect();
+ });
+ document.querySelector("#connection-force-reconnect").addEventListener("click", (e) => {
+ e.preventDefault();
+ forceReconnect();
+ });
+
credentialsUsernameEl = document.querySelector("#credentials-username");
credentialsPasswordEl = document.querySelector("#credentials-password");
credentialsSubmitEl = document.querySelector("#credentials-submit");