updated zabbixlaunch

This commit is contained in:
Paul Lecuq 2021-12-07 18:49:04 +01:00
parent b7a9def20d
commit 05b38b3540
4 changed files with 39 additions and 23 deletions

View File

@ -56,9 +56,11 @@ impl Context {
ctx ctx
} }
pub fn hotreload(&mut self) { pub fn hotreload(&mut self) {
let mut i = 0; let mut i = 0;
let waitmilli = self.cfg.refresh.unwrap_or(5) * 1000; let waitmilli = self.cfg.refresh.unwrap_or(5) * 1000;
while i < waitmilli { while i < waitmilli {
let waitinc = waitmilli / ReloadFrequency::Medium as u64; let waitinc = waitmilli / ReloadFrequency::Medium as u64;
let events = match self.inotify.read_events() { let events = match self.inotify.read_events() {
@ -66,11 +68,12 @@ impl Context {
Err(_) => vec![], Err(_) => vec![],
}; };
if events.len() > 0 { if events.len() > 0 {
self.cfg.load(self.configfile.as_str());
println!( println!(
"Reloading {cfg}", "Reloading {cfg}",
cfg = self.configfile cfg = self.configfile
); );
self.cfg.load(self.configfile.as_str());
get_zabbix_authtoken(&mut self.cfg);
break; break;
} else { } else {
sleep(Duration::from_millis(waitinc)); sleep(Duration::from_millis(waitinc));

View File

@ -7,7 +7,9 @@ use std::time::Duration;
pub const MATRIX_WIDTH: i32 = 8; pub const MATRIX_WIDTH: i32 = 8;
pub const MATRIX_SIZE: i32 = MATRIX_WIDTH * MATRIX_WIDTH; pub const MATRIX_SIZE: i32 = MATRIX_WIDTH * MATRIX_WIDTH;
pub const REQUEST_TIMEOUT: i32 = 10; pub const REQUEST_TIMEOUT: i32 = 5;
pub const ZERO_COLOR: f32 = 0.;
pub const ONE_COLOR: f32 = 1.;
pub fn run(ctx: &mut Context) { pub fn run(ctx: &mut Context) {
match ctx.mode.as_str() { match ctx.mode.as_str() {
@ -63,25 +65,24 @@ fn test(ctx: &mut Context) {
sec = ctx.cfg.refresh.unwrap() sec = ctx.cfg.refresh.unwrap()
); );
loop { loop {
let zabbix_data_result = get_zabbix_problems(&ctx.cfg); ctx.hotreload();
let zabbix_data = match zabbix_data_result { let zabbix_data = match get_zabbix_problems(&ctx.cfg) {
Ok(z) => z, Ok(z) => z,
Err(_) => { Err(_) => {
println!("Error requesting zabbix service, retrying in {}", REQUEST_TIMEOUT); println!("Error requesting zabbix service, retrying in {} seconds", REQUEST_TIMEOUT);
sleep(Duration::from_secs(REQUEST_TIMEOUT as u64)); sleep(Duration::from_secs(REQUEST_TIMEOUT as u64));
continue; continue;
} }
}; };
println!("{}", zabbix_data); println!("{}", zabbix_data);
ctx.hotreload();
} }
} }
pub fn draw(canvas: &mut CanvasLayout, ctx: &mut Context) { pub fn draw(canvas: &mut CanvasLayout, ctx: &mut Context) {
println!("Refresh rate is {} seconds", ctx.cfg.refresh.unwrap()); println!("Refresh rate is {} seconds", ctx.cfg.refresh.unwrap());
loop { loop {
let zabbix_data_result = get_zabbix_problems(&ctx.cfg); ctx.hotreload();
let zabbix_data = match zabbix_data_result { let zabbix_data = match get_zabbix_problems(&ctx.cfg) {
Ok(zabbix_data) => zabbix_data, Ok(zabbix_data) => zabbix_data,
Err(_) => { Err(_) => {
println!("Error requesting zabbix service, retrying in {}", REQUEST_TIMEOUT); println!("Error requesting zabbix service, retrying in {}", REQUEST_TIMEOUT);
@ -114,7 +115,6 @@ pub fn draw(canvas: &mut CanvasLayout, ctx: &mut Context) {
} }
canvas.flush().unwrap(); canvas.flush().unwrap();
} }
ctx.hotreload();
} }
} }
@ -144,9 +144,9 @@ fn clear(canvas: &mut CanvasLayout) {
for a in 0..8 { for a in 0..8 {
for b in 0..9 { for b in 0..9 {
canvas[Pad { x: a, y: b }] = Color { canvas[Pad { x: a, y: b }] = Color {
r: 0f32, r: ZERO_COLOR,
g: 0f32, g: ZERO_COLOR,
b: 1f32, b: ONE_COLOR,
}; };
} }
} }

View File

@ -1,7 +1,8 @@
use std::time::Duration; use std::time::Duration;
use std::thread::sleep; use std::thread::sleep;
use crate::config::Config; use crate::config::Config;
use serde_json::{json, Value}; use serde_json::json;
use serde_json::Value as JsonValue;
pub const ZABBIX_API_VERSION: &'static str = "2.0"; pub const ZABBIX_API_VERSION: &'static str = "2.0";
pub const ZABBIX_API_ID: i32 = 1; pub const ZABBIX_API_ID: i32 = 1;
@ -12,22 +13,33 @@ pub fn get_zabbix_authtoken(cfg: &mut Config) {
let resp = reqwest::blocking::Client::new() let resp = reqwest::blocking::Client::new()
.post(&cfg.server) .post(&cfg.server)
.json(&body) .json(&body)
.send() .send();
.unwrap(); match resp {
Ok(v) => {
let values: Value = resp.json().unwrap(); let values: JsonValue = v.json().unwrap();
cfg.authtoken = Some(values["result"].as_str().unwrap().to_string()); cfg.authtoken = Some(values["result"].as_str().unwrap().to_string());
}
Err(e) => {
println!("{}", e);
cfg.authtoken = Some("".to_string());
}
};
} }
/// Fetch Zabbix problems /// Fetch Zabbix problems
pub fn get_zabbix_problems(cfg: &Config) -> Result<Value, reqwest::Error> { pub fn get_zabbix_problems(cfg: &Config) -> Result<JsonValue, reqwest::Error> {
let body = build_query_triggers(&cfg.authtoken.as_ref().unwrap_or(&String::from(""))); let body = build_query_triggers(&cfg.authtoken.as_ref().unwrap_or(&String::from("")));
let resp = reqwest::blocking::Client::new() let resp = reqwest::blocking::Client::new()
.post(&cfg.server) .post(&cfg.server)
.json(&body) .json(&body)
.send(); .send();
Ok(resp.unwrap().json().unwrap()) match resp {
Ok(v) => v.json(),
Err(e) => {
Err(e)
}
}
} }
/// Check if Zabbix is operational /// Check if Zabbix is operational
@ -51,7 +63,7 @@ fn check_zabbix_connection(cfg: &Config) -> bool {
} }
/// Build the query that fetchs the token /// Build the query that fetchs the token
fn build_query_auth_token(zabbix_username: &String, zabbix_password: &String) -> Value { fn build_query_auth_token(zabbix_username: &String, zabbix_password: &String) -> JsonValue {
let zabbix_api_function = "user.login"; let zabbix_api_function = "user.login";
json!({ json!({
"jsonrpc": ZABBIX_API_VERSION, "jsonrpc": ZABBIX_API_VERSION,
@ -65,7 +77,7 @@ fn build_query_auth_token(zabbix_username: &String, zabbix_password: &String) ->
} }
/// Build the query that fetchs problems /// Build the query that fetchs problems
fn build_query_problems(zabbix_token: &String, zabbix_limit: i64) -> Value { fn build_query_problems(zabbix_token: &String, zabbix_limit: i64) -> JsonValue {
let zabbix_api_function = "problem.get"; let zabbix_api_function = "problem.get";
json!({ json!({
"jsonrpc": ZABBIX_API_VERSION, "jsonrpc": ZABBIX_API_VERSION,
@ -88,7 +100,7 @@ fn build_query_problems(zabbix_token: &String, zabbix_limit: i64) -> Value {
} }
/// Build the query that fetchs triggers /// Build the query that fetchs triggers
fn build_query_triggers(zabbix_token: &String) -> Value { fn build_query_triggers(zabbix_token: &String) -> JsonValue {
let zabbix_api_function = "trigger.get"; let zabbix_api_function = "trigger.get";
json!({ json!({
"jsonrpc": ZABBIX_API_VERSION, "jsonrpc": ZABBIX_API_VERSION,

View File

@ -3,6 +3,7 @@ use std::fmt::{Display, Formatter, Result};
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ZabbixStatus { pub enum ZabbixStatus {
Disaster = 5,
High = 4, High = 4,
Average = 3, Average = 3,
Warning = 2, Warning = 2,