mc-ingress/src/main.rs
Tamipes cca97cfab0
All checks were successful
/ build (push) Successful in 1m26s
fix: rename to correctly log which task is closed on shutdown
2026-06-22 23:44:18 +02:00

91 lines
2.6 KiB
Rust

use crate::opaque_error::OpaqueError;
use std::env;
use tokio::net::TcpListener;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
mod kube_cache;
mod mc_server;
mod opaque_error;
mod packets;
mod proxy;
mod types;
#[tokio::main]
async fn main() {
// ---- Tracing setup ----
let fmt_layer = tracing_subscriber::fmt::layer()
.with_target(false)
.with_level(true);
let filter_layer = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
tracing_subscriber::registry()
.with(fmt_layer)
.with(filter_layer)
.with(tracing_error::ErrorLayer::default())
.init();
tracing::info!("mc-ingress");
let revision: &'static str = env!("COMMIT_HASH");
tracing::info!(revision);
let cancel_token = tokio_util::sync::CancellationToken::new();
let (api, api_task) = kube_cache::McApi::create(cancel_token.clone())
.await
.unwrap();
tracing::info!("initialized kube api");
let config: Config = Default::default();
let listener = TcpListener::bind(config.bind_addr.clone()).await.unwrap();
tracing::info!(bind_addr = config.bind_addr, "started tcp server");
let mut sigterm = match tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
{
Ok(x) => x,
Err(e) => {
tracing::error!(error = ?e, "could not initilaize SIGTERM handling channel!");
return;
}
};
let mut conn_task = proxy::start_proxy(listener, api, config, cancel_token.clone());
tokio::select! {
_ = api_task => {
tracing::error!("the MinecraftApi tokio:spawn'ed task ran to completion, which should not happen!");
}
_ = &mut conn_task => {
tracing::error!("the connection handling tokio:spawn'ed task ran to completion, which should not happen!");
}
_ = sigterm.recv() => {
tracing::info!("SIGTERM received");
cancel_token.cancel();
let res = conn_task.await;
tracing::info!(proxy_task_result = ?res, "shutdown complete");
}
}
}
#[derive(Clone)]
struct Config {
pub filter_conn: String,
pub bind_addr: String,
}
impl Default for Config {
fn default() -> Self {
let filter_conn = match env::var("FILTER_CONN") {
Ok(x) => x,
Err(_) => "(addr == \"10.100.0.1\")".to_string(),
};
let bind_addr = match env::var("BIND_ADDR") {
Ok(x) => x,
Err(_) => "0.0.0.0:25565".to_string(),
};
Self {
filter_conn,
bind_addr,
}
}
}