summaryrefslogtreecommitdiffhomepage
path: root/mullvad_daemon/src
diff options
context:
space:
mode:
Diffstat (limited to 'mullvad_daemon/src')
-rw-r--r--mullvad_daemon/src/cli.rs45
-rw-r--r--mullvad_daemon/src/main.rs46
2 files changed, 87 insertions, 4 deletions
diff --git a/mullvad_daemon/src/cli.rs b/mullvad_daemon/src/cli.rs
new file mode 100644
index 0000000000..670a2bf28b
--- /dev/null
+++ b/mullvad_daemon/src/cli.rs
@@ -0,0 +1,45 @@
+use clap::{App, Arg};
+use log;
+
+use std::path::PathBuf;
+
+pub struct Config {
+ pub log_level: log::LogLevelFilter,
+ pub log_file: Option<PathBuf>,
+}
+
+pub fn get_config() -> Config {
+ let app = create_app();
+ let matches = app.get_matches();
+
+ let log_level = match matches.occurrences_of("v") {
+ 0 => log::LogLevelFilter::Info,
+ 1 => log::LogLevelFilter::Debug,
+ _ => log::LogLevelFilter::Trace,
+ };
+ let log_file = matches.value_of_os("log_file").map(PathBuf::from);
+
+ Config {
+ log_level,
+ log_file,
+ }
+}
+
+fn create_app() -> App<'static, 'static> {
+ App::new(::CRATE_NAME)
+ .version(crate_version!())
+ .author(crate_authors!())
+ .about(crate_description!())
+ .arg(
+ Arg::with_name("v")
+ .short("v")
+ .multiple(true)
+ .help("Sets the level of verbosity."),
+ )
+ .arg(
+ Arg::with_name("log_file")
+ .long("log")
+ .takes_value(true)
+ .help("Activates file logging to the given path"),
+ )
+}
diff --git a/mullvad_daemon/src/main.rs b/mullvad_daemon/src/main.rs
index 51bf264465..74d6801cff 100644
--- a/mullvad_daemon/src/main.rs
+++ b/mullvad_daemon/src/main.rs
@@ -1,8 +1,11 @@
#[macro_use]
+extern crate clap;
+extern crate chrono;
+#[macro_use]
extern crate log;
-extern crate env_logger;
#[macro_use]
extern crate error_chain;
+extern crate fern;
extern crate serde;
#[macro_use]
@@ -21,6 +24,7 @@ extern crate mullvad_types;
extern crate talpid_core;
extern crate talpid_ipc;
+mod cli;
mod management_interface;
mod rpc_info;
mod shutdown;
@@ -29,6 +33,7 @@ use management_interface::{ManagementInterfaceServer, TunnelCommand};
use mullvad_types::states::{DaemonState, SecurityState, TargetState};
use std::io;
+use std::path::PathBuf;
use std::sync::{Arc, Mutex, mpsc};
use std::thread;
@@ -67,6 +72,8 @@ lazy_static! {
];
}
+static CRATE_NAME: &str = "mullvadd";
+
/// All events that can happen in the daemon. Sent from various threads and exposed interfaces.
pub enum DaemonEvent {
@@ -452,7 +459,8 @@ fn log_error<E>(error: &E)
quick_main!(run);
fn run() -> Result<()> {
- init_logger()?;
+ let config = cli::get_config();
+ init_logger(config.log_level, config.log_file.as_ref())?;
let daemon = Daemon::new().chain_err(|| "Unable to initialize daemon")?;
@@ -466,6 +474,36 @@ fn run() -> Result<()> {
Ok(())
}
-fn init_logger() -> Result<()> {
- env_logger::init().chain_err(|| "Failed to bootstrap logging system")
+fn init_logger(log_level: log::LogLevelFilter, log_file: Option<&PathBuf>) -> Result<()> {
+ let silenced_crates = [
+ "jsonrpc_core",
+ "tokio_core",
+ "jsonrpc_ws_server",
+ "ws",
+ "mio",
+ ];
+ let mut config = fern::Dispatch::new()
+ .format(
+ |out, message, record| {
+ out.finish(
+ format_args!(
+ "{}[{}][{}] {}",
+ chrono::Local::now().format("[%Y-%m-%d %H:%M:%S]"),
+ record.target(),
+ record.level(),
+ message
+ ),
+ )
+ },
+ )
+ .level(log_level)
+ .chain(std::io::stdout());
+ for silenced_crate in &silenced_crates {
+ config = config.level_for(*silenced_crate, log::LogLevelFilter::Warn);
+ }
+ if let Some(ref log_file) = log_file {
+ let f = fern::log_file(log_file).chain_err(|| "Failed to open log file for writing")?;
+ config = config.chain(f);
+ }
+ config.apply().chain_err(|| "Failed to bootstrap logging system")
}