Browse Source

Move configuration into a separate module

refactor-mempool
Roman Zeyde 6 years ago
parent
commit
7d9cbc74f1
No known key found for this signature in database GPG Key ID: 87CAE5FA46917CBB
  1. 95
      src/app.rs
  2. 94
      src/config.rs
  3. 1
      src/lib.rs

95
src/app.rs

@ -1,86 +1,15 @@
use argparse::{ArgumentParser, Store, StoreTrue};
use chan;
use chan_signal;
use error_chain::ChainedError;
use simplelog::LevelFilter;
use std::fs::OpenOptions;
use std::net::SocketAddr;
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use daemon::Network;
use config::Config;
use {daemon, index, query, rpc, store};
use errors::*;
#[derive(Debug)]
struct Config {
log_file: String,
log_level: LevelFilter,
restart: bool,
network_type: Network, // bitcoind JSONRPC endpoint
db_path: &'static str, // RocksDB directory path
rpc_addr: SocketAddr, // for serving Electrum clients
}
impl Config {
pub fn from_args() -> Config {
let mut testnet = false;
let mut verbose = false;
let mut restart = false;
let mut log_file = "".to_string();
{
let mut parser = ArgumentParser::new();
parser.set_description("Bitcoin indexing server.");
parser.refer(&mut testnet).add_option(
&["--testnet"],
StoreTrue,
"Connect to a testnet bitcoind instance",
);
parser.refer(&mut verbose).add_option(
&["-v", "--verbose"],
StoreTrue,
"More verbose logging to stderr",
);
parser.refer(&mut restart).add_option(
&["--restart"],
StoreTrue,
"Restart the server in case of a recoverable error",
);
parser.refer(&mut log_file).add_option(
&["-l", "--log-file"],
Store,
"Write the log into specified file",
);
parser.parse_args_or_exit();
}
let network_type = match testnet {
false => Network::Mainnet,
true => Network::Testnet,
};
Config {
log_file,
log_level: if verbose {
LevelFilter::Debug
} else {
LevelFilter::Info
},
restart,
network_type,
db_path: match network_type {
Network::Mainnet => "./db/mainnet",
Network::Testnet => "./db/testnet",
},
rpc_addr: match network_type {
Network::Mainnet => "127.0.0.1:50001",
Network::Testnet => "127.0.0.1:60001",
}.parse()
.unwrap(),
}
}
}
pub struct App {
store: store::DBStore,
index: index::Index,
@ -161,27 +90,6 @@ fn run_server(config: &Config) -> Result<()> {
Ok(())
}
fn setup_logging(config: &Config) {
use simplelog::*;
let mut cfg = Config::default();
cfg.time_format = Some("%F %H:%M:%S%.3f");
let mut loggers = Vec::<Box<SharedLogger>>::new();
loggers.push(TermLogger::new(config.log_level, cfg.clone()).unwrap());
if !config.log_file.is_empty() {
loggers.push(WriteLogger::new(
LevelFilter::Debug,
cfg.clone(),
OpenOptions::new()
.create(true)
.append(true)
.open(&config.log_file)
.unwrap(),
));
}
CombinedLogger::init(loggers).unwrap();
info!("config: {:?}", config);
}
struct Repeat {
do_restart: bool,
iter_count: usize,
@ -215,7 +123,6 @@ impl Iterator for Repeat {
pub fn main() {
let config = Config::from_args();
setup_logging(&config);
for _ in Repeat::new(&config) {
match run_server(&config) {
Ok(_) => break,

94
src/config.rs

@ -0,0 +1,94 @@
use argparse::{ArgumentParser, Store, StoreTrue};
use daemon::Network;
use simplelog;
use std::fs::OpenOptions;
use std::net::SocketAddr;
#[derive(Debug)]
pub struct Config {
pub log_file: String,
pub log_level: simplelog::LevelFilter,
pub restart: bool,
pub network_type: Network, // bitcoind JSONRPC endpoint
pub db_path: &'static str, // RocksDB directory path
pub rpc_addr: SocketAddr, // for serving Electrum clients
}
impl Config {
pub fn from_args() -> Config {
let mut testnet = false;
let mut verbose = false;
let mut restart = false;
let mut log_file = "".to_string();
{
let mut parser = ArgumentParser::new();
parser.set_description("Bitcoin indexing server.");
parser.refer(&mut testnet).add_option(
&["--testnet"],
StoreTrue,
"Connect to a testnet bitcoind instance",
);
parser.refer(&mut verbose).add_option(
&["-v", "--verbose"],
StoreTrue,
"More verbose logging to stderr",
);
parser.refer(&mut restart).add_option(
&["--restart"],
StoreTrue,
"Restart the server in case of a recoverable error",
);
parser.refer(&mut log_file).add_option(
&["-l", "--log-file"],
Store,
"Write the log into specified file",
);
parser.parse_args_or_exit();
}
let network_type = match testnet {
false => Network::Mainnet,
true => Network::Testnet,
};
let config = Config {
log_file,
log_level: if verbose {
simplelog::LevelFilter::Debug
} else {
simplelog::LevelFilter::Info
},
restart,
network_type,
db_path: match network_type {
Network::Mainnet => "./db/mainnet",
Network::Testnet => "./db/testnet",
},
rpc_addr: match network_type {
Network::Mainnet => "127.0.0.1:50001",
Network::Testnet => "127.0.0.1:60001",
}.parse()
.unwrap(),
};
setup_logging(&config);
config
}
}
fn setup_logging(config: &Config) {
let mut cfg = simplelog::Config::default();
cfg.time_format = Some("%F %H:%M:%S%.3f");
let mut loggers = Vec::<Box<simplelog::SharedLogger>>::new();
loggers.push(simplelog::TermLogger::new(config.log_level, cfg.clone()).unwrap());
if !config.log_file.is_empty() {
loggers.push(simplelog::WriteLogger::new(
simplelog::LevelFilter::Debug,
cfg.clone(),
OpenOptions::new()
.create(true)
.append(true)
.open(&config.log_file)
.unwrap(),
));
}
simplelog::CombinedLogger::init(loggers).unwrap();
info!("config: {:?}", config);
}

1
src/lib.rs

@ -26,6 +26,7 @@ extern crate serde_derive;
extern crate serde_json;
pub mod app;
mod config;
mod daemon;
mod errors;
mod index;

Loading…
Cancel
Save