use anyhow::Result; use bento_daemon::{config, db, events, metrics, ota, routes, state, topology}; use std::collections::HashMap; use std::net::SocketAddr; use std::sync::Arc; /// MNW base URL the `tauri-mnw` OTA backend publishes to. Overridable so a /// staging host can point elsewhere; defaults to production. fn mnw_base_url() -> String { std::env::var("BENTO_MNW_BASE_URL").unwrap_or_else(|_| "https://makenot.work".into()) } #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt() .with_writer(std::io::stderr) .with_env_filter( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "bento_daemon=info,bentod=info,tower_http=info".into()), ) .init(); let cfg = Arc::new(config::Config::load()?); let topo = Arc::new(topology::Topology::load(&cfg.topology_path)?); tokio::fs::create_dir_all(&cfg.dist_root).await?; tokio::fs::create_dir_all(&cfg.logs_root).await?; let pool = db::open(&cfg.db_path).await?; tracing::info!(hosts = topo.hosts.len(), apps = topo.app.len(), "topology loaded"); let prom = metrics::init(); let addr: SocketAddr = cfg.listen.parse()?; let app_state = state::AppState { pool, topo, cfg, prom, events: events::channel(), ota: Arc::new(ota::OtaRegistry::standard(mnw_base_url())), active: Arc::new(tokio::sync::Mutex::new(HashMap::new())), }; let app = routes::router(app_state); tracing::info!(%addr, "bento daemon listening"); let listener = tokio::net::TcpListener::bind(addr).await?; axum::serve(listener, app).await?; Ok(()) }