src/config/network.rs: parse bridge-ports

This commit is contained in:
Dietmar Maurer
2020-04-23 09:24:17 +02:00
parent 02269f3dba
commit 1d9a68c2fc
4 changed files with 55 additions and 0 deletions

View File

@ -33,6 +33,7 @@ impl Interface {
options_v4: Vec::new(),
options_v6: Vec::new(),
mtu: None,
bridge_ports: None,
}
}
@ -100,9 +101,24 @@ impl Interface {
/// Write attributes not dependening on address family
fn write_iface_attributes(&self, w: &mut dyn Write) -> Result<(), Error> {
match self.interface_type {
NetworkInterfaceType::Bridge => {
if let Some(ref ports) = self.bridge_ports {
if ports.is_empty() {
writeln!(w, " bridge-ports none")?;
} else {
writeln!(w, " bridge-ports {}", ports.join(" "))?;
}
}
}
_ => {}
}
if let Some(mtu) = self.mtu {
writeln!(w, " mtu {}", mtu)?;
}
Ok(())
}
@ -161,6 +177,7 @@ impl Interface {
gateway_v4: _gateway_v4,
gateway_v6: _gateway_v6,
mtu: _mtu,
bridge_ports: _bridge_ports,
} => {
method_v4 == method_v6
&& options_v4.is_empty()

View File

@ -22,6 +22,7 @@ pub enum Token {
Static,
Attribute,
MTU,
BridgePorts,
EOF,
}
@ -40,6 +41,8 @@ lazy_static! {
map.insert("netmask", Token::Netmask);
map.insert("static", Token::Static);
map.insert("mtu", Token::MTU);
map.insert("bridge-ports", Token::BridgePorts);
map.insert("bridge_ports", Token::BridgePorts);
map
};
}

View File

@ -156,6 +156,24 @@ impl <R: BufRead> NetworkParser<R> {
Ok(())
}
fn parse_iface_list(&mut self) -> Result<Vec<String>, Error> {
let mut list = Vec::new();
loop {
let (token, text) = self.next()?;
match token {
Token::Newline => break,
Token::Text => {
if &text != "none" {
list.push(text);
}
}
_ => bail!("unable to parse interface list - unexpected token '{:?}'", token),
}
}
Ok(list)
}
fn parse_iface_attributes(&mut self, interface: &mut Interface) -> Result<(), Error> {
loop {
@ -172,6 +190,12 @@ impl <R: BufRead> NetworkParser<R> {
let mtu = self.parse_iface_mtu()?;
interface.mtu = Some(mtu);
}
Token::BridgePorts => {
self.eat(Token::BridgePorts)?;
let ports = self.parse_iface_list()?;
interface.bridge_ports = Some(ports);
interface.interface_type = NetworkInterfaceType::Bridge;
}
Token::Netmask => bail!("netmask is deprecated and no longer supported"),
_ => {
self.parse_iface_addon_attribute(interface)?;