//! # 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::{error, info}; use std::process; use rocket::{catchers, fs::FileServer, routes, Build, Rocket}; use rocket_dyn_templates::Template; use crate::routes::authentication::*; use crate::routes::catchers::*; use crate::routes::index::*; use crate::routes::scuttlebutt::*; use crate::routes::status::device::*; use crate::routes::status::network::*; use crate::routes::settings::admin::*; use crate::routes::settings::dns::*; use crate::routes::settings::menu::*; use crate::routes::settings::network::*; use crate::routes::settings::scuttlebutt::*; pub type BoxError = Box; /// Create rocket instance & mount all routes. fn init_rocket() -> Rocket { rocket::build() // GENERAL HTML ROUTES .mount( "/", routes![ help, home, login, login_post, logout, reboot_cmd, shutdown_cmd, power_menu, settings_menu, ], ) // STATUS HTML ROUTES .mount("/status", routes![device_status, network_status]) // ADMIN SETTINGS HTML ROUTES .mount( "/settings/admin", routes![ admin_menu, configure_admin, add_admin, add_admin_post, delete_admin_post, change_password, change_password_post, reset_password, reset_password_post, forgot_password_page, send_password_reset_post, ], ) // NETWORK SETTINGS HTML ROUTES .mount( "/settings/network", routes![ add_credentials, connect_wifi, configure_dns, configure_dns_post, disconnect_wifi, deploy_ap, deploy_client, forget_wifi, network_home, add_ssid, add_wifi, network_detail, wifi_list, wifi_password, wifi_set_password, wifi_usage, wifi_usage_alerts, wifi_usage_reset, ], ) // SCUTTLEBUTT SETTINGS HTML ROUTES .mount("/settings/scuttlebutt", routes![ssb_settings_menu]) // SCUTTLEBUTT SOCIAL HTML ROUTES .mount( "/scuttlebutt", routes![ peers, friends, follows, followers, blocks, profile, private, follow, unfollow, block, publish, ], ) .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); } }