-use ::actix_web::http::StatusCode;
use ::actix_web::HttpResponse;
+use ::actix_web::http::StatusCode;
use ::anyhow::{anyhow, Result};
-use ::config::ConfigError;
use ::config::*;
+use ::config::ConfigError;
use ::log::{info, warn};
use ::serde::Deserialize;
+use ::std::fs::{self};
use ::std::path::{Path, PathBuf};
+use ::std::collections::HashMap;
#[derive(Debug, Deserialize, Clone)]
pub struct Webhook {
pub parallel_processes: i32,
}
+
fn webhook_mode_default() -> String {
"deploy".to_string()
}
impl Settings {
pub fn new() -> Result<Self> {
- info!("Init settings file");
- let mut settings = config::Config::default();
- settings.set_default("domain", "127.0.0.1")?;
- settings.set_default("port", "8000")?;
- settings.set_default("ssl_private_key", None::<String>)?;
- settings.set_default("ssl_cert_chain", None::<String>)?;
- settings.set_default("workers", 8)?;
- settings.set_default("secret", None::<String>)?;
- settings.set_default("basic_auth_user", None::<String>)?;
- settings.set_default("basic_auth_password", None::<String>)?;
- settings.set_default("basic_auth_and_secret", false)?;
-
- settings = parse_config(settings)?;
- let settings: Settings = settings.try_into()?;
+ info!("Loading default config...");
+ let mut runtime_settings = config::Config::default();
+ runtime_settings.set_default("domain", "127.0.0.1")?;
+ runtime_settings.set_default("port", "8000")?;
+ runtime_settings.set_default("ssl_private_key", None::<String>)?;
+ runtime_settings.set_default("ssl_cert_chain", None::<String>)?;
+ runtime_settings.set_default("workers", 8)?;
+ runtime_settings.set_default("secret", None::<String>)?;
+ runtime_settings.set_default("basic_auth_user", None::<String>)?;
+ runtime_settings.set_default("basic_auth_password", None::<String>)?;
+ runtime_settings.set_default("basic_auth_and_secret", false)?;
+
+ info!("Reading runtime config from file...");
+ runtime_settings = parse_runtime_config(runtime_settings)?;
+
+ info!("Reading webhook targets from file...");
+ let webhooks = parse_webhook_config()?;
+ runtime_settings.set("webhooks", webhooks)?;
+
+ let settings: Settings = runtime_settings.try_into()?;
if settings.basic_auth_password.is_some() || settings.basic_auth_user.is_some() {
settings
}
}
-fn parse_config(mut settings: Config) -> Result<Config> {
+fn parse_runtime_config(mut settings: Config) -> Result<Config> {
info!("Parsing config files");
let config_paths = get_config_paths()?;
Ok(settings)
}
+fn parse_webhook_config() -> Result<Vec<Value>> {
+ info!("Parsing webhook target files");
+ let webhook_config_base_path = Path::new("/etc/systemd/webhook/").to_path_buf();
+ let mut webhook_settings = Vec::new();
+
+ info!("Checking {:?} for possible targets...", webhook_config_base_path);
+ if webhook_config_base_path.is_dir() {
+ for entry in fs::read_dir(webhook_config_base_path)? {
+ let entry = entry?;
+ let path = entry.path();
+ if path.is_dir() {
+ info!("Skipping directory {:?}",path);
+ } else {
+ info!("Parsing webhook target at: {:?}",path);
+ let config_file = config::File::new(path.to_str().unwrap(), config::FileFormat::Ini);
+ let mut config = config::Config::default();
+ config.merge(config_file)?;
+
+ info!("Extracting Path section...");
+ let path_section = config.get_table("Path")?;
+ let target_path = path_section.get("PathModified");
+
+ info!("Extracting webhook section...");
+ let mut webhook_section = config.get_table("webhook")?;
+ webhook_section.insert("name", target_path);
+
+
+ webhook_settings.push(webhook_section);
+ }
+ }
+ }
+ Ok(webhook_settings)
+}
+
#[cfg(target_os = "linux")]
fn get_config_paths() -> Result<Vec<PathBuf>> {
let mut paths = Vec::new();
let home_dir = dirs::home_dir().ok_or(anyhow!("Couldn't resolve home dir"))?;
- paths.push(Path::new("/etc/webhook_server.yml").to_path_buf());
- paths.push(home_dir.join(".config/webhook_server.yml"));
- paths.push(Path::new("./webhook_server.yml").to_path_buf());
+ paths.push(Path::new("/etc/systemd/webhookd.config").to_path_buf());
+ paths.push(home_dir.join(".config/systemd/webhookd.conf"));
+ paths.push(Path::new("./webhook_server.toml").to_path_buf());
Ok(paths)
}