Add some CLI commands to generate a default configuration and password hashes

This commit is contained in:
Lennart
2024-11-03 13:17:38 +01:00
parent 3ea004f75d
commit 0f2db05a07
6 changed files with 175 additions and 29 deletions

View File

@@ -2,7 +2,8 @@ use crate::config::Config;
use actix_web::HttpServer;
use anyhow::Result;
use app::make_app;
use clap::Parser;
use clap::{Parser, Subcommand};
use commands::{cmd_gen_config, cmd_pwhash};
use config::{DataStoreConfig, SqliteDataStoreConfig};
use rustical_store::auth::StaticUserStore;
use rustical_store::{AddressbookStore, CalendarStore};
@@ -12,16 +13,26 @@ use std::fs;
use std::sync::Arc;
mod app;
mod commands;
mod config;
mod setup_tracing;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long, env)]
#[arg(short, long, env, default_value = "/etc/rustical/config.toml")]
config_file: String,
#[arg(long, env, help = "Run database migrations (only for sql store)")]
migrate: bool,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Debug, Subcommand)]
enum Command {
GenConfig(commands::GenConfigArgs),
Pwhash(commands::PwhashArgs),
}
async fn get_data_stores(
@@ -40,27 +51,33 @@ async fn get_data_stores(
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let config: Config = toml::from_str(&fs::read_to_string(&args.config_file)?)?;
setup_tracing(&config.tracing);
match args.command {
Some(Command::GenConfig(gen_config_args)) => cmd_gen_config(gen_config_args)?,
Some(Command::Pwhash(pwhash_args)) => cmd_pwhash(pwhash_args)?,
None => {
let config: Config = toml::from_str(&fs::read_to_string(&args.config_file)?)?;
let (addr_store, cal_store) = get_data_stores(args.migrate, &config.data_store).await?;
setup_tracing(&config.tracing);
let user_store = Arc::new(match config.auth {
config::AuthConfig::Static(config) => StaticUserStore::new(config),
});
let (addr_store, cal_store) = get_data_stores(args.migrate, &config.data_store).await?;
HttpServer::new(move || {
make_app(
addr_store.clone(),
cal_store.clone(),
user_store.clone(),
config.frontend.clone(),
)
})
.bind((config.http.host, config.http.port))?
.run()
.await?;
let user_store = Arc::new(match config.auth {
config::AuthConfig::Static(config) => StaticUserStore::new(config),
});
HttpServer::new(move || {
make_app(
addr_store.clone(),
cal_store.clone(),
user_store.clone(),
config.frontend.clone(),
)
})
.bind((config.http.host, config.http.port))?
.run()
.await?;
}
}
Ok(())
}