Skip to main content

pq_map/
config.rs

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", 604_800),
46            retries: var("CT_RETRIES", 5).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}