simple_munin_plugin/
lib.rs1use std::fmt;
3use std::env;
4use std::str::FromStr;
5
6#[derive(Debug)]
7#[derive(Copy, Clone)]
8pub enum Level {
9 Warning,
10 Critical
11}
12
13impl fmt::Display for Level {
14 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15 use self::Level::*;
16 write!(f, "{}", match *self {
17 Warning => "warning",
18 Critical => "critical",
19 })
20 }
21}
22
23pub trait MuninNodePlugin {
24 fn config(&self);
25 fn run(&self);
26
27 fn check_autoconf(&self) -> bool {
28 false
29 }
30
31 fn autoconf(&self) {
32 if self.check_autoconf() {
33 println!("yes")
34 } else {
35 println!("no")
36 }
37 }
38
39 fn get_env_threshold(level: Level, field: &str) -> Option<String> {
40 env::var(format!("{}_{}", field, level)).or_else(|_| env::var(level.to_string())).ok()
41 }
42
43 fn get_env_threshold_as<T>(level: Level, field: &str) -> Option<T> where T: FromStr {
44 Self::get_env_threshold(level, field).and_then(|s| s.parse::<T>().ok())
45 }
46
47 fn print_if_env(level: Level, field: &str) {
48 match Self::get_env_threshold(level, field) {
49 Some(v) => println!("{}.{} {}", field, level, v),
50 _ => ()
51 }
52 }
53
54 fn start(&self) -> i32 {
56 match env::args().nth(1) {
57 Some(ref s) if s == "config" => self.config(),
58 Some(ref s) if s == "autoconf" => self.autoconf(),
59 _ => self.run()
60 };
61
62 0
63 }
64}
65
66
67#[cfg(test)]
69mod tests {
70 use std::env;
71 use super::*;
72 use super::Level::*;
73
74
75 struct DummyPlugin;
76 impl MuninNodePlugin for DummyPlugin {
77 fn config(&self) { unimplemented!() }
78 fn run(&self) { unimplemented!() }
79 }
80
81 #[test]
82 fn test_get_env_threshold() {
83 let load = "load";
84 let warning = "warning";
85 let load_warning = "load_warning";
86 env::remove_var(warning);
87 env::remove_var(load_warning);
88 assert!(env::var(warning).is_err());
89 assert!(env::var(load_warning).is_err());
90 assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));
91
92 let yes10 = "10".to_string();
93 let ok_yes10 = Ok(yes10.clone());
94 env::set_var(load_warning, &yes10);
96 assert_eq!(ok_yes10, env::var(load_warning));
97 assert!(env::var(warning).is_err());
98 assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));
99
100 let yes50 = "50".to_string();
101 let ok_yes50 = Ok(yes50.clone());
102 env::set_var(warning, &yes50);
104 assert_eq!(ok_yes10, env::var(load_warning));
105 assert_eq!(ok_yes50, env::var(warning));
106 assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));
107
108 env::remove_var(load_warning);
110 assert!(env::var(load_warning).is_err());
111 assert_eq!(ok_yes50, env::var(warning));
112 assert_eq!(Some(yes50), DummyPlugin::get_env_threshold(Warning, load));
113
114 env::remove_var(warning);
116 assert!(env::var(warning).is_err());
117 assert!(env::var(load_warning).is_err());
118 assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));
119 }
120
121 #[test]
122 fn test_get_env_threshold_as_number() {
123 let load = "load";
124 let load_warning = "load_warning";
125 let yes60 = "60".to_string();
126 let ok_yes60 = Ok(yes60.clone());
127 env::remove_var(load_warning);
129 assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
130 env::set_var(load_warning, &yes60);
131 assert_eq!(ok_yes60, env::var(load_warning));
132 assert_eq!(Some(60i32), DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
133 env::set_var(load_warning, "2.5");
134 assert_eq!(Some(2.5f32), DummyPlugin::get_env_threshold_as::<f32>(Warning, load));
135 env::set_var(load_warning, "test");
136 assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
137 }
138}