changed the daemonize

This commit is contained in:
alex 2026-03-07 16:17:05 +08:00
parent 651b9ba5cd
commit c8c618015a
3 changed files with 124 additions and 75 deletions

10
Cargo.lock generated
View File

@ -558,6 +558,15 @@ dependencies = [
"typenum", "typenum",
] ]
[[package]]
name = "daemonize"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab8bfdaacb3c887a54d41bdf48d3af8873b3f5566469f8ba21b92057509f116e"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "darling" name = "darling"
version = "0.20.11" version = "0.20.11"
@ -2007,6 +2016,7 @@ dependencies = [
"clap 4.5.60", "clap 4.5.60",
"crc", "crc",
"crc32fast", "crc32fast",
"daemonize",
"dashmap 6.1.0", "dashmap 6.1.0",
"dns-lookup", "dns-lookup",
"etherparse", "etherparse",

View File

@ -35,6 +35,7 @@ rustls-pemfile = "2.2.0"
clap = { version = "4.5.60", features = ["derive", "env"] } clap = { version = "4.5.60", features = ["derive", "env"] }
rpassword = "7.4.0" rpassword = "7.4.0"
serde_json = "1.0.149" serde_json = "1.0.149"
daemonize = "0.5.0"
# rolling-file = { path = "../rolling-file" } # rolling-file = { path = "../rolling-file" }
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]

View File

@ -1,9 +1,11 @@
mod api; mod api;
use std::fs::File;
use std::process; use std::process;
use std::env; use std::env;
use clap::Parser; use clap::Parser;
use daemonize::Daemonize;
use punchnet::CachedLoginInfo; use punchnet::CachedLoginInfo;
use punchnet::CommandLineInput2; use punchnet::CommandLineInput2;
use punchnet::Commands; use punchnet::Commands;
@ -21,6 +23,7 @@ use punchnet::CommandLine;
use punchnet::CommandLineInput; use punchnet::CommandLineInput;
use sdlan_sn_rs::log; use sdlan_sn_rs::log;
use sdlan_sn_rs::utils::Mac;
use sdlan_sn_rs::utils::Result; use sdlan_sn_rs::utils::Result;
use sdlan_sn_rs::utils::create_or_load_uuid; use sdlan_sn_rs::utils::create_or_load_uuid;
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;
@ -95,81 +98,12 @@ fn parse_login_result(res: Result<LoginResponse>) -> LoginData {
} }
} }
#[tokio::main] async fn daemonize_me(
async fn main() { connect_info: ConnectData,
set_base_dir("/usr/local/punchnet"); remembered: CachedLoginInfo,
let _guard = log::init_log(&format!("{}/.output", get_base_dir())); client_id: String,
mac: Mac,
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);
}
}
println!("identity_id = {}", connect_info.identity_id); println!("identity_id = {}", connect_info.identity_id);
let self_host_name = connect_info.hostname; let self_host_name = connect_info.hostname;
@ -318,4 +252,108 @@ async fn main() {
// started = !started; // 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;
}
} }