reactive_graph/server/daemon/
mod.rs

1pub mod args;
2
3use crate::server::daemon::args::DaemonArguments;
4use daemonize_me::Daemon;
5use daemonize_me::Group;
6use daemonize_me::User;
7use std::any::Any;
8use std::fs::File;
9use std::process::exit;
10
11// Initialize daemon
12pub fn daemonize(args: &DaemonArguments) {
13    let daemon = Daemon::new()
14        .work_dir(args.daemon_working_directory.clone().unwrap_or(String::from(".")))
15        .setup_post_fork_parent_hook(post_fork_parent)
16        .setup_post_fork_child_hook(post_fork_child)
17        .setup_post_init_hook(after_init, None);
18    let daemon = match args.daemon_name {
19        Some(ref daemon_name) => daemon.name(daemon_name.as_ref()),
20        None => daemon,
21    };
22    let daemon = match args.daemon_pid {
23        Some(ref daemon_pid) => daemon.pid_file(daemon_pid, Some(false)),
24        None => daemon,
25    };
26    let daemon = match args.daemon_stdout {
27        Some(ref daemon_stdout) => match File::create(daemon_stdout) {
28            Ok(stdout) => daemon.stdout(stdout),
29            Err(_) => daemon,
30        },
31        None => daemon,
32    };
33    let daemon = match args.daemon_stderr {
34        Some(ref daemon_stderr) => match File::create(daemon_stderr) {
35            Ok(stderr) => daemon.stderr(stderr),
36            Err(_) => daemon,
37        },
38        None => daemon,
39    };
40    let daemon = if let (Some(ref daemon_user), Some(ref daemon_group)) = (args.daemon_user.clone(), args.daemon_group.clone()) {
41        if let (Ok(daemon_user), Ok(daemon_group)) = (User::try_from(daemon_user), Group::try_from(daemon_group)) {
42            daemon.user(daemon_user).group(daemon_group)
43        } else {
44            daemon
45        }
46    } else {
47        daemon
48    };
49
50    let daemon = daemon.start();
51    match daemon {
52        Ok(_) => println!("Process has been daemonized with success"),
53        Err(e) => {
54            eprintln!("Failed to run as daemon: {e}");
55            exit(-1);
56        }
57    }
58}
59
60pub fn post_fork_parent(_parent_pid: i32, _child_pid: i32) -> ! {
61    exit(0);
62}
63
64pub fn post_fork_child(_parent_pid: i32, _child_pid: i32) {
65    // Child hook must return
66}
67
68pub fn after_init(_: Option<&dyn Any>) {}