diff --git a/Cargo.lock b/Cargo.lock index 6a57216..320d7ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -558,6 +558,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "daemonize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8bfdaacb3c887a54d41bdf48d3af8873b3f5566469f8ba21b92057509f116e" +dependencies = [ + "libc", +] + [[package]] name = "darling" version = "0.20.11" @@ -2007,6 +2016,7 @@ dependencies = [ "clap 4.5.60", "crc", "crc32fast", + "daemonize", "dashmap 6.1.0", "dns-lookup", "etherparse", diff --git a/Cargo.toml b/Cargo.toml index d7421e8..a5f737a 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ rustls-pemfile = "2.2.0" clap = { version = "4.5.60", features = ["derive", "env"] } rpassword = "7.4.0" serde_json = "1.0.149" +daemonize = "0.5.0" # rolling-file = { path = "../rolling-file" } [target.'cfg(unix)'.dependencies] diff --git a/src/bin/punchnet/main.rs b/src/bin/punchnet/main.rs index a59485a..ab19a50 100755 --- a/src/bin/punchnet/main.rs +++ b/src/bin/punchnet/main.rs @@ -1,9 +1,11 @@ mod api; +use std::fs::File; use std::process; use std::env; use clap::Parser; +use daemonize::Daemonize; use punchnet::CachedLoginInfo; use punchnet::CommandLineInput2; use punchnet::Commands; @@ -21,6 +23,7 @@ use punchnet::CommandLine; use punchnet::CommandLineInput; use sdlan_sn_rs::log; +use sdlan_sn_rs::utils::Mac; use sdlan_sn_rs::utils::Result; use sdlan_sn_rs::utils::create_or_load_uuid; use tokio::io::AsyncWriteExt; @@ -95,81 +98,12 @@ fn parse_login_result(res: Result) -> LoginData { } } -#[tokio::main] -async fn main() { - set_base_dir("/usr/local/punchnet"); - let _guard = log::init_log(&format!("{}/.output", get_base_dir())); - - let client_id = create_or_load_uuid(&format!("{}/.id", get_base_dir()), None).unwrap(); - - let test_token = "49722584273728716817720074439183"; - - let mac = create_or_load_mac(); - - let system = "linux"; - let version = "1.0.0"; - - // let cmd = CommandLineInput::from_args(); - let cmd = CommandLineInput2::parse(); - // println!("port is {}", cmd.port); - - let connect_info: ConnectData; - let remembered: CachedLoginInfo; - - match cmd.cmd { - Commands::Login(user) => { - // TODO: do login with user - let _ = parse_login_result( - login_with_user_pass(TEST_PREFIX, &client_id, &user.username, &user.password, mac, system, version).await - ); - process::exit(0); - } - Commands::TokenLogin(tk) => { - let _ = parse_login_result( - login_with_token(TEST_PREFIX, &client_id, &tk.token, mac, system, version).await - ); - process::exit(0); - } - Commands::AutoRun(tk) => { - let mut remembered_token = get_access_token(); - if remembered_token.is_none() { - let data = parse_login_result( - login_with_token(TEST_PREFIX, &client_id, &tk.token, mac, system, version).await - ); - remembered_token = Some(CachedLoginInfo{ - access_token: data.access_token, - username: data.username, - user_type: data.user_type, - audit: data.audit, - network_id: data.network_id, - network_name: data.network_name, - }); - } - - remembered = remembered_token.unwrap(); - - connect_info = parse_connect_result( - connect(TEST_PREFIX, &client_id, &remembered.access_token).await - ); - } - Commands::Start => { - let remembered_token = get_access_token(); - if remembered_token.is_none() { - eprintln!("not logged in, should login with user/pass or token first"); - process::exit(-2); - } - - remembered = remembered_token.unwrap(); - - connect_info = parse_connect_result( - connect(TEST_PREFIX, &client_id, &remembered.access_token).await - ); - } - Commands::Stop => { - process::exit(-4); - } - } - +async fn daemonize_me( + connect_info: ConnectData, + remembered: CachedLoginInfo, + client_id: String, + mac: Mac, +) { println!("identity_id = {}", connect_info.identity_id); let self_host_name = connect_info.hostname; @@ -318,4 +252,108 @@ async fn main() { // started = !started; // */ // } + +} + +#[tokio::main] +async fn main() { + set_base_dir("/usr/local/punchnet"); + let _guard = log::init_log(&format!("{}/.output", get_base_dir())); + + let client_id = create_or_load_uuid(&format!("{}/.id", get_base_dir()), None).unwrap(); + + let test_token = "49722584273728716817720074439183"; + + let mac = create_or_load_mac(); + + let system = "linux"; + let version = "1.0.0"; + + // let cmd = CommandLineInput::from_args(); + let cmd = CommandLineInput2::parse(); + // println!("port is {}", cmd.port); + + let connect_info: ConnectData; + let remembered: CachedLoginInfo; + + let should_daemonize: bool; + + match cmd.cmd { + Commands::Login(user) => { + // TODO: do login with user + let _ = parse_login_result( + login_with_user_pass(TEST_PREFIX, &client_id, &user.username, &user.password, mac, system, version).await + ); + process::exit(0); + } + Commands::TokenLogin(tk) => { + let _ = parse_login_result( + login_with_token(TEST_PREFIX, &client_id, &tk.token, mac, system, version).await + ); + process::exit(0); + } + Commands::AutoRun(tk) => { + let mut remembered_token = get_access_token(); + if remembered_token.is_none() { + let data = parse_login_result( + login_with_token(TEST_PREFIX, &client_id, &tk.token, mac, system, version).await + ); + remembered_token = Some(CachedLoginInfo{ + access_token: data.access_token, + username: data.username, + user_type: data.user_type, + audit: data.audit, + network_id: data.network_id, + network_name: data.network_name, + }); + } + + remembered = remembered_token.unwrap(); + + connect_info = parse_connect_result( + connect(TEST_PREFIX, &client_id, &remembered.access_token).await + ); + should_daemonize = false; + } + Commands::Start => { + let remembered_token = get_access_token(); + if remembered_token.is_none() { + eprintln!("not logged in, should login with user/pass or token first"); + process::exit(-2); + } + + remembered = remembered_token.unwrap(); + + connect_info = parse_connect_result( + connect(TEST_PREFIX, &client_id, &remembered.access_token).await + ); + should_daemonize = false; + } + Commands::Stop => { + process::exit(-4); + } + } + + + if should_daemonize { + let daemonize = Daemonize::new() + .pid_file("/tmp/punchnet.pid") + .chown_pid_file(true) + .working_directory(get_base_dir()) + .stdout(File::create("/tmp/punchnet.out").unwrap()) + .stderr(File::create("/tmp/punchnet.err").unwrap()) + .privileged_action(|| { + + }); + match daemonize.start() { + Ok(_) => { + daemonize_me(connect_info, remembered, client_id, mac).await; + } + Err(e) => { + eprintln!("failed to daemonize: {}", e); + } + } + } else { + daemonize_me(connect_info, remembered, client_id, mac).await; + } }