diff --git a/examples/models/inherited/evt.cfg b/examples/models/inherited/evt.cfg index ef9d1d63..b95df82c 100644 --- a/examples/models/inherited/evt.cfg +++ b/examples/models/inherited/evt.cfg @@ -1,7 +1,7 @@ constraints: addresses-verification: - descr: Modified to intentionally fail + descr: Addresses verification all: interfaces: - fact: if-up.virbr1.port - equals: 1 + equals: 0 diff --git a/examples/models/router/entities/processes.cfg b/examples/models/router/entities/processes.cfg index ecfb8310..b5554b15 100644 --- a/examples/models/router/entities/processes.cfg +++ b/examples/models/router/entities/processes.cfg @@ -22,6 +22,10 @@ entities: journald: descr: journald daemon process + hosts: + - $ + - "192.168.1.12" + - local facts: default: - label: diff --git a/examples/models/router/relations/basic.cfg b/examples/models/router/relations/basic.cfg index fa3bddb2..526761ea 100644 --- a/examples/models/router/relations/basic.cfg +++ b/examples/models/router/relations/basic.cfg @@ -1,11 +1,18 @@ relations: + # Relation Id general-network: + # State remote: + # Condition requires: - ssh-sockets + + # State local: requires: - no-ssh-sockets + + # State $: consists: - routes diff --git a/libsysinspect/src/intp/checkbook.rs b/libsysinspect/src/intp/checkbook.rs index 7d70a575..82070867 100644 --- a/libsysinspect/src/intp/checkbook.rs +++ b/libsysinspect/src/intp/checkbook.rs @@ -56,6 +56,11 @@ impl CheckbookSection { pub fn id(&self) -> String { self.id.to_owned() } + + /// Get available relations + pub fn relations(&self) -> &[Relation] { + &self.relations + } } impl Display for CheckbookSection { diff --git a/libsysinspect/src/intp/inspector.rs b/libsysinspect/src/intp/inspector.rs index d68f02dc..13b16bdc 100644 --- a/libsysinspect/src/intp/inspector.rs +++ b/libsysinspect/src/intp/inspector.rs @@ -116,8 +116,17 @@ impl SysInspector { } /// Get actions by relations - pub fn actions_by_relations(&self, rids: Vec) -> Result, SysinspectError> { - Ok(vec![]) + pub fn actions_by_relations(&self, rids: Vec, state: Option) -> Result, SysinspectError> { + let mut out: Vec = Vec::default(); + for s in &self.checkbook { + if rids.contains(&s.id()) { + for rel in s.relations() { + out.extend(self.actions_by_entities(rel.get_entities(state.to_owned()), state.to_owned())?); + } + } + } + + Ok(out) } /// Get actions by entities diff --git a/libsysinspect/src/intp/relations.rs b/libsysinspect/src/intp/relations.rs index 8e0f8641..4e2ba3ef 100644 --- a/libsysinspect/src/intp/relations.rs +++ b/libsysinspect/src/intp/relations.rs @@ -33,4 +33,21 @@ impl Relation { pub fn id(&self) -> String { self.id.to_owned().unwrap_or("".to_string()) } + + /// Get states to relations + pub fn states(&self) -> &HashMap>> { + &self.states + } + + /// Get related entities + pub fn get_entities(&self, state: Option) -> Vec { + let mut out: Vec = Vec::default(); + let state = state.unwrap_or_default(); + for (st, ent) in self.states() { + if st.eq(&state) || st.eq("$") { + out.extend(ent.values().flat_map(|eids| eids.to_owned()).collect::>()); + } + } + out + } } diff --git a/libsysinspect/src/reactor/handlers/cstr_stdhdl.rs b/libsysinspect/src/reactor/handlers/cstr_stdhdl.rs index 5248c3e2..050d6189 100644 --- a/libsysinspect/src/reactor/handlers/cstr_stdhdl.rs +++ b/libsysinspect/src/reactor/handlers/cstr_stdhdl.rs @@ -53,7 +53,7 @@ impl EventHandler for ConstraintHandler { let prefix = self.get_prefix(); if !evt.errors.has_errors() { - log::info!("{}All constraints {}", prefix, "passed".bright_green().bold()); + log::info!("{}{} {}", prefix, evt.aid(), "passed".bright_green().bold()); return; } diff --git a/libsysinspect/src/reactor/handlers/mod.rs b/libsysinspect/src/reactor/handlers/mod.rs index 7ab4cc08..dea602a1 100644 --- a/libsysinspect/src/reactor/handlers/mod.rs +++ b/libsysinspect/src/reactor/handlers/mod.rs @@ -57,6 +57,9 @@ pub mod registry { /// NOTE: [`init_handlers`] must be called. /// pub fn get_handler_names() -> Vec { - REGISTRY_MAP.lock().unwrap().keys().map(|s| s.to_string()).collect::>() + let mut out = REGISTRY_MAP.lock().unwrap().keys().cloned().map(|s| s.to_string()).collect::>(); + out.sort(); + + out } } diff --git a/src/main.rs b/src/main.rs index f2647136..c4370d4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -75,13 +75,16 @@ fn main() { // Setup event processor let mut evtproc = EventProcessor::new().set_config(isp.cfg()); - // XXX: Move all this elsewhere - //let ar = isp.actions_by_relations(clidef::split_by(¶ms, "labels", None)).unwrap(); + let arg_state = params.get_one::("state").cloned(); + let arg_labels = clidef::split_by(¶ms, "labels", None); - match isp.actions_by_entities( - clidef::split_by(¶ms, "entities", None), - params.get_one::("state").cloned(), - ) { + let actions = if !arg_labels.is_empty() { + isp.actions_by_relations(arg_labels, arg_state.to_owned()) + } else { + isp.actions_by_entities(clidef::split_by(¶ms, "entities", None), arg_state) + }; + + match actions { Ok(actions) => { for ac in actions { match ac.run() {