Implement --no-ipv6 for addresses

This commit is contained in:
Andrey Golovizin 2021-07-14 15:19:15 +02:00
parent aecfa365a0
commit a9a8793767
3 changed files with 35 additions and 6 deletions

View file

@ -30,7 +30,7 @@ struct ConfigOpts {
#[clap(short, long)]
no_dns: bool,
#[clap(short='4', long)]
#[clap(short = '4', long)]
no_ipv6: bool,
}
@ -96,6 +96,13 @@ struct WireguardKeyPair {
}
impl WireguardConfigData {
fn addresses(&self) -> Result<Vec<ipnet::IpNet>, ipnet::AddrParseError> {
self.address
.split(',')
.map(|s: &str| -> Result<ipnet::IpNet, ipnet::AddrParseError> { s.trim().parse() })
.collect()
}
fn dns(&self) -> Result<Vec<IpAddr>, AddrParseError> {
self.dns
.split(',')
@ -169,12 +176,17 @@ fn write_config(
debug!("endpoint_addr = {:?}", &endpoint_addr);
writeln!(output, "[Interface]")?;
writeln!(output, "PrivateKey = {}", &keys.private_key)?;
writeln!(output, "Address = {}", &config.data.address)?;
let addresses = config.data.addresses()?;
let allowed_addresses = addresses
.iter()
.filter(|addr| addr.addr().is_ipv4() || !config_opts.no_ipv6);
write_list(output, "Address = ", allowed_addresses)?;
if !config_opts.no_dns {
let dns_addrs = config.data.dns()?;
let allowed_dns_addrs = dns_addrs.iter().filter(|addr| addr.is_ipv4() || !config_opts.no_ipv6);
write!(output, "DNS = ")?;
write_list(output, allowed_dns_addrs)?;
let allowed_dns_addrs = dns_addrs
.iter()
.filter(|addr| addr.is_ipv4() || !config_opts.no_ipv6);
write_list(output, "DNS = ", allowed_dns_addrs)?;
}
writeln!(output)?;
@ -186,11 +198,12 @@ fn write_config(
Ok(())
}
fn write_list<I, T>(output: &mut dyn Write, values: I) -> Result<(), std::io::Error>
fn write_list<I, T>(output: &mut dyn Write, prefix: &str, values: I) -> Result<(), std::io::Error>
where
I: IntoIterator<Item = T>,
T: std::fmt::Display,
{
write!(output, "{}", prefix)?;
for (i, value) in values.into_iter().enumerate() {
if i != 0 {
write!(output, ", ")?;