in below/src/main.rs [536:758]
fn real_main(init: init::InitToken) {
let opts = Opt::parse();
let debug = opts.debug;
config::BELOW_CONFIG
.set(match BelowConfig::load(&opts.config) {
Ok(c) => c,
Err(e) => {
eprintln!("{:#}", e);
exit(1);
}
})
.expect("BELOW_CONFIG singleton set twice");
let below_config = config::BELOW_CONFIG
.get()
.expect("BELOW_CONFIG empty after set");
// Use live mode as default
let cmd = opts.cmd.as_ref().unwrap_or(&Command::Live {
interval_s: 5,
host: None,
port: None,
});
let rc = match cmd {
Command::External(command) => commands::run_command(init, debug, below_config, command),
Command::Live {
ref interval_s,
ref host,
ref port,
} => {
let host = host.clone();
let port = port.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::On,
|_, below_config, logger, errs| {
live(
logger,
errs,
Duration::from_secs(*interval_s as u64),
debug,
below_config,
host,
port,
)
},
)
}
Command::Record {
ref interval_s,
ref retain_for_s,
ref store_size_limit,
ref collect_io_stat,
ref port,
ref skew_detection_threshold_ms,
ref disable_disk_stat,
ref disable_exitstats,
ref enable_gpu_stats,
ref compress_opts,
} => {
logutil::set_current_log_target(logutil::TargetLog::Term);
run(
init,
debug,
below_config,
Service::On(*port),
RedirectLogOnFail::Off,
|init, below_config, logger, errs| {
record(
init,
logger,
errs,
Duration::from_secs(*interval_s as u64),
below_config,
retain_for_s.map(|r| Duration::from_secs(r as u64)),
*store_size_limit,
*collect_io_stat,
Duration::from_millis(*skew_detection_threshold_ms),
debug,
*disable_disk_stat,
*disable_exitstats,
*enable_gpu_stats,
compress_opts,
)
},
)
}
Command::Replay {
ref time,
ref host,
ref port,
ref yesterdays,
ref snapshot,
} => {
let time = time.clone();
let host = host.clone();
let port = port.clone();
let days_adjuster = yesterdays.clone();
let snapshot = snapshot.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::Off,
|_, below_config, logger, errs| {
replay(
logger,
errs,
time,
below_config,
host,
port,
days_adjuster,
snapshot,
)
},
)
}
Command::Snapshot {
ref begin,
ref end,
ref host,
ref port,
} => {
let begin = begin.clone();
let end = end.clone();
let host = host.clone();
let port = port.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::Off,
|_, below_config, logger, _errs| {
snapshot(logger, below_config, begin, end, host, port)
},
)
}
Command::Debug { ref cmd } => match cmd {
DebugCommand::DumpStore { ref time, ref json } => {
let time = time.clone();
let json = json.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::Off,
|_, below_config, logger, _errs| dump_store(logger, time, below_config, json),
)
}
DebugCommand::ConvertStore {
ref start_time,
ref end_time,
ref from_store_dir,
ref to_store_dir,
ref host,
ref port,
ref compress_opts,
} => {
let start_time = start_time.clone();
let end_time = end_time.clone();
let from_store_dir = from_store_dir.clone();
let to_store_dir = to_store_dir.clone();
let host = host.clone();
let port = port.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::Off,
|_, below_config, logger, _errs| {
convert_store(
logger,
below_config,
start_time,
end_time,
from_store_dir,
to_store_dir,
host,
port,
compress_opts,
)
},
)
}
},
Command::Dump {
ref host,
ref port,
ref cmd,
} => {
let store_dir = below_config.store_dir.clone();
let host = host.clone();
let port = port.clone();
let cmd = cmd.clone();
run(
init,
debug,
below_config,
Service::Off,
RedirectLogOnFail::Off,
|_, _below_config, logger, errs| {
dump::run(logger, errs, store_dir, host, port, cmd)
},
)
}
Command::GenerateCompletions {
ref shell,
ref output,
} => {
generate_completions(shell.clone(), output.clone())
.unwrap_or_else(|_| panic!("Failed to generate completions for {:?}", shell));
0
}
};
exit(rc);
}