aboutsummaryrefslogtreecommitdiff
path: root/src/config/options.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/options.rs')
-rw-r--r--src/config/options.rs78
1 files changed, 53 insertions, 25 deletions
diff --git a/src/config/options.rs b/src/config/options.rs
index 36da475..b3a63b0 100644
--- a/src/config/options.rs
+++ b/src/config/options.rs
@@ -8,21 +8,27 @@ use crate::config::RuntimeConfig;
// This file parses the options that can be declared in the environment.
// runtime.rs applies business logic and builds RuntimeConfig structs.
-/// Base configuration options
+// - Note for the future -
+// There is no *need* to have a 'DIPLONAT_XXX_*' prefix for all config options.
+// If some config options are shared by several modules, a ConfigOptsBase could
+// contain them, and parse the 'DIPLONAT_*' prefix directly.
+// Only in runtime.rs would these options find their proper location in each
+// module's struct.
+
+
+/// Consul configuration options
#[derive(Clone, Default, Deserialize)]
-pub struct ConfigOptsBase {
- /// This node's private IP address [default: None]
- pub private_ip: Option<String>,
- /// Expiration time for IGD rules [default: 60]
- pub expiration_time: Option<u16>,
- /// Refresh time for IGD and Firewall rules [default: 300]
- pub refresh_time: Option<u16>,
+pub struct ConfigOptsConsul {
+ /// Consul's node name [default: None]
+ pub node_name: Option<String>,
+ /// Consul's REST URL [default: "http://127.0.0.1:8500"]
+ pub url: Option<String>,
}
/// ACME configuration options
#[derive(Clone, Default, Deserialize)]
pub struct ConfigOptsAcme {
- /// Whether ACME is enabled [default: false]
+ /// Whether the ACME module is enabled [default: false]
#[serde(default)]
pub enable: bool,
@@ -30,32 +36,52 @@ pub struct ConfigOptsAcme {
pub email: Option<String>,
}
-/// Consul configuration options
+/// Firewall configuration options
#[derive(Clone, Default, Deserialize)]
-pub struct ConfigOptsConsul {
- /// Consul's node name [default: None]
- pub node_name: Option<String>,
- /// Consul's REST URL [default: "http://127.0.0.1:8500"]
- pub url: Option<String>,
+pub struct ConfigOptsFirewall {
+ /// Whether the firewall module is enabled [default: false]
+ #[serde(default)]
+ pub enable: bool,
+
+ /// Refresh time for firewall rules [default: 300]
+ pub refresh_time: Option<u16>,
+}
+
+/// IGD configuration options
+#[derive(Clone, Default, Deserialize)]
+pub struct ConfigOptsIgd {
+ /// Whether the IGD module is enabled [default: false]
+ #[serde(default)]
+ pub enable: bool,
+
+ /// This node's private IP address [default: None]
+ pub private_ip: Option<String>,
+ /// Expiration time for IGD rules [default: 60]
+ pub expiration_time: Option<u16>,
+ /// Refresh time for IGD rules [default: 300]
+ pub refresh_time: Option<u16>,
}
/// Model of all potential configuration options
pub struct ConfigOpts {
- pub base: ConfigOptsBase,
- pub acme: ConfigOptsAcme,
pub consul: ConfigOptsConsul,
+ pub acme: ConfigOptsAcme,
+ pub firewall: ConfigOptsFirewall,
+ pub igd: ConfigOptsIgd,
}
impl ConfigOpts {
pub fn from_env() -> Result<RuntimeConfig> {
- let base: ConfigOptsBase = envy::prefixed("DIPLONAT_").from_env()?;
let consul: ConfigOptsConsul = envy::prefixed("DIPLONAT_CONSUL_").from_env()?;
let acme: ConfigOptsAcme = envy::prefixed("DIPLONAT_ACME_").from_env()?;
+ let firewall: ConfigOptsFirewall = envy::prefixed("DIPLONAT_FIREWALL_").from_env()?;
+ let igd: ConfigOptsIgd = envy::prefixed("DIPLONAT_IGD_").from_env()?;
RuntimeConfig::new(Self {
- base: base,
- consul: consul,
- acme: acme,
+ consul,
+ acme,
+ firewall,
+ igd,
})
}
@@ -63,14 +89,16 @@ impl ConfigOpts {
#[allow(dead_code)]
pub fn from_iter<Iter: Clone>(iter: Iter) -> Result<RuntimeConfig>
where Iter: IntoIterator<Item = (String, String)> {
- let base: ConfigOptsBase = envy::prefixed("DIPLONAT_").from_iter(iter.clone())?;
let consul: ConfigOptsConsul = envy::prefixed("DIPLONAT_CONSUL_").from_iter(iter.clone())?;
let acme: ConfigOptsAcme = envy::prefixed("DIPLONAT_ACME_").from_iter(iter.clone())?;
+ let firewall: ConfigOptsFirewall = envy::prefixed("DIPLONAT_FIREWALL_").from_iter(iter.clone())?;
+ let igd: ConfigOptsIgd = envy::prefixed("DIPLONAT_IGD_").from_iter(iter.clone())?;
RuntimeConfig::new(Self {
- base: base,
- consul: consul,
- acme: acme,
+ consul,
+ acme,
+ firewall,
+ igd,
})
}
} \ No newline at end of file