chore: Reorganize file tree for easier onboarding. Rust project now at the root for simple git clone && cargo run
This commit is contained in:
22
opnsense-config-xml/Cargo.toml
Normal file
22
opnsense-config-xml/Cargo.toml
Normal file
@@ -0,0 +1,22 @@
|
||||
[package]
|
||||
name = "opnsense-config-xml"
|
||||
edition = "2021"
|
||||
version.workspace = true
|
||||
readme.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1.0.123", features = [ "derive" ] }
|
||||
log = { workspace = true }
|
||||
env_logger = { workspace = true }
|
||||
yaserde = { git = "https://github.com/jggc/yaserde.git" }
|
||||
yaserde_derive = { git = "https://github.com/jggc/yaserde.git" }
|
||||
xml-rs = "0.8"
|
||||
thiserror = "1.0"
|
||||
async-trait = { workspace = true }
|
||||
tokio = { workspace = true }
|
||||
uuid = { workspace = true }
|
||||
rand = { workspace = true }
|
||||
|
||||
[dev-dependencies]
|
||||
pretty_assertions = "1.4.1"
|
||||
85
opnsense-config-xml/src/data/caddy.rs
Normal file
85
opnsense-config-xml/src/data/caddy.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
use yaserde::MaybeString;
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Pischem {
|
||||
pub caddy: Caddy,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Caddy {
|
||||
pub general: CaddyGeneral,
|
||||
pub reverseproxy: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct CaddyGeneral {
|
||||
pub enabled: u8,
|
||||
#[yaserde(rename = "EnableLayer4")]
|
||||
pub enable_layer4: Option<u8>,
|
||||
#[yaserde(rename = "HttpPort")]
|
||||
pub http_port: Option<u16>,
|
||||
#[yaserde(rename = "HttpsPort")]
|
||||
pub https_port: Option<u16>,
|
||||
#[yaserde(rename = "TlsEmail")]
|
||||
pub tls_email: MaybeString,
|
||||
#[yaserde(rename = "TlsAutoHttps")]
|
||||
pub tls_auto_https: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsProvider")]
|
||||
pub tls_dns_provider: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsApiKey")]
|
||||
pub tls_dns_api_key: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsSecretApiKey")]
|
||||
pub tls_dns_secret_api_key: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsOptionalField1")]
|
||||
pub tls_dns_optional_field1: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsOptionalField2")]
|
||||
pub tls_dns_optional_field2: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsOptionalField3")]
|
||||
pub tls_dns_optional_field3: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsOptionalField4")]
|
||||
pub tls_dns_optional_field4: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsPropagationTimeout")]
|
||||
pub tls_dns_propagation_timeout: MaybeString,
|
||||
#[yaserde(rename = "TlsDnsPropagationResolvers")]
|
||||
pub tls_dns_propagation_resolvers: MaybeString,
|
||||
pub accesslist: MaybeString,
|
||||
#[yaserde(rename = "DisableSuperuser")]
|
||||
pub disable_superuser: Option<i32>,
|
||||
#[yaserde(rename = "GracePeriod")]
|
||||
pub grace_period: Option<u16>,
|
||||
#[yaserde(rename = "HttpVersion")]
|
||||
pub http_version: Option<MaybeString>,
|
||||
#[yaserde(rename = "HttpVersions")]
|
||||
pub http_versions: Option<MaybeString>,
|
||||
#[yaserde(rename = "LogCredentials")]
|
||||
pub log_credentials: MaybeString,
|
||||
#[yaserde(rename = "LogAccessPlain")]
|
||||
pub log_access_plain: MaybeString,
|
||||
#[yaserde(rename = "LogAccessPlainKeep")]
|
||||
pub log_access_plain_keep: Option<u16>,
|
||||
#[yaserde(rename = "LogLevel")]
|
||||
pub log_level: MaybeString,
|
||||
#[yaserde(rename = "DynDnsSimpleHttp")]
|
||||
pub dyn_dns_simple_http: MaybeString,
|
||||
#[yaserde(rename = "DynDnsInterface")]
|
||||
pub dyn_dns_interface: MaybeString,
|
||||
#[yaserde(rename = "DynDnsInterval")]
|
||||
pub dyn_dns_interval: MaybeString,
|
||||
#[yaserde(rename = "DynDnsIpVersions")]
|
||||
pub dyn_dns_ip_versions: MaybeString,
|
||||
#[yaserde(rename = "DynDnsTtl")]
|
||||
pub dyn_dns_ttl: MaybeString,
|
||||
#[yaserde(rename = "DynDnsUpdateOnly")]
|
||||
pub dyn_dns_update_only: MaybeString,
|
||||
#[yaserde(rename = "AuthProvider")]
|
||||
pub auth_provider: MaybeString,
|
||||
#[yaserde(rename = "AuthToDomain")]
|
||||
pub auth_to_domain: MaybeString,
|
||||
#[yaserde(rename = "AuthToPort")]
|
||||
pub auth_to_port: MaybeString,
|
||||
#[yaserde(rename = "AuthToTls")]
|
||||
pub auth_to_tls: Option<i32>,
|
||||
#[yaserde(rename = "AuthToUri")]
|
||||
pub auth_to_uri: MaybeString,
|
||||
}
|
||||
118
opnsense-config-xml/src/data/dhcpd.rs
Normal file
118
opnsense-config-xml/src/data/dhcpd.rs
Normal file
@@ -0,0 +1,118 @@
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
use yaserde::MaybeString;
|
||||
|
||||
use super::opnsense::{NumberOption, Range, StaticMap};
|
||||
|
||||
// #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
// #[yaserde(rename = "dhcpd")]
|
||||
// pub struct Dhcpd {
|
||||
// #[yaserde(rename = "lan")]
|
||||
// pub lan: DhcpInterface,
|
||||
// }
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct DhcpInterface {
|
||||
pub enable: Option<MaybeString>,
|
||||
pub gateway: Option<MaybeString>,
|
||||
pub domain: Option<MaybeString>,
|
||||
pub tftp: Option<String>,
|
||||
pub bootfilename: Option<String>,
|
||||
pub netboot: Option<u32>,
|
||||
pub nextserver: Option<String>,
|
||||
pub filename64: Option<String>,
|
||||
#[yaserde(rename = "ddnsdomainalgorithm")]
|
||||
pub ddns_domain_algorithm: Option<MaybeString>,
|
||||
#[yaserde(rename = "numberoptions")]
|
||||
pub number_options: Vec<NumberOption>,
|
||||
#[yaserde(rename = "range")]
|
||||
pub range: Range,
|
||||
pub winsserver: Option<MaybeString>,
|
||||
pub dnsserver: Option<MaybeString>,
|
||||
pub ntpserver: Option<MaybeString>,
|
||||
#[yaserde(rename = "staticmap")]
|
||||
pub staticmaps: Vec<StaticMap>,
|
||||
pub pool: Option<MaybeString>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct DhcpRange {
|
||||
#[yaserde(rename = "from")]
|
||||
pub from: String,
|
||||
#[yaserde(rename = "to")]
|
||||
pub to: String,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::xml_utils::to_xml_str;
|
||||
|
||||
use pretty_assertions::assert_eq;
|
||||
|
||||
#[test]
|
||||
fn dhcpd_should_deserialize_serialize_identical() {
|
||||
let dhcpd: Dhcpd =
|
||||
yaserde::de::from_str(SERIALIZED_DHCPD).expect("Deserialize Dhcpd failed");
|
||||
|
||||
assert_eq!(
|
||||
to_xml_str(&dhcpd).expect("Serialize Dhcpd failed"),
|
||||
SERIALIZED_DHCPD
|
||||
);
|
||||
}
|
||||
|
||||
const SERIALIZED_DHCPD: &str = "<?xml version=\"1.0\"?>
|
||||
<dhcpd>
|
||||
<lan>
|
||||
<enable>1</enable>
|
||||
<gateway>192.168.20.1</gateway>
|
||||
<domain>somedomain.yourlocal.mcd</domain>
|
||||
<ddnsdomainalgorithm>hmac-md5</ddnsdomainalgorithm>
|
||||
<numberoptions>
|
||||
<item/>
|
||||
</numberoptions>
|
||||
<range>
|
||||
<from>192.168.20.50</from>
|
||||
<to>192.168.20.200</to>
|
||||
</range>
|
||||
<winsserver/>
|
||||
<dnsserver>192.168.20.1</dnsserver>
|
||||
<ntpserver/>
|
||||
<staticmap>
|
||||
<mac>55:55:55:55:55:1c</mac>
|
||||
<ipaddr>192.168.20.160</ipaddr>
|
||||
<hostname>somehost983</hostname>
|
||||
<descr>someservire8</descr>
|
||||
<winsserver/>
|
||||
<dnsserver/>
|
||||
<ntpserver/>
|
||||
</staticmap>
|
||||
<staticmap>
|
||||
<mac>55:55:55:55:55:1c</mac>
|
||||
<ipaddr>192.168.20.155</ipaddr>
|
||||
<hostname>somehost893</hostname>
|
||||
<winsserver/>
|
||||
<dnsserver/>
|
||||
<ntpserver/>
|
||||
</staticmap>
|
||||
<staticmap>
|
||||
<mac>55:55:55:55:55:1c</mac>
|
||||
<ipaddr>192.168.20.165</ipaddr>
|
||||
<hostname>somehost893</hostname>
|
||||
<descr/>
|
||||
<winsserver/>
|
||||
<dnsserver/>
|
||||
<ntpserver/>
|
||||
</staticmap>
|
||||
<staticmap>
|
||||
<mac>55:55:55:55:55:1c</mac>
|
||||
<ipaddr>192.168.20.50</ipaddr>
|
||||
<hostname>hostswitch2</hostname>
|
||||
<descr>switch-2 (bottom)</descr>
|
||||
<winsserver/>
|
||||
<dnsserver/>
|
||||
<ntpserver/>
|
||||
</staticmap>
|
||||
<pool/>
|
||||
</lan>
|
||||
</dhcpd>\n";
|
||||
}
|
||||
637
opnsense-config-xml/src/data/haproxy.rs
Normal file
637
opnsense-config-xml/src/data/haproxy.rs
Normal file
@@ -0,0 +1,637 @@
|
||||
use rand;
|
||||
use rand::Rng;
|
||||
use xml::reader::XmlEvent as ReadEvent;
|
||||
use xml::writer::XmlEvent as WriteEvent;
|
||||
use yaserde::MaybeString;
|
||||
use yaserde::{YaDeserialize as YaDeserializeTrait, YaSerialize as YaSerializeTrait};
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
impl YaDeserializeTrait for HAProxyId {
|
||||
fn deserialize<R: std::io::Read>(
|
||||
reader: &mut yaserde::de::Deserializer<R>,
|
||||
) -> Result<Self, String> {
|
||||
let _field_name = match reader.peek()? {
|
||||
ReadEvent::StartElement {
|
||||
name, attributes, ..
|
||||
} => {
|
||||
if attributes.len() > 0 {
|
||||
return Err(String::from(
|
||||
"Attributes not currently supported by HAProxyId",
|
||||
));
|
||||
}
|
||||
|
||||
name.local_name.clone()
|
||||
}
|
||||
_ => return Err(String::from("Unsupporte ReadEvent type")),
|
||||
};
|
||||
reader.next_event()?;
|
||||
|
||||
let content = match reader.peek()? {
|
||||
ReadEvent::Characters(content) => content.clone(),
|
||||
ReadEvent::EndElement { name: _ } => String::new(),
|
||||
_ => return Err(String::from("Unsupporte ReadEvent type")),
|
||||
};
|
||||
|
||||
Ok(Self(content))
|
||||
}
|
||||
}
|
||||
|
||||
impl YaSerializeTrait for HAProxyId {
|
||||
fn serialize<W: std::io::Write>(
|
||||
&self,
|
||||
writer: &mut yaserde::ser::Serializer<W>,
|
||||
) -> Result<(), String> {
|
||||
let yaserde_label = writer.get_start_event_name();
|
||||
|
||||
match yaserde_label {
|
||||
Some(label) => {
|
||||
let struct_start_event = xml::writer::XmlEvent::start_element(label.as_ref());
|
||||
writer
|
||||
.write(struct_start_event)
|
||||
.map_err(|_e| format!("Start element {label:?} write failed"))?;
|
||||
}
|
||||
None => return Err("HAPRoxyId must have a label preset in the writer".to_string()),
|
||||
};
|
||||
|
||||
writer
|
||||
.write(WriteEvent::characters(&self.0))
|
||||
.expect("Writer failed");
|
||||
|
||||
writer
|
||||
.write(WriteEvent::end_element())
|
||||
.expect("Writer failed");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn serialize_attributes(
|
||||
&self,
|
||||
_attributes: Vec<xml::attribute::OwnedAttribute>,
|
||||
_namespace: xml::namespace::Namespace,
|
||||
) -> Result<
|
||||
(
|
||||
Vec<xml::attribute::OwnedAttribute>,
|
||||
xml::namespace::Namespace,
|
||||
),
|
||||
String,
|
||||
> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
pub struct HAProxyId(String);
|
||||
|
||||
impl Default for HAProxyId {
|
||||
fn default() -> Self {
|
||||
let mut rng = rand::thread_rng();
|
||||
Self(format!("{:x}.{:x}", rng.gen::<u64>(), rng.gen::<u32>()))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
#[yaserde(rename = "HAProxy")]
|
||||
pub struct HAProxy {
|
||||
#[yaserde(attribute = true)]
|
||||
pub version: String,
|
||||
pub general: HaProxyGeneral,
|
||||
pub frontends: HAProxyFrontends,
|
||||
pub backends: HAProxyBackends,
|
||||
pub servers: HAProxyServers,
|
||||
pub healthchecks: HAProxyHealthChecks,
|
||||
pub acls: MaybeString,
|
||||
pub actions: MaybeString,
|
||||
pub luas: MaybeString,
|
||||
pub fcgis: MaybeString,
|
||||
pub errorfiles: MaybeString,
|
||||
pub mapfiles: MaybeString,
|
||||
pub groups: MaybeString,
|
||||
pub users: MaybeString,
|
||||
pub cpus: MaybeString,
|
||||
pub resolvers: MaybeString,
|
||||
pub mailers: MaybeString,
|
||||
pub maintenance: Maintenance,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Maintenance {
|
||||
#[yaserde(rename = "cronjobs")]
|
||||
pub cronjobs: CronJobs,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct CronJobs {
|
||||
#[yaserde(rename = "syncCerts")]
|
||||
pub sync_certs: u32,
|
||||
#[yaserde(rename = "syncCertsCron")]
|
||||
pub sync_certs_cron: MaybeString,
|
||||
#[yaserde(rename = "updateOcsp")]
|
||||
pub update_ocsp: u32,
|
||||
#[yaserde(rename = "updateOcspCron")]
|
||||
pub update_ocsp_cron: MaybeString,
|
||||
#[yaserde(rename = "reloadService")]
|
||||
pub reload_service: u32,
|
||||
#[yaserde(rename = "reloadServiceCron")]
|
||||
pub reload_service_cron: MaybeString,
|
||||
#[yaserde(rename = "restartService")]
|
||||
pub restart_service: u32,
|
||||
#[yaserde(rename = "restartServiceCron")]
|
||||
pub restart_service_cron: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HaProxyGeneral {
|
||||
pub enabled: i32,
|
||||
#[yaserde(rename = "gracefulStop")]
|
||||
pub graceful_stop: i32,
|
||||
#[yaserde(rename = "hardStopAfter")]
|
||||
pub hard_stop_after: String,
|
||||
#[yaserde(rename = "closeSpreadTime")]
|
||||
pub close_spread_time: MaybeString,
|
||||
#[yaserde(rename = "seamlessReload")]
|
||||
pub seamless_reload: i32,
|
||||
#[yaserde(rename = "storeOcsp")]
|
||||
pub store_ocsp: i32,
|
||||
#[yaserde(rename = "showIntro")]
|
||||
pub show_intro: i32,
|
||||
pub peers: Peers,
|
||||
pub tuning: Tuning,
|
||||
pub defaults: HaProxyDefaults,
|
||||
pub logging: HaProxyLogging,
|
||||
pub stats: Stats,
|
||||
pub cache: HaProxyCache,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Peers {
|
||||
pub enabled: i32,
|
||||
pub name1: MaybeString,
|
||||
pub listen1: MaybeString,
|
||||
pub port1: i32,
|
||||
pub name2: MaybeString,
|
||||
pub listen2: MaybeString,
|
||||
pub port2: i32,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Tuning {
|
||||
pub root: i32,
|
||||
#[yaserde(rename = "maxConnections")]
|
||||
pub max_connections: MaybeString,
|
||||
pub nbthread: i32,
|
||||
#[yaserde(rename = "resolversPrefer")]
|
||||
pub resolvers_prefer: String,
|
||||
#[yaserde(rename = "sslServerVerify")]
|
||||
pub ssl_server_verify: String,
|
||||
#[yaserde(rename = "maxDHSize")]
|
||||
pub max_dh_size: i32,
|
||||
#[yaserde(rename = "bufferSize")]
|
||||
pub buffer_size: i32,
|
||||
#[yaserde(rename = "spreadChecks")]
|
||||
pub spread_checks: i32,
|
||||
#[yaserde(rename = "bogusProxyEnabled")]
|
||||
pub bogus_proxy_enabled: i32,
|
||||
#[yaserde(rename = "luaMaxMem")]
|
||||
pub lua_max_mem: i32,
|
||||
#[yaserde(rename = "customOptions")]
|
||||
pub custom_options: MaybeString,
|
||||
#[yaserde(rename = "ocspUpdateEnabled")]
|
||||
pub ocs_update_enabled: MaybeString,
|
||||
#[yaserde(rename = "ocspUpdateMinDelay")]
|
||||
pub ocs_update_min_delay: MaybeString,
|
||||
#[yaserde(rename = "ocspUpdateMaxDelay")]
|
||||
pub ocs_update_max_delay: MaybeString,
|
||||
#[yaserde(rename = "ssl_defaultsEnabled")]
|
||||
pub ssl_defaults_enabled: i32,
|
||||
#[yaserde(rename = "ssl_bindOptions")]
|
||||
pub ssl_bind_options: MaybeString,
|
||||
#[yaserde(rename = "ssl_minVersion")]
|
||||
pub ssl_min_version: MaybeString,
|
||||
#[yaserde(rename = "ssl_maxVersion")]
|
||||
pub ssl_max_version: MaybeString,
|
||||
#[yaserde(rename = "ssl_cipherList")]
|
||||
pub ssl_cipher_list: MaybeString,
|
||||
#[yaserde(rename = "ssl_cipherSuites")]
|
||||
pub ssl_cipher_suites: MaybeString,
|
||||
#[yaserde(rename = "h2_initialWindowSize")]
|
||||
pub h2_initial_window_size: Option<MaybeString>,
|
||||
#[yaserde(rename = "h2_initialWindowSizeOutgoing")]
|
||||
pub h2_initial_window_size_outgoing: Option<MaybeString>,
|
||||
#[yaserde(rename = "h2_initialWindowSizeIncoming")]
|
||||
pub h2_initial_window_size_incoming: Option<MaybeString>,
|
||||
#[yaserde(rename = "h2_maxConcurrentStreams")]
|
||||
pub h2_max_concurrent_streams: Option<MaybeString>,
|
||||
#[yaserde(rename = "h2_maxConcurrentStreamsOutgoing")]
|
||||
pub h2_max_concurrent_streams_outgoing: Option<MaybeString>,
|
||||
#[yaserde(rename = "h2_maxConcurrentStreamsIncoming")]
|
||||
pub h2_max_concurrent_streams_incoming: Option<MaybeString>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HaProxyDefaults {
|
||||
#[yaserde(rename = "maxConnections")]
|
||||
pub max_connections: MaybeString,
|
||||
#[yaserde(rename = "maxConnectionsServers")]
|
||||
pub max_connections_servers: MaybeString,
|
||||
#[yaserde(rename = "timeoutClient")]
|
||||
pub timeout_client: String,
|
||||
#[yaserde(rename = "timeoutConnect")]
|
||||
pub timeout_connect: String,
|
||||
#[yaserde(rename = "timeoutCheck")]
|
||||
pub timeout_check: MaybeString,
|
||||
#[yaserde(rename = "timeoutServer")]
|
||||
pub timeout_server: String,
|
||||
pub retries: i32,
|
||||
pub redispatch: String,
|
||||
pub init_addr: String,
|
||||
#[yaserde(rename = "customOptions")]
|
||||
pub custom_options: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HaProxyLogging {
|
||||
pub host: String,
|
||||
pub facility: String,
|
||||
pub level: String,
|
||||
pub length: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Stats {
|
||||
pub enabled: i32,
|
||||
pub port: i32,
|
||||
#[yaserde(rename = "remoteEnabled")]
|
||||
pub remote_enabled: i32,
|
||||
#[yaserde(rename = "remoteBind")]
|
||||
pub remote_bind: MaybeString,
|
||||
#[yaserde(rename = "authEnabled")]
|
||||
pub auth_enabled: i32,
|
||||
#[yaserde(rename = "users")]
|
||||
pub users: MaybeString,
|
||||
#[yaserde(rename = "allowedUsers")]
|
||||
pub allowed_users: MaybeString,
|
||||
#[yaserde(rename = "allowedGroups")]
|
||||
pub allowed_groups: MaybeString,
|
||||
#[yaserde(rename = "customOptions")]
|
||||
pub custom_options: MaybeString,
|
||||
pub prometheus_enabled: i32,
|
||||
pub prometheus_bind: String,
|
||||
pub prometheus_path: String,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HaProxyCache {
|
||||
pub enabled: i32,
|
||||
#[yaserde(rename = "totalMaxSize")]
|
||||
pub total_max_size: i32,
|
||||
#[yaserde(rename = "maxAge")]
|
||||
pub max_age: i32,
|
||||
#[yaserde(rename = "maxObjectSize")]
|
||||
pub max_object_size: MaybeString,
|
||||
#[yaserde(rename = "processVary")]
|
||||
pub process_vary: i32,
|
||||
#[yaserde(rename = "maxSecondaryEntries")]
|
||||
pub max_secondary_entries: i32,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyFrontends {
|
||||
pub frontend: Vec<Frontend>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Frontend {
|
||||
#[yaserde(attribute = true)]
|
||||
pub uuid: String,
|
||||
pub id: HAProxyId,
|
||||
pub enabled: i32,
|
||||
pub name: String,
|
||||
pub description: MaybeString,
|
||||
pub bind: String,
|
||||
#[yaserde(rename = "bindOptions")]
|
||||
pub bind_options: MaybeString,
|
||||
pub mode: String,
|
||||
#[yaserde(rename = "defaultBackend")]
|
||||
pub default_backend: String,
|
||||
pub ssl_enabled: i32,
|
||||
pub ssl_certificates: MaybeString,
|
||||
pub ssl_default_certificate: MaybeString,
|
||||
#[yaserde(rename = "ssl_customOptions")]
|
||||
pub ssl_custom_options: MaybeString,
|
||||
#[yaserde(rename = "ssl_advancedEnabled")]
|
||||
pub ssl_advanced_enabled: i32,
|
||||
#[yaserde(rename = "ssl_bindOptions")]
|
||||
pub ssl_bind_options: MaybeString,
|
||||
#[yaserde(rename = "ssl_minVersion")]
|
||||
pub ssl_min_version: MaybeString,
|
||||
#[yaserde(rename = "ssl_maxVersion")]
|
||||
pub ssl_max_version: MaybeString,
|
||||
#[yaserde(rename = "ssl_cipherList")]
|
||||
pub ssl_cipher_list: MaybeString,
|
||||
#[yaserde(rename = "ssl_cipherSuites")]
|
||||
pub ssl_cipher_suites: MaybeString,
|
||||
#[yaserde(rename = "ssl_hstsEnabled")]
|
||||
pub ssl_hsts_enabled: i32,
|
||||
#[yaserde(rename = "ssl_hstsIncludeSubDomains")]
|
||||
pub ssl_hsts_include_sub_domains: i32,
|
||||
#[yaserde(rename = "ssl_hstsPreload")]
|
||||
pub ssl_hsts_preload: i32,
|
||||
#[yaserde(rename = "ssl_hstsMaxAge")]
|
||||
pub ssl_hsts_max_age: i32,
|
||||
#[yaserde(rename = "ssl_clientAuthEnabled")]
|
||||
pub ssl_client_auth_enabled: i32,
|
||||
#[yaserde(rename = "ssl_clientAuthVerify")]
|
||||
pub ssl_client_auth_verify: MaybeString,
|
||||
#[yaserde(rename = "ssl_clientAuthCAs")]
|
||||
pub ssl_client_auth_cas: MaybeString,
|
||||
#[yaserde(rename = "ssl_clientAuthCRLs")]
|
||||
pub ssl_client_auth_cr_ls: MaybeString,
|
||||
#[yaserde(rename = "basicAuthEnabled")]
|
||||
pub basic_auth_enabled: i32,
|
||||
#[yaserde(rename = "basicAuthUsers")]
|
||||
pub basic_auth_users: MaybeString,
|
||||
#[yaserde(rename = "basicAuthGroups")]
|
||||
pub basic_auth_groups: MaybeString,
|
||||
#[yaserde(rename = "tuning_maxConnections")]
|
||||
pub tuning_max_connections: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutClient")]
|
||||
pub tuning_timeout_client: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutHttpReq")]
|
||||
pub tuning_timeout_http_req: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutHttpKeepAlive")]
|
||||
pub tuning_timeout_http_keep_alive: MaybeString,
|
||||
#[yaserde(rename = "linkedCpuAffinityRules")]
|
||||
pub linked_cpu_affinity_rules: MaybeString,
|
||||
pub tuning_shards: MaybeString,
|
||||
#[yaserde(rename = "logging_dontLogNull")]
|
||||
pub logging_dont_log_null: i32,
|
||||
#[yaserde(rename = "logging_dontLogNormal")]
|
||||
pub logging_dont_log_normal: i32,
|
||||
#[yaserde(rename = "logging_logSeparateErrors")]
|
||||
pub logging_log_separate_errors: i32,
|
||||
#[yaserde(rename = "logging_detailedLog")]
|
||||
pub logging_detailed_log: i32,
|
||||
#[yaserde(rename = "logging_socketStats")]
|
||||
pub logging_socket_stats: i32,
|
||||
pub stickiness_pattern: MaybeString,
|
||||
#[yaserde(rename = "stickiness_dataTypes")]
|
||||
pub stickiness_data_types: MaybeString,
|
||||
pub stickiness_expire: MaybeString,
|
||||
pub stickiness_size: MaybeString,
|
||||
pub stickiness_counter: i32,
|
||||
pub stickiness_counter_key: MaybeString,
|
||||
pub stickiness_length: MaybeString,
|
||||
#[yaserde(rename = "stickiness_connRatePeriod")]
|
||||
pub stickiness_conn_rate_period: MaybeString,
|
||||
#[yaserde(rename = "stickiness_sessRatePeriod")]
|
||||
pub stickiness_sess_rate_period: MaybeString,
|
||||
#[yaserde(rename = "stickiness_httpReqRatePeriod")]
|
||||
pub stickiness_http_req_rate_period: MaybeString,
|
||||
#[yaserde(rename = "stickiness_httpErrRatePeriod")]
|
||||
pub stickiness_http_err_rate_period: MaybeString,
|
||||
#[yaserde(rename = "stickiness_bytesInRatePeriod")]
|
||||
pub stickiness_bytes_in_rate_period: MaybeString,
|
||||
#[yaserde(rename = "stickiness_bytesOutRatePeriod")]
|
||||
pub stickiness_bytes_out_rate_period: MaybeString,
|
||||
#[yaserde(rename = "http2Enabled")]
|
||||
pub http2_enabled: i32,
|
||||
#[yaserde(rename = "http2Enabled_nontls")]
|
||||
pub http2_enabled_nontls: i32,
|
||||
pub advertised_protocols: MaybeString,
|
||||
#[yaserde(rename = "forwardFor")]
|
||||
pub forward_for: i32,
|
||||
pub prometheus_enabled: i32,
|
||||
pub prometheus_path: MaybeString,
|
||||
#[yaserde(rename = "connectionBehaviour")]
|
||||
pub connection_behaviour: MaybeString,
|
||||
#[yaserde(rename = "customOptions")]
|
||||
pub custom_options: MaybeString,
|
||||
#[yaserde(rename = "linkedActions")]
|
||||
pub linked_actions: MaybeString,
|
||||
#[yaserde(rename = "linkedErrorfiles")]
|
||||
pub linked_error_files: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyBackends {
|
||||
#[yaserde(rename = "backend")]
|
||||
pub backends: Vec<HAProxyBackend>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyBackend {
|
||||
#[yaserde(attribute = true, rename = "uuid")]
|
||||
pub uuid: String,
|
||||
#[yaserde(rename = "id")]
|
||||
pub id: HAProxyId,
|
||||
#[yaserde(rename = "enabled")]
|
||||
pub enabled: u8,
|
||||
#[yaserde(rename = "name")]
|
||||
pub name: String,
|
||||
#[yaserde(rename = "description")]
|
||||
pub description: MaybeString,
|
||||
#[yaserde(rename = "mode")]
|
||||
pub mode: String,
|
||||
#[yaserde(rename = "algorithm")]
|
||||
pub algorithm: String,
|
||||
#[yaserde(rename = "random_draws")]
|
||||
pub random_draws: Option<u32>,
|
||||
#[yaserde(rename = "proxyProtocol")]
|
||||
pub proxy_protocol: MaybeString,
|
||||
#[yaserde(rename = "linkedServers")]
|
||||
pub linked_servers: MaybeString,
|
||||
#[yaserde(rename = "linkedFcgi")]
|
||||
pub linked_fcgi: MaybeString,
|
||||
#[yaserde(rename = "linkedResolver")]
|
||||
pub linked_resolver: MaybeString,
|
||||
#[yaserde(rename = "resolverOpts")]
|
||||
pub resolver_opts: MaybeString,
|
||||
#[yaserde(rename = "resolvePrefer")]
|
||||
pub resolve_prefer: MaybeString,
|
||||
#[yaserde(rename = "source")]
|
||||
pub source: MaybeString,
|
||||
#[yaserde(rename = "healthCheckEnabled")]
|
||||
pub health_check_enabled: u8,
|
||||
#[yaserde(rename = "healthCheck")]
|
||||
pub health_check: MaybeString,
|
||||
#[yaserde(rename = "healthCheckLogStatus")]
|
||||
pub health_check_log_status: u8,
|
||||
#[yaserde(rename = "checkInterval")]
|
||||
pub check_interval: MaybeString,
|
||||
#[yaserde(rename = "checkDownInterval")]
|
||||
pub check_down_interval: MaybeString,
|
||||
#[yaserde(rename = "healthCheckFall")]
|
||||
pub health_check_fall: MaybeString,
|
||||
#[yaserde(rename = "healthCheckRise")]
|
||||
pub health_check_rise: MaybeString,
|
||||
#[yaserde(rename = "linkedMailer")]
|
||||
pub linked_mailer: MaybeString,
|
||||
#[yaserde(rename = "http2Enabled")]
|
||||
pub http2_enabled: u8,
|
||||
#[yaserde(rename = "http2Enabled_nontls")]
|
||||
pub http2_enabled_nontls: u8,
|
||||
#[yaserde(rename = "ba_advertised_protocols")]
|
||||
pub ba_advertised_protocols: MaybeString,
|
||||
#[yaserde(rename = "forwardFor")]
|
||||
pub forward_for: Option<i32>,
|
||||
#[yaserde(rename = "forwardedHeader")]
|
||||
pub forwarded_header: Option<MaybeString>,
|
||||
#[yaserde(rename = "forwardedHeaderParameters")]
|
||||
pub forwarded_header_parameters: Option<MaybeString>,
|
||||
pub persistence: MaybeString,
|
||||
pub persistence_cookiemode: MaybeString,
|
||||
pub persistence_cookiename: MaybeString,
|
||||
pub persistence_stripquotes: u8,
|
||||
pub stickiness_pattern: MaybeString,
|
||||
#[yaserde(rename = "stickiness_dataTypes")]
|
||||
pub stickiness_data_types: MaybeString,
|
||||
pub stickiness_expire: String,
|
||||
pub stickiness_size: String,
|
||||
pub stickiness_cookiename: MaybeString,
|
||||
pub stickiness_cookielength: MaybeString,
|
||||
#[yaserde(rename = "stickiness_connRatePeriod")]
|
||||
pub stickiness_conn_rate_period: String,
|
||||
#[yaserde(rename = "stickiness_sessRatePeriod")]
|
||||
pub stickiness_sess_rate_period: String,
|
||||
#[yaserde(rename = "stickiness_httpReqRatePeriod")]
|
||||
pub stickiness_http_req_rate_period: String,
|
||||
#[yaserde(rename = "stickiness_httpErrRatePeriod")]
|
||||
pub stickiness_http_err_rate_period: String,
|
||||
#[yaserde(rename = "stickiness_bytesInRatePeriod")]
|
||||
pub stickiness_bytes_in_rate_period: String,
|
||||
#[yaserde(rename = "stickiness_bytesOutRatePeriod")]
|
||||
pub stickiness_bytes_out_rate_period: String,
|
||||
#[yaserde(rename = "basicAuthEnabled")]
|
||||
pub basic_auth_enabled: u8,
|
||||
#[yaserde(rename = "basicAuthUsers")]
|
||||
pub basic_auth_users: MaybeString,
|
||||
#[yaserde(rename = "basicAuthGroups")]
|
||||
pub basic_auth_groups: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutConnect")]
|
||||
pub tuning_timeout_connect: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutCheck")]
|
||||
pub tuning_timeout_check: MaybeString,
|
||||
#[yaserde(rename = "tuning_timeoutServer")]
|
||||
pub tuning_timeout_server: MaybeString,
|
||||
#[yaserde(rename = "tuning_retries")]
|
||||
pub tuning_retries: MaybeString,
|
||||
#[yaserde(rename = "customOptions")]
|
||||
pub custom_options: MaybeString,
|
||||
#[yaserde(rename = "tuning_defaultserver")]
|
||||
pub tuning_defaultserver: MaybeString,
|
||||
#[yaserde(rename = "tuning_noport")]
|
||||
pub tuning_noport: u8,
|
||||
#[yaserde(rename = "tuning_httpreuse")]
|
||||
pub tuning_httpreuse: MaybeString,
|
||||
#[yaserde(rename = "tuning_caching")]
|
||||
pub tuning_caching: u8,
|
||||
#[yaserde(rename = "linkedActions")]
|
||||
pub linked_actions: MaybeString,
|
||||
#[yaserde(rename = "linkedErrorfiles")]
|
||||
pub linked_errorfiles: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyServers {
|
||||
#[yaserde(rename = "server")]
|
||||
pub servers: Vec<HAProxyServer>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyServer {
|
||||
#[yaserde(attribute = true, rename = "uuid")]
|
||||
pub uuid: String,
|
||||
pub id: HAProxyId,
|
||||
pub enabled: u8,
|
||||
pub name: String,
|
||||
pub description: MaybeString,
|
||||
pub address: String,
|
||||
pub port: u16,
|
||||
pub checkport: MaybeString,
|
||||
pub mode: String,
|
||||
pub multiplexer_protocol: MaybeString,
|
||||
#[yaserde(rename = "type")]
|
||||
pub server_type: String,
|
||||
#[yaserde(rename = "serviceName")]
|
||||
pub service_name: MaybeString,
|
||||
pub number: MaybeString,
|
||||
#[yaserde(rename = "linkedResolver")]
|
||||
pub linked_resolver: MaybeString,
|
||||
#[yaserde(rename = "resolverOpts")]
|
||||
pub resolver_opts: MaybeString,
|
||||
#[yaserde(rename = "resolvePrefer")]
|
||||
pub resolve_prefer: MaybeString,
|
||||
pub ssl: u8,
|
||||
#[yaserde(rename = "sslSNI")]
|
||||
pub ssl_sni: MaybeString,
|
||||
#[yaserde(rename = "sslVerify")]
|
||||
pub ssl_verify: u8,
|
||||
#[yaserde(rename = "sslCA")]
|
||||
pub ssl_ca: MaybeString,
|
||||
#[yaserde(rename = "sslCRL")]
|
||||
pub ssl_crl: MaybeString,
|
||||
#[yaserde(rename = "sslClientCertificate")]
|
||||
pub ssl_client_certificate: MaybeString,
|
||||
#[yaserde(rename = "maxConnections")]
|
||||
pub max_connections: MaybeString,
|
||||
pub weight: Option<u32>,
|
||||
#[yaserde(rename = "checkInterval")]
|
||||
pub check_interval: MaybeString,
|
||||
#[yaserde(rename = "checkDownInterval")]
|
||||
pub check_down_interval: MaybeString,
|
||||
pub source: MaybeString,
|
||||
pub advanced: MaybeString,
|
||||
#[yaserde(rename = "unix_socket")]
|
||||
pub unix_socket: MaybeString,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyHealthChecks {
|
||||
#[yaserde(rename = "healthcheck")]
|
||||
pub healthchecks: Vec<HAProxyHealthCheck>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct HAProxyHealthCheck {
|
||||
#[yaserde(attribute = true)]
|
||||
pub uuid: String,
|
||||
pub name: String,
|
||||
pub description: MaybeString,
|
||||
#[yaserde(rename = "type")]
|
||||
pub health_check_type: String,
|
||||
pub interval: String,
|
||||
pub ssl: MaybeString,
|
||||
#[yaserde(rename = "sslSNI")]
|
||||
pub ssl_sni: MaybeString,
|
||||
pub force_ssl: u8,
|
||||
pub checkport: MaybeString,
|
||||
pub http_method: MaybeString,
|
||||
pub http_uri: MaybeString,
|
||||
pub http_version: MaybeString,
|
||||
#[yaserde(rename = "http_host")]
|
||||
pub http_host: MaybeString,
|
||||
#[yaserde(rename = "http_expressionEnabled")]
|
||||
pub http_expression_enabled: Option<u8>,
|
||||
pub http_expression: MaybeString,
|
||||
pub http_negate: MaybeString,
|
||||
pub http_value: MaybeString,
|
||||
pub tcp_enabled: MaybeString,
|
||||
#[yaserde(rename = "tcp_sendValue")]
|
||||
pub tcp_send_value: MaybeString,
|
||||
#[yaserde(rename = "tcp_matchType")]
|
||||
pub tcp_match_type: MaybeString,
|
||||
pub tcp_negate: MaybeString,
|
||||
#[yaserde(rename = "tcp_matchValue")]
|
||||
pub tcp_match_value: MaybeString,
|
||||
pub agent_port: MaybeString,
|
||||
pub mysql_user: MaybeString,
|
||||
pub mysql_post41: MaybeString,
|
||||
pub pgsql_user: MaybeString,
|
||||
pub smtp_domain: MaybeString,
|
||||
pub esmtp_domain: MaybeString,
|
||||
#[yaserde(rename = "agentPort")]
|
||||
pub agent_port_uppercase: MaybeString,
|
||||
#[yaserde(rename = "dbUser")]
|
||||
pub db_user: MaybeString,
|
||||
#[yaserde(rename = "smtpDomain")]
|
||||
pub smtp_domain_uppercase: MaybeString,
|
||||
}
|
||||
224
opnsense-config-xml/src/data/interfaces.rs
Normal file
224
opnsense-config-xml/src/data/interfaces.rs
Normal file
@@ -0,0 +1,224 @@
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
use yaserde::MaybeString;
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
|
||||
pub struct Interface {
|
||||
pub internal_dynamic: Option<MaybeString>,
|
||||
#[yaserde(rename = "if")]
|
||||
pub physical_interface_name: String,
|
||||
pub descr: Option<MaybeString>,
|
||||
pub enable: MaybeString,
|
||||
pub lock: Option<MaybeString>,
|
||||
#[yaserde(rename = "spoofmac")]
|
||||
pub spoof_mac: Option<MaybeString>,
|
||||
pub ipaddr: Option<MaybeString>,
|
||||
pub dhcphostname: Option<MaybeString>,
|
||||
#[yaserde(rename = "alias-address")]
|
||||
pub alias_address: Option<MaybeString>,
|
||||
#[yaserde(rename = "alias-subnet")]
|
||||
pub alias_subnet: Option<MaybeString>,
|
||||
#[yaserde(rename = "blockpriv")]
|
||||
pub block_priv: Option<MaybeString>,
|
||||
#[yaserde(rename = "blockbogons")]
|
||||
pub block_bogons: Option<MaybeString>,
|
||||
#[yaserde(rename = "type")]
|
||||
pub r#type: Option<MaybeString>,
|
||||
#[yaserde(rename = "virtual")]
|
||||
pub r#virtual: Option<MaybeString>,
|
||||
pub subnet: Option<MaybeString>,
|
||||
pub ipaddrv6: Option<MaybeString>,
|
||||
#[yaserde(rename = "dhcp6-ia-pd-len")]
|
||||
pub dhcp6_ia_pd_len: Option<MaybeString>,
|
||||
pub networks: Option<MaybeString>,
|
||||
pub subnetv6: Option<MaybeString>,
|
||||
pub gateway: Option<MaybeString>,
|
||||
pub gatewayv6: Option<MaybeString>,
|
||||
pub media: Option<MaybeString>,
|
||||
pub mediaopt: Option<MaybeString>,
|
||||
#[yaserde(rename = "track6-interface")]
|
||||
pub track6_interface: Option<MaybeString>,
|
||||
#[yaserde(rename = "track6-prefix-id")]
|
||||
pub track6_prefix_id: Option<MaybeString>,
|
||||
#[yaserde(rename = "dhcprejectfrom")]
|
||||
pub dhcprejectfrom: Option<MaybeString>,
|
||||
pub adv_dhcp6_interface_statement_send_options: Option<MaybeString>,
|
||||
pub adv_dhcp6_interface_statement_request_options: Option<MaybeString>,
|
||||
pub adv_dhcp6_interface_statement_information_only_enable: Option<MaybeString>,
|
||||
pub adv_dhcp6_interface_statement_script: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_address_enable: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_address: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_address_id: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_address_pltime: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_address_vltime: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_prefix_enable: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_prefix: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_prefix_id: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_prefix_pltime: Option<MaybeString>,
|
||||
pub adv_dhcp6_id_assoc_statement_prefix_vltime: Option<MaybeString>,
|
||||
pub adv_dhcp6_prefix_interface_statement_sla_len: Option<MaybeString>,
|
||||
pub adv_dhcp6_authentication_statement_authname: Option<MaybeString>,
|
||||
pub adv_dhcp6_authentication_statement_protocol: Option<MaybeString>,
|
||||
pub adv_dhcp6_authentication_statement_algorithm: Option<MaybeString>,
|
||||
pub adv_dhcp6_authentication_statement_rdm: Option<MaybeString>,
|
||||
pub adv_dhcp6_key_info_statement_keyname: Option<MaybeString>,
|
||||
pub adv_dhcp6_key_info_statement_realm: Option<MaybeString>,
|
||||
pub adv_dhcp6_key_info_statement_keyid: Option<MaybeString>,
|
||||
pub adv_dhcp6_key_info_statement_secret: Option<MaybeString>,
|
||||
pub adv_dhcp6_key_info_statement_expire: Option<MaybeString>,
|
||||
pub adv_dhcp6_config_advanced: Option<MaybeString>,
|
||||
pub adv_dhcp6_config_file_override: Option<MaybeString>,
|
||||
pub adv_dhcp6_config_file_override_path: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_timeout: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_retry: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_select_timeout: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_reboot: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_backoff_cutoff: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_initial_interval: Option<MaybeString>,
|
||||
pub adv_dhcp_pt_values: Option<MaybeString>,
|
||||
pub adv_dhcp_send_options: Option<MaybeString>,
|
||||
pub adv_dhcp_request_options: Option<MaybeString>,
|
||||
pub adv_dhcp_required_options: Option<MaybeString>,
|
||||
pub adv_dhcp_option_modifiers: Option<MaybeString>,
|
||||
pub adv_dhcp_config_advanced: Option<MaybeString>,
|
||||
pub adv_dhcp_config_file_override: Option<MaybeString>,
|
||||
pub adv_dhcp_config_file_override_path: Option<MaybeString>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::xml_utils::to_xml_str;
|
||||
|
||||
use super::*;
|
||||
use pretty_assertions::assert_eq;
|
||||
use yaserde::NamedList;
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
|
||||
pub struct InterfacesParent {
|
||||
foo: String,
|
||||
interfaces: NamedList<Interface>,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_deserialize_interfaces() {
|
||||
let interfaces =
|
||||
yaserde::de::from_str::<NamedList<Interface>>(FULL_INTERFACES_XML).unwrap();
|
||||
assert_eq!(interfaces.elements.len(), 6)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_serialize_interfaces() {
|
||||
let named_list = NamedList {
|
||||
elements: vec![
|
||||
(String::from("paul"), Interface::default()),
|
||||
(String::from("anotherpaul"), Interface::default()),
|
||||
(String::from("thirdone"), Interface::default()),
|
||||
(String::from("andgofor4"), Interface::default()),
|
||||
],
|
||||
};
|
||||
|
||||
let parent = InterfacesParent {
|
||||
foo: String::from("foo"),
|
||||
interfaces: named_list,
|
||||
bar: String::from("foo"),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
&to_xml_str(&parent).unwrap(),
|
||||
r#"<?xml version="1.0"?>
|
||||
<InterfacesParent>
|
||||
<foo>foo</foo>
|
||||
<interfaces>
|
||||
<paul>
|
||||
<if></if>
|
||||
<descr></descr>
|
||||
<enable/>
|
||||
</paul>
|
||||
<anotherpaul>
|
||||
<if></if>
|
||||
<descr></descr>
|
||||
<enable/>
|
||||
</anotherpaul>
|
||||
<thirdone>
|
||||
<if></if>
|
||||
<descr></descr>
|
||||
<enable/>
|
||||
</thirdone>
|
||||
<andgofor4>
|
||||
<if></if>
|
||||
<descr></descr>
|
||||
<enable/>
|
||||
</andgofor4>
|
||||
</interfaces>
|
||||
<bar>foo</bar>
|
||||
</InterfacesParent>
|
||||
"#
|
||||
)
|
||||
}
|
||||
|
||||
const FULL_INTERFACES_XML: &str = "<interfaces>
|
||||
<lan>
|
||||
<if>em1</if>
|
||||
<descr>LAN</descr>
|
||||
<enable>1</enable>
|
||||
<spoofmac/>
|
||||
<media/>
|
||||
<mediaopt/>
|
||||
<ipaddr>192.168.20.1</ipaddr>
|
||||
<subnet>24</subnet>
|
||||
<ipaddrv6>track6</ipaddrv6>
|
||||
<track6-interface/>
|
||||
<track6-prefix-id>0</track6-prefix-id>
|
||||
</lan>
|
||||
<wan>
|
||||
<if>pppoe0</if>
|
||||
<descr>WAN</descr>
|
||||
<enable>1</enable>
|
||||
<lock>1</lock>
|
||||
<spoofmac/>
|
||||
<blockpriv>1</blockpriv>
|
||||
<blockbogons>1</blockbogons>
|
||||
<ipaddr>pppoe</ipaddr>
|
||||
</wan>
|
||||
<lo0>
|
||||
<internal_dynamic>1</internal_dynamic>
|
||||
<descr>Loopback</descr>
|
||||
<enable>1</enable>
|
||||
<if>lo0</if>
|
||||
<ipaddr>127.0.0.1</ipaddr>
|
||||
<ipaddrv6>::1</ipaddrv6>
|
||||
<subnet>8</subnet>
|
||||
<subnetv6>128</subnetv6>
|
||||
<type>none</type>
|
||||
<virtual>1</virtual>
|
||||
</lo0>
|
||||
<opt1>
|
||||
<if>em5</if>
|
||||
<descr>backup_sync</descr>
|
||||
<enable>1</enable>
|
||||
<lock>1</lock>
|
||||
<spoofmac/>
|
||||
<ipaddr>10.10.5.1</ipaddr>
|
||||
<subnet>24</subnet>
|
||||
</opt1>
|
||||
<wireguard>
|
||||
<internal_dynamic>1</internal_dynamic>
|
||||
<descr>WireGuard (Group)</descr>
|
||||
<if>wireguard</if>
|
||||
<virtual>1</virtual>
|
||||
<enable>1</enable>
|
||||
<type>group</type>
|
||||
<networks/>
|
||||
</wireguard>
|
||||
<openvpn>
|
||||
<internal_dynamic>1</internal_dynamic>
|
||||
<enable>1</enable>
|
||||
<if>openvpn</if>
|
||||
<descr>OpenVPN</descr>
|
||||
<type>group</type>
|
||||
<virtual>1</virtual>
|
||||
<networks/>
|
||||
</openvpn>
|
||||
</interfaces>";
|
||||
}
|
||||
10
opnsense-config-xml/src/data/mod.rs
Normal file
10
opnsense-config-xml/src/data/mod.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
mod caddy;
|
||||
mod dhcpd;
|
||||
mod haproxy;
|
||||
mod interfaces;
|
||||
mod opnsense;
|
||||
pub use caddy::*;
|
||||
pub use dhcpd::*;
|
||||
pub use haproxy::*;
|
||||
pub use interfaces::*;
|
||||
pub use opnsense::*;
|
||||
1585
opnsense-config-xml/src/data/opnsense.rs
Normal file
1585
opnsense-config-xml/src/data/opnsense.rs
Normal file
File diff suppressed because it is too large
Load Diff
4
opnsense-config-xml/src/lib.rs
Normal file
4
opnsense-config-xml/src/lib.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
mod data;
|
||||
mod xml_utils;
|
||||
pub use data::*;
|
||||
pub use yaserde::MaybeString;
|
||||
20
opnsense-config-xml/src/xml_utils/mod.rs
Normal file
20
opnsense-config-xml/src/xml_utils/mod.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
use yaserde::YaSerialize;
|
||||
|
||||
pub fn to_xml_str<T: YaSerialize>(model: &T) -> Result<String, String> {
|
||||
let yaserde_cfg = yaserde::ser::Config {
|
||||
perform_indent: true,
|
||||
write_document_declaration: false,
|
||||
pad_self_closing: false,
|
||||
..Default::default()
|
||||
};
|
||||
let serialized = yaserde::ser::to_string_with_config::<T>(model, &yaserde_cfg)?;
|
||||
|
||||
// Opnsense does not specify encoding in the document declaration
|
||||
//
|
||||
// yaserde / xml-rs does not allow disabling the encoding attribute in the
|
||||
// document declaration
|
||||
//
|
||||
// So here we just manually prefix the xml document with the exact document declaration
|
||||
// that opnsense uses
|
||||
Ok(format!("<?xml version=\"1.0\"?>\n{serialized}\n"))
|
||||
}
|
||||
Reference in New Issue
Block a user