add args parse [clap]

This commit is contained in:
2024-09-12 19:54:14 +03:00
parent 61745d706f
commit 1f8a81e731
2 changed files with 237 additions and 7 deletions

View File

@@ -15,11 +15,32 @@ use flexi_logger::{AdaptiveFormat, Logger, LoggerHandle};
use std::sync::Arc;
use std::time::Duration;
fn get_query_options() -> ListContainersOptions<&'static str> {
use clap::Parser;
use parse_duration::parse as parse_duration;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
#[clap(propagate_version = true)]
struct Cli {
/// target label
#[arg(short, long, default_value = "auto-restart.unhealthy")]
pub label: String,
/// check interval
#[arg(short, long, default_value = "10s", value_parser = parse_duration)]
pub interval: Duration,
/// unhealthy status timeout
#[arg(short, long, default_value = "35s", value_parser = parse_duration)]
pub unhealthy_timeout: Duration,
}
fn get_query_options(args: &Cli) -> ListContainersOptions<String> {
let mut filters = HashMap::new();
//filters.insert("status", vec!["running"]);
filters.insert("label", vec!["auto-restart.unhealthy"]);
filters.insert("health", vec!["unhealthy"]);
filters.insert("label".into(), vec![args.label.clone()]);
filters.insert("health".into(), vec!["unhealthy".into()]);
ListContainersOptions {
filters,
@@ -67,8 +88,9 @@ async fn query_task(
interval: Duration,
tx: mpsc::Sender<Containers>,
mut shutdown_rx: mpsc::Receiver<()>,
args: Cli,
) {
let query_options = get_query_options();
let query_options = get_query_options(&args);
let mut query_time = Duration::new(0, 0);
log::debug!("query_task -> start recv");
while (timeout(interval - query_time, shutdown_rx.recv()).await).is_err() {
@@ -148,6 +170,7 @@ async fn restart_task(connection: Arc<Docker>, mut rx: mpsc::Receiver<Containers
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let logger = create_logger()?;
let cli = Cli::parse();
let connection = Arc::new(Docker::connect_with_defaults()?);
let _ = connection
@@ -164,15 +187,16 @@ async fn main() -> anyhow::Result<()> {
let (query_tx, filter_rx) = mpsc::channel::<Containers>(1);
let (filter_tx, restart_rx) = mpsc::channel::<Containers>(1);
let interval = Duration::from_secs(10);
let unhealthy_timeout = Duration::from_secs(35);
let interval = cli.interval;
let unhealthy_timeout = cli.unhealthy_timeout;
tokio::try_join!(
tokio::spawn(query_task(
query_connection,
interval,
query_tx,
shutdown_rx
shutdown_rx,
cli
)),
tokio::spawn(filter_task(unhealthy_timeout, filter_rx, filter_tx)),
tokio::spawn(restart_task(restart_connection, restart_rx)),