kaniop-data-mover 0.16.2

S3-compatible data mover for Kanidm backup payload and manifest transfer
mod checksum;
mod commands;
mod crypto;
mod s3;

use std::process::ExitCode;

use clap::{Parser, Subcommand};
use tracing_subscriber::EnvFilter;

#[derive(Parser)]
#[command(name = "kaniop-data-mover", about = "S3 data mover for Kanidm backups")]
struct Cli {
    #[arg(long, default_value = "info", env = "DATA_MOVER_LOG_FILTER")]
    log_filter: String,

    #[arg(long, default_value = "json", env)]
    log_format: String,

    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    Upload {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
    Download {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
    DeletePlan {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
    Discover {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
    Check {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
    Transport {
        #[arg(
            long,
            env = "OPERATION_DOC_PATH",
            default_value = "/run/kaniop/operation.json"
        )]
        operation_doc: String,
    },
}

#[tokio::main]
async fn main() -> ExitCode {
    let cli = Cli::parse();

    let filter = EnvFilter::try_new(&cli.log_filter).unwrap_or_else(|_| EnvFilter::new("info"));
    match cli.log_format.as_str() {
        "json" => {
            tracing_subscriber::fmt()
                .json()
                .with_env_filter(filter)
                .init();
        }
        _ => {
            tracing_subscriber::fmt().with_env_filter(filter).init();
        }
    }

    let exit_code = match cli.command {
        Commands::Upload { operation_doc } => commands::upload::run(&operation_doc).await,
        Commands::Download { operation_doc } => commands::download::run(&operation_doc).await,
        Commands::DeletePlan { operation_doc } => commands::delete_plan::run(&operation_doc).await,
        Commands::Discover { operation_doc } => commands::discover::run(&operation_doc).await,
        Commands::Check { operation_doc } => commands::check::run(&operation_doc).await,
        Commands::Transport { operation_doc } => commands::transport::run(&operation_doc).await,
    };

    match exit_code {
        Ok(_) => ExitCode::SUCCESS,
        Err(code) => ExitCode::from(code as u8),
    }
}