Files
dotfiles/nix/homelab/api/src/main.rs

84 lines
2.2 KiB
Rust

mod endpoints;
mod error;
mod rcon;
use std::env;
use actix_web::{App, HttpServer, web};
use kube::Client;
use crate::rcon::RconClient;
pub struct AppState {
rcon: RconClient,
kube: Client,
}
struct Env {
rcon_password: String,
}
#[cfg(debug_assertions)]
fn load_env() -> Env {
dotenvy::dotenv().ok();
Env {
rcon_password: env::var("RCON_PASSWORD")
.expect("environment variable RCON_PASSWORD must be set"),
}
}
#[cfg(not(debug_assertions))]
fn load_env() -> Env {
Env {
rcon_password: env::var("RCON_PASSWORD")
.expect("environment variable RCON_PASSWORD must be set"),
}
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let env = load_env();
// Initialize Kubernetes client
// Uses in-cluster config when running in k3s, falls back to ~/.kube/config locally
let kube_client = Client::try_default()
.await
.expect("failed to create Kubernetes client");
let app_state = web::Data::new(AppState {
rcon: RconClient::new(env.rcon_password),
kube: kube_client,
});
HttpServer::new(move || {
App::new()
.app_data(app_state.clone())
.route(
"/",
web::get()
.to(async || concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"))),
)
.service(
web::scope("/api")
.route(
"/minecraft-server-stats",
web::get().to(endpoints::server_stats::get_server_stats),
)
// .route(
// "/minecraft/{server}/world-size",
// web::get().to(endpoints::kubernetes::get_world_size),
// )
.route(
"/minecraft/{server}/uptime",
web::get().to(endpoints::server_uptime::get_uptime),
), // .route(
// "/minecraft/{server}/restore",
// web::post().to(endpoints::kubernetes::create_restore),
// ),
)
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}