diff --git a/etc/proxmox-backup-proxy.service.in b/etc/proxmox-backup-proxy.service.in index e389a565..7ca806aa 100644 --- a/etc/proxmox-backup-proxy.service.in +++ b/etc/proxmox-backup-proxy.service.in @@ -9,6 +9,7 @@ After=proxmox-backup.service Type=notify ExecStart=%LIBEXECDIR%/proxmox-backup/proxmox-backup-proxy ExecReload=/bin/kill -HUP $MAINPID +PIDFile=/run/proxmox-backup/proxy.pid Restart=on-failure User=%PROXY_USER% Group=%PROXY_USER% diff --git a/etc/proxmox-backup.service.in b/etc/proxmox-backup.service.in index a843abd5..76705a0e 100644 --- a/etc/proxmox-backup.service.in +++ b/etc/proxmox-backup.service.in @@ -7,6 +7,7 @@ After=network.target Type=notify ExecStart=%LIBEXECDIR%/proxmox-backup/proxmox-backup-api ExecReload=/bin/kill -HUP $MAINPID +PIDFile=/run/proxmox-backup/api.pid Restart=on-failure [Install] diff --git a/src/bin/proxmox-backup-api.rs b/src/bin/proxmox-backup-api.rs index 93456257..7ca26671 100644 --- a/src/bin/proxmox-backup-api.rs +++ b/src/bin/proxmox-backup-api.rs @@ -78,6 +78,7 @@ async fn run() -> Result<(), Error> { }, ); + server::write_pid(buildcfg::PROXMOX_BACKUP_API_PID_FN)?; daemon::systemd_notify(daemon::SystemdNotify::Ready)?; let init_result: Result<(), Error> = try_block!({ diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index ce67faee..2ae796f8 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -145,6 +145,7 @@ async fn run() -> Result<(), Error> { }, ); + server::write_pid(buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?; daemon::systemd_notify(daemon::SystemdNotify::Ready)?; let init_result: Result<(), Error> = try_block!({ diff --git a/src/buildcfg.rs b/src/buildcfg.rs index 7b61ff26..402f2c9d 100644 --- a/src/buildcfg.rs +++ b/src/buildcfg.rs @@ -12,12 +12,19 @@ macro_rules! PROXMOX_BACKUP_LOG_DIR_M { () => ("/var/log/proxmox-backup") } /// namespaced directory for in-memory (tmpfs) run state pub const PROXMOX_BACKUP_RUN_DIR: &str = PROXMOX_BACKUP_RUN_DIR_M!(); + /// namespaced directory for persistent logging pub const PROXMOX_BACKUP_LOG_DIR: &str = PROXMOX_BACKUP_LOG_DIR_M!(); /// logfile for all API reuests handled by the proxy and privileged API daemons pub const API_ACCESS_LOG_FN: &str = concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/api/access.log"); +/// the PID filename for the unprivileged proxy daemon +pub const PROXMOX_BACKUP_PROXY_PID_FN: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/proxy.pid"); + +/// the PID filename for the privileged api daemon +pub const PROXMOX_BACKUP_API_PID_FN: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/api.pid"); + /// Prepend configuration directory to a file name /// /// This is a simply way to get the full path for configuration files. diff --git a/src/server.rs b/src/server.rs index aa4b57ec..05fd25d9 100644 --- a/src/server.rs +++ b/src/server.rs @@ -4,6 +4,7 @@ //! services. We want async IO, so this is built on top of //! tokio/hyper. +use anyhow::{format_err, Error}; use lazy_static::lazy_static; use nix::unistd::Pid; @@ -24,6 +25,18 @@ pub fn pstart() -> u64 { *PSTART } +pub fn write_pid(pid_fn: &str) -> Result<(), Error> { + let pid_str = format!("{}\n", *PID); + let opts = proxmox::tools::fs::CreateOptions::new(); + proxmox::tools::fs::replace_file(pid_fn, pid_str.as_bytes(), opts) +} + +pub fn read_pid(pid_fn: &str) -> Result { + let pid = proxmox::tools::fs::file_get_contents(pid_fn)?; + let pid = std::str::from_utf8(&pid)?.trim(); + pid.parse().map_err(|err| format_err!("could not parse pid - {}", err)) +} + pub fn ctrl_sock_from_pid(pid: i32) -> String { format!("\0{}/control-{}.sock", buildcfg::PROXMOX_BACKUP_RUN_DIR, pid) }