use std::sync::Arc; use opnsense_config_xml::{NodeExporter, OPNsense}; use crate::{config::OPNsenseShell, Error}; pub struct NodeExporterConfig<'a> { opnsense: &'a mut OPNsense, opnsense_shell: Arc, } impl<'a> NodeExporterConfig<'a> { pub fn new(opnsense: &'a mut OPNsense, opnsense_shell: Arc) -> Self { Self { opnsense, opnsense_shell, } } pub fn get_full_config(&self) -> &Option { &self.opnsense.opnsense.node_exporter } fn with_node_exporter(&mut self, f: F) -> R where F: FnOnce(&mut NodeExporter) -> R, { match &mut self.opnsense.opnsense.node_exporter.as_mut() { Some(node_exporter) => f(node_exporter), None => unimplemented!( " node exporter is not yet installed" ), } } pub fn enable(&mut self, enabled: bool) { self.with_node_exporter(|node_exporter| node_exporter.enabled = enabled as u8) } pub async fn reload_restart(&self) -> Result<(), Error> { self.opnsense_shell .exec("configctl node_exporter stop") .await?; self.opnsense_shell .exec("configctl template reload OPNsense/NodeExporter") .await?; self.opnsense_shell .exec("configctl node_exporter configtest") .await?; self.opnsense_shell .exec("configctl node_exporter start") .await?; Ok(()) } }