simple_munin_plugin/
lib.rs

1//! Simple Rust library for building Munin plugins.
2use 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    /// Plugin entry point
55    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// You should set environment variable RUST_TEST_THREADS=1
68#[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        // "load_warning" only
95        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        // "load_warning" and "warning"
103        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        // "warning" only
109        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        // remove both
115        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        // "load_warning" only
128        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}