use crate::service_messages::Platform;
use crate::service_instance::service_unit_instance;
use crate::service_provision::ProvisionHost;
use crate::systemd_dbus::{Bus, EXCHANGE_WAIT};
use crate::service_server::Bind;
use std::time::Duration;
pub const START_NOTICE_GRACE: Duration = Duration::from_secs(1);
pub const RECONNECTS: usize = 5;
pub(crate) const CONNECT_PAUSE: Duration = Duration::from_millis(25);
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Activation {
Managed,
Unsupported(Platform),
}
#[derive(Clone, Debug)]
pub struct ClientConfig {
pub address: Bind,
pub activation: Activation,
pub start_wait: Duration,
pub heartbeat_silence: Duration,
pub start_watch: Option<ManagerWatch>,
pub keep_fresh: Option<FreshScratch>,
pub answer_ceiling: Duration,
pub withdraw_ceiling: Duration,
pub extra_wait: Duration,
pub start_ceiling: Duration,
}
#[derive(Clone, Debug)]
pub struct FreshScratch {
pub path: std::path::PathBuf,
pub every: Duration,
}
#[derive(Clone, Debug)]
pub struct ManagerWatch {
pub bus: std::path::PathBuf,
pub unit: String,
pub every: Duration,
pub state: fn(&std::path::Path, &str) -> Option<String>,
pub start: fn(&std::path::Path, &str) -> bool,
}
pub const MANAGER_ASK_EVERY: Duration = START_NOTICE_GRACE;
pub(crate) fn unit_state(bus: &std::path::Path, unit: &str) -> Option<String> {
let mut connection: Bus = Bus::connect(bus, EXCHANGE_WAIT).ok()?;
return connection.active_state(unit).ok()?;
}
pub(crate) fn start_unit(bus: &std::path::Path, unit: &str) -> bool {
let Ok(mut connection) = Bus::connect(bus, EXCHANGE_WAIT) else { return false };
return connection.start_unit(unit).is_ok();
}
pub fn manager_watch_for(host: &ProvisionHost) -> ManagerWatch {
return ManagerWatch { bus: host.bus.clone(), unit: service_unit_instance(host.instance.as_str()), every: MANAGER_ASK_EVERY, state: unit_state, start: start_unit };
}