exclude = [ "build", "debian", "tests/catar_data/test_symlink/symlink1"]
+[workspace]
+members = [
+ "pbs-buildcfg",
+]
+
[lib]
name = "proxmox_backup"
path = "src/lib.rs"
#proxmox-http = { version = "0.2.0", path = "../proxmox/proxmox-http", features = [ "client", "http-helpers", "websocket" ] }
proxmox-openid = "0.6.0"
+pbs-buildcfg = { path = "pbs-buildcfg" }
+
[features]
default = []
#valgrind = ["valgrind_request"]
--- /dev/null
+[package]
+name = "pbs-buildcfg"
+version = "0.1.0"
+authors = ["Proxmox Support Team <support@proxmox.com>"]
+edition = "2018"
+description = "macros used for pbs related paths such as configdir and rundir"
+
+[dependencies]
--- /dev/null
+//! Exports configuration data from the build system
+
+/// The configured configuration directory
+pub const CONFIGDIR: &str = "/etc/proxmox-backup";
+pub const JS_DIR: &str = "/usr/share/javascript/proxmox-backup";
+
+#[macro_export]
+macro_rules! PROXMOX_BACKUP_RUN_DIR_M { () => ("/run/proxmox-backup") }
+
+#[macro_export]
+macro_rules! PROXMOX_BACKUP_LOG_DIR_M { () => ("/var/log/proxmox-backup") }
+
+#[macro_export]
+macro_rules! PROXMOX_BACKUP_CACHE_DIR_M { () => ("/var/cache/proxmox-backup") }
+
+#[macro_export]
+macro_rules! PROXMOX_BACKUP_FILE_RESTORE_BIN_DIR_M {
+ () => ("/usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore")
+}
+
+/// 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 requests handled by the proxy and privileged API daemons. Note that not all
+/// failed logins can be logged here with full information, use the auth log for that.
+pub const API_ACCESS_LOG_FN: &str = concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/api/access.log");
+
+/// logfile for any failed authentication, via ticket or via token, and new successful ticket
+/// creations. This file can be useful for fail2ban.
+pub const API_AUTH_LOG_FN: &str = concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/api/auth.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");
+
+/// filename of the cached initramfs to use for booting single file restore VMs, this file is
+/// automatically created by APT hooks
+pub const PROXMOX_BACKUP_INITRAMFS_FN: &str =
+ concat!(PROXMOX_BACKUP_CACHE_DIR_M!(), "/file-restore-initramfs.img");
+
+/// filename of the cached initramfs to use for debugging single file restore
+pub const PROXMOX_BACKUP_INITRAMFS_DBG_FN: &str =
+ concat!(PROXMOX_BACKUP_CACHE_DIR_M!(), "/file-restore-initramfs-debug.img");
+
+/// filename of the kernel to use for booting single file restore VMs
+pub const PROXMOX_BACKUP_KERNEL_FN: &str =
+ concat!(PROXMOX_BACKUP_FILE_RESTORE_BIN_DIR_M!(), "/bzImage");
+
+/// Prepend configuration directory to a file name
+///
+/// This is a simply way to get the full path for configuration files.
+/// #### Example:
+/// ```
+/// # #[macro_use] extern crate proxmox_backup;
+/// let cert_path = configdir!("/proxy.pfx");
+/// ```
+#[macro_export]
+macro_rules! configdir {
+ ($subdir:expr) => (concat!("/etc/proxmox-backup", $subdir))
+}
+
+/// Prepend the run directory to a file name.
+///
+/// This is a simply way to get the full path for files in `/run`.
+#[macro_export]
+macro_rules! rundir {
+ ($subdir:expr) => {
+ concat!($crate::PROXMOX_BACKUP_RUN_DIR_M!(), $subdir)
+ };
+}
use proxmox::api::{api, Permission, Router, RpcEnvironment};
use proxmox::list_subdirs_api_method;
+use pbs_buildcfg::configdir;
+
use crate::acme::AcmeClient;
use crate::api2::types::Authid;
use crate::api2::types::NODE_SCHEMA;
use anyhow::{bail, format_err, Error};
use serde_json::json;
+use pbs_buildcfg::configdir;
+
use crate::api2::types::{Userid, UsernameRef, RealmRef};
pub trait ProxmoxAuthenticator {
use proxmox::tools::fs::{file_get_contents, replace_file, CreateOptions};
use proxmox::try_block;
+use pbs_buildcfg::configdir;
+
use crate::api2::types::Userid;
fn compute_csrf_secret_digest(
use proxmox_backup::tools::daemon;
use proxmox_backup::auth_helpers::*;
use proxmox_backup::config;
-use proxmox_backup::buildcfg;
fn main() {
proxmox_backup::tools::setup_safe_path_env();
let _ = csrf_secret(); // load with lazy_static
let mut config = server::ApiConfig::new(
- buildcfg::JS_DIR,
+ pbs_buildcfg::JS_DIR,
&proxmox_backup::api2::ROUTER,
RpcEnvironmentType::PRIVILEGED,
default_api_auth(),
let mut commando_sock = server::CommandoSocket::new(server::our_ctrl_sock());
- config.enable_file_log(buildcfg::API_ACCESS_LOG_FN, &mut commando_sock)?;
+ config.enable_file_log(pbs_buildcfg::API_ACCESS_LOG_FN, &mut commando_sock)?;
let rest_server = RestServer::new(config);
"proxmox-backup.service",
);
- server::write_pid(buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
+ server::write_pid(pbs_buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
daemon::systemd_notify(daemon::SystemdNotify::Ready)?;
let init_result: Result<(), Error> = try_block!({
},
};
+use pbs_buildcfg::configdir;
use proxmox_backup::api2::types::Authid;
-use proxmox_backup::configdir;
-use proxmox_backup::buildcfg;
use proxmox_backup::server;
use proxmox_backup::auth_helpers::*;
use proxmox_backup::tools::{
let _ = csrf_secret(); // load with lazy_static
let mut config = ApiConfig::new(
- buildcfg::JS_DIR,
+ pbs_buildcfg::JS_DIR,
&proxmox_backup::api2::ROUTER,
RpcEnvironmentType::PUBLIC,
default_api_auth(),
config.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit");
config.add_alias("docs", "/usr/share/doc/proxmox-backup/html");
- let mut indexpath = PathBuf::from(buildcfg::JS_DIR);
+ let mut indexpath = PathBuf::from(pbs_buildcfg::JS_DIR);
indexpath.push("index.hbs");
config.register_template("index", &indexpath)?;
config.register_template("console", "/usr/share/pve-xtermjs/index.html.hbs")?;
let mut commando_sock = server::CommandoSocket::new(server::our_ctrl_sock());
- config.enable_file_log(buildcfg::API_ACCESS_LOG_FN, &mut commando_sock)?;
+ config.enable_file_log(pbs_buildcfg::API_ACCESS_LOG_FN, &mut commando_sock)?;
let rest_server = RestServer::new(config);
"proxmox-backup-proxy.service",
);
- server::write_pid(buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
+ server::write_pid(pbs_buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
daemon::systemd_notify(daemon::SystemdNotify::Ready)?;
let init_result: Result<(), Error> = try_block!({
let max_size = 32 * 1024 * 1024 - 1;
let max_files = 14;
- let mut logrotate = LogRotate::new(buildcfg::API_ACCESS_LOG_FN, true)
+ let mut logrotate = LogRotate::new(pbs_buildcfg::API_ACCESS_LOG_FN, true)
.ok_or_else(|| format_err!("could not get API access log file names"))?;
if logrotate.rotate(max_size, None, Some(max_files))? {
worker.log("API access log was not rotated".to_string());
}
- let mut logrotate = LogRotate::new(buildcfg::API_AUTH_LOG_FN, true)
+ let mut logrotate = LogRotate::new(pbs_buildcfg::API_AUTH_LOG_FN, true)
.ok_or_else(|| format_err!("could not get API auth log file names"))?;
if logrotate.rotate(max_size, None, Some(max_files))? {
let sock = server::our_ctrl_sock();
let f1 = server::send_command(sock, "{\"command\":\"api-access-log-reopen\"}\n");
- let pid = server::read_pid(buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
+ let pid = server::read_pid(pbs_buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
let sock = server::ctrl_sock_from_pid(pid);
let f2 = server::send_command(sock, "{\"command\":\"api-access-log-reopen\"}\n");
tools::fs::file_get_json,
};
+use pbs_buildcfg;
+
use proxmox_backup::api2::access::user::UserWithTokens;
use proxmox_backup::api2::types::*;
use proxmox_backup::backup::BackupDir;
-use proxmox_backup::buildcfg;
use proxmox_backup::client::*;
use proxmox_backup::tools;
/// "www-data", so we use a custom one in /run/proxmox-backup/<uid> instead.
pub fn get_user_run_dir() -> Result<std::path::PathBuf, Error> {
let uid = nix::unistd::Uid::current();
- let mut path: std::path::PathBuf = buildcfg::PROXMOX_BACKUP_RUN_DIR.into();
+ let mut path: std::path::PathBuf = pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR.into();
path.push(uid.to_string());
tools::create_run_dir()?;
std::fs::create_dir_all(&path)?;
use proxmox_backup::backup::backup_user;
use proxmox_backup::client::{VsockClient, DEFAULT_VSOCK_PORT};
-use proxmox_backup::{buildcfg, tools};
+use proxmox_backup::tools;
use super::SnapRestoreDetails;
const MAX_CID_TRIES: u64 = 32;
fn create_restore_log_dir() -> Result<String, Error> {
- let logpath = format!("{}/file-restore", buildcfg::PROXMOX_BACKUP_LOG_DIR);
+ let logpath = format!("{}/file-restore", pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR);
proxmox::try_block!({
let backup_user = backup_user()?;
.owner(nix::unistd::ROOT)
.group(nix::unistd::Gid::from_raw(0));
- create_path(buildcfg::PROXMOX_BACKUP_LOG_DIR, None, Some(opts))?;
+ create_path(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR, None, Some(opts))?;
create_path(&logpath, None, Some(opts_root))?;
Ok(())
})
}
fn validate_img_existance(debug: bool) -> Result<(), Error> {
- let kernel = PathBuf::from(buildcfg::PROXMOX_BACKUP_KERNEL_FN);
+ let kernel = PathBuf::from(pbs_buildcfg::PROXMOX_BACKUP_KERNEL_FN);
let initramfs = PathBuf::from(if debug {
- buildcfg::PROXMOX_BACKUP_INITRAMFS_DBG_FN
+ pbs_buildcfg::PROXMOX_BACKUP_INITRAMFS_DBG_FN
} else {
- buildcfg::PROXMOX_BACKUP_INITRAMFS_FN
+ pbs_buildcfg::PROXMOX_BACKUP_INITRAMFS_FN
});
if !kernel.exists() || !initramfs.exists() {
bail!("cannot run file-restore VM: package 'proxmox-backup-restore-image' is not (correctly) installed");
tools::fd_change_cloexec(tmp_fd.0, false)?;
let initramfs = if debug {
- buildcfg::PROXMOX_BACKUP_INITRAMFS_DBG_FN
+ pbs_buildcfg::PROXMOX_BACKUP_INITRAMFS_DBG_FN
} else {
- buildcfg::PROXMOX_BACKUP_INITRAMFS_FN
+ pbs_buildcfg::PROXMOX_BACKUP_INITRAMFS_FN
};
let mut f = File::from_std(unsafe { std::fs::File::from_raw_fd(tmp_fd.0) });
"none",
"-enable-kvm",
"-kernel",
- buildcfg::PROXMOX_BACKUP_KERNEL_FN,
+ pbs_buildcfg::PROXMOX_BACKUP_KERNEL_FN,
"-initrd",
&ramfs_path,
"-append",
+++ /dev/null
-//! Exports configuration data from the build system
-
-/// The configured configuration directory
-pub const CONFIGDIR: &str = "/etc/proxmox-backup";
-pub const JS_DIR: &str = "/usr/share/javascript/proxmox-backup";
-
-#[macro_export]
-macro_rules! PROXMOX_BACKUP_RUN_DIR_M { () => ("/run/proxmox-backup") }
-
-#[macro_export]
-macro_rules! PROXMOX_BACKUP_LOG_DIR_M { () => ("/var/log/proxmox-backup") }
-
-#[macro_export]
-macro_rules! PROXMOX_BACKUP_CACHE_DIR_M { () => ("/var/cache/proxmox-backup") }
-
-#[macro_export]
-macro_rules! PROXMOX_BACKUP_FILE_RESTORE_BIN_DIR_M {
- () => ("/usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore")
-}
-
-/// 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 requests handled by the proxy and privileged API daemons. Note that not all
-/// failed logins can be logged here with full information, use the auth log for that.
-pub const API_ACCESS_LOG_FN: &str = concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/api/access.log");
-
-/// logfile for any failed authentication, via ticket or via token, and new successful ticket
-/// creations. This file can be useful for fail2ban.
-pub const API_AUTH_LOG_FN: &str = concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/api/auth.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");
-
-/// filename of the cached initramfs to use for booting single file restore VMs, this file is
-/// automatically created by APT hooks
-pub const PROXMOX_BACKUP_INITRAMFS_FN: &str =
- concat!(PROXMOX_BACKUP_CACHE_DIR_M!(), "/file-restore-initramfs.img");
-
-/// filename of the cached initramfs to use for debugging single file restore
-pub const PROXMOX_BACKUP_INITRAMFS_DBG_FN: &str =
- concat!(PROXMOX_BACKUP_CACHE_DIR_M!(), "/file-restore-initramfs-debug.img");
-
-/// filename of the kernel to use for booting single file restore VMs
-pub const PROXMOX_BACKUP_KERNEL_FN: &str =
- concat!(PROXMOX_BACKUP_FILE_RESTORE_BIN_DIR_M!(), "/bzImage");
-
-/// Prepend configuration directory to a file name
-///
-/// This is a simply way to get the full path for configuration files.
-/// #### Example:
-/// ```
-/// # #[macro_use] extern crate proxmox_backup;
-/// let cert_path = configdir!("/proxy.pfx");
-/// ```
-#[macro_export]
-macro_rules! configdir {
- ($subdir:expr) => (concat!("/etc/proxmox-backup", $subdir))
-}
-
-/// Prepend the run directory to a file name.
-///
-/// This is a simply way to get the full path for files in `/run`.
-#[macro_export]
-macro_rules! rundir {
- ($subdir:expr) => {
- concat!(PROXMOX_BACKUP_RUN_DIR_M!(), $subdir)
- };
-}
use proxmox::tools::fs::{CreateOptions, replace_file};
use proxmox::try_block;
-use crate::buildcfg;
+use pbs_buildcfg::{self, configdir};
pub mod acl;
pub mod acme;
/// * owned by 'backup' user/group
/// * nobody else can read (mode 0700)
pub fn check_configdir_permissions() -> Result<(), Error> {
- let cfgdir = buildcfg::CONFIGDIR;
+ let cfgdir = pbs_buildcfg::CONFIGDIR;
let backup_user = crate::backup::backup_user()?;
let backup_uid = backup_user.uid.as_raw();
}
pub fn create_configdir() -> Result<(), Error> {
- let cfgdir = buildcfg::CONFIGDIR;
+ let cfgdir = pbs_buildcfg::CONFIGDIR;
match nix::unistd::mkdir(cfgdir, Mode::from_bits_truncate(0o700)) {
Ok(()) => {}
};
use crate::tools::ControlFlow;
-pub(crate) const ACME_DIR: &str = configdir!("/acme");
-pub(crate) const ACME_ACCOUNT_DIR: &str = configdir!("/acme/accounts");
+pub(crate) const ACME_DIR: &str = pbs_buildcfg::configdir!("/acme");
+pub(crate) const ACME_ACCOUNT_DIR: &str = pbs_buildcfg::configdir!("/acme/accounts");
pub(crate) const ACME_DNS_SCHEMA_FN: &str = "/usr/share/proxmox-acme/dns-challenge-schema.json";
config
}
-const ACME_PLUGIN_CFG_FILENAME: &str = configdir!("/acme/plugins.cfg");
-const ACME_PLUGIN_CFG_LOCKFILE: &str = configdir!("/acme/.plugins.lck");
+const ACME_PLUGIN_CFG_FILENAME: &str = pbs_buildcfg::configdir!("/acme/plugins.cfg");
+const ACME_PLUGIN_CFG_LOCKFILE: &str = pbs_buildcfg::configdir!("/acme/.plugins.lck");
const LOCK_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10);
pub fn lock() -> Result<std::fs::File, Error> {
use proxmox_http::ProxyConfig;
+use pbs_buildcfg::configdir;
+
use crate::acme::AcmeClient;
use crate::api2::types::{
AcmeAccountName, AcmeDomain, ACME_DOMAIN_PROPERTY_SCHEMA, HTTP_PROXY_SCHEMA,
use proxmox::tools::uuid::Uuid;
use proxmox::tools::AsHex;
+use pbs_buildcfg::configdir;
+
use crate::api2::types::Userid;
/// Mapping of userid to TFA entry.
const LOCK_FILE: &str = configdir!("/tfa.json.lock");
const LOCK_TIMEOUT: Duration = Duration::from_secs(5);
-const CHALLENGE_DATA_PATH: &str = rundir!("/tfa/challenges");
+const CHALLENGE_DATA_PATH: &str = pbs_buildcfg::rundir!("/tfa/challenges");
/// U2F registration challenges time out after 2 minutes.
const CHALLENGE_TIMEOUT: i64 = 2 * 60;
use crate::api2::types::Authid;
use crate::auth;
-const LOCK_FILE: &str = configdir!("/token.shadow.lock");
-const CONF_FILE: &str = configdir!("/token.shadow");
+const LOCK_FILE: &str = pbs_buildcfg::configdir!("/token.shadow.lock");
+const CONF_FILE: &str = pbs_buildcfg::configdir!("/token.shadow");
const LOCK_TIMEOUT: Duration = Duration::from_secs(5);
#[derive(Serialize, Deserialize)]
pub mod task;
-#[macro_use]
-pub mod buildcfg;
-
#[macro_use]
pub mod tools;
use proxmox::sys::linux::procfs::PidStat;
-use crate::buildcfg;
+use pbs_buildcfg;
lazy_static! {
static ref PID: i32 = unsafe { libc::getpid() };
}
pub fn ctrl_sock_from_pid(pid: i32) -> String {
- format!("\0{}/control-{}.sock", buildcfg::PROXMOX_BACKUP_RUN_DIR, pid)
+ format!("\0{}/control-{}.sock", pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR, pid)
}
pub fn our_ctrl_sock() -> String {
pub mod auth;
pub(crate) async fn reload_proxy_certificate() -> Result<(), Error> {
- let proxy_pid = crate::server::read_pid(buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
+ let proxy_pid = crate::server::read_pid(pbs_buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
let sock = crate::server::ctrl_sock_from_pid(proxy_pid);
let _: Value = crate::server::send_raw_command(sock, "{\"command\":\"reload-certificate\"}\n")
.await?;
}
pub(crate) async fn notify_datastore_removed() -> Result<(), Error> {
- let proxy_pid = crate::server::read_pid(buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
+ let proxy_pid = crate::server::read_pid(pbs_buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?;
let sock = crate::server::ctrl_sock_from_pid(proxy_pid);
let _: Value = crate::server::send_raw_command(sock, "{\"command\":\"datastore-removed\"}\n")
.await?;
owned_by_backup: true,
..Default::default()
};
- FileLogger::new(crate::buildcfg::API_AUTH_LOG_FN, logger_options)
+ FileLogger::new(pbs_buildcfg::API_AUTH_LOG_FN, logger_options)
}
fn get_proxied_peer(headers: &HeaderMap) -> Option<std::net::SocketAddr> {
use super::UPID;
-use crate::buildcfg;
+use pbs_buildcfg;
+
use crate::server;
use crate::tools::logrotate::{LogRotate, LogRotateFiles};
use crate::tools::{FileLogger, FileLogOptions};
use crate::api2::types::{Authid, TaskStateType};
macro_rules! taskdir {
- ($subdir:expr) => (concat!(PROXMOX_BACKUP_LOG_DIR_M!(), "/tasks", $subdir))
+ ($subdir:expr) => (concat!(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR_M!(), "/tasks", $subdir))
}
pub const PROXMOX_BACKUP_TASK_DIR: &str = taskdir!("/");
pub const PROXMOX_BACKUP_TASK_LOCK_FN: &str = taskdir!("/.active.lock");
.owner(backup_user.uid)
.group(backup_user.gid);
- create_path(buildcfg::PROXMOX_BACKUP_LOG_DIR, None, Some(opts.clone()))?;
+ create_path(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR, None, Some(opts.clone()))?;
create_path(PROXMOX_BACKUP_TASK_DIR, None, Some(opts.clone()))?;
- create_path(buildcfg::PROXMOX_BACKUP_RUN_DIR, None, Some(opts))?;
+ create_path(pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR, None, Some(opts))?;
Ok(())
}).map_err(|err: Error| format_err!("unable to create task log dir - {}", err))?;
CreateOptions,
};
+use pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR_M;
+
#[cfg(test)]
mod test;
let opts = CreateOptions::new()
.owner(backup_user.uid)
.group(backup_user.gid);
- let _: bool = create_path(PROXMOX_BACKUP_RUN_DIR_M!(), None, Some(opts))?;
+ let _: bool = create_path(pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR_M!(), None, Some(opts))?;
Ok(())
}
use openssl::stack::Stack;
use openssl::pkey::{Public, PKey};
-use crate::configdir;
+use pbs_buildcfg::configdir;
// C type:
#[allow(non_camel_case_types)]
static INSTANCE: OnceCell<Arc<Memcom>> = OnceCell::new();
-const MEMCOM_FILE_PATH: &str = rundir!("/proxmox-backup-memcom");
+const MEMCOM_FILE_PATH: &str = pbs_buildcfg::rundir!("/proxmox-backup-memcom");
impl Memcom {
/// Open the memory based communication channel singleton.