add args parse [clap]
This commit is contained in:
38
src/main.rs
38
src/main.rs
@@ -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)),
|
||||
|
Reference in New Issue
Block a user