84 lines
2.2 KiB
Rust
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
|
|
}
|