Skip to content

Commit

Permalink
Merge pull request #46 from tinythings/isbm-move-traits-to-lib
Browse files Browse the repository at this point in the history
Enable traits for all Python modules within the minion
  • Loading branch information
isbm authored Nov 25, 2024
2 parents 921786b + 1f96daa commit b0bca1d
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 67 deletions.
53 changes: 23 additions & 30 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions libsysinspect/src/pylang/pvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use std::{
sync::Arc,
};

// use super::pylib::pysystem::syscore;
use super::pylib::pysystem::syscore;

pub struct PyVm {
itp: Interpreter,
Expand All @@ -37,7 +37,7 @@ impl PyVm {
.init_stdlib()
.settings(cfg)
.init_hook(Box::new(|vm| {
//vm.add_native_module("syscore".to_owned(), Box::new(syscore::make_module));
vm.add_native_module("syscore".to_owned(), Box::new(syscore::make_module));
}))
.interpreter();

Expand Down
21 changes: 5 additions & 16 deletions libsysinspect/src/pylang/pylib/pysystem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ use rustpython_vm::pymodule;

#[pymodule]
pub mod syscore {
use crate::{cfg::mmconf::MinionConfig, traits::systraits::SystemTraits, util::dataconv};
use crate::{
traits::{self, systraits::SystemTraits},
util::dataconv,
};
use rustpython_vm::PyResult;
use rustpython_vm::{builtins::PyList, convert::ToPyObject, pyclass, PyObjectRef, PyPayload, VirtualMachine};
use std::path::PathBuf;

#[derive(Debug, Clone)]
struct StrVec(Vec<String>);
Expand All @@ -30,20 +32,7 @@ pub mod syscore {
#[pyclass]
impl MinionTraits {
fn new() -> MinionTraits {
// This sucks big time. It always initialises traits for every script call
let cfg = match MinionConfig::new(PathBuf::from("/etc/sysinspect/sysinspect.conf")) {
Ok(c) => Some(c),
Err(err) => {
log::debug!("Error initialising traits: {err}");
None
}
};

if let Some(cfg) = cfg {
return MinionTraits { traits: Some(SystemTraits::new(cfg)) };
}

MinionTraits { ..Default::default() }
MinionTraits { traits: Some(traits::get_minion_traits(None)) }
}

#[pymethod]
Expand Down
15 changes: 14 additions & 1 deletion libsysinspect/src/traits/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ pub mod systraits;

use std::collections::HashMap;

use crate::SysinspectError;
use crate::{cfg::mmconf::MinionConfig, SysinspectError};
use once_cell::sync::OnceCell;
use pest::Parser;
use pest_derive::Parser;
use serde_json::Value;
Expand Down Expand Up @@ -95,3 +96,15 @@ pub fn matches_traits(qt: Vec<Vec<HashMap<String, Value>>>, traits: SystemTraits

or_op_c.contains(&true)
}

/// System traits instance
static _TRAITS: OnceCell<SystemTraits> = OnceCell::new();

/// Returns a copy of initialised traits.
pub fn get_minion_traits(cfg: Option<&MinionConfig>) -> SystemTraits {
if let Some(cfg) = cfg {
return _TRAITS.get_or_init(|| SystemTraits::new(cfg.clone())).to_owned();
}

_TRAITS.get_or_init(|| SystemTraits::new(MinionConfig::default())).to_owned()
}
42 changes: 26 additions & 16 deletions sysminion/src/minion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ use libsysinspect::{
MasterMessage, MinionMessage, ProtoConversion,
},
rsa,
traits::{self, systraits::SystemTraits},
traits::{self},
util::dataconv,
SysinspectError,
};
use once_cell::sync::{Lazy, OnceCell};
use once_cell::sync::Lazy;
use std::{fs, path::PathBuf, sync::Arc, vec};
use tokio::io::AsyncReadExt;
use tokio::net::{tcp::OwnedReadHalf, TcpStream};
Expand All @@ -30,13 +30,19 @@ Traits are system properties and attributes on which a minion is running.
P.S. These are not Rust traits. :-)
*/

/*
/// System traits instance
static _TRAITS: OnceCell<SystemTraits> = OnceCell::new();
/// Returns a copy of initialised traits.
pub fn get_minion_traits() -> SystemTraits {
_TRAITS.get().expect("Traits are not initialised!?").to_owned()
pub fn traits::get_minion_traits(cfg: Option<&MinionConfig>) -> SystemTraits {
if let Some(cfg) = cfg {
return _TRAITS.get_or_init(|| SystemTraits::new(cfg.clone())).to_owned();
}
_TRAITS.get_or_init(|| SystemTraits::new(MinionConfig::default())).to_owned()
}
*/

pub struct SysMinion {
cfg: MinionConfig,
Expand All @@ -57,9 +63,7 @@ impl SysMinion {
}

let cfg = MinionConfig::new(cfp)?;

// Init traits
_TRAITS.get_or_init(|| SystemTraits::new(cfg.clone()));
traits::get_minion_traits(Some(&cfg));

let (rstm, wstm) = TcpStream::connect(cfg.master()).await.unwrap().into_split();
let instance = SysMinion {
Expand Down Expand Up @@ -107,8 +111,12 @@ impl SysMinion {
}

let mut out: Vec<String> = vec![];
for t in get_minion_traits().items() {
out.push(format!("{}: {}", t.to_owned(), dataconv::to_string(get_minion_traits().get(&t)).unwrap_or_default()));
for t in traits::get_minion_traits(None).items() {
out.push(format!(
"{}: {}",
t.to_owned(),
dataconv::to_string(traits::get_minion_traits(None).get(&t)).unwrap_or_default()
));
}
log::debug!("Minion traits:\n{}", out.join("\n"));

Expand All @@ -121,7 +129,7 @@ impl SysMinion {

/// Get current minion Id
fn get_minion_id(&self) -> String {
dataconv::as_str(get_minion_traits().get(traits::SYS_ID))
dataconv::as_str(traits::get_minion_traits(None).get(traits::SYS_ID))
}

/// Talk-back to the master
Expand Down Expand Up @@ -235,7 +243,8 @@ impl SysMinion {
}

pub async fn send_traits(self: Arc<Self>) -> Result<(), SysinspectError> {
let mut r = MinionMessage::new(self.get_minion_id(), RequestType::Traits, get_minion_traits().to_json_string()?);
let mut r =
MinionMessage::new(self.get_minion_id(), RequestType::Traits, traits::get_minion_traits(None).to_json_string()?);
r.set_sid(MINION_SID.to_string());
self.request(r.sendable().unwrap()).await; // XXX: make a better error handling for Tokio
Ok(())
Expand All @@ -244,7 +253,7 @@ impl SysMinion {
/// Send ehlo
pub async fn send_ehlo(self: Arc<Self>) -> Result<(), SysinspectError> {
let mut r = MinionMessage::new(
dataconv::as_str(get_minion_traits().get(traits::SYS_ID)),
dataconv::as_str(traits::get_minion_traits(None).get(traits::SYS_ID)),
RequestType::Ehlo,
MINION_SID.to_string(),
);
Expand All @@ -257,7 +266,8 @@ impl SysMinion {

/// Send registration request
pub async fn send_registration(self: Arc<Self>, pbk_pem: String) -> Result<(), SysinspectError> {
let r = MinionMessage::new(dataconv::as_str(get_minion_traits().get(traits::SYS_ID)), RequestType::Add, pbk_pem);
let r =
MinionMessage::new(dataconv::as_str(traits::get_minion_traits(None).get(traits::SYS_ID)), RequestType::Add, pbk_pem);

log::info!("Registration request to {}", self.cfg.master());
self.request(r.sendable()?).await;
Expand Down Expand Up @@ -368,7 +378,7 @@ impl SysMinion {
sr.set_state(mqr_l.state());
sr.set_entities(mqr_l.entities());
sr.set_checkbook_labels(mqr_l.checkbook_labels());
sr.set_traits(get_minion_traits());
sr.set_traits(traits::get_minion_traits(None));

sr.start();

Expand All @@ -384,7 +394,7 @@ impl SysMinion {
log::trace!("Command was dropped as it was specifically addressed for another minion");
return;
} else if tgt.id().is_empty() {
let traits = get_minion_traits();
let traits = traits::get_minion_traits(None);

// Is matching this host?
let mut skip = true;
Expand Down Expand Up @@ -413,7 +423,7 @@ impl SysMinion {
Ok(q) => {
match traits::to_typed_query(q) {
Ok(tpq) => {
if !traits::matches_traits(tpq, get_minion_traits()) {
if !traits::matches_traits(tpq, traits::get_minion_traits(None)) {
log::trace!("Command was dropped as it does not match the traits");
return;
}
Expand Down
4 changes: 2 additions & 2 deletions sysminion/src/proto.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
pub mod msg {
use crate::minion::{get_minion_traits, MINION_SID};
use crate::minion::MINION_SID;
use libsysinspect::{
proto::{rqtypes::RequestType, MinionMessage},
traits,
Expand All @@ -13,7 +13,7 @@ pub mod msg {
/// Make pong message
pub fn get_pong() -> Vec<u8> {
let p = MinionMessage::new(
dataconv::as_str(get_minion_traits().get(traits::SYS_ID)),
dataconv::as_str(traits::get_minion_traits(None).get(traits::SYS_ID)),
RequestType::Pong,
MINION_SID.to_string(),
);
Expand Down

0 comments on commit b0bca1d

Please sign in to comment.