use axum::{ extract::Query, routing::get, Router, }; use serde::Deserialize; #[derive(Deserialize)] struct ProbeClientToServerQuery { domain: String, hostname: String, port: u16, } #[tokio::main] async fn main() { let mut args = std::env::args(); let _name = args.next().unwrap(); let mut listen = String::from("[::]:3000"); loop { let arg = if let Some(arg) = args.next() { arg } else { break; }; match arg.as_str() { "--listen" => { listen = args.next().unwrap(); } unknown => { println!("unknown option: {}", unknown); std::process::exit(1) } } } let app = Router::new() .route("/", get(route_index)) .route("/probe-client-to-server", get(route_probe_client_to_server)); let listener = tokio::net::TcpListener::bind(listen).await.unwrap(); println!("Server listening on: http://{}", listener.local_addr().unwrap()); println!("Probe with:"); println!(" http://{}/probe-client-to-server?domain=fem-net.de&hostname=xmpp-2.net.clerie.de&port=5222", listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); } async fn route_index() -> String { return String::from("Prometheus exporter for checking XMPP server availability"); } async fn route_probe_client_to_server( Query(query): Query, ) -> Result { let mut out = String::new(); out.push_str(&format!("{} {}:{}", query.domain, query.hostname, query.port)); return Ok(out); }