diff options
| author | tv <tv@krebsco.de> | 2026-10-30 16:32:23 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-30 16:32:23 +0100 |
| commit | f091fb2a9188f686e5b1f9012c510a1b3c8ad840 (patch) | |
| tree | 8821dfe3c63535762a798b85dfe8c0d850a9df90 /src/transport/libp2p.rs | |
| parent | 0ee0cd19b7ceabf5d75e1b8fdd074a6e758bc6db (diff) | |
move transport config checks to respective modules
Diffstat (limited to 'src/transport/libp2p.rs')
| -rw-r--r-- | src/transport/libp2p.rs | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/src/transport/libp2p.rs b/src/transport/libp2p.rs index 2d67d2c..d023079 100644 --- a/src/transport/libp2p.rs +++ b/src/transport/libp2p.rs @@ -204,6 +204,48 @@ pub(crate) struct Libp2pConfig { pub(crate) memory: bool, } +/// The multiaddrs of option `option`. +fn parse_addresses(option: &str, addresses: &[String]) -> Result<Vec<Multiaddr>> { + addresses + .iter() + .map(|address| { + address + .parse::<Multiaddr>() + .with_context(|| format!("{option} {address:?}")) + }) + .collect() +} + +/// The ranges of `libp2p-ignore`. +fn parse_ranges(ranges: &[String]) -> Result<Vec<IpRange>> { + ranges + .iter() + .map(|range| range.parse().context("libp2p-ignore")) + .collect() +} + +/// This transport's options, checked when the configuration is loaded +/// (`config::Settings::check`), so `--print-config` tells a wrong one too: the +/// multiaddrs and ranges parse, and a relay that is no node (`--relay-only`) can be +/// dialled and keeps its peer ID. +pub(crate) fn check(settings: &crate::config::Settings) -> Result<()> { + parse_addresses("libp2p-listen", &settings.libp2p_listen)?; + parse_addresses("libp2p-announce", &settings.libp2p_announce)?; + parse_addresses("libp2p-relays", &settings.libp2p_relays)?; + parse_ranges(&settings.libp2p_ignore)?; + if settings.relay_only { + if settings.libp2p_listen.is_empty() { + bail!("relay-only needs libp2p-listen: where nodes reach the relay"); + } + if settings.libp2p_key_file.is_none() { + bail!( + "relay-only needs libp2p-key-file: without it, the relay's peer ID changes with every start and nodes lose it" + ); + } + } + Ok(()) +} + impl Libp2pConfig { /// The configuration `settings` give; `relay_only`: a relay that is no node /// (`--relay-only`). @@ -211,16 +253,7 @@ impl Libp2pConfig { settings: &crate::config::Settings, relay_only: bool, ) -> Result<Self> { - let parse = |option: &str, addresses: &[String]| { - addresses - .iter() - .map(|address| { - address - .parse::<Multiaddr>() - .with_context(|| format!("{option} {address:?}")) - }) - .collect::<Result<Vec<_>>>() - }; + let parse = parse_addresses; Ok(Self { key: Self::load_key(settings.libp2p_key_file.as_deref())?, listen: parse("libp2p-listen", &settings.libp2p_listen)?, @@ -230,11 +263,7 @@ impl Libp2pConfig { continuum: !relay_only, mdns: settings.libp2p_mdns, upnp: settings.libp2p_upnp, - ignore: settings - .libp2p_ignore - .iter() - .map(|range| range.parse().context("libp2p-ignore")) - .collect::<Result<Vec<_>>>()?, + ignore: parse_ranges(&settings.libp2p_ignore)?, public: settings.libp2p_public, memory: false, }) |
