xbp 10.14.2

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
Documentation
mod handlers;
mod models;

use actix_web::{web, App, HttpServer};
use std::env;
use tracing::info;

pub async fn start_api_server() -> std::io::Result<()> {
    let port = env::var("PORT_XBP_API")
        .unwrap_or_else(|_| "8080".to_string())
        .parse::<u16>()
        .unwrap_or(8080);

    info!("Starting XBP API server on port {}", port);

    HttpServer::new(|| {
        App::new()
            .route("/ports", web::get().to(handlers::list_ports))
            .route("/ports/{port}", web::get().to(handlers::get_port))
            .route("/ports/{port}/kill", web::post().to(handlers::kill_port))
            .route("/systemctl", web::get().to(handlers::list_systemctl))
            .route(
                "/systemctl/{service}",
                web::get().to(handlers::get_systemctl_service),
            )
            .route("/pm2", web::get().to(handlers::list_pm2))
            .route("/pm2/{name}", web::delete().to(handlers::delete_pm2))
            .route("/pm2/{name}/start", web::post().to(handlers::start_pm2))
            .route("/pm2/{name}/stop", web::post().to(handlers::stop_pm2))
            .route("/pm2/{name}/restart", web::post().to(handlers::restart_pm2))
            .route("/services", web::get().to(handlers::list_services))
            .route(
                "/services/{name}/{command}",
                web::post().to(handlers::run_service_command),
            )
            .route("/config", web::get().to(handlers::get_config))
            .route("/logs", web::get().to(handlers::get_logs))
            .route(
                "/install/{package}",
                web::post().to(handlers::install_package),
            )
            .route("/setup", web::post().to(handlers::setup))
            .route("/redeploy", web::post().to(handlers::redeploy))
            .route(
                "/redeploy/{service_name}",
                web::post().to(handlers::redeploy_service),
            )
            .route(
                "/binary/download",
                web::post().to(handlers::download_and_run_binary),
            )
            .route(
                "/openapi/download",
                web::get().to(handlers::download_openapi),
            )
            .route("/health", web::get().to(handlers::health))
    })
    .bind(("0.0.0.0", port))?
    .run()
    .await
}