//! # peach-web //! //! `peach-web` provides a web interface for monitoring and interacting with the //! PeachCloud device. This allows administration of the single-board computer //! (ie. Raspberry Pi) running PeachCloud, as well as the ssb-server and related //! plugins. //! //! ## Design //! //! `peach-web` is written primarily in Rust and presents a web interface for //! interacting with the device. The stack currently consists of Rocket (Rust //! web framework), Tera (Rust template engine inspired by Jinja2 and the Django //! template language), HTML, CSS and JavaScript. Additional functionality is //! provided by JSON-RPC clients for the `peach-network` and `peach-stats` //! microservices. //! //! HTML is rendered server-side. Request handlers call JSON-RPC microservices //! and serve HTML and assets. A JSON API is exposed for remote calls and //! dynamic client-side content updates via vanilla JavaScript following //! unobstructive design principles. Each Tera template is passed a context //! object. In the case of Rust, this object is a `struct` and must implement //! `Serialize`. The fields of the context object are available in the context //! of the template to be rendered. #![feature(proc_macro_hygiene, decl_macro)] pub mod error; pub mod routes; #[cfg(test)] mod tests; pub mod utils; use log::{info, error}; use std::process; use rocket::{catchers, routes, Rocket, Build, fs::FileServer}; use rocket_dyn_templates::Template; use crate::routes::authentication::*; use crate::routes::device::*; use crate::routes::catchers::*; use crate::routes::index::*; use crate::routes::ping::*; use crate::routes::scuttlebutt::*; use crate::routes::settings::admin::*; use crate::routes::settings::dns::*; use crate::routes::settings::network::*; pub type BoxError = Box; /// Create rocket instance & mount all routes. fn init_rocket() -> Rocket { rocket::build() .mount( "/", routes![ add_credentials, // WEB ROUTE connect_wifi, // WEB ROUTE disconnect_wifi, // WEB ROUTE deploy_ap, // WEB ROUTE deploy_client, // WEB ROUTE device_stats, // WEB ROUTE forget_wifi, // WEB ROUTE help, // WEB ROUTE index, // WEB ROUTE login, // WEB ROUTE login_post, // WEB ROUTE logout, // WEB ROUTE messages, // WEB ROUTE network_home, // WEB ROUTE network_add_ssid, // WEB ROUTE network_add_wifi, // WEB ROUTE network_detail, // WEB ROUTE peers, // WEB ROUTE profile, // WEB ROUTE reboot_cmd, // WEB ROUTE shutdown_cmd, // WEB ROUTE shutdown_menu, // WEB ROUTE wifi_list, // WEB ROUTE wifi_password, // WEB ROUTE wifi_set_password, // WEB ROUTE wifi_usage, // WEB ROUTE wifi_usage_alerts, // WEB ROUTE wifi_usage_reset, // WEB ROUTE configure_dns, // WEB ROUTE configure_dns_post, // WEB ROUTE change_password, // WEB ROUTE change_password_post, // WEB ROUTE reset_password, // WEB ROUTE reset_password_post, // WEB ROUTE forgot_password_page, // WEB ROUTE send_password_reset_post, // WEB ROUTE configure_admin, // WEB ROUTE add_admin, // WEB ROUTE add_admin_post, // WEB ROUTE delete_admin_post, // WEB ROUTE activate_ap, // JSON API activate_client, // JSON API add_wifi, // JSON API connect_ap, // JSON API disconnect_ap, // JSON API forget_ap, // JSON API modify_password, // JSON API ping_pong, // JSON API ping_network, // JSON API ping_oled, // JSON API ping_stats, // JSON API reset_data_total, // JSON API return_ip, // JSON API return_rssi, // JSON API return_ssid, // JSON API return_state, // JSON API return_status, // JSON API reboot_device, // JSON API scan_networks, // JSON API shutdown_device, // JSON API update_wifi_alerts, // JSON API save_dns_configuration_endpoint, // JSON API save_password_form_endpoint, // JSON API reset_password_form_endpoint, // JSON API ], ) .mount("/", FileServer::from("static")) .register("/", catchers![not_found, internal_error, forbidden]) .attach(Template::fairing()) } /// Launch the peach-web rocket server. #[rocket::main] async fn main() { // initialize logger env_logger::init(); // initialize rocket info!("Initializing Rocket"); let rocket = init_rocket(); // launch rocket info!("Launching Rocket"); if let Err(e) = rocket.launch().await { error!("Error in Rocket application: {}", e); process::exit(1); } }