nomilo/src/main.rs

125 lines
3.6 KiB
Rust
Raw Normal View History

2024-12-15 20:21:03 +00:00
mod errors;
2022-04-29 02:29:10 +00:00
mod dns;
2024-12-15 20:21:03 +00:00
mod routes;
2025-03-24 22:03:54 +00:00
mod resources;
2024-12-15 20:21:03 +00:00
mod database;
mod validation;
mod macros;
2024-12-22 21:36:26 +00:00
mod template;
2025-03-24 22:03:54 +00:00
mod proto;
2025-04-01 22:49:56 +00:00
mod localization;
2025-05-13 18:23:26 +00:00
mod form;
2024-12-15 20:21:03 +00:00
use std::sync::Arc;
use axum::Router;
use axum::routing;
2024-12-22 21:36:26 +00:00
use tower_http::services::ServeDir;
2024-12-15 20:21:03 +00:00
use database::sqlite::SqliteDB;
2024-12-22 21:36:26 +00:00
use database::BoxedDb;
2024-12-15 20:21:03 +00:00
use dns::dns_driver::DnsDriverConfig;
use dns::dns_driver::TsigConfig;
use dns::{ZoneDriver, RecordDriver};
2024-12-22 21:36:26 +00:00
use template::TemplateEngine;
2024-12-15 20:21:03 +00:00
#[derive(Clone)]
pub struct AppState {
zone: Arc<dyn ZoneDriver>,
records: Arc<dyn RecordDriver>,
2024-12-22 21:36:26 +00:00
db: BoxedDb,
template_engine: TemplateEngine
2024-12-15 20:21:03 +00:00
}
#[tokio::main]
async fn main() {
2025-04-01 22:49:56 +00:00
let localization = localization::Localization::init(std::path::Path::new("./locales"));
2025-04-01 18:03:15 +00:00
let template_engine = TemplateEngine::new(
std::path::Path::new("./templates"),
localization.clone()
);
2024-12-22 21:36:26 +00:00
2024-12-15 20:21:03 +00:00
let dns_driver = dns::dns_driver::DnsDriver::from_config(DnsDriverConfig {
address: "127.0.0.1:5353".parse().unwrap(),
tsig: Some(TsigConfig {
key_name: "dev".parse().unwrap(),
secret: domain::utils::base64::decode::<Vec<u8>>("mbmz4J3Efm1BUjqe12M1RHsOnPjYhKQe+2iKO4tL+a4=").unwrap(),
algorithm: domain::tsig::Algorithm::Sha256,
})
});
let dns_driver = Arc::new(dns_driver);
let app_state = AppState {
zone: dns_driver.clone(),
records: dns_driver.clone(),
db: Arc::new(SqliteDB::new("db.sqlite".into()).await),
2024-12-22 21:36:26 +00:00
template_engine
2024-12-15 20:21:03 +00:00
};
let app = Router::new()
2024-12-22 21:36:26 +00:00
/* ----- API ----- */
.route("/api/admin/zones", routing::post(routes::api::zones::create_zone))
.route("/api/zones/{zone_name}/records", routing::get(routes::api::zones::get_zone_records))
.route("/api/zones/{zone_name}/records", routing::post(routes::api::zones::create_zone_records))
/* ----- UI ----- */
2025-03-31 13:06:33 +00:00
.route("/zones/{zone_name}/records", routing::get(routes::ui::zones::get_records_page))
.route("/zones/{zone_name}/records/new", routing::get(routes::ui::zones::get_new_record_page))
2025-05-13 18:23:26 +00:00
.route("/zones/{zone_name}/records/new", routing::post(routes::ui::zones::post_new_record))
2024-12-22 21:36:26 +00:00
.nest_service("/assets", ServeDir::new("assets"))
2025-04-01 18:03:15 +00:00
.with_state(app_state)
.layer(localization.language_middleware("en".parse().unwrap()));
2024-12-15 20:21:03 +00:00
let listener = tokio::net::TcpListener::bind("127.0.0.1:8000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
2021-03-20 02:31:41 +00:00
2022-04-22 22:27:16 +00:00
2021-03-20 18:18:08 +00:00
2024-12-15 20:21:03 +00:00
/*
2022-04-23 10:14:19 +00:00
use crate::cli::{NomiloCli, NomiloCommand};
2022-04-22 22:27:16 +00:00
#[database("sqlite")]
2021-03-26 22:30:38 +00:00
pub struct DbConn(diesel::SqliteConnection);
2021-03-20 02:31:41 +00:00
2022-04-22 23:34:04 +00:00
2022-04-23 10:14:19 +00:00
pub fn get_db_conn(figment: &Figment) -> diesel::SqliteConnection {
let url = match figment.focus("databases.sqlite").extract_inner::<String>("url") {
Ok(url) => url,
Err(e) => {
eprintln!("Error loading configuration: {}", e);
exit(1);
}
};
2022-04-22 22:27:16 +00:00
2022-04-23 10:14:19 +00:00
match diesel::SqliteConnection::establish(&url) {
Ok(c) => c,
Err(e) => {
eprintln!("Error connecting to database at \"{}\": {}", url, e);
exit(1);
}
}
2022-04-22 23:34:04 +00:00
}
fn main() {
2022-04-22 22:27:16 +00:00
let figment = Figment::from(rocket::Config::default())
.merge(Toml::file(Env::var_or("NOMILO_CONFIG", "nomilo.toml")).nested())
.merge(Env::prefixed("NOMILO_").ignore(&["PROFILE"]).global())
.select(Profile::from_env_or("NOMILO_PROFILE", "release"));
let app_config = match figment.extract::<config::Config>() {
Ok(c) => c,
Err(e) => {
eprintln!("Error loading configuration: {}", e);
exit(1);
}
};
2021-03-20 02:31:41 +00:00
2022-04-23 10:14:19 +00:00
let nomilo = NomiloCli::parse();
nomilo.run(figment, app_config);
2021-03-20 02:31:41 +00:00
}
2024-12-15 20:21:03 +00:00
*/