add color and remove cli deps

This commit is contained in:
beckerinj
2022-12-14 03:09:01 -05:00
parent 1d64040129
commit 38be2c53e7
5 changed files with 162 additions and 87 deletions

55
Cargo.lock generated
View File

@@ -314,26 +314,11 @@ checksum = "8e67816e006b17427c9b4386915109b494fec2d929c63e3bd3561234cbf1bf1e"
dependencies = [
"atty",
"bitflags",
"clap_derive",
"clap_lex",
"once_cell",
"strsim",
"termcolor",
]
[[package]]
name = "clap_derive"
version = "4.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "clap_lex"
version = "0.3.0"
@@ -343,6 +328,17 @@ dependencies = [
"os_str_bytes",
]
[[package]]
name = "colored"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
dependencies = [
"atty",
"lazy_static",
"winapi",
]
[[package]]
name = "core"
version = "0.1.0"
@@ -1327,13 +1323,12 @@ name = "monitor_cli"
version = "0.1.0"
dependencies = [
"async_timing_util",
"bollard",
"clap",
"monitor_types",
"colored",
"rand",
"run_command",
"serde",
"serde_json",
"serde_derive",
"toml",
]
@@ -1702,30 +1697,6 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro2"
version = "1.0.44"

View File

@@ -6,13 +6,11 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
monitor_types = { path = "../lib/types" }
# monitor_types = "0.1.0"
clap = { version="4.0", features=["derive"] }
bollard = "0.13"
clap = "4.0"
async_timing_util = "0.1.12"
rand = "0.8"
serde = "1.0"
serde_json = "1.0"
serde_derive = "1.0"
toml = "0.5"
run_command = "0.0.5"
run_command = "0.0.5"
colored = "2"

View File

