#![forbid(unsafe_code)]
#![allow(dead_code)]
#![allow(missing_docs)]
mod api;
mod cert;
mod db;
#[cfg(feature = "postgres")]
mod db_pg;
mod merkle;
mod ots_anchor;
mod witness;
use clap::Parser;
use std::path::PathBuf;
use std::sync::Arc;
use api::AppState;
#[derive(Parser, Debug)]
#[command(
name = "confium-log-server",
version,
about = "Public transparency log server for Confium"
)]
pub struct Args {
#[arg(long, default_value = "confium-log.db")]
pub db: PathBuf,
#[arg(long, default_value = "127.0.0.1:8080")]
pub listen: String,
#[arg(long)]
pub no_ots: bool,
#[arg(long, default_value_t = 600)]
pub ots_interval_secs: u64,
#[arg(long, default_value_t = 1000)]
pub page_size: usize,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "confium_log_server=info,tower_http=info".into()),
)
.init();
let args = Args::parse();
tracing::info!(?args.db, ?args.listen, "starting confium-log-server");
let db = db::Database::open(&args.db)?;
db.init_schema()?;
let merkle = merkle::MerkleState::from_db(&db)?;
let state = Arc::new(AppState {
db,
merkle: parking_lot::Mutex::new(merkle),
page_size: args.page_size,
});
if !args.no_ots {
let anchor_state = state.clone();
tokio::spawn(async move {
ots_anchor::run_anchor_loop(
anchor_state,
std::time::Duration::from_secs(args.ots_interval_secs),
)
.await;
});
}
let app = api::router(state);
let listener = tokio::net::TcpListener::bind(&args.listen).await?;
tracing::info!("listening on http://{}", args.listen);
axum::serve(listener, app).await?;
Ok(())
}