1use std::env;
2use std::time::Duration;
3
4#[derive(Debug, Clone)]
5pub struct Config {
6 pub cache_ttl: u64,
7 pub retries: u32,
8 pub retry_delay: u64,
9 pub connect_timeout: u64,
10 pub max_time: u64,
11 pub db_host: String,
12 pub db_port: u16,
13 pub db_user: String,
14 pub db_name: String,
15 pub db_connect_timeout: u64,
16 pub db_query_timeout: u64,
17 pub probe_cache_ttl: u64,
18 pub probe_timeout: Duration,
19 pub probe_concurrency: usize,
20 pub sweep_connect_timeout: Duration,
21 pub sweep_concurrency: usize,
22 pub sweep_delay_ms: u64,
23 pub sweep_ttl: u64,
24 pub probe_ports: Vec<u16>,
25 pub dns_timeout: Duration,
26 pub dns_attempts: usize,
27 pub dns_concurrency: usize,
28}
29
30impl Config {
31 pub fn from_env() -> Self {
32 let var = |name: &str, default: u64| {
33 env::var(name)
34 .ok()
35 .and_then(|v| v.parse().ok())
36 .unwrap_or(default)
37 };
38 let var_str = |name: &str, default: &str| {
39 env::var(name)
40 .ok()
41 .filter(|v| !v.is_empty())
42 .unwrap_or_else(|| default.to_string())
43 };
44 Self {
45 cache_ttl: var("CT_CACHE_TTL", 2_592_000), retries: var("CT_RETRIES", 10).max(1) as u32,
47 retry_delay: var("CT_RETRY_DELAY", 2),
48 connect_timeout: var("CT_CONNECT_TIMEOUT", 10),
49 max_time: var("CT_MAX_TIME", 60),
50 db_host: var_str("CT_DB_HOST", "crt.sh"),
51 db_port: var("CT_DB_PORT", 5432) as u16,
52 db_user: var_str("CT_DB_USER", "guest"),
53 db_name: var_str("CT_DB_DB", "certwatch"),
54 db_connect_timeout: var("CT_DB_CONNECT_TIMEOUT", 30),
55 db_query_timeout: var("CT_DB_QUERY_TIMEOUT", 120),
56 probe_cache_ttl: var("PROBE_CACHE_TTL", 86_400),
57 probe_timeout: Duration::from_secs(var("PROBE_TIMEOUT", 8)),
58 probe_concurrency: var("PROBE_CONCURRENCY", 32).max(1) as usize,
59 sweep_connect_timeout: Duration::from_secs(var("SWEEP_CONNECT_TIMEOUT", 1)),
60 sweep_concurrency: var("SWEEP_CONCURRENCY", 4).max(1) as usize,
61 sweep_delay_ms: var("SWEEP_DELAY_MS", 200),
62 sweep_ttl: var("PROBE_SWEEP_TTL", 604_800),
63 probe_ports: env::var("PROBE_PORTS")
64 .ok()
65 .map(|v| v.split(',').filter_map(|p| p.trim().parse().ok()).collect())
66 .unwrap_or_default(),
67 dns_timeout: Duration::from_secs(var("DNS_TIMEOUT", 5)),
68 dns_attempts: var("DNS_ATTEMPTS", 2).max(1) as usize,
69 dns_concurrency: var("DNS_CONCURRENCY", 32).max(1) as usize,
70 }
71 }
72}