Skip to main content

hatchery_server/
lib.rs

1//! Host for hatchery subservices. See `deploy/README.md`.
2
3pub mod config;
4pub mod control;
5pub mod error;
6#[cfg(feature = "harness")]
7pub mod harness;
8#[cfg(feature = "m4a")]
9pub mod m4a;
10#[cfg(feature = "memory")]
11pub mod memory;
12#[cfg(feature = "m4a")]
13pub mod hub;
14#[cfg(feature = "m4a")]
15pub mod messenger;
16#[cfg(feature = "m4a")]
17pub mod provision;
18#[cfg(feature = "m4a")]
19pub mod tasks;
20pub mod subservice;
21pub mod supervisor;
22
23pub use config::ServerConfig;
24pub use error::ServerError;
25pub use subservice::{State, Status, Subservice};
26pub use supervisor::Supervisor;
27
28/// Build the subservices enabled by features and configuration.
29pub fn build_subservices(config: &ServerConfig) -> Vec<Box<dyn Subservice>> {
30    #[allow(unused_mut)]
31    let mut services: Vec<Box<dyn Subservice>> = Vec::new();
32    #[cfg(feature = "harness")]
33    if config.harness_enabled {
34        if let Some(bin) = config.harness_bin.clone() {
35            services.push(Box::new(harness::HarnessSubservice::new(bin, config.harness_args.clone())));
36        }
37    }
38    #[cfg(feature = "m4a")]
39    if config.m4a_enabled {
40        services.push(Box::new(m4a::M4aSubservice::new(
41            &config.data_dir,
42            config.m4a_master_key_var.clone(),
43        )));
44    }
45    #[cfg(feature = "m4a")]
46    if let (true, Some(master), Some(c2_addr)) =
47        (config.m4a_enabled, config.m4a_master_key_var.clone(), config.provision_c2_addr.clone())
48    {
49        services.push(Box::new(provision::ProvisionSubservice::new(provision::ProvisionConfig {
50            data_dir: config.data_dir.clone(),
51            master_key_var: master,
52            c2_addr,
53            c2_token_var: config.provision_c2_token_var.clone(),
54            interval: std::time::Duration::from_secs(config.provision_interval_secs),
55            server_ref: config.m4a_server_ref.clone(),
56            mail_domain: config.mail_domain.clone(),
57            policy_path: config.policy_path.clone(),
58        })));
59    }
60    #[cfg(feature = "memory")]
61    services.push(Box::new(memory::MemorySubservice::new(
62        config.memory_bin.clone(),
63        &config.data_dir,
64    )));
65    let _ = config;
66    services
67}