| 1 |
use anyhow::Result; |
| 2 |
use sando_daemon::{config, db, events, git, metrics, routes, state, sync, topology}; |
| 3 |
use std::net::SocketAddr; |
| 4 |
use std::path::Path; |
| 5 |
use std::sync::Arc; |
| 6 |
|
| 7 |
#[tokio::main] |
| 8 |
async fn main() -> Result<()> { |
| 9 |
tracing_subscriber::fmt() |
| 10 |
|
| 11 |
|
| 12 |
|
| 13 |
.with_writer(std::io::stderr) |
| 14 |
.with_env_filter( |
| 15 |
tracing_subscriber::EnvFilter::try_from_default_env() |
| 16 |
|
| 17 |
|
| 18 |
|
| 19 |
.unwrap_or_else(|_| "sando_daemon=info,sandod=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.workdir).await?; |
| 26 |
tokio::fs::create_dir_all(&cfg.release_root).await?; |
| 27 |
git::ensure_bare_repo(Path::new(&topo.repo.bare_path)).await?; |
| 28 |
let pool = db::connect(&cfg.db_path).await?; |
| 29 |
db::migrate(&pool).await?; |
| 30 |
sync::sync(&pool, &*topo).await?; |
| 31 |
tracing::info!(tiers = topo.tiers.len(), bare = %topo.repo.bare_path, "topology synced"); |
| 32 |
|
| 33 |
let prom = metrics::init(); |
| 34 |
let addr: SocketAddr = cfg.listen.parse()?; |
| 35 |
let executors = Arc::new(state::build_executors(&topo)); |
| 36 |
let app_state = state::AppState { |
| 37 |
pool, |
| 38 |
topo, |
| 39 |
cfg, |
| 40 |
prom, |
| 41 |
active_build: Arc::new(tokio::sync::Mutex::new(None)), |
| 42 |
events: events::channel(), |
| 43 |
executors, |
| 44 |
}; |
| 45 |
let app = routes::router(app_state); |
| 46 |
tracing::info!(%addr, "sando daemon listening"); |
| 47 |
let listener = tokio::net::TcpListener::bind(addr).await?; |
| 48 |
axum::serve(listener, app).await?; |
| 49 |
Ok(()) |
| 50 |
} |
| 51 |
|