about summary refs log tree commit diff
path: root/splorm/src/handler/api.rs
blob: f360b87c368aac2ca90229f24720e77c23070cc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use axum::{
	Router,
	body::Body,
	extract::{Path, State},
	response::Response,
	routing::get,
};
use sessionhash::RequestContext;

use crate::{RuntimeError, fs, state::SplormState};

pub fn routes() -> Router<SplormState> {
	Router::new().route("/stats/now/{name}", get(stats))
}

async fn stats(
	Path(name): Path<String>,
	State(state): State<SplormState>,
	ctx: RequestContext,
) -> Result<Response, RuntimeError> {
	tracing::trace!("{ctx} GET /api/stats/{name}");

	let graphs = {
		let mut connector = state.gatherer_thread().await;
		connector.regular_graphs().await
	};

	let file_path = match name.as_str() {
		"current_hostmeminfo.gif" => graphs.meminfo,
		"current_hostnetinfo.gif" => graphs.meminfo,
		"current_hostcpuinfo.gif" => graphs.cpuinfo,
		_ => return Err(RuntimeError::generic_404()),
	};

	tracing::trace!("graph {name} system_path={file_path}");
	let file = fs::unsafe_read_file(file_path).await?;

	Response::builder()
		.header("content-type", "image/gif")
		.status(200)
		.body(Body::from(file))
		.map_err(|_| RuntimeError::Unknown)
}