simple-munin-plugin 0.1.0

Simple Rust library for building Munin plugins.
Documentation
//! Simple Rust library for building Munin plugins.
use std::fmt;
use std::env;
use std::str::FromStr;

#[derive(Debug)]
#[derive(Copy, Clone)]
pub enum Level {
    Warning,
    Critical
}

impl fmt::Display for Level {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use self::Level::*;
        write!(f, "{}", match *self {
            Warning => "warning",
            Critical => "critical",
        })
    }
}

pub trait MuninNodePlugin {
    fn config(&self);
    fn run(&self);

    fn check_autoconf(&self) -> bool {
        false
    }

    fn autoconf(&self) {
        if self.check_autoconf() {
            println!("yes")
        } else {
            println!("no")
        }
    }

    fn get_env_threshold(level: Level, field: &str) -> Option<String> {
        env::var(format!("{}_{}", field, level)).or_else(|_| env::var(level.to_string())).ok()
    }

    fn get_env_threshold_as<T>(level: Level, field: &str) -> Option<T> where T: FromStr {
        Self::get_env_threshold(level, field).and_then(|s| s.parse::<T>().ok())
    }

    fn print_if_env(level: Level, field: &str) {
        match Self::get_env_threshold(level, field) {
            Some(v) => println!("{}.{} {}", field, level, v),
            _ => ()
        }
    }

    /// Plugin entry point
    fn start(&self) -> i32 {
        match env::args().nth(1) {
            Some(ref s) if s == "config" => self.config(),
            Some(ref s) if s == "autoconf" => self.autoconf(),
            _ => self.run()
        };

        0
    }
}


// You should set environment variable RUST_TEST_THREADS=1
#[cfg(test)]
mod tests {
    use std::env;
    use super::*;
    use super::Level::*;


    struct DummyPlugin;
    impl MuninNodePlugin for DummyPlugin {
        fn config(&self) { unimplemented!() }
        fn run(&self) { unimplemented!() }
    }

    #[test]
    fn test_get_env_threshold() {
        let load = "load";
        let warning = "warning";
        let load_warning = "load_warning";
        env::remove_var(warning);
        env::remove_var(load_warning);
        assert!(env::var(warning).is_err());
        assert!(env::var(load_warning).is_err());
        assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));

        let yes10 = "10".to_string();
        let ok_yes10 = Ok(yes10.clone());
        // "load_warning" only
        env::set_var(load_warning, &yes10);
        assert_eq!(ok_yes10, env::var(load_warning));
        assert!(env::var(warning).is_err());
        assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));

        let yes50 = "50".to_string();
        let ok_yes50 = Ok(yes50.clone());
        // "load_warning" and "warning"
        env::set_var(warning, &yes50);
        assert_eq!(ok_yes10, env::var(load_warning));
        assert_eq!(ok_yes50, env::var(warning));
        assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));

        // "warning" only
        env::remove_var(load_warning);
        assert!(env::var(load_warning).is_err());
        assert_eq!(ok_yes50, env::var(warning));
        assert_eq!(Some(yes50), DummyPlugin::get_env_threshold(Warning, load));

        // remove both
        env::remove_var(warning);
        assert!(env::var(warning).is_err());
        assert!(env::var(load_warning).is_err());
        assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));
    }

    #[test]
    fn test_get_env_threshold_as_number() {
        let load = "load";
        let load_warning = "load_warning";
        let yes60 = "60".to_string();
        let ok_yes60 = Ok(yes60.clone());
        // "load_warning" only
        env::remove_var(load_warning);
        assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
        env::set_var(load_warning, &yes60);
        assert_eq!(ok_yes60, env::var(load_warning));
        assert_eq!(Some(60i32), DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
        env::set_var(load_warning, "2.5");
        assert_eq!(Some(2.5f32), DummyPlugin::get_env_threshold_as::<f32>(Warning, load));
        env::set_var(load_warning, "test");
        assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
    }
}