forked from github-starred/komodo
add color and remove cli deps
This commit is contained in:
55
Cargo.lock
generated
55
Cargo.lock
generated
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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!("\n✅ core 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!("\n✅ monitor 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!("\n✅ monitor 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!("\n✅ periphery 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!("\n✅ monitor 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)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
use clap::{arg, Arg, Command};
|
||||
|
||||
mod helpers;
|
||||
mod types;
|
||||
|
||||
use helpers::*;
|
||||
|
||||
|
||||
89
cli/src/types.rs
Normal file
89
cli/src/types.rs
Normal 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()
|
||||
}
|
||||
Reference in New Issue
Block a user