use crate::libvirt_lib_structures::XMLUuid; use std::net::{IpAddr, Ipv4Addr}; /// Network forward information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "forward")] pub struct NetworkForwardXML { #[serde(rename = "@mode")] pub mode: String, #[serde(default, rename = "@dev", skip_serializing_if = "String::is_empty")] pub dev: String, } /// Network bridge information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "bridge")] pub struct NetworkBridgeXML { #[serde(rename = "@name")] pub name: String, } /// Network DNS information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "dns")] pub struct NetworkDNSXML { pub forwarder: NetworkDNSForwarderXML, } /// Network DNS information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "forwarder")] pub struct NetworkDNSForwarderXML { /// Address of the DNS server #[serde(rename = "@addr")] pub addr: Ipv4Addr, } /// Network DNS information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "domain")] pub struct NetworkDomainXML { #[serde(rename = "@name")] pub name: String, } /// Network ip information #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "ip")] pub struct NetworkIPXML { #[serde(default, rename = "@family")] pub family: String, #[serde(rename = "@address")] pub address: IpAddr, /// Network Prefix #[serde(rename = "@prefix")] pub prefix: Option, /// Network Netmask. This field is never serialized, but because we can't know if LibVirt will /// provide us netmask or prefix, we need to handle both of these fields #[serde(rename = "@netmask", skip_serializing)] pub netmask: Option, pub dhcp: Option, } #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "dhcp")] pub struct NetworkDHCPXML { pub range: NetworkDHCPRangeXML, #[serde(default, rename = "host", skip_serializing_if = "Vec::is_empty")] pub hosts: Vec, } #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "host")] pub struct NetworkDHCPHostXML { #[serde(rename = "@mac", default, skip_serializing_if = "Option::is_none")] pub mac: Option, #[serde(rename = "@name")] pub name: String, #[serde(rename = "@ip")] pub ip: IpAddr, } #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "dhcp")] pub struct NetworkDHCPRangeXML { #[serde(rename = "@start")] pub start: IpAddr, #[serde(rename = "@end")] pub end: IpAddr, } /// Network information, see https://libvirt.org/formatnetwork.html #[derive(serde::Serialize, serde::Deserialize, Debug)] #[serde(rename = "network")] pub struct NetworkXML { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub uuid: Option, #[serde(skip_serializing_if = "Option::is_none")] pub title: Option, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub forward: Option, #[serde(skip_serializing_if = "Option::is_none")] pub bridge: Option, #[serde(skip_serializing_if = "Option::is_none")] pub dns: Option, #[serde(skip_serializing_if = "Option::is_none")] pub domain: Option, #[serde(default, rename = "ip")] pub ips: Vec, } impl NetworkXML { pub fn parse_xml(xml: &str) -> anyhow::Result { Ok(quick_xml::de::from_str(xml)?) } pub fn as_xml(&self) -> anyhow::Result { Ok(quick_xml::se::to_string(self)?) } }