feat: add cli interface to change config

This commit is contained in:
Matthieu Bessat 2024-07-23 23:23:44 +02:00
parent 544d8a6f89
commit 481d59e963
5 changed files with 59 additions and 8 deletions

32
Cargo.lock generated
View file

@ -115,6 +115,37 @@ version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "argh"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7af5ba06967ff7214ce4c7419c7d185be7ecd6cc4965a8f6e1d8ce0398aad219"
dependencies = [
"argh_derive",
"argh_shared",
]
[[package]]
name = "argh_derive"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56df0aeedf6b7a2fc67d06db35b09684c3e8da0c95f8f27685cb17e08413d87a"
dependencies = [
"argh_shared",
"proc-macro2",
"quote",
"syn 2.0.72",
]
[[package]]
name = "argh_shared"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531"
dependencies = [
"serde",
]
[[package]]
name = "async-trait"
version = "0.1.81"
@ -146,6 +177,7 @@ name = "autotasker"
version = "0.1.0"
dependencies = [
"anyhow",
"argh",
"axum",
"chrono",
"clap",

View file

@ -20,4 +20,5 @@ log = "0.4.22"
env_logger = "0.11.3"
tower-http = { version = "0.5.2", features = ["fs"] }
tokio-cron-scheduler = "0.10.2"
argh = "0.1.12"

View file

@ -23,7 +23,7 @@ Unix-like
- [x] List the tasks availables.
- [x] Run tasks in background.
- [x] Store the logs and tasks runs in a sqlite DB.
- [ ] Schedule tasks (CRON-like).
- [x] Schedule tasks (CRON-like).
- [ ] OpenMetrics exporter to alert when a task failed.
- [ ] External alerting when a task failed.
- [ ] Run task via webhook, with a webhook token.

11
TODO.md
View file

@ -2,12 +2,12 @@
## TODO
- [x] Implement basic scheduler
- [x] Add basic CSS
- [ ] Implement basic auth with OAuth2
- [ ] Implement support for webhook and debouncing of webhook
- [ ] Implement basic auth with HTTP basic auth (to trigger and see logs only)
- [ ] add CSS badge and color code on job status
- [ ] Validating config file
- validate schedule CRON syntax
- [ ] Load config file from `/etc/`
- [ ] Implement basic auth with OAuth2
- [ ] Add `Dockerfile` and docker-compose example
- [ ] Add CI/CD to build docker image
- [ ] Add configuration to limit the logs head and tail
@ -30,3 +30,6 @@
- [x] setup sqlite
- [x] store of task run logs in sqlite
- [x] Implement basic scheduler
- [x] Add basic CSS
- [x] Load config file from `/etc/`

View file

@ -3,6 +3,7 @@ mod models;
mod executor;
mod scheduler;
use argh::FromArgs;
use log::info;
use anyhow::{anyhow, Context, Result};
use axum::routing::get;
@ -27,8 +28,16 @@ pub struct AppState {
templating_env: Environment<'static>
}
fn get_config() -> Result<Config> {
let inp_def_yaml = fs::read_to_string("./config.yaml")
#[derive(Debug, FromArgs)]
/// Autotasker daemon
struct CliFlags {
/// path to YAML config file to use to configure autotasker
#[argh(option)]
config: Option<String>,
}
fn get_config(path: String) -> Result<Config> {
let inp_def_yaml = fs::read_to_string(path)
.expect("Should have been able to read the the config file");
serde_yaml::from_str(&inp_def_yaml)
@ -60,6 +69,7 @@ fn build_templating_env() -> Environment<'static> {
#[tokio::main]
async fn main() -> Result<()> {
let flags: CliFlags = argh::from_env();
env_logger::init();
info!("Starting autotasker");
@ -68,7 +78,12 @@ async fn main() -> Result<()> {
// start channel to talk to executor daemon
let (tx, rx) = mpsc::channel::<ExecutorOrder>(32);
let config: Config = get_config().expect("Cannot get config");
let config_path = match flags.config {
Some(v) => v,
None => "/etc/autotasker/config.yaml".to_string()
};
info!("Using config file at {}", &config_path);
let config: Config = get_config(config_path).expect("Cannot get config");
let state = AppState {
config,