66 lines
1.8 KiB
Rust
66 lines
1.8 KiB
Rust
use std::collections::HashMap;
|
|
use std::net::SocketAddr;
|
|
use std::sync::{Arc};
|
|
use tokio::sync::Mutex;
|
|
|
|
use axum::Router;
|
|
use axum::routing::{get, post};
|
|
use openidconnect::{
|
|
IntrospectionUrl,
|
|
core::CoreClient,
|
|
};
|
|
|
|
pub mod model;
|
|
mod config;
|
|
mod error;
|
|
mod handlers;
|
|
mod util;
|
|
|
|
use crate::util::powerdns::PowerDnsApi;
|
|
|
|
#[derive(Clone)]
|
|
pub struct AppState {
|
|
oidc_client: CoreClient,
|
|
pdns_client: PowerDnsApi,
|
|
state: Arc<Mutex<HashMap<String, String>>>,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let config = config::PowerDnsTsigKeyManagerConfig::load("config.yaml")
|
|
.expect("Unable to load and parse config.yaml");
|
|
|
|
let oidc_client = util::openid::create_client(
|
|
config.oidc.issuer,
|
|
config.oidc.client_id,
|
|
config.oidc.client_secret,
|
|
config.oidc.callback,
|
|
).await
|
|
.set_introspection_uri(IntrospectionUrl::from_url(config.oidc.introspection_url));
|
|
|
|
let pdns_client = util::powerdns::PowerDnsApi::new(
|
|
config.powerdns.server_url,
|
|
config.powerdns.server_api_key,
|
|
config.powerdns.server_id,
|
|
).await;
|
|
|
|
let state: HashMap<String, String> = HashMap::new();
|
|
let app_state = AppState {
|
|
oidc_client,
|
|
pdns_client,
|
|
state: Arc::new(Mutex::new(state)),
|
|
};
|
|
let app = Router::new()
|
|
.route("/user/home", get(handlers::user::home))
|
|
.route("/openid/login", get(handlers::openid::login))
|
|
.route("/openid/callback", get(handlers::openid::callback))
|
|
.route("/api/tsigkey/list", get(handlers::api::list))
|
|
.route("/api/tsigkey/:tsig_key_name", get(handlers::api::get).delete(handlers::api::delete))
|
|
.route("/api/tsigkey/", post(handlers::api::add).put(handlers::api::add))
|
|
.route("/", get(handlers::app::home))
|
|
.with_state(app_state);
|
|
let socket_addr: SocketAddr = (config.server.bind_address, config.server.port).into();
|
|
let listener = tokio::net::TcpListener::bind(socket_addr).await.unwrap();
|
|
axum::serve::serve(listener, app).await.unwrap();
|
|
}
|