169 lines
6.2 KiB
Rust
169 lines
6.2 KiB
Rust
|
|
use anyhow::Result;
|
||
|
|
use std::env;
|
||
|
|
use std::process::Command;
|
||
|
|
use crate::package_manager::{get_all_components, InstallMode, PackageManager};
|
||
|
|
pub async fn run() -> Result<()> {
|
||
|
|
env_logger::init();
|
||
|
|
let args: Vec<String> = env::args().collect();
|
||
|
|
if args.len() < 2 {
|
||
|
|
print_usage();
|
||
|
|
return Ok(());
|
||
|
|
}
|
||
|
|
use tracing::info;
|
||
|
|
fn print_usage(){info!("usage: botserver <command> [options]")}
|
||
|
|
let command = &args[1];
|
||
|
|
match command.as_str() {
|
||
|
|
"start" => {
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
println!("Starting all installed components...");
|
||
|
|
let components = get_all_components();
|
||
|
|
for component in components {
|
||
|
|
if pm.is_installed(component.name) {
|
||
|
|
match pm.start(component.name) {
|
||
|
|
Ok(_) => println!("✓ Started {}", component.name),
|
||
|
|
Err(e) => eprintln!("✗ Failed to start {}: {}", component.name, e),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
println!("✓ BotServer components started");
|
||
|
|
}
|
||
|
|
"stop" => {
|
||
|
|
println!("Stopping all components...");
|
||
|
|
let components = get_all_components();
|
||
|
|
for component in components {
|
||
|
|
let _ = Command::new("pkill").arg("-f").arg(component.termination_command).output();
|
||
|
|
}
|
||
|
|
println!("✓ BotServer components stopped");
|
||
|
|
}
|
||
|
|
"restart" => {
|
||
|
|
println!("Restarting BotServer...");
|
||
|
|
let components = get_all_components();
|
||
|
|
for component in components {
|
||
|
|
let _ = Command::new("pkill").arg("-f").arg(component.termination_command).output();
|
||
|
|
}
|
||
|
|
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
let components = get_all_components();
|
||
|
|
for component in components {
|
||
|
|
if pm.is_installed(component.name) {
|
||
|
|
let _ = pm.start(component.name);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
println!("✓ BotServer restarted");
|
||
|
|
}
|
||
|
|
"install" => {
|
||
|
|
if args.len() < 3 {
|
||
|
|
eprintln!("Usage: botserver install <component> [--container] [--tenant <name>]");
|
||
|
|
return Ok(());
|
||
|
|
}
|
||
|
|
let component = &args[2];
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
pm.install(component).await?;
|
||
|
|
println!("✓ Component '{}' installed successfully", component);
|
||
|
|
}
|
||
|
|
"remove" => {
|
||
|
|
if args.len() < 3 {
|
||
|
|
eprintln!("Usage: botserver remove <component> [--container] [--tenant <name>]");
|
||
|
|
return Ok(());
|
||
|
|
}
|
||
|
|
let component = &args[2];
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
pm.remove(component)?;
|
||
|
|
println!("✓ Component '{}' removed successfully", component);
|
||
|
|
}
|
||
|
|
"list" => {
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
println!("Available components:");
|
||
|
|
for component in pm.list() {
|
||
|
|
let status = if pm.is_installed(&component) {
|
||
|
|
"✓ installed"
|
||
|
|
} else {
|
||
|
|
" available"
|
||
|
|
};
|
||
|
|
println!(" {} {}", status, component);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
"status" => {
|
||
|
|
if args.len() < 3 {
|
||
|
|
eprintln!("Usage: botserver status <component> [--container] [--tenant <name>]");
|
||
|
|
return Ok(());
|
||
|
|
}
|
||
|
|
let component = &args[2];
|
||
|
|
let mode = if args.contains(&"--container".to_string()) {
|
||
|
|
InstallMode::Container
|
||
|
|
} else {
|
||
|
|
InstallMode::Local
|
||
|
|
};
|
||
|
|
let tenant = if let Some(idx) = args.iter().position(|a| a == "--tenant") {
|
||
|
|
args.get(idx + 1).cloned()
|
||
|
|
} else {
|
||
|
|
None
|
||
|
|
};
|
||
|
|
let pm = PackageManager::new(mode, tenant)?;
|
||
|
|
if pm.is_installed(component) {
|
||
|
|
println!("✓ Component '{}' is installed", component);
|
||
|
|
} else {
|
||
|
|
println!("✗ Component '{}' is not installed", component);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
"--help" | "-h" => {
|
||
|
|
print_usage();
|
||
|
|
}
|
||
|
|
_ => {
|
||
|
|
eprintln!("Unknown command: {}", command);
|
||
|
|
print_usage();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
Ok(())
|
||
|
|
}
|