From 9858a7a5ce3ffb07d16f2a6dcd834eb0399ab9ec Mon Sep 17 00:00:00 2001 From: beckerinj Date: Mon, 12 Dec 2022 02:48:36 -0500 Subject: [PATCH] start mongo cli --- Cargo.lock | 1 + cli/Cargo.toml | 3 +- cli/src/helpers.rs | 69 ++++++++++++++++++++++++++++++++++++++-------- cli/src/main.rs | 20 ++++++++++++-- 4 files changed, 79 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 050081ad4..e9977327d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1265,6 +1265,7 @@ dependencies = [ "clap", "monitor_types", "rand", + "run_command", "serde", "serde_json", "toml", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 815042f60..6e1e02e30 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -14,4 +14,5 @@ async_timing_util = "0.1.12" rand = "0.8" serde = "1.0" serde_json = "1.0" -toml = "0.5" \ No newline at end of file +toml = "0.5" +run_command = "0.0.5" \ No newline at end of file diff --git a/cli/src/helpers.rs b/cli/src/helpers.rs index 0ae6a12f8..321c23115 100644 --- a/cli/src/helpers.rs +++ b/cli/src/helpers.rs @@ -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::("username") - .map(|p| p.to_string()); - let password = sub_matches - .get_one::("password") - .map(|p| p.to_string()); + let username = sub_matches.get_one::("username"); + let password = sub_matches.get_one::("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::("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::("port") + .map(|p| p.as_str()) + .unwrap_or("27017") + .parse::() + .expect("invalid port"); + + let network = sub_matches + .get_one::("network") + .map(|p| p.as_str()) + .unwrap_or("bridge"); + + let mount = sub_matches + .get_one::("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) { diff --git a/cli/src/main.rs b/cli/src/main.rs index 12f206ba0..62473891f 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -50,11 +50,27 @@ fn cli() -> Command { Command::new("start_mongo") .about("start up a local mongo container for monitor") .arg( - arg!(--username "specify the default (root) username for mongo. default is mongo with no auth") + arg!(--name "specify the name of the mongo container. default is monitor-mongo") .required(false) ) .arg( - arg!(--password "specify the default (root) password for mongo. default is mongo with no auth") + arg!(--username "specify the admin username for mongo. default is mongo with no auth") + .required(false) + ) + .arg( + arg!(--password "specify the admin password for mongo. default is mongo with no auth") + .required(false) + ) + .arg( + arg!(--port "sets port mongo will run on. default is 27017") + .required(false) + ) + .arg( + arg!(--mount "sets the path the mongo data is mounted into. default is ~/.monitor/db") + .required(false) + ) + .arg( + arg!(--network "sets docker network of mongo container. default is bridge") .required(false) ) )