feat: Added http server that serve the same files

This commit is contained in:
2026-10-20 02:56:39 +02:00
parent a5594c768d
commit 620f36d0bb
7 changed files with 210 additions and 38 deletions
+20 -38
View File
@@ -1,30 +1,27 @@
mod cli;
mod error;
mod file;
mod http;
use std::net::SocketAddr;
use std::pin::pin;
use axum::Router;
use axum::routing::get;
use clap::{CommandFactory, Parser};
use clap_complete::{Shell, generate as generate_complete};
use crete::cluster::Cluster;
use crete::environment::PathEnvironment;
use crete::talosconfig::{get_current_context, set_context};
use crete::tftp::ServerError;
use crete::{get_configs_path, get_repo_path, set_repo_path, tftp};
use futures::StreamExt;
use futures::future::join_all;
use ipxe::IPXE_DIR;
use minijinja::context;
use regex::Regex;
use thiserror::Error;
use crate::cli::{Cli, Commands, GlobalOpts};
#[derive(Debug, Error)]
enum Error {
#[error("No clusters where found")]
NoClustersFound,
#[error("Server error: {0}")]
ServerError(#[from] ServerError),
}
use crate::error::Error;
use crate::file::get_file;
use crate::http::handler;
async fn generate(opts: &GlobalOpts) -> Result<(), Error> {
let clusters = Cluster::get_all().await;
@@ -107,36 +104,21 @@ async fn main() -> Result<(), Error> {
"crete",
&mut std::io::stdout(),
),
Commands::Serve { ip } => {
let re = Regex::new(r"talos/(?<cluster>.+)/(?<node>.+)\.ya?ml")
.expect("regex should be valid");
Commands::Serve { port, ip } => {
tokio::spawn(async move {
let app = Router::new().fallback_service(get(handler));
let addr: SocketAddr = (ip, port).into();
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
println!("Http server started on {addr}");
axum::serve(listener, app).await.unwrap();
});
tftp::serve(ip, move |filename, _| {
let filename = filename.to_owned();
let re = re.clone();
async move {
const IPXE_PATTERN: &str = "ipxe/";
if let Some(filename) = filename.strip_prefix(IPXE_PATTERN) {
Some(IPXE_DIR.get_file(filename)?.contents().to_owned())
} else if let Some(caps) = re.captures(&filename) {
let cluster = &caps["cluster"];
let node = &caps["node"];
let clusters = Cluster::get_all().await;
let cluster = clusters.get(cluster)?;
let node = cluster.node(node)?;
let config = node.config(cluster).await;
Some(config.into())
} else {
None
}
}
async move { get_file(filename).await.map(|(file, _)| file) }
})
.await?
.await?;
}
};