start mongo cli

This commit is contained in:
beckerinj
2022-12-12 02:48:36 -05:00
parent e5dec41b49
commit 9858a7a5ce
4 changed files with 79 additions and 14 deletions

1
Cargo.lock generated
View File

@@ -1265,6 +1265,7 @@ dependencies = [
"clap",
"monitor_types",
"rand",
"run_command",
"serde",
"serde_json",
"toml",

View File

@@ -14,4 +14,5 @@ async_timing_util = "0.1.12"
rand = "0.8"
serde = "1.0"
serde_json = "1.0"
toml = "0.5"
toml = "0.5"
run_command = "0.0.5"

View File

@@ -1,12 +1,13 @@
use std::{
fs::{self, File},
io::Write,
io::{Write, Read},
};
use async_timing_util::Timelength;
use clap::ArgMatches;
use monitor_types::{CoreConfig, MongoConfig, PeripheryConfig};
use rand::{distributions::Alphanumeric, Rng};
use run_command::run_command_pipe_to_terminal;
use serde::Serialize;
pub fn gen_core_config(sub_matches: &ArgMatches) {
@@ -61,25 +62,71 @@ pub fn gen_core_config(sub_matches: &ArgMatches) {
}
pub fn start_mongo(sub_matches: &ArgMatches) {
let username = sub_matches
.get_one::<String>("username")
.map(|p| p.to_string());
let password = sub_matches
.get_one::<String>("password")
.map(|p| p.to_string());
let username = sub_matches.get_one::<String>("username");
let password = sub_matches.get_one::<String>("password");
if (username.is_some() && password.is_none()) {
println!("must provide --password if username is provided ❌");
println!("must provide --password if username is provided ❌");
return;
}
if (username.is_none() && password.is_some()) {
println!("must provide --username if password is provided ❌");
println!("must provide --username if password is provided ❌");
return;
}
// start mongo here
let name = sub_matches
.get_one::<String>("name")
.map(|p| p.as_str())
.unwrap_or("monitor-mongo");
println!("\n✅ monitor mongo has been started up ✅\n")
let port = sub_matches
.get_one::<String>("port")
.map(|p| p.as_str())
.unwrap_or("27017")
.parse::<u16>()
.expect("invalid port");
let network = sub_matches
.get_one::<String>("network")
.map(|p| p.as_str())
.unwrap_or("bridge");
let mount = sub_matches
.get_one::<String>("mount")
.map(|p| p.as_str())
.unwrap_or("~/.monitor/db");
let env = if username.is_some() && password.is_some() {
let (username, password) = (username.unwrap(), password.unwrap());
format!(" --env MONGO_INITDB_ROOT_USERNAME={username} --env MONGO_INITDB_ROOT_PASSWORD={password}")
} else {
String::new()
};
let command = format!("docker run -d --name {name} -p {port}:27017 --network {network} -v {mount}:/data/db{env} mongo --quiet");
println!("\n==============\n mongo config \n==============\n");
println!("name: {name}");
println!("port: {port}");
println!("mount: {mount}");
println!("network: {network}");
println!("\npress ENTER to start mongo");
let buffer = &mut [0u8];
let res = std::io::stdin().read_exact(buffer);
if res.is_err() {
println!("pressed another button, exiting");
}
let output = run_command_pipe_to_terminal(&command);
if output.success() {
println!("\n✅ monitor mongo has been started up ✅\n")
} else {
eprintln!("\n❌ there was some error on startup ❌\n")
}
}
pub fn start_core(sub_matches: &ArgMatches) {

View File

@@ -50,11 +50,27 @@ fn cli() -> Command {
Command::new("start_mongo")
.about("start up a local mongo container for monitor")
.arg(
arg!(--username <USERNAME> "specify the default (root) username for mongo. default is mongo with no auth")
arg!(--name <NAME> "specify the name of the mongo container. default is monitor-mongo")
.required(false)
)
.arg(
arg!(--password <PASSWORD> "specify the default (root) password for mongo. default is mongo with no auth")
arg!(--username <USERNAME> "specify the admin username for mongo. default is mongo with no auth")
.required(false)
)
.arg(
arg!(--password <PASSWORD> "specify the admin password for mongo. default is mongo with no auth")
.required(false)
)
.arg(
arg!(--port <PORT> "sets port mongo will run on. default is 27017")
.required(false)
)
.arg(
arg!(--mount <PATH> "sets the path the mongo data is mounted into. default is ~/.monitor/db")
.required(false)
)
.arg(
arg!(--network <NETWORK> "sets docker network of mongo container. default is bridge")
.required(false)
)
)