summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs87
1 files changed, 22 insertions, 65 deletions
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()
-}
-