@@ -1,15 +1,17 @@
use std::{
fs::{self, File},
io::{Read, Write},
io::{Read, Write}, path::PathBuf, str::FromStr,
};
use async_timing_util::Timelength;
use clap::ArgMatches;
use monitor_types::{CoreConfig, MongoConfig, PeripheryConfig};
use colored::Colorize;
use rand::{distributions::Alphanumeric, Rng};
use run_command::run_command_pipe_to_terminal;
use serde::Serialize;
use crate::types::{CoreConfig, MongoConfig, PeripheryConfig};
const CORE_IMAGE_NAME: &str = "mbecker20/monitor-core";
const PERIPHERY_IMAGE_NAME: &str = "mbecker20/monitor-periphery";
@@ -64,9 +66,9 @@ pub fn gen_core_config(sub_matches: &ArgMatches) {
github_webhook_secret: generate_secret(30),
};
write_to_toml(&path, config);
write_to_toml(&path, &config);
println!("\ncore config has been generated \n");
println!("\n{} has been generated at {path}\n", "core config".bold());
}
pub fn start_mongo(sub_matches: &ArgMatches) {
@@ -74,11 +76,11 @@ pub fn start_mongo(sub_matches: &ArgMatches) {
let password = sub_matches.get_one::<String>("password");
if (username.is_some() && password.is_none()) {
println!("❌ must provide --password if username is provided ❌");
println!("\n❌ must provide {} if username is provided ❌\n", "--password".bold());
return;
}
if (username.is_none() && password.is_some()) {
println!("❌ must provide --username if password is provided ❌");
println!("\n❌ must provide {} if password is provided ❌\n", "--username".bold());
return;
}
@@ -104,20 +106,25 @@ pub fn start_mongo(sub_matches: &ArgMatches) {
.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());
let env = if let (Some(username), Some(password)) = (username, password) {
format!(" --env MONGO_INITDB_ROOT_USERNAME={username} --env MONGO_INITDB_ROOT_PASSWORD={password}")
} else {
String::new()
};
println!("\n==============\n mongo config \n==============\n");
println!("name: {name}");
println!("port: {port}");
println!("mount: {mount}");
println!("network: {network}");
println!(
"\n====================\n {} \n====================\n",
"mongo config".bold()
);
if let Some(username) = username {
println!("{}: {username}", "mongo username".dimmed());
}
println!("{}: {name}", "container name".dimmed());
println!("{}: {port}", "port".dimmed());
println!("{}: {mount}", "mount".dimmed());
println!("{}: {network}", "network".dimmed());
println!("\npress ENTER to start mongo");
println!("\npress {} to start {}. {}", "ENTER".green().bold(), "MongoDB".bold(), "(ctrl-c to cancel)".dimmed());
let buffer = &mut [0u8];
let res = std::io::stdin().read_exact(buffer);
@@ -131,9 +138,9 @@ pub fn start_mongo(sub_matches: &ArgMatches) {
let output = run_command_pipe_to_terminal(&command);
if output.success() {
println!("\nmonitor mongo has been started up ✅\n")
println!("\n{} has been started up ✅\n", "monitor mongo".bold())
} else {
eprintln!("\n❌ there was some error on startup ❌\n")
eprintln!("\n❌ there was some {} on startup ❌\n", "error".red())
}
}
@@ -141,7 +148,7 @@ pub fn start_core(sub_matches: &ArgMatches) {
let config_path = sub_matches
.get_one::<String>("config_path")
.map(|p| p.as_str())
.unwrap_or("$HOME/.monitor/core.config.toml")
.unwrap_or("~/.monitor/core.config.toml")
.to_string();
let name = sub_matches
@@ -161,13 +168,13 @@ pub fn start_core(sub_matches: &ArgMatches) {
.map(|p| p.as_str())
.unwrap_or("bridge");
println!("\n=============\n core config \n=============\n");
println!("name: {name}");
println!("config path: {config_path}");
println!("port: {port}");
println!("network: {network}");
println!("\n===================\n {} \n===================\n", "core config".bold());
println!("{}: {name}", "container name".dimmed());
println!("{}: {config_path}", "config path".dimmed());
println!("{}: {port}", "port".dimmed());
println!("{}: {network}", "network".dimmed());
println!("\npress ENTER to start monitor core");
println!("\npress {} to start {}. {}", "ENTER".green().bold(), "monitor core".bold(), "(ctrl-c to cancel)".dimmed());
let buffer = &mut [0u8];
let res = std::io::stdin().read_exact(buffer);
@@ -181,9 +188,9 @@ pub fn start_core(sub_matches: &ArgMatches) {
let output = run_command_pipe_to_terminal(&command);
if output.success() {
println!("\nmonitor core has been started up ✅\n")
println!("\n{} has been started up ✅\n", "monitor core".bold())
} else {
eprintln!("\n❌ there was some error on startup ❌\n")
eprintln!("\n❌ there was some {} on startup ❌\n", "error".red())
}
}
@@ -191,7 +198,7 @@ pub fn gen_periphery_config(sub_matches: &ArgMatches) {
let path = sub_matches
.get_one::<String>("path")
.map(|p| p.as_str())
.unwrap_or("$HOME/.monitor/periphery.config.toml")
.unwrap_or("~/.monitor/periphery.config.toml")
.to_string();
let port = sub_matches
@@ -209,22 +216,22 @@ pub fn gen_periphery_config(sub_matches: &ArgMatches) {
docker_accounts: Default::default(),
};
write_to_toml(&path, config);
write_to_toml(&path, &config);
println!("\nperiphery config has been generated ✅\n");
println!("\n{} generated at {path}\n", "periphery config".bold());
}
pub fn start_periphery(sub_matches: &ArgMatches) {
let config_path = sub_matches
.get_one::<String>("config_path")
.map(|p| p.as_str())
.unwrap_or("$HOME/.monitor/periphery.config.toml")
.unwrap_or("~/.monitor/periphery.config.toml")
.to_string();
let repo_dir = sub_matches
.get_one::<String>("repo_dir")
.map(|p| p.as_str())
.unwrap_or("$HOME/.monitor/repos")
.unwrap_or("~/.monitor/repos")
.to_string();
let name = sub_matches
@@ -244,14 +251,14 @@ pub fn start_periphery(sub_matches: &ArgMatches) {
.map(|p| p.as_str())
.unwrap_or("bridge");
println!("\n==================\n periphery config \n==================\n");
println!("name: {name}");
println!("config path: {config_path}");
println!("repo dir: {repo_dir}");
println!("port: {port}");
println!("network: {network}");
println!("\n========================\n {} \n========================\n", "periphery config".bold());
println!("{}: {name}", "container name".dimmed());
println!("{}: {config_path}", "config path".dimmed());
println!("{}: {repo_dir}", "repo folder".dimmed());
println!("{}: {port}", "port".dimmed());
println!("{}: {network}", "network".dimmed());
println!("\npress ENTER to start monitor periphery");
println!("\npress {} to start {}. {}", "ENTER".green().bold(), "monitor periphery".bold(), "(ctrl-c to cancel)".dimmed());
let buffer = &mut [0u8];
let res = std::io::stdin().read_exact(buffer);
@@ -265,13 +272,16 @@ pub fn start_periphery(sub_matches: &ArgMatches) {
let output = run_command_pipe_to_terminal(&command);
if output.success() {
println!("\nmonitor periphery has been started up ✅\n")
println!("\n{} has been started up ✅\n", "monitor periphery".bold())
} else {
eprintln!("\n❌ there was some error on startup ❌\n")
eprintln!("\n❌ there was some {} on startup ❌\n", "error".red())
}
}
fn write_to_toml(path: &str, toml: impl Serialize) {
let path = PathBuf::from_str(path).expect("not a valid path");
println!("{}", path.display());
let _ = fs::create_dir_all(pop_path(&path));
fs::write(
path,
toml::to_string(&toml).expect("failed to parse config into toml"),
@@ -279,6 +289,12 @@ fn write_to_toml(path: &str, toml: impl Serialize) {
.expect("❌ failed to write toml to file ❌");
}
fn pop_path(path: &PathBuf) -> PathBuf {
let mut clone = path.clone();
clone.pop();
clone
}
fn generate_secret(length: usize) -> String {
rand::thread_rng()
.sample_iter(&Alphanumeric)

View File

@@ -3,6 +3,7 @@
use clap::{arg, Arg, Command};
mod helpers;
mod types;
use helpers::*;

89
cli/src/types.rs Normal file
View File

@@ -0,0 +1,89 @@
use std::collections::HashMap;
use async_timing_util::Timelength;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CoreConfig {
// port the core web server runs on
#[serde(default = "default_core_port")]
pub port: u16,
// jwt config
pub jwt_secret: String,
#[serde(default = "default_jwt_valid_for")]
pub jwt_valid_for: Timelength,
// integration with slack app
pub slack_url: Option<String>,
// github integration
pub github_webhook_secret: String,
pub github_oauth: OauthCredentials,
// mongo config
pub mongo: MongoConfig,
}
fn default_core_port() -> u16 {
9000
}
fn default_jwt_valid_for() -> Timelength {
Timelength::OneWeek
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct OauthCredentials {
pub id: String,
pub secret: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct MongoConfig {
pub uri: String,
#[serde(default = "default_core_mongo_app_name")]
pub app_name: String,
#[serde(default = "default_core_mongo_db_name")]
pub db_name: String,
}
fn default_core_mongo_app_name() -> String {
"monitor_core".to_string()
}
fn default_core_mongo_db_name() -> String {
"monitor".to_string()
}
pub type GithubUsername = String;
pub type GithubToken = String;
pub type GithubAccounts = HashMap<GithubUsername, GithubToken>;
pub type DockerUsername = String;
pub type DockerToken = String;
pub type DockerAccounts = HashMap<DockerUsername, DockerToken>;
pub type SecretsMap = HashMap<String, String>;
#[derive(Serialize, Deserialize, Debug)]
pub struct PeripheryConfig {
#[serde(default = "default_periphery_port")]
pub port: u16,
#[serde(default = "default_repo_dir")]
pub repo_dir: String,
#[serde(default)]
pub secrets: SecretsMap,
#[serde(default)]
pub github_accounts: GithubAccounts,
#[serde(default)]
pub docker_accounts: DockerAccounts,
}
fn default_periphery_port() -> u16 {
8000
}
fn default_repo_dir() -> String {
"/repos".to_string()
}