adds util
Signed-off-by: Jochen Maes <jochen@sejo-it.be>
This commit is contained in:
parent
5f58c86436
commit
55fc77b728
@ -1,6 +1,4 @@
|
|||||||
use std::process::Command;
|
use crate::{types::fact::{Fact, FactData}, util::command::get_result_as_string};
|
||||||
|
|
||||||
use crate::types::fact::{Fact, FactData};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub struct IPData {}
|
pub struct IPData {}
|
||||||
@ -41,13 +39,7 @@ impl Fact for IPData {
|
|||||||
fn gather(&self) -> Vec<FactData> {
|
fn gather(&self) -> Vec<FactData> {
|
||||||
let mut vfd: Vec<FactData> = vec![];
|
let mut vfd: Vec<FactData> = vec![];
|
||||||
let time_set = self.get_epoch_ms();
|
let time_set = self.get_epoch_ms();
|
||||||
let output = Command::new("ip")
|
let ips: Vec<IpAddr> = serde_json::from_str(get_result_as_string("ip", vec!["-j", "addr"]).as_str()).unwrap();
|
||||||
.arg("-j")
|
|
||||||
.arg("addr")
|
|
||||||
.output()
|
|
||||||
.expect("Failed to execute ip");
|
|
||||||
let stdout = String::from_utf8(output.stdout).unwrap();
|
|
||||||
let ips: Vec<IpAddr> = serde_json::from_str(stdout.as_str()).unwrap();
|
|
||||||
for ip in ips {
|
for ip in ips {
|
||||||
if ip.ifname != "lo" {
|
if ip.ifname != "lo" {
|
||||||
for addr_info in ip.addr_info {
|
for addr_info in ip.addr_info {
|
||||||
@ -89,3 +81,27 @@ impl Fact for IPData {
|
|||||||
return vfd;
|
return vfd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct IpRoute {
|
||||||
|
dst: String,
|
||||||
|
gateway: Option<String>,
|
||||||
|
dev: String,
|
||||||
|
protocol: Option<String>,
|
||||||
|
metric: Option<i32>,
|
||||||
|
flags: Vec<String>,
|
||||||
|
scope: String,
|
||||||
|
prefsrc: String,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Fact for IpRoute {
|
||||||
|
fn gather(&self) -> Vec<FactData> {
|
||||||
|
let mut vfd: Vec<FactData> = vec![];
|
||||||
|
let time_set = self.get_epoch_ms();
|
||||||
|
|
||||||
|
let routes: Vec<IpRoute> = serde_json::from_str(get_result_as_string("ip", vec!["-j", "route"]).as_str()).unwrap();
|
||||||
|
|
||||||
|
return vfd;
|
||||||
|
}
|
||||||
|
}
|
105
src/gatherers/system.rs
Normal file
105
src/gatherers/system.rs
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use crate::types::fact::{Fact, FactData};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
pub struct SystemData {}
|
||||||
|
|
||||||
|
impl SystemData {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct UnameData{
|
||||||
|
kernel_name: String,
|
||||||
|
node_name: String,
|
||||||
|
kernel_release: String,
|
||||||
|
kernel_version: String,
|
||||||
|
machine: String,
|
||||||
|
processor: String,
|
||||||
|
hardware_platform: String,
|
||||||
|
operating_system: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct IpAddrInfo {
|
||||||
|
family: String,
|
||||||
|
local: String,
|
||||||
|
prefixlen: i32,
|
||||||
|
broadcast: Option<String>,
|
||||||
|
scope: String,
|
||||||
|
dynamic: Option<bool>,
|
||||||
|
noprefixroute: Option<bool>,
|
||||||
|
label: Option<String>,
|
||||||
|
valid_life_time: i64,
|
||||||
|
preferred_life_time: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct IpAddr {
|
||||||
|
ifindex: i32,
|
||||||
|
ifname: String,
|
||||||
|
flags: Vec<String>,
|
||||||
|
mtu: i32,
|
||||||
|
qdisc: String,
|
||||||
|
operstate: String,
|
||||||
|
group: String,
|
||||||
|
txqlen: i32,
|
||||||
|
link_type: String,
|
||||||
|
address: Option<String>,
|
||||||
|
broadcast: Option<String>,
|
||||||
|
addr_info: Vec<IpAddrInfo>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Fact for SystemData {
|
||||||
|
fn gather(&self) -> Vec<FactData> {
|
||||||
|
let mut vfd: Vec<FactData> = vec![];
|
||||||
|
let time_set = self.get_epoch_ms();
|
||||||
|
let output = Command::new("ip")
|
||||||
|
.arg("-j")
|
||||||
|
.arg("addr")
|
||||||
|
.output()
|
||||||
|
.expect("Failed to execute ip");
|
||||||
|
let stdout = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let ips: Vec<IpAddr> = serde_json::from_str(stdout.as_str()).unwrap();
|
||||||
|
for ip in ips {
|
||||||
|
if ip.ifname != "lo" {
|
||||||
|
for addr_info in ip.addr_info {
|
||||||
|
let fd = FactData {
|
||||||
|
name: format!("ip_addr_{}_{}_addr", ip.ifname, addr_info.family),
|
||||||
|
value: addr_info.local,
|
||||||
|
time_set: time_set,
|
||||||
|
};
|
||||||
|
vfd.push(fd);
|
||||||
|
vfd.push(FactData {
|
||||||
|
name: format!("ip_addr_{}_{}_prefixlen", ip.ifname, addr_info.family),
|
||||||
|
value: addr_info.prefixlen.to_string(),
|
||||||
|
time_set: time_set,
|
||||||
|
});
|
||||||
|
if addr_info.label.is_some() {
|
||||||
|
vfd.push(FactData {
|
||||||
|
name: format!("ip_addr_{}_{}_label", ip.ifname, addr_info.family),
|
||||||
|
value: addr_info.label.unwrap(),
|
||||||
|
time_set: time_set,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if addr_info.broadcast.is_some() {
|
||||||
|
vfd.push(FactData {
|
||||||
|
name: format!("ip_addr_{}_{}_broadcast", ip.ifname, addr_info.family),
|
||||||
|
value: addr_info.broadcast.unwrap(),
|
||||||
|
time_set: time_set,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if ip.address.is_some() {
|
||||||
|
vfd.push(FactData {
|
||||||
|
name: format!("ip_addr_{}_macaddr", ip.ifname),
|
||||||
|
value: ip.address.clone().unwrap(),
|
||||||
|
time_set: time_set,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vfd;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
mod types;
|
mod types;
|
||||||
mod gatherers;
|
mod gatherers;
|
||||||
|
mod util;
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use crate::types::fact::{Fact, FactData};
|
use crate::types::fact::{Fact, FactData};
|
||||||
|
42
src/util/command.rs
Normal file
42
src/util/command.rs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
use std::process::{Command, Output};
|
||||||
|
|
||||||
|
fn get_output_from_command(cmd: &str, args: Vec<&str>) -> Output {
|
||||||
|
return Command::new(&cmd)
|
||||||
|
.args(args)
|
||||||
|
.output()
|
||||||
|
.expect(format!("Failed to execute command: {}", &cmd).as_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_stdout_as_string(output: Output) -> String {
|
||||||
|
return match String::from_utf8(output.stdout) {
|
||||||
|
Ok(x) => x.strip_suffix("\n").unwrap().to_string(),
|
||||||
|
Err(e) => e.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_stderr_as_string(output: Output) -> String {
|
||||||
|
return match String::from_utf8(output.stderr) {
|
||||||
|
Ok(x) => x.strip_suffix("\n").unwrap().to_string(),
|
||||||
|
Err(e) => e.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_result_as_string(cmd: &str, args:Vec<&str>) -> String {
|
||||||
|
let output = get_output_from_command(cmd, args);
|
||||||
|
match output.status.code() {
|
||||||
|
Some(0) => get_stdout_as_string(output),
|
||||||
|
_ => get_stderr_as_string(output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::util::command::{get_result_as_string};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_output_from_command() {
|
||||||
|
assert_eq!("Linux", get_result_as_string("uname", vec![]));
|
||||||
|
assert_eq!("ls: cannot access '/dev/mouse': No such file or directory",
|
||||||
|
get_result_as_string("ls", vec!["/dev/mouse",]))
|
||||||
|
}
|
||||||
|
}
|
1
src/util/mod.rs
Normal file
1
src/util/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod command;
|
Loading…
Reference in New Issue
Block a user