src/config/network.rs: use a simple String for comments

This commit is contained in:
Dietmar Maurer 2020-04-24 07:46:08 +02:00
parent 96d9478668
commit 8a6b86b8a7
4 changed files with 36 additions and 37 deletions

View File

@ -126,12 +126,12 @@ pub enum DeletableProperty {
optional: true, optional: true,
}, },
comments_v4: { comments_v4: {
description: "Comments (inet)", description: "Comments (inet, may span multiple lines)",
type: String, type: String,
optional: true, optional: true,
}, },
comments_v6: { comments_v6: {
description: "Comments (inet6)", description: "Comments (inet5, may span multiple lines)",
type: String, type: String,
optional: true, optional: true,
}, },
@ -221,8 +221,8 @@ pub fn update_interface(
DeletableProperty::gateway_v6 => { interface.gateway_v6 = None; }, DeletableProperty::gateway_v6 => { interface.gateway_v6 = None; },
DeletableProperty::method_v4 => { interface.method_v4 = None; }, DeletableProperty::method_v4 => { interface.method_v4 = None; },
DeletableProperty::method_v6 => { interface.method_v6 = None; }, DeletableProperty::method_v6 => { interface.method_v6 = None; },
DeletableProperty::comments_v4 => { interface.comments_v4 = Vec::new(); }, DeletableProperty::comments_v4 => { interface.comments_v4 = None; },
DeletableProperty::comments_v6 => { interface.comments_v6 = Vec::new(); }, DeletableProperty::comments_v6 => { interface.comments_v6 = None; },
DeletableProperty::mtu => { interface.mtu = None; }, DeletableProperty::mtu => { interface.mtu = None; },
DeletableProperty::auto => { interface.auto = false; }, DeletableProperty::auto => { interface.auto = false; },
DeletableProperty::bridge_ports => { interface.set_bridge_ports(Vec::new())?; } DeletableProperty::bridge_ports => { interface.set_bridge_ports(Vec::new())?; }
@ -266,13 +266,8 @@ pub fn update_interface(
} }
} }
if let Some(comments) = comments_v4 { if comments_v4.is_some() { interface.comments_v4 = comments_v4; }
interface.comments_v4 = comments.lines().map(String::from).collect(); if comments_v6.is_some() { interface.comments_v6 = comments_v6; }
}
if let Some(comments) = comments_v6 {
interface.comments_v6 = comments.lines().map(String::from).collect();
}
network::save_config(&config)?; network::save_config(&config)?;

View File

@ -587,20 +587,14 @@ pub const NETWORK_INTERFACE_LIST_SCHEMA: Schema = ArraySchema::new(
}, },
}, },
comments_v4: { comments_v4: {
description: "Comments (inet)", description: "Comments (inet, may span multiple lines)",
type: Array, type: String,
items: { optional: true,
description: "Comment line.",
type: String,
},
}, },
comments_v6: { comments_v6: {
description: "Comments (inet6)", description: "Comments (inet6, may span multiple lines)",
type: Array, type: String,
items: { optional: true,
description: "Comment line.",
type: String,
},
}, },
bridge_ports: { bridge_ports: {
schema: NETWORK_INTERFACE_LIST_SCHEMA, schema: NETWORK_INTERFACE_LIST_SCHEMA,
@ -645,10 +639,10 @@ pub struct Interface {
#[serde(skip_serializing_if="Vec::is_empty")] #[serde(skip_serializing_if="Vec::is_empty")]
pub options_v6: Vec<String>, pub options_v6: Vec<String>,
#[serde(skip_serializing_if="Vec::is_empty")] #[serde(skip_serializing_if="Option::is_none")]
pub comments_v4: Vec<String>, pub comments_v4: Option<String>,
#[serde(skip_serializing_if="Vec::is_empty")] #[serde(skip_serializing_if="Option::is_none")]
pub comments_v6: Vec<String>, pub comments_v6: Option<String>,
#[serde(skip_serializing_if="Option::is_none")] #[serde(skip_serializing_if="Option::is_none")]
/// Maximum Transmission Unit /// Maximum Transmission Unit

View File

@ -32,8 +32,8 @@ impl Interface {
gateway_v6: None, gateway_v6: None,
options_v4: Vec::new(), options_v4: Vec::new(),
options_v6: Vec::new(), options_v6: Vec::new(),
comments_v4: Vec::new(), comments_v4: None,
comments_v6: Vec::new(), comments_v6: None,
mtu: None, mtu: None,
bridge_ports: None, bridge_ports: None,
bond_slaves: None, bond_slaves: None,
@ -166,8 +166,10 @@ impl Interface {
writeln!(w, " {}", option)?; writeln!(w, " {}", option)?;
} }
for comment in &self.comments_v4 { if let Some(ref comments) = self.comments_v4 {
writeln!(w, "#4{}", comment)?; for comment in comments.lines() {
writeln!(w, "#{}", comment)?;
}
} }
Ok(()) Ok(())
@ -188,8 +190,10 @@ impl Interface {
writeln!(w, " {}", option)?; writeln!(w, " {}", option)?;
} }
for comment in &self.comments_v6 { if let Some(ref comments) = self.comments_v6 {
writeln!(w, "#6{}", comment)?; for comment in comments.lines() {
writeln!(w, "#{}", comment)?;
}
} }
Ok(()) Ok(())
@ -220,8 +224,8 @@ impl Interface {
bond_slaves: _bond_slaves, bond_slaves: _bond_slaves,
} => { } => {
method_v4 == method_v6 method_v4 == method_v6
&& comments_v4.is_empty() && comments_v4.is_none()
&& comments_v6.is_empty() && comments_v6.is_none()
&& options_v4.is_empty() && options_v4.is_empty()
&& options_v6.is_empty() && options_v6.is_empty()
} }

View File

@ -182,9 +182,15 @@ impl <R: BufRead> NetworkParser<R> {
Token::Comment => { Token::Comment => {
let comment = self.eat(Token::Comment)?; let comment = self.eat(Token::Comment)?;
if !address_family_v4 && address_family_v6 { if !address_family_v4 && address_family_v6 {
interface.comments_v6.push(comment); let mut comments = interface.comments_v6.take().unwrap_or(String::new());
if !comments.is_empty() { comments.push('\n'); }
comments.push_str(&comment);
interface.comments_v6 = Some(comments);
} else { } else {
interface.comments_v4.push(comment); let mut comments = interface.comments_v4.take().unwrap_or(String::new());
if !comments.is_empty() { comments.push('\n'); }
comments.push_str(&comment);
interface.comments_v4 = Some(comments);
} }
self.eat(Token::Newline)?; self.eat(Token::Newline)?;
continue; continue;