FEAT: Add back-end support for WispGate integration.

* Add the wispgate enable, API key and API url config options (as optional).
* Set defaults.
* Update the config UI to match.
* Update the Python library to export `automatic_import_wispgate`, `wispgate_api_token` and `wispgate_api_url`
This commit is contained in:
Herbert Wolverson 2025-02-15 10:51:03 -06:00
parent d7fd99eee3
commit 4f5dbec93c
24 changed files with 176 additions and 1 deletions

View File

@ -15,6 +15,8 @@ mod powercode_integration;
mod sonar_integration;
pub mod influxdb;
mod flows;
mod wispgate;
pub use bridge::*;
pub use long_term_stats::LongTermStats;
pub use tuning::Tunables;

View File

@ -72,6 +72,9 @@ pub struct Config {
/// InfluxDB Configuration
pub influxdb: Option<super::influxdb::InfluxDbConfig>,
/// WispGate Integration
pub wispgate_integration: Option<super::wispgate::WispGateIntegration>,
/// Option to disable the webserver for headless/CLI operation
pub disable_webserver: Option<bool>,
@ -139,6 +142,7 @@ impl Default for Config {
uisp_integration: super::uisp_integration::UispIntegration::default(),
powercode_integration: super::powercode_integration::PowercodeIntegration::default(),
sonar_integration: super::sonar_integration::SonarIntegration::default(),
wispgate_integration: None,
influxdb: None,
packet_capture_time: 10,
queue_check_period_ms: 1000,

View File

@ -0,0 +1,8 @@
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
pub struct WispGateIntegration {
pub enable_wispgate: bool,
pub wispgate_api_token: String,
pub wispgate_api_url: String,
}

View File

@ -94,6 +94,9 @@ fn liblqos_python(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(is_network_flat))?;
m.add_wrapped(wrap_pyfunction!(blackboard_finish))?;
m.add_wrapped(wrap_pyfunction!(blackboard_submit))?;
m.add_wrapped(wrap_pyfunction!(automatic_import_wispgate))?;
m.add_wrapped(wrap_pyfunction!(wispgate_api_token))?;
m.add_wrapped(wrap_pyfunction!(wispgate_api_url))?;
Ok(())
}
@ -736,4 +739,31 @@ pub fn blackboard_submit(subsystem: String, key: String, value: String) -> PyRes
};
let _ = run_query(vec![BusRequest::BlackboardData { subsystem, key, value }]);
Ok(())
}
#[pyfunction]
fn automatic_import_wispgate() -> PyResult<bool> {
let config = lqos_config::load_config().unwrap();
let Some(wisp_gate) = config.wispgate_integration.as_ref() else {
return Ok(false);
};
Ok(wisp_gate.enable_wispgate)
}
#[pyfunction]
fn wispgate_api_token() -> PyResult<String> {
let config = lqos_config::load_config().unwrap();
let Some(wisp_gate) = config.wispgate_integration.as_ref() else {
return Ok(String::new());
};
Ok(wisp_gate.wispgate_api_token.clone())
}
#[pyfunction]
fn wispgate_api_url() -> PyResult<String> {
let config = lqos_config::load_config().unwrap();
let Some(wisp_gate) = config.wispgate_integration.as_ref() else {
return Ok(String::new());
};
Ok(wisp_gate.wispgate_api_url.clone())
}

View File

@ -1,6 +1,6 @@
#!/bin/bash
set -e
scripts=( index.js template.js login.js first-run.js shaped-devices.js tree.js help.js unknown-ips.js configuration.js circuit.js flow_map.js all_tree_sankey.js asn_explorer.js lts_trial.js config_general.js config_anon.js config_tuning.js config_queues.js config_lts.js config_iprange.js config_flows.js config_integration.js config_spylnx.js config_uisp.js config_powercode.js config_sonar.js config_interface.js config_network.js config_devices.js config_users.js )
scripts=( index.js template.js login.js first-run.js shaped-devices.js tree.js help.js unknown-ips.js configuration.js circuit.js flow_map.js all_tree_sankey.js asn_explorer.js lts_trial.js config_general.js config_anon.js config_tuning.js config_queues.js config_lts.js config_iprange.js config_flows.js config_integration.js config_spylnx.js config_uisp.js config_powercode.js config_sonar.js config_interface.js config_network.js config_devices.js config_users.js config_wispgate.js )
for script in "${scripts[@]}"
do
echo "Building {$script}"

View File

