use crate::dnsmasq::DnsMasq; use crate::HAProxy; use crate::{data::dhcpd::DhcpInterface, xml_utils::to_xml_str}; use log::error; use uuid::Uuid; use yaserde::{MaybeString, NamedList, RawXml}; use yaserde_derive::{YaDeserialize, YaSerialize}; use super::{Interface, Pischem}; #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] #[yaserde(rename = "opnsense")] pub struct OPNsense { pub theme: String, pub sysctl: Sysctl, pub system: System, pub interfaces: NamedList, pub dhcpd: NamedList, pub snmpd: Snmpd, pub syslog: Syslog, pub nat: Nat, pub filter: Filters, pub load_balancer: Option, pub rrd: Option, pub ntpd: Ntpd, pub widgets: Option, pub revision: Revision, #[yaserde(rename = "OPNsense")] pub opnsense: OPNsenseXmlSection, pub staticroutes: StaticRoutes, pub ca: MaybeString, pub gateways: Option, pub cert: Vec, pub dhcpdv6: DhcpDv6, pub virtualip: VirtualIp, pub openvpn: OpenVpn, pub ppps: Ppps, pub dyndnses: Option, pub vlans: Vlans, pub bridges: Bridges, pub gifs: Gifs, pub gres: Gres, pub laggs: Laggs, pub wireless: Wireless, pub hasync: Hasync, #[yaserde(rename = "Pischem")] pub pischem: Option, pub ifgroups: Ifgroups, pub dnsmasq: Option, } impl From for OPNsense { fn from(content: String) -> Self { yaserde::de::from_str(&content) .map_err(|e| println!("{}", e)) .expect("OPNSense received invalid string, should be full XML") } } impl OPNsense { pub fn to_xml(&self) -> String { to_xml_str(self) .map_err(|e| error!("{}", e)) .expect("OPNSense could not serialize to XML") } } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct LoadBalancer { pub monitor_type: Vec, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct MonitorType { pub name: String, #[yaserde(rename = "type")] pub r#type: String, pub descr: String, pub options: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Ntpd { pub prefer: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Widgets { pub sequence: String, pub column_count: i32, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Revision { pub username: String, pub time: f64, pub description: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Options { pub path: Option, pub host: Option, pub code: Option, pub send: Option, pub expect: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Filters { #[yaserde(rename = "rule")] pub rules: Vec, pub bypassstaticroutes: Option, pub scrub: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Rule { #[yaserde(attribute = true)] pub uuid: Option, #[yaserde(rename = "associated-rule-id")] pub associated_rule_id: Option, #[yaserde(rename = "type")] pub r#type: Option, pub interface: String, pub ipprotocol: String, pub statetype: Option, pub descr: Option, pub direction: Option, pub category: Option, pub quick: Option, pub protocol: Option, pub source: Source, pub icmptype: Option, pub destination: Destination, pub updated: Option, pub created: Option, pub disabled: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Source { pub any: Option, pub network: Option, pub address: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Destination { pub network: Option, pub address: Option, pub port: Option, pub any: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Username { pub user: String, pub host: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Sysctl { pub item: Vec, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct SysctlItem { pub descr: Option, pub tunable: Option, pub value: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct System { pub use_mfs_tmp: Option, pub use_mfs_var: Option, pub serialspeed: u32, pub primaryconsole: String, pub secondaryconsole: Option, pub optimization: String, pub hostname: String, pub domain: String, pub group: Vec, pub user: Vec, pub nextuid: Option, pub nextgid: Option, pub timezone: String, pub timeservers: String, pub webgui: WebGui, pub usevirtualterminal: u8, pub disablenatreflection: Option, pub disableconsolemenu: u8, pub disablevlanhwfilter: u8, pub disablechecksumoffloading: u8, pub disablesegmentationoffloading: u8, pub disablelargereceiveoffloading: u8, pub ipv6allow: u8, pub powerd_ac_mode: String, pub powerd_battery_mode: String, pub powerd_normal_mode: String, pub bogons: Bogons, pub crypto_hardware: Option, pub pf_share_forward: u8, pub lb_use_sticky: u8, pub kill_states: Option, pub ssh: Ssh, pub rrdbackup: Option, pub netflowbackup: Option, pub firmware: Firmware, pub sudo_allow_wheel: Option, pub sudo_allow_group: Option, pub enablenatreflectionhelper: Option, pub rulesetoptimization: Option, pub maximumstates: Option, pub maximumfrags: Option, pub aliasesresolveinterval: Option, pub maximumtableentries: Option, pub language: String, pub dnsserver: Option, pub dns1gw: Option, pub dns2gw: Option, pub dns3gw: Option, pub dns4gw: Option, pub dns5gw: Option, pub dns6gw: Option, pub dns7gw: Option, pub dns8gw: Option, pub dnsallowoverride: u8, pub dnsallowoverride_exclude: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Ssh { pub group: String, pub noauto: u8, pub interfaces: MaybeString, pub kex: MaybeString, pub ciphers: MaybeString, pub macs: MaybeString, pub keys: MaybeString, pub enabled: String, pub passwordauth: u8, pub keysig: MaybeString, pub permitrootlogin: u8, pub rekeylimit: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Firmware { #[yaserde(attribute = true)] pub version: String, pub mirror: MaybeString, pub flavour: MaybeString, pub plugins: MaybeString, #[yaserde(rename = "type")] pub firmware_type: MaybeString, pub subscription: MaybeString, pub reboot: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Bogons { pub interval: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Group { pub name: String, pub description: Option, pub scope: String, pub gid: u32, pub member: String, #[yaserde(rename = "priv")] pub priv_field: Option, pub source_networks: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct User { pub name: String, pub descr: MaybeString, pub scope: String, pub groupname: Option, pub password: String, pub pwd_changed_at: Option, pub uid: u32, pub disabled: Option, pub landing_page: Option, pub comment: Option, pub email: Option, pub apikeys: Option, #[yaserde(rename = "priv")] pub priv_field: Option, pub language: Option, pub expires: Option, pub authorizedkeys: Option, pub dashboard: Option, pub ipsecpsk: Option, pub otp_seed: Option, pub shell: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct WebGui { pub protocol: String, #[yaserde(rename = "ssl-certref")] pub ssl_certref: String, pub port: MaybeString, #[yaserde(rename = "ssl-ciphers")] pub ssl_ciphers: MaybeString, pub interfaces: MaybeString, pub compression: MaybeString, pub nohttpreferercheck: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct NumberOption { item: MaybeString, } #[derive(Default, Clone, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Range { pub from: String, pub to: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct StaticMap { pub mac: String, pub ipaddr: String, pub hostname: String, pub descr: Option, pub winsserver: MaybeString, pub dnsserver: MaybeString, pub ntpserver: MaybeString, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Snmpd { pub syslocation: MaybeString, pub syscontact: MaybeString, pub rocommunity: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Syslog { pub reverse: Option, pub preservelogs: Option, pub nologdefaultblock: Option, pub nologdefaultpass: Option, pub nologbogons: Option, pub nologprivatenets: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Nat { #[yaserde(rename = "outbound")] pub outbound: Outbound, #[yaserde(rename = "rule")] pub rules: Vec, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Outbound { pub mode: String, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct NatRule { pub protocol: String, pub interface: String, pub category: MaybeString, pub ipprotocol: String, pub descr: MaybeString, pub tag: MaybeString, pub tagged: Option, pub poolopts: PoolOpts, #[yaserde(rename = "associated-rule-id")] pub associated_rule_id: Option, pub disabled: Option, pub target: String, #[yaserde(rename = "local-port")] pub local_port: i32, pub source: Source, pub destination: Destination, pub updated: Updated, pub created: Created, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct PoolOpts { // No specific fields for this element, can be added as needed } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Updated { pub username: String, pub time: f64, pub description: MaybeString, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Created { pub username: String, pub time: f64, pub description: MaybeString, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Filter { #[yaserde(attribute = true)] version: String, rules: Option, snatrules: Option, npt: Option, onetoone: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] #[yaserde(rename = "OPNsense")] pub struct OPNsenseXmlSection { pub captiveportal: Option, pub cron: Option, #[yaserde(rename = "Netflow")] pub netflow: Option, #[yaserde(rename = "Firewall")] pub firewall: Option, #[yaserde(rename = "IDS")] pub ids: Option, #[yaserde(rename = "IPsec")] pub ipsec: Option, #[yaserde(rename = "Interfaces")] pub interfaces: Option, #[yaserde(rename = "NodeExporter")] pub node_exporter: Option, #[yaserde(rename = "Kea")] pub kea: Option, pub monit: Option, #[yaserde(rename = "OpenVPNExport")] pub openvpn_export: Option, pub proxy: Option, #[yaserde(rename = "Syslog")] pub syslog: Option, #[yaserde(rename = "TrafficShaper")] pub traffic_shaper: Option, pub unboundplus: Option, #[yaserde(rename = "DHCRelay")] pub dhcrelay: Option, pub trust: Option, pub tftp: Option, #[yaserde(rename = "Nginx")] pub nginx: Option, pub wireguard: Option, #[yaserde(rename = "Swanctl")] pub swanctl: Swanctl, #[yaserde(rename = "DynDNS")] pub dyndns: Option, #[yaserde(rename = "OpenVPN")] pub openvpn: ConfigOpenVPN, #[yaserde(rename = "Gateways")] pub gateways: RawXml, #[yaserde(rename = "HAProxy")] pub haproxy: Option, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Tftp { pub general: TftpGeneral, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct TftpGeneral { #[yaserde(attribute = true)] pub version: String, pub enabled: u8, pub listen: String, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] #[yaserde(rename = "IDS")] pub struct IDS { #[yaserde(attribute = true)] pub version: String, pub rules: MaybeString, pub policies: MaybeString, #[yaserde(rename = "userDefinedRules")] pub user_defined_rules: MaybeString, pub files: MaybeString, #[yaserde(rename = "fileTags")] pub file_tags: MaybeString, pub general: IDSGeneral, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct IDSGeneral { pub enabled: Option, pub ips: Option, pub promisc: Option, pub interfaces: String, pub homenet: String, #[yaserde(rename = "defaultPacketSize")] pub default_packet_size: MaybeString, #[yaserde(rename = "UpdateCron")] pub update_cron: MaybeString, #[yaserde(rename = "AlertLogrotate")] pub alert_logrotate: String, #[yaserde(rename = "AlertSaveLogs")] pub alert_save_logs: u8, #[yaserde(rename = "MPMAlgo")] pub mpm_algo: MaybeString, pub detect: Detect, pub syslog: Option, pub syslog_eve: Option, #[yaserde(rename = "LogPayload")] pub log_payload: Option, pub verbosity: MaybeString, #[yaserde(rename = "eveLog")] pub eve_log: Option, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Detect { #[yaserde(rename = "Profile")] profile: MaybeString, toclient_groups: MaybeString, toserver_groups: MaybeString, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct IPsec { #[yaserde(attribute = true)] version: String, general: GeneralIpsec, #[yaserde(rename = "keyPairs")] key_pairs: MaybeString, #[yaserde(rename = "preSharedKeys")] pre_shared_keys: MaybeString, charon: Option, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct GeneralIpsec { enabled: MaybeString, preferred_oldsa: Option, disablevpnrules: Option, passthrough_networks: Option, user_source: Option, local_group: Option, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] #[yaserde(rename = "Interfaces")] pub struct ConfigInterfaces { vxlans: Vxlan, loopbacks: Loopback, neighbors: Option, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Neighbors { #[yaserde(attribute = true)] version: String, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Vxlan { #[yaserde(attribute = true)] version: String, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Loopback { #[yaserde(attribute = true)] version: String, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] #[yaserde(rename = "monit")] pub struct Monit { #[yaserde(attribute = true)] version: String, general: GeneralMonit, alert: Option, service: Vec, test: Vec, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct GeneralMonit { enabled: u8, interval: u32, startdelay: u32, mailserver: String, port: u16, username: MaybeString, password: MaybeString, ssl: u8, sslversion: String, sslverify: u8, logfile: MaybeString, statefile: MaybeString, #[yaserde(rename = "eventqueuePath")] event_queue_path: MaybeString, #[yaserde(rename = "eventqueueSlots")] event_queue_slots: MaybeString, #[yaserde(rename = "httpdEnabled")] httpd_enabled: u8, #[yaserde(rename = "httpdUsername")] httpd_username: String, #[yaserde(rename = "httpdPassword")] httpd_password: MaybeString, #[yaserde(rename = "httpdPort")] httpd_port: u16, #[yaserde(rename = "httpdAllow")] httpd_allow: MaybeString, #[yaserde(rename = "mmonitUrl")] mmonit_url: MaybeString, #[yaserde(rename = "mmonitTimeout")] mmonit_timeout: u32, #[yaserde(rename = "mmonitRegisterCredentials")] mmonit_register_credentials: u8, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Alert { #[yaserde(attribute = true)] uuid: String, enabled: u8, recipient: String, noton: u8, events: MaybeString, format: MaybeString, reminder: MaybeString, description: MaybeString, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Service { #[yaserde(attribute = true)] uuid: String, enabled: u8, name: String, description: MaybeString, #[yaserde(rename = "type")] r#type: String, pidfile: MaybeString, #[yaserde(rename = "match")] r#match: MaybeString, path: MaybeString, timeout: u32, starttimeout: u32, address: MaybeString, interface: MaybeString, start: MaybeString, stop: MaybeString, tests: String, depends: MaybeString, polltime: MaybeString, } #[derive(Debug, YaSerialize, YaDeserialize, PartialEq)] pub struct Test { #[yaserde(attribute = true)] uuid: String, name: String, #[yaserde(rename = "type")] r#type: String, condition: String, action: String, path: MaybeString, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct CaptivePortal { #[yaserde(attribute = true)] pub version: String, #[yaserde(rename = "zones")] pub zones: Option, #[yaserde(rename = "templates")] pub templates: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Cron { #[yaserde(attribute = true)] pub version: String, #[yaserde(rename = "jobs")] pub jobs: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Netflow { #[yaserde(attribute = true)] pub version: String, #[yaserde(rename = "capture")] pub capture: Option, #[yaserde(rename = "collect")] pub collect: Option, #[yaserde(rename = "activeTimeout")] pub active_timeout: Option, #[yaserde(rename = "inactiveTimeout")] pub inactive_timeout: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Capture { #[yaserde(rename = "interfaces")] pub interfaces: MaybeString, #[yaserde(rename = "egress_only")] pub egress_only: MaybeString, #[yaserde(rename = "version")] pub version: MaybeString, #[yaserde(rename = "targets")] pub targets: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Collect { #[yaserde(rename = "enable")] pub enable: Option, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Zones { // Define fields for Zones, e.g.: #[yaserde(rename = "zone")] pub zones: Vec, } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Zone { #[yaserde(attribute = true)] pub uuid: MaybeString, #[yaserde(rename = "name")] pub name: MaybeString, // Add other fields as needed } #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Templates { // Define fields for Templates, e.g.: #[yaserde(rename = "template")] pub templates: Vec