Make XML stream request

This commit is contained in:
2025-06-01 17:55:04 +02:00
parent e002c3a8c3
commit c0ca538a38
3 changed files with 31 additions and 2 deletions

1
Cargo.lock generated
View File

@@ -452,6 +452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"pin-project-lite",

View File

@@ -6,4 +6,4 @@ edition = "2021"
[dependencies]
axum = "0.8.4"
serde = { version = "1.0.219", features = ["derive"] }
tokio = { version = "1.45.1", features = ["rt-multi-thread"] }
tokio = { version = "1.45.1", features = ["io-util", "rt-multi-thread"] }

View File

@@ -4,6 +4,14 @@ use axum::{
Router,
};
use serde::Deserialize;
use tokio::io::{
AsyncBufReadExt,
AsyncWriteExt,
BufReader,
};
use tokio::net::{
TcpStream,
};
#[derive(Deserialize)]
struct ProbeClientToServerQuery {
@@ -46,7 +54,7 @@ async fn main() {
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());
println!(" http://{}/probe-client-to-server?domain=fem-net.de&hostname=xmpp-2.fem-net.de&port=5222", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap();
}
@@ -55,9 +63,29 @@ async fn route_index() -> String {
return String::from("Prometheus exporter for checking XMPP server availability");
}
async fn probe_client_to_server(domain: &str, hostname: &str, port: u16) -> Result<(), String> {
let mut stream = TcpStream::connect((hostname, port)).await.unwrap();
let connect_string = format!("<stream:stream to='{}' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en' version='1.0'></stream:stream>", domain);
stream.write_all(connect_string.as_bytes()).await.unwrap();
let mut stream = BufReader::new(stream);
let mut response = String::new();
stream.read_line(&mut response).await.unwrap();
println!("{}", response);
Ok(())
}
async fn route_probe_client_to_server(
Query(query): Query<ProbeClientToServerQuery>,
) -> Result<String, String> {
probe_client_to_server(&query.domain, &query.hostname, query.port).await.unwrap();
let mut out = String::new();
out.push_str(&format!("{} {}:{}", query.domain, query.hostname, query.port));