@ -0,0 +1,62 @@
import {saveConfig, loadConfig} from "./config/config_helper";
function validateConfig() {
// Validate required fields when enabled
if (document.getElementById("enableWispgate").checked) {
const apiKey = document.getElementById("wispgate_api_token").value.trim();
if (!apiKey) {
alert("API Key is required when WispGate integration is enabled");
return false;
}
const apiUrl = document.getElementById("wispgate_api_url").value.trim();
if (!apiUrl) {
alert("API URL is required when WispGate integration is enabled");
return false;
}
try {
new URL(apiUrl);
} catch {
alert("API URL must be a valid URL");
return false;
}
}
return true;
}
function updateConfig() {
// Update only the powercode_integration section
window.config.wispgate_integration = {
enable_wispgate: document.getElementById("enableWispgate").checked,
wispgate_api_token: document.getElementById("wispgate_api_token").value.trim(),
wispgate_api_url: document.getElementById("wispgate_api_url").value.trim()
};
}
loadConfig(() => {
// window.config now contains the configuration.
// Populate form fields with config values
if (window.config && window.config.wispgate_integration) {
const wispgateIntegration = window.config.wispgate_integration;
// Boolean field
document.getElementById("enableWispgate").checked =
wispgateIntegration.enable_wispgate ?? false;
// String fields
document.getElementById("wispgate_api_token").value =
wispgateIntegration.wispgate_api_token ?? "";
document.getElementById("wispgate_api_url").value =
wispgateIntegration.wispgate_api_url ?? "";
// Add save button click handler
document.getElementById('saveButton').addEventListener('click', () => {
if (validateConfig()) {
updateConfig();
saveConfig(() => {
alert("Configuration saved successfully!");
});
}
});
}
});

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item active"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><i class="fa fa-map"></i> Network Layout</li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item active"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item active"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item active"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item active"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -14,6 +14,7 @@
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item active"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>

View File

@ -0,0 +1,52 @@
<div class="row">
<div class="col-12">
<ul class="config-menu">
<li class="config-menu-item"><a href="config_general.html" class="text-decoration-none"><i class="fa fa-server"></i> General</a></li>
<li class="config-menu-item"><a href="config_anon.html" class="text-decoration-none"><i class="fa fa-user-secret"></i> Anonymous Usage Stats</a></li>
<li class="config-menu-item"><a href="config_tuning.html" class="text-decoration-none"><i class="fa fa-warning"></i> Tuning</a></li>
<li class="config-menu-item"><a href="config_interface.html" class="text-decoration-none"><i class="fa fa-chain"></i> Network Mode</a></li>
<li class="config-menu-item"><a href="config_queues.html" class="text-decoration-none"><i class="fa fa-car"></i> Queues</a></li>
<li class="config-menu-item"><a href="config_lts.html" class="text-decoration-none"><i class="fa fa-line-chart"></i> Long-Term Stats</a></li>
<li class="config-menu-item"><a href="config_iprange.html" class="text-decoration-none"><i class="fa fa-address-card"></i> IP Ranges</a></li>
<li class="config-menu-item"><a href="config_flows.html" class="text-decoration-none"><i class="fa fa-arrow-circle-down"></i> Flow Tracking</a></li>
<li class="config-menu-item"><a href="config_integration.html" class="text-decoration-none"><i class="fa fa-link"></i> Integration - Common</a></li>
<li class="config-menu-item"><a href="config_spylnx.html" class="text-decoration-none"><i class="fa fa-link"></i> Splynx</a></li>
<li class="config-menu-item"><a href="config_uisp.html" class="text-decoration-none"><i class="fa fa-link"></i> UISP</a></li>
<li class="config-menu-item"><a href="config_powercode.html" class="text-decoration-none"><i class="fa fa-link"></i> Powercode</a></li>
<li class="config-menu-item"><a href="config_sonar.html" class="text-decoration-none"><i class="fa fa-link"></i> Sonar</a></li>
<li class="config-menu-item active"><a href="config_wispgate.html" class="text-decoration-none"><i class="fa fa-link"></i> WispGate</a></li>
<li class="config-menu-item"><a href="config_network.html" class="text-decoration-none"><i class="fa fa-map"></i> Network Layout</a></li>
<li class="config-menu-item"><a href="config_devices.html" class="text-decoration-none"><i class="fa fa-table"></i> Shaped Devices</a></li>
<li class="config-menu-item"><a href="config_users.html" class="text-decoration-none"><i class="fa fa-users"></i> LibreQoS Users</a></li>
</ul>
<hr class="mt-3 mb-3" />
</div>
</div>
<div class="row">
<div class="col-12">
<form>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="enableWispgate">
<label class="form-check-label" for="enableWispgate">Enable WispGate Integration</label>
<div class="form-text">Enable integration with WispGate system</div>
</div>
<div class="mb-3">
<label for="wispgate_api_token" class="form-label">API KEY</label>
<input type="text" class="form-control" id="wispgate_api_token">
<div class="form-text">WispGate API Token</div>
</div>
<div class="mb-3">
<label for="wispgate_api_url" class="form-label">API URL</label>
<input type="text" class="form-control" id="wispgate_api_url">
<div class="form-text">WispGate API URL</div>
</div>
<button type="button" id="saveButton" class="btn btn-outline-primary">Save Changes</button>
</form>
</div>
</div>
<script src="config_wispgate.js"></script>

View File

@ -50,6 +50,7 @@ pub(super) fn static_routes() -> Result<Router> {
"config_network.html",
"config_devices.html",
"config_users.html",
"config_wispgate.html",
];
// Iterate through pages and construct the router