diff --git a/src/api2/config/network.rs b/src/api2/config/network.rs index d0b4e942..1931196e 100644 --- a/src/api2/config/network.rs +++ b/src/api2/config/network.rs @@ -126,12 +126,12 @@ pub enum DeletableProperty { optional: true, }, comments_v4: { - description: "Comments (inet)", + description: "Comments (inet, may span multiple lines)", type: String, optional: true, }, comments_v6: { - description: "Comments (inet6)", + description: "Comments (inet5, may span multiple lines)", type: String, optional: true, }, @@ -221,8 +221,8 @@ pub fn update_interface( DeletableProperty::gateway_v6 => { interface.gateway_v6 = None; }, DeletableProperty::method_v4 => { interface.method_v4 = None; }, DeletableProperty::method_v6 => { interface.method_v6 = None; }, - DeletableProperty::comments_v4 => { interface.comments_v4 = Vec::new(); }, - DeletableProperty::comments_v6 => { interface.comments_v6 = Vec::new(); }, + DeletableProperty::comments_v4 => { interface.comments_v4 = None; }, + DeletableProperty::comments_v6 => { interface.comments_v6 = None; }, DeletableProperty::mtu => { interface.mtu = None; }, DeletableProperty::auto => { interface.auto = false; }, DeletableProperty::bridge_ports => { interface.set_bridge_ports(Vec::new())?; } @@ -266,13 +266,8 @@ pub fn update_interface( } } - if let Some(comments) = comments_v4 { - interface.comments_v4 = comments.lines().map(String::from).collect(); - } - - if let Some(comments) = comments_v6 { - interface.comments_v6 = comments.lines().map(String::from).collect(); - } + if comments_v4.is_some() { interface.comments_v4 = comments_v4; } + if comments_v6.is_some() { interface.comments_v6 = comments_v6; } network::save_config(&config)?; diff --git a/src/api2/types.rs b/src/api2/types.rs index 7595a54c..90207861 100644 --- a/src/api2/types.rs +++ b/src/api2/types.rs @@ -587,20 +587,14 @@ pub const NETWORK_INTERFACE_LIST_SCHEMA: Schema = ArraySchema::new( }, }, comments_v4: { - description: "Comments (inet)", - type: Array, - items: { - description: "Comment line.", - type: String, - }, + description: "Comments (inet, may span multiple lines)", + type: String, + optional: true, }, comments_v6: { - description: "Comments (inet6)", - type: Array, - items: { - description: "Comment line.", - type: String, - }, + description: "Comments (inet6, may span multiple lines)", + type: String, + optional: true, }, bridge_ports: { schema: NETWORK_INTERFACE_LIST_SCHEMA, @@ -645,10 +639,10 @@ pub struct Interface { #[serde(skip_serializing_if="Vec::is_empty")] pub options_v6: Vec, - #[serde(skip_serializing_if="Vec::is_empty")] - pub comments_v4: Vec, - #[serde(skip_serializing_if="Vec::is_empty")] - pub comments_v6: Vec, + #[serde(skip_serializing_if="Option::is_none")] + pub comments_v4: Option, + #[serde(skip_serializing_if="Option::is_none")] + pub comments_v6: Option, #[serde(skip_serializing_if="Option::is_none")] /// Maximum Transmission Unit diff --git a/src/config/network.rs b/src/config/network.rs index 12e13b8c..5b263115 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -32,8 +32,8 @@ impl Interface { gateway_v6: None, options_v4: Vec::new(), options_v6: Vec::new(), - comments_v4: Vec::new(), - comments_v6: Vec::new(), + comments_v4: None, + comments_v6: None, mtu: None, bridge_ports: None, bond_slaves: None, @@ -166,8 +166,10 @@ impl Interface { writeln!(w, " {}", option)?; } - for comment in &self.comments_v4 { - writeln!(w, "#4{}", comment)?; + if let Some(ref comments) = self.comments_v4 { + for comment in comments.lines() { + writeln!(w, "#{}", comment)?; + } } Ok(()) @@ -188,8 +190,10 @@ impl Interface { writeln!(w, " {}", option)?; } - for comment in &self.comments_v6 { - writeln!(w, "#6{}", comment)?; + if let Some(ref comments) = self.comments_v6 { + for comment in comments.lines() { + writeln!(w, "#{}", comment)?; + } } Ok(()) @@ -220,8 +224,8 @@ impl Interface { bond_slaves: _bond_slaves, } => { method_v4 == method_v6 - && comments_v4.is_empty() - && comments_v6.is_empty() + && comments_v4.is_none() + && comments_v6.is_none() && options_v4.is_empty() && options_v6.is_empty() } diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs index 9d1c7a11..c63c3477 100644 --- a/src/config/network/parser.rs +++ b/src/config/network/parser.rs @@ -182,9 +182,15 @@ impl NetworkParser { Token::Comment => { let comment = self.eat(Token::Comment)?; 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 { - 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)?; continue;