From 04b053d87e420be6c535e29376c8728b50a8c49d Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Mon, 2 Nov 2020 19:18:36 +0100 Subject: [PATCH] server: write main daemon PID to run directory so that we can easily get the main PID of the last recently launched daemon. Will be used to get the control socket of that one for access lgo rotate in a future patch Signed-off-by: Thomas Lamprecht --- etc/proxmox-backup-proxy.service.in | 1 + etc/proxmox-backup.service.in | 1 + src/bin/proxmox-backup-api.rs | 1 + src/bin/proxmox-backup-proxy.rs | 1 + src/buildcfg.rs | 7 +++++++ src/server.rs | 13 +++++++++++++ 6 files changed, 24 insertions(+) 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) }