Skip to main content

max / makenotwork

1.6 KB · 47 lines History Blame Raw
1 use anyhow::Result;
2 use bento_daemon::{config, db, events, metrics, ota, routes, state, topology};
3 use std::collections::HashMap;
4 use std::net::SocketAddr;
5 use std::sync::Arc;
6
7 /// MNW base URL the `tauri-mnw` OTA backend publishes to. Overridable so a
8 /// staging host can point elsewhere; defaults to production.
9 fn mnw_base_url() -> String {
10 std::env::var("BENTO_MNW_BASE_URL").unwrap_or_else(|_| "https://makenot.work".into())
11 }
12
13 #[tokio::main]
14 async fn main() -> Result<()> {
15 tracing_subscriber::fmt()
16 .with_writer(std::io::stderr)
17 .with_env_filter(
18 tracing_subscriber::EnvFilter::try_from_default_env()
19 .unwrap_or_else(|_| "bento_daemon=info,bentod=info,tower_http=info".into()),
20 )
21 .init();
22
23 let cfg = Arc::new(config::Config::load()?);
24 let topo = Arc::new(topology::Topology::load(&cfg.topology_path)?);
25 tokio::fs::create_dir_all(&cfg.dist_root).await?;
26 tokio::fs::create_dir_all(&cfg.logs_root).await?;
27 let pool = db::open(&cfg.db_path).await?;
28 tracing::info!(hosts = topo.hosts.len(), apps = topo.app.len(), "topology loaded");
29
30 let prom = metrics::init();
31 let addr: SocketAddr = cfg.listen.parse()?;
32 let app_state = state::AppState {
33 pool,
34 topo,
35 cfg,
36 prom,
37 events: events::channel(),
38 ota: Arc::new(ota::OtaRegistry::standard(mnw_base_url())),
39 active: Arc::new(tokio::sync::Mutex::new(HashMap::new())),
40 };
41 let app = routes::router(app_state);
42 tracing::info!(%addr, "bento daemon listening");
43 let listener = tokio::net::TcpListener::bind(addr).await?;
44 axum::serve(listener, app).await?;
45 Ok(())
46 }
47