summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-05-18 14:25:32 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-05-18 14:25:41 +0200
commit581a73e00776ed9940c8c38e0f2ab318e0a469ee (patch)
treec709b7b9275003a9d6c9f2641cdb6fc705c56b17
parenteda9994c203e06a58556b8fdf956b2dc169c1283 (diff)
Split gui and server main function into submodules
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/gui.rs44
-rw-r--r--src/main.rs87
-rw-r--r--src/server.rs44
3 files changed, 110 insertions, 65 deletions
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()
+}
+