diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-04 19:36:50 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-04 19:36:50 +0200 |
commit | f95e7453eb0424e900f369c458b58cb4370704ff (patch) | |
tree | c7ba1ddc7679dd72e86f40c6dc42777fa19e698b | |
parent | a929c0bfd34097ca7054b972220d111c43e6db2a (diff) |
Add WAN reconnecting (warm, cold, force)
-rw-r--r-- | src-tauri/Cargo.toml | 2 | ||||
-rw-r--r-- | src-tauri/src/main.rs | 49 | ||||
-rw-r--r-- | src-tauri/tauri.conf.json | 3 | ||||
-rw-r--r-- | src/wan.html | 38 | ||||
-rw-r--r-- | src/wan.js | 54 |
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 /> @@ -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"); |