summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMario Krehl <mario-krehl@gmx.de>2017-12-09 15:44:27 +0100
committerMario Krehl <mario-krehl@gmx.de>2017-12-09 15:44:27 +0100
commitf31d9b16c91afd4bedc9a9dfe856e019561ed4f9 (patch)
tree98192978e04d2e48156515c8ce49cd55f5ed22b9 /src
parent8bc335330080805816fb3ccf803e2daf0cd252bb (diff)
Add basic functionality:
- logging - error handling - configuration parsing
Diffstat (limited to 'src')
-rw-r--r--src/config.rs42
-rw-r--r--src/error.rs10
-rw-r--r--src/main.rs57
3 files changed, 108 insertions, 1 deletions
diff --git a/src/config.rs b/src/config.rs
new file mode 100644
index 0000000..5d1885c
--- /dev/null
+++ b/src/config.rs
@@ -0,0 +1,42 @@
+//! Module for parsing/accessing the configuration
+
+extern crate log;
+extern crate toml;
+
+use std::fs::File;
+use std::io::Read;
+use error::*;
+
+/// Main Config struct
+#[derive(Debug, Deserialize)]
+pub struct Config {
+ item : Vec<Item>,
+}
+
+/// Holds data for one antikoerper Log-File
+#[derive(Debug, Deserialize)]
+struct Item {
+ file : String,
+ regex : String,
+ alias : String,
+}
+
+impl Config {
+ pub fn load(filename : String) -> Result<Config> {
+ debug!("configuration file name: '{}'", filename);
+ let mut file = File::open(filename.clone())
+ .chain_err(|| "configuration file could not be opened")?;
+ debug!("configuration file successfully opened");
+ let mut content = String::new();
+ file.read_to_string(&mut content)
+ .chain_err(|| "configuration file could not be read")?;
+ debug!("configuration file successfully read");
+ match toml::from_str(content.as_str()) {
+ Ok(config) => {
+ debug!("configuration file successfully parsed");
+ Ok(config)
+ },
+ _ => Err(ErrorKind::ConfigParseError(filename).into()),
+ }
+ }
+}
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..6258c10
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,10 @@
+
+error_chain! {
+ errors {
+ ConfigParseError(filename: String) {
+ description("configuration file could not be parsed"),
+ display("configuration file could not be parsed: '{}'", filename),
+ }
+ }
+}
+
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..4a4e53d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,58 @@
+#![recursion_limit = "1024"]
+
+extern crate clap;
+#[macro_use]
+extern crate error_chain;
+#[macro_use]
+extern crate log;
+#[macro_use]
+extern crate serde_derive;
+extern crate simplelog;
+
+use clap::{App, Arg};
+use simplelog::{SimpleLogger, LogLevelFilter, Config as LogConfig};
+
+use std::process::exit;
+
+mod error;
+mod config;
+use config::Config;
+
fn main() {
- println!("Hello, world!");
+ let matches = App::new("aklog-server")
+ .version("0.1.0")
+ .author("Mario Krehl <mario-krehl@gmx.de>")
+ .about("Presents antikoerper-logfiles to grafana")
+ .arg(Arg::with_name("config")
+ .short("c")
+ .long("config")
+ .value_name("FILE")
+ .help("configuration file to use")
+ .takes_value(true)
+ .required(true))
+ .arg(Arg::with_name("verbosity")
+ .short("v")
+ .long("verbose")
+ .help("sets the level of verbosity")
+ .multiple(true))
+ .get_matches();
+
+ match matches.occurrences_of("verbosity") {
+ 0 => SimpleLogger::init(LogLevelFilter::Warn, LogConfig::default()).unwrap(),
+ 1 => SimpleLogger::init(LogLevelFilter::Info, LogConfig::default()).unwrap(),
+ 2 => SimpleLogger::init(LogLevelFilter::Debug, LogConfig::default()).unwrap(),
+ 3 | _ => SimpleLogger::init(LogLevelFilter::Trace, LogConfig::default()).unwrap(),
+ };
+
+ debug!("Initialized logger");
+
+ let config_file = matches.value_of("config").unwrap();
+ let config = match Config::load(String::from(config_file)) {
+ Ok(c) => c,
+ Err(_) => {
+ error!("Failed to open/parse configuration file: '{}'", config_file);
+ exit(1);
+ },
+ };
+
}