use tracing::info;
use waf_proxy::Proxy;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
tracing_subscriber::fmt()
.json()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.init();
let args: Vec<String> = std::env::args().skip(1).collect();
let config_path =
waf_proxy::config::resolve_path(&args, std::env::var(waf_proxy::config::ENV_CONFIG).ok());
let config = match waf_proxy::config::load(&config_path) {
Ok(c) => c,
Err(e) => {
eprintln!("waf: {e}");
std::process::exit(2);
}
};
info!(
listen = %config.proxy.listen,
backend = %config.proxy.backend,
mode = ?config.waf.mode,
"WAF starting"
);
let proxy = Proxy::bind(&config).await?;
info!(addr = %proxy.local_addr()?, "listening");
#[cfg(unix)]
{
use tracing::{error, warn};
let reloader = proxy.reloader();
let reload_path = config_path.clone();
tokio::spawn(async move {
let mut hangup = match tokio::signal::unix::signal(
tokio::signal::unix::SignalKind::hangup(),
) {
Ok(s) => s,
Err(e) => {
warn!(error = %e, "cannot install SIGHUP handler; hot reload disabled");
return;
}
};
while hangup.recv().await.is_some() {
info!(path = %reload_path.display(), "SIGHUP received; reloading config");
if let Err(e) = reloader.reload_from(&reload_path) {
error!(error = %e, "SIGHUP reload failed; current config kept");
}
}
});
}
proxy.run().await
}