diff --git a/experimental/src/generic/mod.rs b/experimental/src/generic/mod.rs index 13d70eb05..359a7b433 100644 --- a/experimental/src/generic/mod.rs +++ b/experimental/src/generic/mod.rs @@ -1,9 +1,9 @@ extern crate serde; extern crate serde_json; +use lib::{r_snmp_walk, SnmpResult}; use serde::Deserialize; use std::collections::{BTreeMap, HashMap}; -use lib::{r_snmp_walk, SnmpResult}; #[derive(Deserialize, Debug, Clone, Copy)] enum Operation { @@ -44,11 +44,12 @@ struct Leaf { #[derive(Deserialize, Debug)] pub struct Command { - leaf: Leaf, + leaf: Leaf, } pub struct CmdResult { - + pub status: i32, + pub output: String, } impl Command { @@ -58,16 +59,13 @@ impl Command { for entry in &self.leaf.entries { match entry { Entry::Agregation(op) => { - println!("Agregation: {:?}", op); agregation = (&op.name, op.op); - }, - Entry::Query(query) => { - match query.query { - QueryType::Walk => { - res = Some((&query.name, r_snmp_walk(target, &query.oid))); - } - } } + Entry::Query(query) => match query.query { + QueryType::Walk => { + res = Some((&query.name, r_snmp_walk(target, &query.oid))); + } + }, } } match res { @@ -86,18 +84,66 @@ impl Command { Operation::Average => { let sum: f32 = values.iter().sum(); Some((agregation.0, sum / values.len() as f32)) - }, + } _ => None, }; - let metrics = self.build_metrics(&labels, &values, ag); - println!("Metrics: {:?}", metrics); - }, - None => println!("No result"), + let metrics = self.build_metrics(&labels, &values, &ag); + let status = self.build_status(); + let output = self.build_output(&ag, count, status, &metrics); + return CmdResult { status, output }; + } + None => { + return CmdResult { + status: 3, + output: "No result".to_string(), + }; + } } - CmdResult {} } - fn build_metrics(&self, labels: &Vec, values: &Vec, ag: Option<(&str, f32)>) -> BTreeMap { + fn build_status(&self) -> i32 { + 0 + } + + fn build_output( + &self, + ag: &Option<(&str, f32)>, + count: usize, + status: i32, + metrics: &BTreeMap, + ) -> String { + let mut retval = self + .leaf + .output + .replace("{count}", count.to_string().as_str()) + .replace( + "{status}", + match status { + 0 => "OK", + 1 => "WARNING", + 2 => "CRITICAL", + _ => "UNKNOWN", + }, + ); + match ag { + Some(a) => { + retval = retval.replace(format!("{{{}}}", a.0).as_str(), a.1.to_string().as_str()); + } + None => {} + }; + retval += " |"; + metrics.iter().for_each(|(k, v)| { + retval += format!(" {}={}", k, v).as_str(); + }); + retval + } + + fn build_metrics( + &self, + labels: &Vec, + values: &Vec, + ag: &Option<(&str, f32)>, + ) -> BTreeMap { let mut metrics: BTreeMap = BTreeMap::new(); values.iter().enumerate().for_each(|(i, v)| { metrics.insert(labels[i].clone(), *v); @@ -105,7 +151,7 @@ impl Command { match ag { Some(a) => { metrics.insert(a.0.to_string(), a.1); - }, + } None => (), } metrics diff --git a/experimental/src/main.rs b/experimental/src/main.rs index 9b6ae0040..1e3dc6efb 100644 --- a/experimental/src/main.rs +++ b/experimental/src/main.rs @@ -52,9 +52,9 @@ fn json_to_command(file_name: &str) -> Result { fn main() { let cli = Cli::parse(); let url = format!("{}:{}", cli.hostname, cli.port); -// let result = r_snmp_get(&url, "1.3.6.1.2.1.1.1.0", &cli.community); -// println!("Hello, {:?}!", &result); let cmd = json_to_command(&cli.json_conf); let cmd = cmd.unwrap(); let result = cmd.execute(&url); + println!("{}", result.output); + std::process::exit(result.status); }