Skip to main content

roowho2_lib/server/
config.rs

1use std::{collections::HashSet, path::PathBuf, time::Duration};
2
3use serde::{Deserialize, Serialize};
4
5pub const DEFAULT_CONFIG_PATH: &str = "/etc/roowho2/config.toml";
6
7/// Default interval between rwhod status packet broadcasts.
8const DEFAULT_SEND_INTERVAL_SECONDS: u64 = 60;
9
10/// Default maximum number of distinct hosts to keep rwhod status records for at the same time.
11const DEFAULT_MAX_STATUS_ENTRIES: usize = 4096;
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct Config {
15    /// Logging level for the daemon.
16    pub log_level: Option<LogLevel>,
17
18    /// Configuration for the rwhod server.
19    pub rwhod: RwhodConfig,
20
21    /// Configuration for the fingerd server.
22    pub fingerd: FingerdConfig,
23
24    /// Configuration for the walld server.
25    pub walld: WalldConfig,
26
27    /// Path to the Unix domain socket for client-server communication.
28    ///
29    /// If left as `None`, the server expects to be served a file descriptor to the socket named 'client'.
30    pub client_socket_path: Option<String>,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(rename_all = "lowercase")]
35pub enum LogLevel {
36    Info,
37    Debug,
38    Trace,
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
42pub struct RwhodConfig {
43    /// Enable or disable the rwhod server functionality.
44    pub enable: bool,
45
46    /// Path to the ignore list for users that should be hidden from rwhod.
47    pub ignore_list_path: Option<PathBuf>,
48
49    /// Network interfaces to send rwhod packets on (e.g., ["eth0", "wlan0"]).
50    ///
51    /// If left as `None`, the server will send on all relevant interfaces it can find.
52    pub interfaces: Option<HashSet<String>>,
53
54    /// Interval between rwhod status packet broadcasts.
55    ///
56    /// If left as `None`, defaults to 60 seconds.
57    pub send_interval_seconds: Option<u64>,
58
59    /// Maximum number of distinct hosts to keep rwhod status records for at
60    /// the same time. Once at capacity, the least recently updated record
61    /// is evicted to make room for a newly-seen host.
62    ///
63    /// If left as `None`, defaults to 4096.
64    pub max_status_entries: Option<usize>,
65
66    /// Whether to react to Linux audit log activity (e.g. logins/logouts)
67    /// and push a status update immediately, instead of only on the
68    /// regular `send_interval_seconds` interval.
69    ///
70    /// If left as `None`, defaults to `false`.
71    pub realtime_updates: Option<bool>,
72}
73
74impl RwhodConfig {
75    /// Resolves [`Self::send_interval_seconds`] into a concrete interval.
76    pub fn send_interval(&self) -> Duration {
77        let seconds = match self.send_interval_seconds {
78            Some(0) => {
79                tracing::warn!(
80                    "rwhod.send_interval_seconds is set to 0, remapping to default value of {} seconds",
81                    DEFAULT_SEND_INTERVAL_SECONDS
82                );
83                DEFAULT_SEND_INTERVAL_SECONDS
84            }
85            Some(seconds) => seconds,
86            None => DEFAULT_SEND_INTERVAL_SECONDS,
87        };
88
89        Duration::from_secs(seconds)
90    }
91
92    /// Resolves [`Self::max_status_entries`] into a concrete limit.
93    pub fn max_status_entries(&self) -> usize {
94        match self.max_status_entries {
95            Some(0) => {
96                tracing::warn!(
97                    "rwhod.max_status_entries is set to 0, remapping to default value of {}",
98                    DEFAULT_MAX_STATUS_ENTRIES
99                );
100                DEFAULT_MAX_STATUS_ENTRIES
101            }
102            Some(max_status_entries) => max_status_entries,
103            None => DEFAULT_MAX_STATUS_ENTRIES,
104        }
105    }
106
107    /// Resolves [`Self::realtime_updates`] into a concrete flag.
108    pub fn realtime_updates_enabled(&self) -> bool {
109        self.realtime_updates.unwrap_or(false)
110    }
111}
112
113#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
114pub struct FingerdConfig {
115    /// Enable or disable the fingerd server functionality.
116    pub enable: bool,
117
118    /// Path to the ignore list for users that should be hidden from fingerd.
119    pub ignore_list_path: Option<PathBuf>,
120}
121
122#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
123pub struct WalldConfig {
124    /// Enable or disable the walld server functionality.
125    pub enable: bool,
126}