Compare commits
2 Commits
acab30acce
...
bdd3b7ab9b
Author | SHA1 | Date |
---|---|---|
glyph | bdd3b7ab9b | |
glyph | 4f36f61128 |
|
@ -0,0 +1,120 @@
|
|||
use maud::{html, PreEscaped};
|
||||
use peach_network::{network, network::Scan};
|
||||
use rouille::Request;
|
||||
|
||||
use crate::{
|
||||
templates,
|
||||
utils::{flash::FlashRequest, theme},
|
||||
};
|
||||
|
||||
// ROUTE: /settings/network/wifi?<ssid>
|
||||
|
||||
fn render_status_elements<'a>() -> () {
|
||||
let wlan_ssid = match network::ssid("wlan0") {
|
||||
Ok(Some(ssid)) => ssid,
|
||||
_ => String::from("Not connected")
|
||||
};
|
||||
|
||||
if
|
||||
div class="two-grid capsule{% if ssid == wlan_ssid %} success-border{% endif %}" title="PeachCloud network mode and status" {
|
||||
|
||||
}
|
||||
|
||||
fn render_network_status_icon() {
|
||||
|
||||
|
||||
(PreEscaped("<!-- NETWORK STATUS ICON -->"))
|
||||
|
||||
div class="grid-column-1" {
|
||||
img id="wifiIcon" class="center icon" src="/icons/wifi.svg" alt="WiFi icon";
|
||||
label class="center label-small font-gray" for="wifiIcon" title="Access Point Status">{% if ssid == wlan_ssid %}CONNECTED{% elif ap.state == "Available" %}AVAILABLE{% else %}NOT IN RANGE{% endif %};
|
||||
}
|
||||
}
|
||||
|
||||
fn render_network_detailed_info() -> Markup {
|
||||
html! {
|
||||
(PreEscaped("<!-- NETWORK DETAILED INFO -->"))
|
||||
div class="grid-column-2" {
|
||||
label class="label-small font-gray" for="netSsid" title="WiFi network SSID" { "SSID" };
|
||||
p id="netSsid" class="card-text" title="SSID" { (ssid) }
|
||||
label class="label-small font-gray" for="netSec" title="Security protocol" { "SECURITY" };
|
||||
p id="netSec" class="card-text" title="Security protocol in use by {{ ssid }}" { "{% if ap.detail %}{% if ap.detail.protocol != "" %}{{ ap.detail.protocol }}{% else %}None{% endif %}{% else %}Unknown{% endif %}" }
|
||||
label class="label-small font-gray" for="netSig" title="Signal Strength" { "SIGNAL" };
|
||||
p id="netSig" class="card-text" title="Signal strength of WiFi access point" { "{% if ap.signal %}{{ ap.signal }}%{% else %}Unknown{% endif %}" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fn render_network_card
|
||||
//
|
||||
fn render_buttons() -> Markup {
|
||||
html! {
|
||||
(PreEscaped("<!-- BUTTONS -->"))
|
||||
div class="card-container" style="padding-top: 0;" {
|
||||
div id="buttonDiv" {
|
||||
{%- if wlan_ssid == selected -%}
|
||||
form id="wifiDisconnect" action="/settings/network/wifi/disconnect" method="post" {
|
||||
(PreEscaped("<!-- hidden element: allows ssid to be sent in request -->"))
|
||||
input id="disconnectSsid" name="ssid" type="text" value="{{ ssid }}" style="display: none;";
|
||||
input id="disconnectWifi" class="button button-warning center" title="Disconnect from Network" type="submit" value="Disconnect";
|
||||
}
|
||||
{%- endif -%}
|
||||
{%- if saved_aps -%}
|
||||
{# Loop through the list of AP's with saved credentials #}
|
||||
{%- for ap in saved_aps -%}
|
||||
{# If the selected access point appears in the list, #}
|
||||
{# display the Modify and Forget buttons. #}
|
||||
{%- if ap.ssid == selected -%}
|
||||
{# Set 'in_list' to true to allow correct Add button display #}
|
||||
{% set_global in_list = true %}
|
||||
{%- if wlan_ssid != selected and ap.state == "Available" -%}
|
||||
form id="wifiConnect" action="/settings/network/wifi/connect" method="post" {
|
||||
(PreEscaped("<!-- hidden element: allows ssid to be sent in request -->"))
|
||||
input id="connectSsid" name="ssid" type="text" value="{{ ap.ssid }}" style="display: none;";
|
||||
input id="connectWifi" class="button button-primary center" title="Connect to Network" type="submit" value="Connect";
|
||||
}
|
||||
{%- endif -%}
|
||||
a class="button button-primary center" href="/settings/network/wifi/modify?ssid={{ ssid }}" { "Modify" }
|
||||
form id="wifiForget" action="/settings/network/wifi/forget" method="post" {
|
||||
(PreEscaped("<!-- hidden element: allows ssid to be sent in request -->"))
|
||||
input id="forgetSsid" name="ssid" type="text" value="{{ ap.ssid }}" style="display: none;";
|
||||
input id="forgetWifi" class="button button-warning center" title="Forget Network" type="submit" value="Forget";
|
||||
}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endif -%}
|
||||
{%- if in_list == false -%}
|
||||
{# Display the Add button if AP creds not already in saved networks list #}
|
||||
a class="button button-primary center" href="/settings/network/wifi/add?ssid={{ ssid }}" { "Add" }
|
||||
{%- endif -%}
|
||||
a class="button button-secondary center" href="/settings/network/wifi" title="Cancel" { "Cancel" }/
|
||||
|
||||
/// WiFi access point (AP) details.
|
||||
pub fn build_template(request: &Request, selected_ap: String) -> PreEscaped<String> {
|
||||
let network_list_template = html! {
|
||||
@if let Ok(Some(wlan_networks)) = network::all_networks("wlan0") {
|
||||
@for ssid, ap in wlan_networks {
|
||||
// select only the access point we are interested in displaying
|
||||
@if ssid == selected_ap {
|
||||
(PreEscaped("<!-- NETWORK CARD -->"))
|
||||
div class="card center" {
|
||||
(PreEscaped("<!-- NETWORK INFO BOX -->"))
|
||||
div class="two-grid capsule{% if ssid == wlan_ssid %} success-border{% endif %}" title="PeachCloud network mode and status" {
|
||||
(PreEscaped("<!-- left column -->"))
|
||||
// network status icon goes here
|
||||
// ...
|
||||
// network detailed info goes here
|
||||
// ...
|
||||
}
|
||||
// buttons go here
|
||||
// ...
|
||||
|
||||
}
|
||||
// flash
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use maud::{html, Markup, PreEscaped};
|
||||
use peach_network::{network, AccessPoint};
|
||||
use rouille::Request;
|
||||
|
||||
use crate::{
|
||||
templates,
|
||||
utils::{flash::FlashRequest, theme},
|
||||
};
|
||||
|
||||
// ROUTE: /settings/network/wifi
|
||||
|
||||
/// Retrieve network state data required by the WiFi network list template.
|
||||
fn get_network_state_data(ap: &str, wlan: &str) -> (String, String, HashMap<String, AccessPoint>) {
|
||||
let ap_state = match network::state("ap0") {
|
||||
Ok(Some(state)) => state,
|
||||
Err(_) => "Interface unavailable".to_string(),
|
||||
};
|
||||
|
||||
let wlan_ssid = match network::ssid("wlan0") {
|
||||
Ok(Some(ssid)) => ssid,
|
||||
Err(_) => "Not connected".to_string(),
|
||||
};
|
||||
|
||||
let wlan_networks = match network::all_networks("wlan0") {
|
||||
Ok(networks) => networks,
|
||||
Err(_) => HashMap::new(),
|
||||
};
|
||||
|
||||
(ap_state, wlan_ssid, wlan_networks)
|
||||
}
|
||||
|
||||
fn render_network_connected_elements(ssid: String) -> Markup {
|
||||
let ap_detail_url = format!("/network/wifi?ssid={}", ssid);
|
||||
|
||||
html! {
|
||||
a class="list-item link primary-bg" href=(ap_detail_url) {
|
||||
img id="netStatus" class="icon icon-active icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi online";
|
||||
p class="list-text" { (ssid) }
|
||||
label class="label-small list-label font-gray" for="netStatus" title="Status" { "Connected" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn render_network_available_elements(ssid: String, ap_state: String) -> Markup {
|
||||
let ap_detail_url = format!("/network/wifi?ssid={}", ssid);
|
||||
|
||||
html! {
|
||||
a class="list-item link light-bg" href=(ap_detail_url) {
|
||||
img id="netStatus" class="icon icon-inactive icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi offline";
|
||||
p class="list-text" { (ssid) }
|
||||
label class="label-small list-label font-gray" for="netStatus" title="Status" { (ap_state) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn render_network_unavailable_elements(ssid: String, ap_state: String) -> Markup {
|
||||
let ap_detail_url = format!("/network/wifi?ssid={}", ssid);
|
||||
|
||||
html! {
|
||||
a class="list-item link" href=(ap_detail_url) {
|
||||
img id="netStatus" class="icon icon-inactive icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi offline";
|
||||
p class="list-text" { (ssid) }
|
||||
label class="label-small list-label font-gray" for="netStatus" title="Status" { (ap_state) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// WiFi network list template builder.
|
||||
pub fn build_template(request: &Request) -> PreEscaped<String> {
|
||||
let (ap_state, wlan_ssid, wlan_networks) = get_network_state_data("ap0", "wlan0");
|
||||
|
||||
html! {
|
||||
div class="card center" {
|
||||
div class="center list-container" {
|
||||
ul class="list" {
|
||||
@if ap_state == "up" {
|
||||
li class="list-item light-bg warning-border" {
|
||||
"Enable WiFi client mode to view saved and available networks."
|
||||
}
|
||||
} @else if wlan_networks {
|
||||
@for (ssid, ap) in wlan_networks {
|
||||
li {
|
||||
@if ssid == wlan_ssid {
|
||||
(render_network_connected_elements(ssid))
|
||||
} @else if ap.state == "Available" {
|
||||
(render_network_available_elements(ssid, ap.state))
|
||||
} @else {
|
||||
(render_network_unavailable_elements(ssid, ap.state))
|
||||
}
|
||||
}
|
||||
}
|
||||
} @else {
|
||||
li class="list-item light-bg" {
|
||||
"No saved or available networks found."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
pub mod configure_dns;
|
||||
pub mod list_aps;
|
||||
pub mod menu;
|
||||
pub mod modify_ap;
|
||||
|
|
Loading…
Reference in New Issue