From 581a73e00776ed9940c8c38e0f2ab318e0a469ee Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Mon, 18 May 2020 14:25:32 +0200 Subject: Split gui and server main function into submodules Signed-off-by: Matthias Beyer --- src/gui.rs | 44 ++++++++++++++++++++++++++++++ src/main.rs | 87 +++++++++++++++-------------------------------------------- src/server.rs | 44 ++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 65 deletions(-) create mode 100644 src/gui.rs create mode 100644 src/server.rs diff --git a/src/gui.rs b/src/gui.rs new file mode 100644 index 0000000..eb145f4 --- /dev/null +++ b/src/gui.rs @@ -0,0 +1,44 @@ +use anyhow::Error; +use anyhow::Result; + +use crate::app::App; +use crate::cli::*; +use crate::configuration::Configuration; +use crate::types::util::*; + +pub fn run_gui(config: Configuration, adr: String) -> Result<()> { + // GUI + let app = { + let device_name = config.get_device_name(); + let device_key = config.get_device_key(); + + if let (Some(name), Some(key)) = (device_name, device_key) { + let name = IPNSHash::from(name.clone()); + let key = key.clone(); + let api_url = config.get_api_url().clone(); + let api_port = config.get_api_port().clone(); + + App::load(name, key, &api_url, api_port) + } else { + // ask user for name(s) + // boot repository + // load App object + unimplemented!() + } + }; + + let webview_content = web_view::Content::Url(adr.clone()); + + web_view::builder() + .title("My Project") + .content(webview_content) + .resizable(true) + .debug(true) + .user_data(()) + .invoke_handler(|_webview, _arg| Ok(())) + .build() + .map_err(Error::from)? + .run() + .map_err(Error::from) +} + diff --git a/src/main.rs b/src/main.rs index 2d38875..8aca5db 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,9 @@ extern crate pidlock; mod app; mod cli; mod configuration; +mod gui; mod repository; +mod server; mod types; mod version; @@ -50,7 +52,6 @@ use serde_json::to_string_pretty as serde_json_to_string_pretty; use serde_json::from_str as serde_json_from_str; use anyhow::Result; use anyhow::Error; -use actix_web::{web, HttpResponse, Responder}; use env_logger::Env; use crate::app::App; @@ -68,10 +69,6 @@ use crate::types::util::Version; use std::process::exit; -fn start_server(cli: &CLI) -> bool { - cli.cmd().map(|cmd| Command::Server == *cmd).unwrap_or(false) -} - #[actix_rt::main] async fn main() -> Result<()> { let cli = cli()?; @@ -91,67 +88,27 @@ async fn main() -> Result<()> { let port = cli.port().unwrap_or_else(|| *config.get_app_port()); let adr = format!("127.0.0.1:{}", port); - if start_server(&cli) { - let mut lock = pidlock::Pidlock::new("/tmp/distrox_server.pid"); - if *lock.state() == pidlock::PidlockState::Acquired { - // We assume that the server is already running - info!("Assuming that the server is already running. Doing nothing."); + let mut server_lock = crate::server::mk_lock(); + let server_running = crate::server::is_running(&server_lock); + let start_server = crate::server::do_start(&cli); + + match (server_running, start_server) { + (true, false) => crate::gui::run_gui(config, adr), + (false, false) => { + // fork() + let path = std::env::current_exe()?; + let mut child = std::process::Command::new(path).arg("server").spawn()?; + let r = crate::gui::run_gui(config, adr); + child.kill()?; + r + }, + + (false, true) => crate::server::run_server(server_lock, adr).await, + + (true, true) => { + info!("Server is already running. Doing nothing."); return Ok(()) - } - - info!("Starting server"); - let _ = lock.acquire().map_err(|_| anyhow!("Error while getting the PID lock"))?; - - info!("Got PID lock for server"); - actix_web::HttpServer::new(|| { - actix_web::App::new() - .service(actix_web::web::resource("/{name}/{id}/index.html").to(index)) - }) - .bind(adr.clone()) - .expect(&format!("Could not bind to address {}", adr)) - .run() - .await; - - info!("Server shutdown"); - info!("Releasing PID lock for server"); - lock.release().map_err(|_| anyhow!("Error while releasing the PID lock")) - } else { - let app = { - let device_name = config.get_device_name(); - let device_key = config.get_device_key(); - - if let (Some(name), Some(key)) = (device_name, device_key) { - let name = IPNSHash::from(name.clone()); - let key = key.clone(); - let api_url = config.get_api_url().clone(); - let api_port = config.get_api_port().clone(); - - App::load(name, key, &api_url, api_port) - } else { - // ask user for name(s) - // boot repository - // load App object - unimplemented!() - } - }; - - let webview_content = web_view::Content::Url(adr.clone()); - - web_view::builder() - .title("My Project") - .content(webview_content) - .resizable(true) - .debug(true) - .user_data(()) - .invoke_handler(|_webview, _arg| Ok(())) - .build() - .map_err(Error::from)? - .run() - .map_err(Error::from) + }, } } -async fn index() -> impl Responder { - HttpResponse::Ok() -} - diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..65956e8 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,44 @@ +use actix_web::{web, HttpResponse, Responder}; +use anyhow::Error; +use anyhow::Result; +use pidlock::{Pidlock, PidlockState}; + +use crate::cli::*; +use crate::types::util::*; + +pub fn mk_lock() -> Pidlock { + pidlock::Pidlock::new("/tmp/distrox_server.pid") +} + +pub fn do_start(cli: &CLI) -> bool { + cli.cmd().map(|cmd| Command::Server == *cmd).unwrap_or(false) +} + +pub fn is_running(server_lock: &Pidlock) -> bool { + *server_lock.state() == PidlockState::Acquired +} + + +pub async fn run_server(mut server_lock: Pidlock, adr: String) -> Result<()> { + info!("Starting server"); + let _ = server_lock.acquire().map_err(|_| anyhow!("Error while getting the PID lock"))?; + + info!("Got PID lock for server"); + actix_web::HttpServer::new(|| { + actix_web::App::new() + .service(actix_web::web::resource("/{name}/{id}/index.html").to(index)) + }) + .bind(adr.clone()) + .expect(&format!("Could not bind to address {}", adr)) + .run() + .await; + + info!("Server shutdown"); + info!("Releasing PID lock for server"); + server_lock.release().map_err(|_| anyhow!("Error while releasing the PID lock")) +} + +async fn index() -> impl Responder { + HttpResponse::Ok() +} + -- cgit v1.2.3