diff --git a/Cargo.toml b/Cargo.toml index 8af932b8..d41915b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,3 +24,4 @@ clap = { version = "4.0", features = ["derive"] } time = "0.3" + diff --git a/src/config2.rs b/src/config2.rs index e9619093..1e683a42 100644 --- a/src/config2.rs +++ b/src/config2.rs @@ -93,7 +93,9 @@ pub struct AppConfig { pub api_mode: bool, #[serde(default = "default_enabled")] pub metrics_mode: bool, - pub api_token: String, + pub api_webhook_token: Option, + #[serde(default = "default_enabled")] + pub api_webhook_enabled: bool, } #[derive(Clone, Debug, Deserialize, Default)] diff --git a/src/main.rs b/src/main.rs index 66a10a9b..78e8e1e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use ::clickhouse::Client; use actix_web::middleware::Logger; +use actix_web::web::to; use actix_web::web::Data; use actix_web::{App, HttpServer}; use clap::Parser; @@ -29,6 +30,7 @@ use crate::cpuusage::cpu_metrics; use crate::loadavg::loadavg_metrics; use crate::memory::mem_metrics; use crate::utils::{current_timestamp, human_readable_date, level_from_settings}; +use crate::web::not_found; #[derive(Parser)] #[command(version = "0.0.1", about = "Pony - montiroing tool for Xray/Wireguard")] @@ -114,14 +116,19 @@ async fn main() -> std::io::Result<()> { let settings_arc = Arc::new(settings.clone()); HttpServer::new(move || { - App::new() + let mut app = App::new() .app_data(Data::new(ch_client.clone())) .app_data(Data::new(settings_arc.clone())) .wrap(Logger::default()) .service(web::hello) .service(web::status_ch) .service(web::status) - .service(webhook::webhook_handler) + .default_service(to(not_found)); + + if settings.app.api_webhook_enabled { + app = app.service(webhook::webhook_handler); + } + app }) .bind(("0.0.0.0", 5005))? .run() diff --git a/src/web.rs b/src/web.rs index 2f145727..e35cb75d 100644 --- a/src/web.rs +++ b/src/web.rs @@ -15,6 +15,10 @@ struct Params { cluster: String, } +pub async fn not_found() -> HttpResponse { + HttpResponse::NotFound().body("404 - Not Found") +} + #[get("/")] pub async fn hello() -> impl Responder { HttpResponse::Ok().body("Hello, Fuckin World!") diff --git a/src/webhook.rs b/src/webhook.rs index e95e6885..9719b3f5 100644 --- a/src/webhook.rs +++ b/src/webhook.rs @@ -57,7 +57,11 @@ async fn webhook_handler( payload: web::Json, settings: Data>, ) -> impl Responder { - let verified = validate(auth.token(), &settings.app.api_token); + let verified = match settings.app.api_webhook_token.clone() { + Some(token) => validate(auth.token(), &token), + None => false, + }; + if verified { let settings_ref = Arc::as_ref(settings.get_ref()).clone(); if payload.status.trim() == "failed" {