From d17eb4832ec9617c0f1c89cb0492f0b39f801591 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 11:42:15 -0400 Subject: [PATCH 01/13] Refactor to use a middleware to do the redirection before we hit routing --- Cargo.lock | 1 + Cargo.toml | 1 + src/apis/mod.rs | 1 + src/apis/porkbun.rs | 13 ++++++++++++ src/main.rs | 52 +++++++++++++++++++++++++++++++++++---------- 5 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 src/apis/mod.rs create mode 100644 src/apis/porkbun.rs diff --git a/Cargo.lock b/Cargo.lock index 380e62a..676872b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "tower", "tower-http", "tracing", "tracing-opentelemetry", diff --git a/Cargo.toml b/Cargo.toml index 5364763..564ec0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ async-trait = "0.1.60" axum = "0.7.4" axum-macros = "0.4.0" tower-http = { version = "0.5.2", features = ["trace"] } +tower = "0.4.13" [build-dependencies] vergen = { version = "8.3.1", features = [ diff --git a/src/apis/mod.rs b/src/apis/mod.rs new file mode 100644 index 0000000..a39b179 --- /dev/null +++ b/src/apis/mod.rs @@ -0,0 +1 @@ +pub mod porkbun; diff --git a/src/apis/porkbun.rs b/src/apis/porkbun.rs new file mode 100644 index 0000000..e4f3b55 --- /dev/null +++ b/src/apis/porkbun.rs @@ -0,0 +1,13 @@ +pub struct Config { + api_key: String, + secret_api_key: String, +} + +impl Config { + pub fn from_env() -> color_eyre::Result { + Ok(Self { + api_key: std::env::var("PORKBUN_API_KEY")?, + secret_api_key: std::env::var("PORKBUN_SECRET_API_KEY")?, + }) + } +} diff --git a/src/main.rs b/src/main.rs index e3cc10a..4c07ced 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use axum::{ - extract::Host, + extract::{Host, Request, State}, response::{IntoResponse, Redirect, Response}, + routing::get, }; use color_eyre::eyre::Context; use setup::{setup_sentry, setup_tracing}; @@ -10,6 +11,8 @@ use tower_http::trace::TraceLayer; mod server_tracing; mod setup; +mod apis; + fn main() -> color_eyre::Result<()> { let _sentry_guard = setup_sentry(); @@ -23,7 +26,7 @@ fn main() -> color_eyre::Result<()> { async fn _main() -> color_eyre::Result<()> { setup_tracing()?; - run_axum(AppState).await + run_axum().await } #[derive(Clone, Debug)] @@ -34,29 +37,56 @@ async fn handler(Host(host): Host) -> Response { "redirects.coreyja.domains" => { "I have lots of domains. Some of them just redirect to others.".into_response() } - "coreyja.tv" | "coreyja.tube" => Redirect::to("https://coreyja.com/videos").into_response(), - "coreyja.blog" => Redirect::to("https://coreyja.com/posts").into_response(), - "coreyja.club" => Redirect::to("https://discord.gg/CpAPpXrgUq").into_response(), _ => "This is not one of the hosts I know about.".into_response(), } } -async fn run_axum(app_state: AppState) -> color_eyre::Result<()> { +async fn host_redirection( + // you can add more extractors here but the last + // extractor must implement `FromRequest` which + // `Request` does + Host(host): Host, + request: Request, + next: axum::middleware::Next, +) -> Response { + let redirect_to = match host.as_str() { + // "redirects.coreyja.domains" => { + // "I have lots of domains. Some of them just redirect to others.".into_response() + // } + "coreyja.tv" | "coreyja.tube" => Some("https://coreyja.com/videos"), + "coreyja.blog" => Some("https://coreyja.com/posts"), + "coreyja.club" => Some("https://discord.gg/CpAPpXrgUq"), + // "coreyja.domains" => inner_routes.oneshot(req).await.unwrap(), + _ => None, + }; + + if let Some(redirect_to) = redirect_to { + return Redirect::to(redirect_to).into_response(); + }; + + next.run(request).await +} + +async fn run_axum() -> color_eyre::Result<()> { let tracer = server_tracing::Tracer; let trace_layer = TraceLayer::new_for_http() .make_span_with(tracer) .on_response(tracer); - let app = axum::Router::new() - .fallback(handler) - .with_state(app_state) - .layer(trace_layer); + let state = AppState; + + let outer = axum::Router::new() + .route("/", get(handler)) + // .fallback(handler) + .with_state(state) + .layer(trace_layer) + .layer(axum::middleware::from_fn(host_redirection)); let addr = std::net::SocketAddr::from(([0, 0, 0, 0], 3001)); let listener = TcpListener::bind(&addr).await.unwrap(); tracing::debug!("listening on {}", addr); - axum::serve(listener, app) + axum::serve(listener, outer) .await .wrap_err("Failed to run server")?; From 0ad5da5d67775fc0c9382e4359cd4e371faca3a8 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 12:02:40 -0400 Subject: [PATCH 02/13] Get a basic endpoint to echo out all my domains --- .dockerignore | 1 + .gitignore | 1 + Cargo.lock | 1 + Cargo.toml | 4 ++++ src/apis/porkbun.rs | 30 ++++++++++++++++++++++++++++++ src/main.rs | 14 ++++++++------ 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/.dockerignore b/.dockerignore index 09301dc..0280210 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ # flyctl launch added from .gitignore target fly.toml +.envrc diff --git a/.gitignore b/.gitignore index ea8c4bf..46b5d68 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +.envrc diff --git a/Cargo.lock b/Cargo.lock index 676872b..7524c88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -335,6 +335,7 @@ dependencies = [ "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", + "reqwest", "sentry", "sentry-tower", "serde", diff --git a/Cargo.toml b/Cargo.toml index 564ec0d..d1aaf08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,10 @@ axum = "0.7.4" axum-macros = "0.4.0" tower-http = { version = "0.5.2", features = ["trace"] } tower = "0.4.13" +reqwest = { version = "0.11.12", features = [ + "json", + "rustls-tls", +], default-features = false } [build-dependencies] vergen = { version = "8.3.1", features = [ diff --git a/src/apis/porkbun.rs b/src/apis/porkbun.rs index e4f3b55..63ade29 100644 --- a/src/apis/porkbun.rs +++ b/src/apis/porkbun.rs @@ -1,3 +1,7 @@ +use color_eyre::config; +use serde::Serialize; +use serde_json::Value; + pub struct Config { api_key: String, secret_api_key: String, @@ -11,3 +15,29 @@ impl Config { }) } } + +#[derive(Debug, Serialize)] +struct Auth { + apikey: String, + secretapikey: String, +} + +impl Auth { + pub fn from_config(config: &Config) -> Self { + Self { + apikey: config.api_key.clone(), + secretapikey: config.secret_api_key.clone(), + } + } +} + +pub async fn fetch_domains(config: Config) -> color_eyre::Result { + let client = reqwest::Client::new(); + let response = client + .post("https://porkbun.com/api/json/v3/domain/listAll") + .json(&Auth::from_config(&config)) + .send() + .await?; + + Ok(response.json().await?) +} diff --git a/src/main.rs b/src/main.rs index 4c07ced..ed7bf3a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use axum::{ - extract::{Host, Request, State}, + extract::{Host, Request}, response::{IntoResponse, Redirect, Response}, routing::get, }; @@ -50,13 +50,9 @@ async fn host_redirection( next: axum::middleware::Next, ) -> Response { let redirect_to = match host.as_str() { - // "redirects.coreyja.domains" => { - // "I have lots of domains. Some of them just redirect to others.".into_response() - // } "coreyja.tv" | "coreyja.tube" => Some("https://coreyja.com/videos"), "coreyja.blog" => Some("https://coreyja.com/posts"), "coreyja.club" => Some("https://discord.gg/CpAPpXrgUq"), - // "coreyja.domains" => inner_routes.oneshot(req).await.unwrap(), _ => None, }; @@ -67,6 +63,12 @@ async fn host_redirection( next.run(request).await } +async fn porkbun_handler() -> impl IntoResponse { + let config = apis::porkbun::Config::from_env().expect("Failed to get porkbun config"); + + axum::Json(apis::porkbun::fetch_domains(config).await.unwrap()) +} + async fn run_axum() -> color_eyre::Result<()> { let tracer = server_tracing::Tracer; let trace_layer = TraceLayer::new_for_http() @@ -77,7 +79,7 @@ async fn run_axum() -> color_eyre::Result<()> { let outer = axum::Router::new() .route("/", get(handler)) - // .fallback(handler) + .route("/porkbun", get(porkbun_handler)) .with_state(state) .layer(trace_layer) .layer(axum::middleware::from_fn(host_redirection)); From dbc4e95e331f8697a70e91df54044b2fe9c4bb81 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 19:03:47 -0400 Subject: [PATCH 03/13] Get cja setup --- Cargo.lock | 1133 ++++++++++++++++++++- Cargo.toml | 7 + build.rs | 2 + migrations/20240316161307_CreateJobs.sql | 14 + migrations/20240316161322_CreateCrons.sql | 17 + src/apis/porkbun.rs | 1 - src/cron.rs | 15 + src/jobs.rs | 19 + src/main.rs | 64 +- src/setup.rs | 35 + 10 files changed, 1276 insertions(+), 31 deletions(-) create mode 100644 migrations/20240316161307_CreateJobs.sql create mode 100644 migrations/20240316161322_CreateCrons.sql create mode 100644 src/cron.rs create mode 100644 src/jobs.rs diff --git a/Cargo.lock b/Cargo.lock index 7524c88..9544612 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,54 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.2" @@ -26,6 +74,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.80" @@ -46,7 +115,16 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", ] [[package]] @@ -119,7 +197,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -137,12 +215,27 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -154,6 +247,18 @@ name = "bitflags" version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] [[package]] name = "bstr" @@ -181,6 +286,12 @@ version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.5.0" @@ -231,6 +342,50 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.4", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "cja" +version = "0.0.0" +source = "git+https://github.com/coreyja/coreyja.com?branch=main#db0d69ed648c5fb63a088c5a76a3a862a7da9a3b" +dependencies = [ + "async-trait", + "axum-core", + "base64", + "chrono", + "http 1.1.0", + "miette", + "serde", + "serde_json", + "sqlx", + "thiserror", + "tokio", + "tower-cookies", + "tracing", + "uuid", +] + [[package]] name = "clru" version = "0.6.1" @@ -264,6 +419,30 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cookie" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" +dependencies = [ + "aes-gcm", + "base64", + "hkdf", + "hmac", + "percent-encoding", + "rand", + "sha2", + "subtle", + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -280,6 +459,30 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.0" @@ -298,12 +501,41 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "debugid" version = "0.8.0" @@ -314,6 +546,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -323,6 +566,18 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + [[package]] name = "domains" version = "0.1.0" @@ -330,8 +585,11 @@ dependencies = [ "async-trait", "axum", "axum-macros", + "cja", "color-eyre", + "futures", "maud", + "miette", "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", @@ -340,16 +598,25 @@ dependencies = [ "sentry-tower", "serde", "serde_json", + "sqlx", "tokio", "tower", + "tower-cookies", "tower-http", "tracing", "tracing-opentelemetry", "tracing-subscriber", "tracing-tree", + "uuid", "vergen", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dunce" version = "1.0.4" @@ -361,6 +628,9 @@ name = "either" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +dependencies = [ + "serde", +] [[package]] name = "encoding_rs" @@ -387,6 +657,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "eyre" version = "0.6.12" @@ -424,6 +711,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "flate2" version = "1.0.28" @@ -434,6 +727,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -449,6 +753,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -456,6 +775,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -475,6 +795,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.30" @@ -489,7 +820,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -510,6 +841,7 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -521,6 +853,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -532,6 +874,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.28.1" @@ -804,7 +1156,7 @@ checksum = "d75e7ab728059f595f6ddc1ad8771b8d6a231971ae493d9d5948ecad366ee8bb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -1087,12 +1439,28 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" @@ -1106,6 +1474,24 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "home" version = "0.5.9" @@ -1269,13 +1655,36 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.5.0" +name = "iana-time-zone" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -1294,12 +1703,38 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + [[package]] name = "itertools" version = "0.10.5" @@ -1309,6 +1744,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -1329,6 +1773,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" @@ -1336,6 +1783,23 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -1396,7 +1860,17 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 2.0.52", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", ] [[package]] @@ -1414,12 +1888,50 @@ dependencies = [ "libc", ] +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "backtrace", + "backtrace-ext", + "is-terminal", + "miette-derive", + "once_cell", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1440,6 +1952,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1459,12 +1981,49 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -1472,6 +2031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1508,6 +2068,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "openssl-probe" version = "0.1.5" @@ -1656,6 +2222,21 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1679,7 +2260,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -1694,6 +2275,45 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1761,10 +2381,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -1911,11 +2531,31 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin", + "spin 0.9.8", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2225,7 +2865,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -2261,12 +2901,34 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha1_smol" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2295,6 +2957,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -2310,6 +2982,12 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.6" @@ -2320,11 +2998,257 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +dependencies = [ + "itertools 0.12.1", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +dependencies = [ + "ahash", + "atoi", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls 0.21.10", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots 0.25.4", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +dependencies = [ + "atoi", + "base64", + "bitflags 2.4.2", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +dependencies = [ + "atoi", + "base64", + "bitflags 2.4.2", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", + "urlencoding", + "uuid", +] + +[[package]] +name = "stringprep" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +dependencies = [ + "finl_unicode", + "unicode-bidi", + "unicode-normalization", +] [[package]] name = "subtle" @@ -2332,6 +3256,45 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "supports-color" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" +dependencies = [ + "is-terminal", + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84231692eb0d4d41e4cdd0cabfdd2e6cd9e255e65f80c9aa7c98dd502b4233d" +dependencies = [ + "is-terminal", +] + +[[package]] +name = "supports-unicode" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f850c19edd184a205e883199a261ed44471c81e39bd95b1357f5febbef00e77a" +dependencies = [ + "is-terminal", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.52" @@ -2382,6 +3345,27 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "terminal_size" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + [[package]] name = "thiserror" version = "1.0.57" @@ -2399,7 +3383,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -2487,7 +3471,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -2562,6 +3546,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-cookies" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d" +dependencies = [ + "async-trait", + "axum-core", + "cookie", + "futures-util", + "http 1.1.0", + "parking_lot", + "pin-project-lite", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-http" version = "0.5.2" @@ -2611,7 +3612,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] @@ -2699,6 +3700,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "uname" version = "0.1.1" @@ -2726,6 +3733,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.23" @@ -2735,6 +3748,34 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -2781,6 +3822,7 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ + "getrandom", "serde", ] @@ -2790,6 +3832,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vergen" version = "8.3.1" @@ -2837,6 +3885,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -2858,7 +3912,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.52", "wasm-bindgen-shared", ] @@ -2892,7 +3946,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2938,6 +3992,16 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "whoami" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2969,6 +4033,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3120,6 +4193,26 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "zeroize" version = "1.7.0" diff --git a/Cargo.toml b/Cargo.toml index d1aaf08..f2e293f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,13 @@ reqwest = { version = "0.11.12", features = [ "rustls-tls", ], default-features = false } +cja = { version = "0.0.0", git = "https://github.com/coreyja/coreyja.com", branch = "main" } +sqlx = "0.7.3" +uuid = { version = "1.6.1", features = ["v4"] } +tower-cookies = { version = "0.10.0", features = ["private", "signed"] } +miette = { version = "5.7" } +futures = "0.3.30" + [build-dependencies] vergen = { version = "8.3.1", features = [ "build", diff --git a/build.rs b/build.rs index 41fe109..571dd2d 100644 --- a/build.rs +++ b/build.rs @@ -3,6 +3,8 @@ use std::error::Error; use vergen::EmitBuilder; fn main() -> Result<(), Box> { + println!("cargo:rerun-if-changed=migrations"); + EmitBuilder::builder() .all_build() .all_cargo() diff --git a/migrations/20240316161307_CreateJobs.sql b/migrations/20240316161307_CreateJobs.sql new file mode 100644 index 0000000..0f91381 --- /dev/null +++ b/migrations/20240316161307_CreateJobs.sql @@ -0,0 +1,14 @@ +-- Add migration script here +-- Add migration script here +CREATE TABLE + Jobs ( + job_id UUID PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + payload JSONB NOT NULL, + priority INT NOT NULL, + run_at TIMESTAMPTZ NOT NULL DEFAULT NOW (), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW (), + locked_at TIMESTAMPTZ, + locked_by TEXT, + context TEXT NOT NULL + ); diff --git a/migrations/20240316161322_CreateCrons.sql b/migrations/20240316161322_CreateCrons.sql new file mode 100644 index 0000000..cd73f86 --- /dev/null +++ b/migrations/20240316161322_CreateCrons.sql @@ -0,0 +1,17 @@ +-- Add migration script here +CREATE TABLE + Crons ( + cron_id UUID PRIMARY KEY, + name TEXT NOT NULL, + last_run_at TIMESTAMP + WITH + TIME ZONE NOT NULL, + created_at TIMESTAMP + WITH + TIME ZONE NOT NULL, + updated_at TIMESTAMP + WITH + TIME ZONE NOT NULL + ); + +CREATE UNIQUE INDEX idx_crons_name ON Crons (name); diff --git a/src/apis/porkbun.rs b/src/apis/porkbun.rs index 63ade29..2610bec 100644 --- a/src/apis/porkbun.rs +++ b/src/apis/porkbun.rs @@ -1,4 +1,3 @@ -use color_eyre::config; use serde::Serialize; use serde_json::Value; diff --git a/src/cron.rs b/src/cron.rs new file mode 100644 index 0000000..28ec05e --- /dev/null +++ b/src/cron.rs @@ -0,0 +1,15 @@ +use cja::cron::{CronRegistry, Worker}; + +use crate::AppState; + +fn cron_registry() -> CronRegistry { + let mut registry = CronRegistry::new(); + + registry +} + +pub(crate) async fn run_cron(app_state: AppState) -> miette::Result<()> { + Worker::new(app_state, cron_registry()).run().await?; + + Ok(()) +} diff --git a/src/jobs.rs b/src/jobs.rs new file mode 100644 index 0000000..628ffda --- /dev/null +++ b/src/jobs.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; + +use crate::AppState; + +cja::impl_job_registry!(AppState, NoopJob); + +#[derive(Clone, Debug, Serialize, Deserialize)] +struct NoopJob; + +#[async_trait::async_trait] +impl cja::jobs::Job for NoopJob { + const NAME: &'static str = "NoopJob"; + + async fn run(&self, _app_state: AppState) -> miette::Result<()> { + tracing::info!("Noop job ran"); + + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index ed7bf3a..a75c871 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,15 +3,19 @@ use axum::{ response::{IntoResponse, Redirect, Response}, routing::get, }; -use color_eyre::eyre::Context; +use cja::app_state::AppState as _; +use miette::IntoDiagnostic; use setup::{setup_sentry, setup_tracing}; use tokio::net::TcpListener; use tower_http::trace::TraceLayer; +use tracing::info; mod server_tracing; mod setup; mod apis; +mod cron; +mod jobs; fn main() -> color_eyre::Result<()> { let _sentry_guard = setup_sentry(); @@ -26,11 +30,55 @@ fn main() -> color_eyre::Result<()> { async fn _main() -> color_eyre::Result<()> { setup_tracing()?; - run_axum().await + let app_state = AppState::from_env().await?; + + cja::sqlx::migrate!().run(app_state.db()).await?; + + info!("Spawning Tasks"); + let futures = vec![ + tokio::spawn(run_axum(app_state.clone())), + tokio::spawn(cja::jobs::worker::job_worker(app_state.clone(), jobs::Jobs)), + tokio::spawn(cron::run_cron(app_state.clone())), + ]; + info!("Tasks Spawned"); + + futures::future::try_join_all(futures).await?; + + Ok(()) } #[derive(Clone, Debug)] -struct AppState; +struct AppState { + db: sqlx::Pool, + cookie_key: cja::server::cookies::CookieKey, +} + +impl cja::app_state::AppState for AppState { + fn version(&self) -> &str { + env!("VERGEN_GIT_SHA") + } + + fn db(&self) -> &sqlx::PgPool { + &self.db + } + + fn cookie_key(&self) -> &cja::server::cookies::CookieKey { + &self.cookie_key + } +} + +impl AppState { + pub async fn from_env() -> color_eyre::Result { + let pool = crate::setup::setup_db_pool().await?; + + let cookie_key = cja::server::cookies::CookieKey::from_env_or_generate()?; + + Ok(Self { + db: pool, + cookie_key, + }) + } +} async fn handler(Host(host): Host) -> Response { match host.as_str() { @@ -69,18 +117,16 @@ async fn porkbun_handler() -> impl IntoResponse { axum::Json(apis::porkbun::fetch_domains(config).await.unwrap()) } -async fn run_axum() -> color_eyre::Result<()> { +async fn run_axum(app_state: AppState) -> miette::Result<()> { let tracer = server_tracing::Tracer; let trace_layer = TraceLayer::new_for_http() .make_span_with(tracer) .on_response(tracer); - let state = AppState; - let outer = axum::Router::new() .route("/", get(handler)) .route("/porkbun", get(porkbun_handler)) - .with_state(state) + .with_state(app_state) .layer(trace_layer) .layer(axum::middleware::from_fn(host_redirection)); @@ -88,9 +134,7 @@ async fn run_axum() -> color_eyre::Result<()> { let listener = TcpListener::bind(&addr).await.unwrap(); tracing::debug!("listening on {}", addr); - axum::serve(listener, outer) - .await - .wrap_err("Failed to run server")?; + axum::serve(listener, outer).await.into_diagnostic()?; Ok(()) } diff --git a/src/setup.rs b/src/setup.rs index c2c927c..3055c0d 100644 --- a/src/setup.rs +++ b/src/setup.rs @@ -3,6 +3,7 @@ use std::{collections::HashMap, time::Duration}; use color_eyre::{eyre::Context, Result}; use opentelemetry_otlp::WithExportConfig; use sentry::ClientInitGuard; +use sqlx::{postgres::PgPoolOptions, PgPool}; use tracing_opentelemetry::OpenTelemetryLayer; use tracing_subscriber::{prelude::*, EnvFilter, Registry}; use tracing_tree::HierarchicalLayer; @@ -88,3 +89,37 @@ pub fn setup_sentry() -> Option { None } } + +#[tracing::instrument(err)] +pub async fn setup_db_pool() -> Result { + let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + let pool = PgPoolOptions::new() + .max_connections(5) + .connect(&database_url) + .await?; + + const MIGRATION_LOCK_ID: i64 = 0xDB_DB_DB_DB_DB_DB_DB; + sqlx::query!("SELECT pg_advisory_lock($1)", MIGRATION_LOCK_ID) + .execute(&pool) + .await?; + + sqlx::migrate!().run(&pool).await?; + + let unlock_result = sqlx::query!("SELECT pg_advisory_unlock($1)", MIGRATION_LOCK_ID) + .fetch_one(&pool) + .await? + .pg_advisory_unlock; + + match unlock_result { + Some(b) => { + if b { + tracing::info!("Migration lock unlocked"); + } else { + tracing::info!("Failed to unlock migration lock"); + } + } + None => panic!("Failed to unlock migration lock"), + } + + Ok(pool) +} From 76da77b94406b1ac5aa96bef813024d245ed0126 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 19:54:16 -0400 Subject: [PATCH 04/13] Job to save all my domains into the DB on a cron --- Cargo.lock | 1 + Cargo.toml | 1 + migrations/20240316232103_AddDomains.down.sql | 2 + migrations/20240316232103_AddDomains.up.sql | 18 +++++++ src/apis/porkbun.rs | 22 +++++++- src/cron.rs | 6 ++- src/jobs.rs | 18 ++----- src/jobs/refresh_domains.rs | 54 +++++++++++++++++++ 8 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 migrations/20240316232103_AddDomains.down.sql create mode 100644 migrations/20240316232103_AddDomains.up.sql create mode 100644 src/jobs/refresh_domains.rs diff --git a/Cargo.lock b/Cargo.lock index 9544612..a7e9f9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,6 +585,7 @@ dependencies = [ "async-trait", "axum", "axum-macros", + "chrono", "cja", "color-eyre", "futures", diff --git a/Cargo.toml b/Cargo.toml index f2e293f..9bf30ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,6 +51,7 @@ uuid = { version = "1.6.1", features = ["v4"] } tower-cookies = { version = "0.10.0", features = ["private", "signed"] } miette = { version = "5.7" } futures = "0.3.30" +chrono = { version = "0.4.23", default-features = false, features = ["serde"] } [build-dependencies] vergen = { version = "8.3.1", features = [ diff --git a/migrations/20240316232103_AddDomains.down.sql b/migrations/20240316232103_AddDomains.down.sql new file mode 100644 index 0000000..e07b74d --- /dev/null +++ b/migrations/20240316232103_AddDomains.down.sql @@ -0,0 +1,2 @@ +-- Add migration script here +DROP TABLE PorkbunDomains; diff --git a/migrations/20240316232103_AddDomains.up.sql b/migrations/20240316232103_AddDomains.up.sql new file mode 100644 index 0000000..52c48b5 --- /dev/null +++ b/migrations/20240316232103_AddDomains.up.sql @@ -0,0 +1,18 @@ +-- Add migration script here +CREATE TABLE + PorkbunDomains ( + porkbun_domain_id UUID PRIMARY KEY NOT NULL, + auto_renew BOOLEAN NOT NULL, + purchase_date TIMESTAMPTZ NOT NULL, + domain TEXT NOT NULL, + expire_date TIMESTAMPTZ NOT NULL, + not_local BOOLEAN NOT NULL, + security_lock BOOLEAN NOT NULL, + status TEXT, + tld TEXT NOT NULL, + whois_privacy BOOLEAN NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW (), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW () + ); + +CREATE UNIQUE INDEX idx_porkbun_domains_on_domain ON PorkbunDomains (domain); diff --git a/src/apis/porkbun.rs b/src/apis/porkbun.rs index 2610bec..2b45fc0 100644 --- a/src/apis/porkbun.rs +++ b/src/apis/porkbun.rs @@ -1,4 +1,4 @@ -use serde::Serialize; +use serde::{Deserialize, Serialize}; use serde_json::Value; pub struct Config { @@ -30,7 +30,25 @@ impl Auth { } } -pub async fn fetch_domains(config: Config) -> color_eyre::Result { +#[derive(Serialize, Deserialize)] +pub struct FetchDomainsResponse { + pub domains: Vec, +} +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PorkbunDomain { + pub auto_renew: String, + pub create_date: String, + pub domain: String, + pub expire_date: String, + pub not_local: i32, + pub security_lock: String, + pub status: Option, + pub tld: String, + pub whois_privacy: String, +} + +pub async fn fetch_domains(config: Config) -> color_eyre::Result { let client = reqwest::Client::new(); let response = client .post("https://porkbun.com/api/json/v3/domain/listAll") diff --git a/src/cron.rs b/src/cron.rs index 28ec05e..a5e2ba2 100644 --- a/src/cron.rs +++ b/src/cron.rs @@ -1,10 +1,14 @@ +use std::time::Duration; + use cja::cron::{CronRegistry, Worker}; -use crate::AppState; +use crate::{jobs::refresh_domains::RefreshDomains, AppState}; fn cron_registry() -> CronRegistry { let mut registry = CronRegistry::new(); + registry.register_job(RefreshDomains, Duration::from_secs(60 * 60)); + registry } diff --git a/src/jobs.rs b/src/jobs.rs index 628ffda..d5c13f7 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -1,19 +1,7 @@ use serde::{Deserialize, Serialize}; -use crate::AppState; +use crate::{jobs::refresh_domains::RefreshDomains, AppState}; -cja::impl_job_registry!(AppState, NoopJob); +pub mod refresh_domains; -#[derive(Clone, Debug, Serialize, Deserialize)] -struct NoopJob; - -#[async_trait::async_trait] -impl cja::jobs::Job for NoopJob { - const NAME: &'static str = "NoopJob"; - - async fn run(&self, _app_state: AppState) -> miette::Result<()> { - tracing::info!("Noop job ran"); - - Ok(()) - } -} +cja::impl_job_registry!(AppState, RefreshDomains); diff --git a/src/jobs/refresh_domains.rs b/src/jobs/refresh_domains.rs new file mode 100644 index 0000000..f8f7f7b --- /dev/null +++ b/src/jobs/refresh_domains.rs @@ -0,0 +1,54 @@ +use chrono::{DateTime, FixedOffset, NaiveDateTime, Utc}; +use cja::jobs::Job; + +use miette::IntoDiagnostic; + +use crate::AppState; + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct RefreshDomains; + +#[async_trait::async_trait] +impl Job for RefreshDomains { + const NAME: &'static str = "RefreshDomains"; + + async fn run(&self, app_state: AppState) -> miette::Result<()> { + let config = + crate::apis::porkbun::Config::from_env().expect("Failed to get porkbun config"); + + let resp = crate::apis::porkbun::fetch_domains(config).await.unwrap(); + + let format = "%Y-%m-%d %H:%M:%S"; + + for domain in resp.domains { + sqlx::query!(" + INSERT INTO PorkbunDomains + (porkbun_domain_id, auto_renew, purchase_date, domain, expire_date, not_local, security_lock, status, tld, whois_privacy) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (domain) + DO UPDATE SET + auto_renew = excluded.auto_renew, + purchase_date = excluded.purchase_date, + expire_date = excluded.expire_date, + not_local = excluded.not_local, + security_lock = excluded.security_lock, + status = excluded.status, + tld = excluded.tld, + whois_privacy = excluded.whois_privacy + ", + uuid::Uuid::new_v4(), + domain.auto_renew == "1", + NaiveDateTime::parse_from_str(&domain.create_date, &format).into_diagnostic()?.and_utc(), + domain.domain, + NaiveDateTime::parse_from_str(&domain.expire_date, &format).into_diagnostic()?.and_utc(), + domain.not_local == 1, + domain.security_lock == "1", + domain.status, + domain.tld, + domain.whois_privacy == "1" + ).execute(&app_state.db).await.into_diagnostic()?; + } + + Ok(()) + } +} From 75259873c725ce0f267ade22d08f5a330ab809a4 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 19:54:45 -0400 Subject: [PATCH 05/13] No porkbun handler now --- src/main.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index a75c871..2b2ea99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,12 +111,6 @@ async fn host_redirection( next.run(request).await } -async fn porkbun_handler() -> impl IntoResponse { - let config = apis::porkbun::Config::from_env().expect("Failed to get porkbun config"); - - axum::Json(apis::porkbun::fetch_domains(config).await.unwrap()) -} - async fn run_axum(app_state: AppState) -> miette::Result<()> { let tracer = server_tracing::Tracer; let trace_layer = TraceLayer::new_for_http() @@ -125,7 +119,6 @@ async fn run_axum(app_state: AppState) -> miette::Result<()> { let outer = axum::Router::new() .route("/", get(handler)) - .route("/porkbun", get(porkbun_handler)) .with_state(app_state) .layer(trace_layer) .layer(axum::middleware::from_fn(host_redirection)); From 71f35ea8c058a966f027ec9328db169fa55b2f39 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 19:58:28 -0400 Subject: [PATCH 06/13] Add sqlx --- ...df3daaaf7d30a19a37b28abcae7efbe9b4ca7.json | 22 ++++++++++++++++++ ...bd775446017b2514434647902d9bfa7c27135.json | 23 +++++++++++++++++++ ...4d563bfbf45ab7892fd9e481f3f392c3cef05.json | 22 ++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 .sqlx/query-0115c52b6c77a377e6585308ba0df3daaaf7d30a19a37b28abcae7efbe9b4ca7.json create mode 100644 .sqlx/query-14ed731d1079774973f5529b94abd775446017b2514434647902d9bfa7c27135.json create mode 100644 .sqlx/query-b895561dd1cdc3b47ea1f3c353f4d563bfbf45ab7892fd9e481f3f392c3cef05.json diff --git a/.sqlx/query-0115c52b6c77a377e6585308ba0df3daaaf7d30a19a37b28abcae7efbe9b4ca7.json b/.sqlx/query-0115c52b6c77a377e6585308ba0df3daaaf7d30a19a37b28abcae7efbe9b4ca7.json new file mode 100644 index 0000000..6e5e69d --- /dev/null +++ b/.sqlx/query-0115c52b6c77a377e6585308ba0df3daaaf7d30a19a37b28abcae7efbe9b4ca7.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT pg_advisory_unlock($1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "pg_advisory_unlock", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + null + ] + }, + "hash": "0115c52b6c77a377e6585308ba0df3daaaf7d30a19a37b28abcae7efbe9b4ca7" +} diff --git a/.sqlx/query-14ed731d1079774973f5529b94abd775446017b2514434647902d9bfa7c27135.json b/.sqlx/query-14ed731d1079774973f5529b94abd775446017b2514434647902d9bfa7c27135.json new file mode 100644 index 0000000..ac87d0f --- /dev/null +++ b/.sqlx/query-14ed731d1079774973f5529b94abd775446017b2514434647902d9bfa7c27135.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO PorkbunDomains\n (porkbun_domain_id, auto_renew, purchase_date, domain, expire_date, not_local, security_lock, status, tld, whois_privacy)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n ON CONFLICT (domain)\n DO UPDATE SET\n auto_renew = excluded.auto_renew,\n purchase_date = excluded.purchase_date,\n expire_date = excluded.expire_date,\n not_local = excluded.not_local,\n security_lock = excluded.security_lock,\n status = excluded.status,\n tld = excluded.tld,\n whois_privacy = excluded.whois_privacy\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Bool", + "Timestamptz", + "Text", + "Timestamptz", + "Bool", + "Bool", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "14ed731d1079774973f5529b94abd775446017b2514434647902d9bfa7c27135" +} diff --git a/.sqlx/query-b895561dd1cdc3b47ea1f3c353f4d563bfbf45ab7892fd9e481f3f392c3cef05.json b/.sqlx/query-b895561dd1cdc3b47ea1f3c353f4d563bfbf45ab7892fd9e481f3f392c3cef05.json new file mode 100644 index 0000000..842305d --- /dev/null +++ b/.sqlx/query-b895561dd1cdc3b47ea1f3c353f4d563bfbf45ab7892fd9e481f3f392c3cef05.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT pg_advisory_lock($1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "pg_advisory_lock", + "type_info": "Void" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + null + ] + }, + "hash": "b895561dd1cdc3b47ea1f3c353f4d563bfbf45ab7892fd9e481f3f392c3cef05" +} From 320f448e48e683dc4afa97038a1a5dbf84684314 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Sat, 16 Mar 2024 19:59:32 -0400 Subject: [PATCH 07/13] Clippy --- src/apis/porkbun.rs | 1 - src/jobs.rs | 2 -- src/jobs/refresh_domains.rs | 3 +-- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/apis/porkbun.rs b/src/apis/porkbun.rs index 2b45fc0..09bc38c 100644 --- a/src/apis/porkbun.rs +++ b/src/apis/porkbun.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -use serde_json::Value; pub struct Config { api_key: String, diff --git a/src/jobs.rs b/src/jobs.rs index d5c13f7..0f9e257 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -1,5 +1,3 @@ -use serde::{Deserialize, Serialize}; - use crate::{jobs::refresh_domains::RefreshDomains, AppState}; pub mod refresh_domains; diff --git a/src/jobs/refresh_domains.rs b/src/jobs/refresh_domains.rs index f8f7f7b..4689557 100644 --- a/src/jobs/refresh_domains.rs +++ b/src/jobs/refresh_domains.rs @@ -1,6 +1,5 @@ -use chrono::{DateTime, FixedOffset, NaiveDateTime, Utc}; +use chrono::NaiveDateTime; use cja::jobs::Job; - use miette::IntoDiagnostic; use crate::AppState; From 5060b533a7192eaeb931ee2da0165807a01259a8 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 21:21:36 -0400 Subject: [PATCH 08/13] Use some more stuff from cja --- Cargo.lock | 567 +++++++++++++++++++++++++++++++++++++----- src/main.rs | 77 ++++-- src/server_tracing.rs | 74 ------ src/setup.rs | 125 ---------- 4 files changed, 560 insertions(+), 283 deletions(-) delete mode 100644 src/server_tracing.rs delete mode 100644 src/setup.rs diff --git a/Cargo.lock b/Cargo.lock index a7e9f9e..2fa6883 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,6 +107,28 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "async-trait" version = "0.1.77" @@ -133,6 +155,34 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "axum" version = "0.7.4" @@ -140,7 +190,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.3", "bytes", "futures-util", "http 1.1.0", @@ -167,6 +217,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-core" version = "0.4.3" @@ -224,6 +291,12 @@ dependencies = [ "backtrace", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -368,11 +441,11 @@ dependencies = [ [[package]] name = "cja" version = "0.0.0" -source = "git+https://github.com/coreyja/coreyja.com?branch=main#db0d69ed648c5fb63a088c5a76a3a862a7da9a3b" +source = "git+https://github.com/coreyja/coreyja.com?branch=main#196fd4499750acfcb60d61017326c92e04d8a649" dependencies = [ "async-trait", - "axum-core", - "base64", + "axum 0.7.4", + "base64 0.21.7", "chrono", "http 1.1.0", "miette", @@ -381,8 +454,12 @@ dependencies = [ "sqlx", "thiserror", "tokio", + "tower", "tower-cookies", + "tower-http", + "tower-service", "tracing", + "tracing-common", "uuid", ] @@ -432,7 +509,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" dependencies = [ "aes-gcm", - "base64", + "base64 0.21.7", "hkdf", "hmac", "percent-encoding", @@ -536,6 +613,19 @@ dependencies = [ "cipher", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "debugid" version = "0.8.0" @@ -583,7 +673,7 @@ name = "domains" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.7.4", "axum-macros", "chrono", "cja", @@ -591,12 +681,12 @@ dependencies = [ "futures", "maud", "miette", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", + "opentelemetry 0.22.0", + "opentelemetry-otlp 0.15.0", + "opentelemetry_sdk 0.22.1", "reqwest", - "sentry", - "sentry-tower", + "sentry 0.32.2", + "sentry-tower 0.32.2", "serde", "serde_json", "sqlx", @@ -605,9 +695,9 @@ dependencies = [ "tower-cookies", "tower-http", "tracing", - "tracing-opentelemetry", + "tracing-opentelemetry 0.23.0", "tracing-subscriber", - "tracing-tree", + "tracing-tree 0.3.0", "uuid", "vergen", ] @@ -1109,7 +1199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebe47d8c0887f82355e2e9e16b6cecaa4d5e5346a7a474ca78ff94de1db35a5b" dependencies = [ "gix-hash", - "hashbrown", + "hashbrown 0.14.3", "parking_lot", ] @@ -1409,7 +1499,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1428,13 +1518,19 @@ dependencies = [ "futures-sink", "futures-util", "http 1.1.0", - "indexmap", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" @@ -1451,7 +1547,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -1639,6 +1735,18 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.28", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "hyper-util" version = "0.1.3" @@ -1694,6 +1802,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.2.5" @@ -1701,7 +1819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -2081,6 +2199,16 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "opentelemetry" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" +dependencies = [ + "opentelemetry_api", + "opentelemetry_sdk 0.19.0", +] + [[package]] name = "opentelemetry" version = "0.22.0" @@ -2096,6 +2224,19 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "opentelemetry-http" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a819b71d6530c4297b49b3cae2939ab3a8cc1b9f382826a1bc29dd0ca3864906" +dependencies = [ + "async-trait", + "bytes", + "http 0.2.12", + "opentelemetry_api", + "reqwest", +] + [[package]] name = "opentelemetry-http" version = "0.11.0" @@ -2105,10 +2246,28 @@ dependencies = [ "async-trait", "bytes", "http 0.2.12", - "opentelemetry", + "opentelemetry 0.22.0", "reqwest", ] +[[package]] +name = "opentelemetry-otlp" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8af72d59a4484654ea8eb183fea5ae4eb6a41d7ac3e3bae5f4d2a282a3a7d3ca" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "http 0.2.12", + "opentelemetry 0.19.0", + "opentelemetry-http 0.8.0", + "opentelemetry-proto 0.2.0", + "prost 0.11.9", + "reqwest", + "thiserror", +] + [[package]] name = "opentelemetry-otlp" version = "0.15.0" @@ -2118,26 +2277,39 @@ dependencies = [ "async-trait", "futures-core", "http 0.2.12", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", + "opentelemetry 0.22.0", + "opentelemetry-http 0.11.0", + "opentelemetry-proto 0.5.0", "opentelemetry-semantic-conventions", - "opentelemetry_sdk", - "prost", + "opentelemetry_sdk 0.22.1", + "prost 0.12.3", "reqwest", "thiserror", ] +[[package]] +name = "opentelemetry-proto" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045f8eea8c0fa19f7d48e7bc3128a39c2e5c533d5c61298c548dfefc1064474c" +dependencies = [ + "futures", + "futures-util", + "opentelemetry 0.19.0", + "prost 0.11.9", + "tonic 0.8.3", +] + [[package]] name = "opentelemetry-proto" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" dependencies = [ - "opentelemetry", - "opentelemetry_sdk", - "prost", - "tonic", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", + "prost 0.12.3", + "tonic 0.11.0", ] [[package]] @@ -2146,6 +2318,44 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" +[[package]] +name = "opentelemetry_api" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" +dependencies = [ + "fnv", + "futures-channel", + "futures-util", + "indexmap 1.9.3", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" +dependencies = [ + "async-trait", + "crossbeam-channel", + "dashmap", + "fnv", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api", + "percent-encoding", + "rand", + "thiserror", + "tokio", + "tokio-stream", +] + [[package]] name = "opentelemetry_sdk" version = "0.22.1" @@ -2159,7 +2369,7 @@ dependencies = [ "futures-util", "glob", "once_cell", - "opentelemetry", + "opentelemetry 0.22.0", "ordered-float", "percent-encoding", "rand", @@ -2365,6 +2575,16 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79" +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + [[package]] name = "prost" version = "0.12.3" @@ -2372,7 +2592,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.12.3", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2486,7 +2719,7 @@ version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2629,7 +2862,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -2737,6 +2970,26 @@ dependencies = [ "serde", ] +[[package]] +name = "sentry" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce4b57f1b521f674df7a1d200be8ff5d74e3712020ee25b553146657b5377d5" +dependencies = [ + "httpdate", + "reqwest", + "rustls 0.21.10", + "sentry-backtrace 0.31.8", + "sentry-contexts 0.31.8", + "sentry-core 0.31.8", + "sentry-panic 0.31.8", + "sentry-tower 0.31.8", + "sentry-tracing 0.31.8", + "tokio", + "ureq", + "webpki-roots 0.25.4", +] + [[package]] name = "sentry" version = "0.32.2" @@ -2746,17 +2999,29 @@ dependencies = [ "httpdate", "reqwest", "rustls 0.21.10", - "sentry-backtrace", - "sentry-contexts", - "sentry-core", - "sentry-panic", - "sentry-tower", - "sentry-tracing", + "sentry-backtrace 0.32.2", + "sentry-contexts 0.32.2", + "sentry-core 0.32.2", + "sentry-panic 0.32.2", + "sentry-tower 0.32.2", + "sentry-tracing 0.32.2", "tokio", "ureq", "webpki-roots 0.25.4", ] +[[package]] +name = "sentry-backtrace" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cc8d4e04a73de8f718dc703943666d03f25d3e9e4d0fb271ca0b8c76dfa00e" +dependencies = [ + "backtrace", + "once_cell", + "regex", + "sentry-core 0.31.8", +] + [[package]] name = "sentry-backtrace" version = "0.32.2" @@ -2766,7 +3031,21 @@ dependencies = [ "backtrace", "once_cell", "regex", - "sentry-core", + "sentry-core 0.32.2", +] + +[[package]] +name = "sentry-contexts" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6436c1bad22cdeb02179ea8ef116ffc217797c028927def303bc593d9320c0d1" +dependencies = [ + "hostname", + "libc", + "os_info", + "rustc_version", + "sentry-core 0.31.8", + "uname", ] [[package]] @@ -2779,10 +3058,23 @@ dependencies = [ "libc", "os_info", "rustc_version", - "sentry-core", + "sentry-core 0.32.2", "uname", ] +[[package]] +name = "sentry-core" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901f761681f97db3db836ef9e094acdd8756c40215326c194201941947164ef1" +dependencies = [ + "once_cell", + "rand", + "sentry-types 0.31.8", + "serde", + "serde_json", +] + [[package]] name = "sentry-core" version = "0.32.2" @@ -2791,19 +3083,40 @@ checksum = "b1189f68d7e7e102ef7171adf75f83a59607fafd1a5eecc9dc06c026ff3bdec4" dependencies = [ "once_cell", "rand", - "sentry-types", + "sentry-types 0.32.2", "serde", "serde_json", ] +[[package]] +name = "sentry-panic" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fbf1c163f8b6a9d05912e1b272afa27c652e8b47ea60cb9a57ad5e481eea99" +dependencies = [ + "sentry-backtrace 0.31.8", + "sentry-core 0.31.8", +] + [[package]] name = "sentry-panic" version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1c18d0b5fba195a4950f2f4c31023725c76f00aabb5840b7950479ece21b5ca" dependencies = [ - "sentry-backtrace", - "sentry-core", + "sentry-backtrace 0.32.2", + "sentry-core 0.32.2", +] + +[[package]] +name = "sentry-tower" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e782e369edac4adfc5bf528b27577270bc3e7023c388ebad9db08e1d56b30b" +dependencies = [ + "sentry-core 0.31.8", + "tower-layer", + "tower-service", ] [[package]] @@ -2814,24 +3127,53 @@ checksum = "d87dfe009138dc515009842619b562e03b2b3f926a91318ec7ae23d09435f8b4" dependencies = [ "http 1.1.0", "pin-project", - "sentry-core", + "sentry-core 0.32.2", "tower-layer", "tower-service", "url", ] +[[package]] +name = "sentry-tracing" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82eabcab0a047040befd44599a1da73d3adb228ff53b5ed9795ae04535577704" +dependencies = [ + "sentry-backtrace 0.31.8", + "sentry-core 0.31.8", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "sentry-tracing" version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3012699a9957d7f97047fd75d116e22d120668327db6e7c59824582e16e791b2" dependencies = [ - "sentry-backtrace", - "sentry-core", + "sentry-backtrace 0.32.2", + "sentry-core 0.32.2", "tracing-core", "tracing-subscriber", ] +[[package]] +name = "sentry-types" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da956cca56e0101998c8688bc65ce1a96f00673a0e58e663664023d4c7911e82" +dependencies = [ + "debugid", + "hex", + "rand", + "serde", + "serde_json", + "thiserror", + "time", + "url", + "uuid", +] + [[package]] name = "sentry-types" version = "0.32.2" @@ -3070,7 +3412,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap", + "indexmap 2.2.5", "log", "memchr", "once_cell", @@ -3138,7 +3480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", - "base64", + "base64 0.21.7", "bitflags 2.4.2", "byteorder", "bytes", @@ -3182,7 +3524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", - "base64", + "base64 0.21.7", "bitflags 2.4.2", "byteorder", "chrono", @@ -3464,6 +3806,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.2.0" @@ -3510,6 +3862,38 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.13.1", + "bytes", + "futures-core", + "futures-util", + "h2 0.3.24", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.11.9", + "prost-derive 0.11.9", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + [[package]] name = "tonic" version = "0.11.0" @@ -3517,13 +3901,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" dependencies = [ "async-trait", - "base64", + "base64 0.21.7", "bytes", "http 0.2.12", "http-body 0.4.6", "percent-encoding", "pin-project", - "prost", + "prost 0.12.3", "tokio", "tokio-stream", "tower-layer", @@ -3539,9 +3923,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "indexmap 1.9.3", "pin-project", "pin-project-lite", + "rand", + "slab", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -3554,7 +3942,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.3", "cookie", "futures-util", "http 1.1.0", @@ -3616,6 +4004,22 @@ dependencies = [ "syn 2.0.52", ] +[[package]] +name = "tracing-common" +version = "0.1.0" +source = "git+https://github.com/coreyja/coreyja.com?branch=main#196fd4499750acfcb60d61017326c92e04d8a649" +dependencies = [ + "miette", + "opentelemetry 0.19.0", + "opentelemetry-otlp 0.12.0", + "sentry 0.31.8", + "sentry-tracing 0.31.8", + "tracing", + "tracing-opentelemetry 0.19.0", + "tracing-subscriber", + "tracing-tree 0.2.5", +] + [[package]] name = "tracing-core" version = "0.1.32" @@ -3636,6 +4040,27 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -3647,6 +4072,20 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" +dependencies = [ + "once_cell", + "opentelemetry 0.19.0", + "tracing", + "tracing-core", + "tracing-log 0.1.4", + "tracing-subscriber", +] + [[package]] name = "tracing-opentelemetry" version = "0.23.0" @@ -3655,12 +4094,12 @@ checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" dependencies = [ "js-sys", "once_cell", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", "smallvec", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.2.0", "tracing-subscriber", "web-time", ] @@ -3680,7 +4119,19 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.2.0", +] + +[[package]] +name = "tracing-tree" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec6adcab41b1391b08a308cc6302b79f8095d1673f6947c2dc65ffb028b0b2d" +dependencies = [ + "nu-ansi-term 0.46.0", + "tracing-core", + "tracing-log 0.1.4", + "tracing-subscriber", ] [[package]] @@ -3691,7 +4142,7 @@ checksum = "65139ecd2c3f6484c3b99bc01c77afe21e95473630747c7aca525e78b0666675" dependencies = [ "nu-ansi-term 0.49.0", "tracing-core", - "tracing-log", + "tracing-log 0.2.0", "tracing-subscriber", ] @@ -3789,7 +4240,7 @@ version = "2.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" dependencies = [ - "base64", + "base64 0.21.7", "log", "once_cell", "rustls 0.22.2", diff --git a/src/main.rs b/src/main.rs index 2b2ea99..f9631de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,16 +3,15 @@ use axum::{ response::{IntoResponse, Redirect, Response}, routing::get, }; -use cja::app_state::AppState as _; -use miette::IntoDiagnostic; -use setup::{setup_sentry, setup_tracing}; -use tokio::net::TcpListener; -use tower_http::trace::TraceLayer; +use cja::{ + app_state::AppState as _, + server::run_server, + setup::{setup_sentry, setup_tracing}, +}; +use miette::{Context, IntoDiagnostic}; +use sqlx::{postgres::PgPoolOptions, PgPool}; use tracing::info; -mod server_tracing; -mod setup; - mod apis; mod cron; mod jobs; @@ -28,7 +27,9 @@ fn main() -> color_eyre::Result<()> { } async fn _main() -> color_eyre::Result<()> { - setup_tracing()?; + setup_tracing("domains") + .wrap_err("Failed to setup tracing") + .unwrap(); let app_state = AppState::from_env().await?; @@ -36,7 +37,7 @@ async fn _main() -> color_eyre::Result<()> { info!("Spawning Tasks"); let futures = vec![ - tokio::spawn(run_axum(app_state.clone())), + tokio::spawn(run_server(routes(app_state.clone()))), tokio::spawn(cja::jobs::worker::job_worker(app_state.clone(), jobs::Jobs)), tokio::spawn(cron::run_cron(app_state.clone())), ]; @@ -69,7 +70,7 @@ impl cja::app_state::AppState for AppState { impl AppState { pub async fn from_env() -> color_eyre::Result { - let pool = crate::setup::setup_db_pool().await?; + let pool = setup_db_pool().await.unwrap(); let cookie_key = cja::server::cookies::CookieKey::from_env_or_generate()?; @@ -111,23 +112,47 @@ async fn host_redirection( next.run(request).await } -async fn run_axum(app_state: AppState) -> miette::Result<()> { - let tracer = server_tracing::Tracer; - let trace_layer = TraceLayer::new_for_http() - .make_span_with(tracer) - .on_response(tracer); - - let outer = axum::Router::new() +fn routes(app_state: AppState) -> axum::Router { + axum::Router::new() .route("/", get(handler)) .with_state(app_state) - .layer(trace_layer) - .layer(axum::middleware::from_fn(host_redirection)); - - let addr = std::net::SocketAddr::from(([0, 0, 0, 0], 3001)); - let listener = TcpListener::bind(&addr).await.unwrap(); - tracing::debug!("listening on {}", addr); + .layer(axum::middleware::from_fn(host_redirection)) +} - axum::serve(listener, outer).await.into_diagnostic()?; +#[tracing::instrument(err)] +pub async fn setup_db_pool() -> miette::Result { + const MIGRATION_LOCK_ID: i64 = 0xDB_DB_DB_DB_DB_DB_DB; + + let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + let pool = PgPoolOptions::new() + .max_connections(5) + .connect(&database_url) + .await + .into_diagnostic()?; + + sqlx::query!("SELECT pg_advisory_lock($1)", MIGRATION_LOCK_ID) + .execute(&pool) + .await + .into_diagnostic()?; + + sqlx::migrate!().run(&pool).await.into_diagnostic()?; + + let unlock_result = sqlx::query!("SELECT pg_advisory_unlock($1)", MIGRATION_LOCK_ID) + .fetch_one(&pool) + .await + .into_diagnostic()? + .pg_advisory_unlock; + + match unlock_result { + Some(b) => { + if b { + tracing::info!("Migration lock unlocked"); + } else { + tracing::info!("Failed to unlock migration lock"); + } + } + None => panic!("Failed to unlock migration lock"), + } - Ok(()) + Ok(pool) } diff --git a/src/server_tracing.rs b/src/server_tracing.rs deleted file mode 100644 index c68708d..0000000 --- a/src/server_tracing.rs +++ /dev/null @@ -1,74 +0,0 @@ -use axum::http::Request; -use tower_http::trace::{MakeSpan, OnResponse}; -use tracing::Level; - -#[derive(Debug, Clone, Copy)] -pub(crate) struct Tracer; - -impl MakeSpan for Tracer { - fn make_span(&mut self, request: &axum::http::Request) -> tracing::Span { - let route = http_route(request); - let span_name = format!("{} {}", request.method(), route); - - tracing::span!( - Level::INFO, - "server.request", - otel.name = span_name, - kind = "server", - uri = %request.uri(), - url.path = %request.uri().path(), - url.query = request.uri().query(), - url.scheme = request.uri().scheme_str(), - server.address = request.uri().host(), - server.port = request.uri().port_u16(), - http_version = ?request.version(), - user_agent.original = request.headers().get("user-agent").and_then(|h| h.to_str().ok()), - http.route = route, - http.request.method = %request.method(), - http.request.header.host = request.headers().get("host").and_then(|h| h.to_str().ok()), - http.request.header.forwarded_for = request.headers().get("x-forwarded-for").and_then(|h| h.to_str().ok()), - http.request.header.forwarded_proto = request.headers().get("x-forwarded-proto").and_then(|h| h.to_str().ok()), - http.request.header.host = request.headers().get("x-forwarded-ssl").and_then(|h| h.to_str().ok()), - http.request.header.referer = request.headers().get("referer").and_then(|h| h.to_str().ok()), - http.request.header.fly_forwarded_port = request.headers().get("fly-forwarded-port").and_then(|h| h.to_str().ok()), - http.request.header.fly_region = request.headers().get("fly-region").and_then(|h| h.to_str().ok()), - http.request.header.via = request.headers().get("via").and_then(|h| h.to_str().ok()), - - http.response.status_code = tracing::field::Empty, - http.response.header.content_type = tracing::field::Empty, - ) - } -} - -impl OnResponse for Tracer { - fn on_response( - self, - response: &axum::http::Response, - latency: std::time::Duration, - span: &tracing::Span, - ) { - let status_code = response.status().as_u16(); - tracing::event!( - Level::INFO, - status = status_code, - latency = format_args!("{} ms", latency.as_millis()), - "finished processing request" - ); - - span.record("http.response.status_code", status_code); - span.record( - "http.response.header.content_type", - response - .headers() - .get("content-type") - .and_then(|h| h.to_str().ok()), - ); - } -} - -#[inline] -fn http_route(req: &Request) -> &str { - req.extensions() - .get::() - .map_or_else(|| "", |mp| mp.as_str()) -} diff --git a/src/setup.rs b/src/setup.rs deleted file mode 100644 index 3055c0d..0000000 --- a/src/setup.rs +++ /dev/null @@ -1,125 +0,0 @@ -use std::{collections::HashMap, time::Duration}; - -use color_eyre::{eyre::Context, Result}; -use opentelemetry_otlp::WithExportConfig; -use sentry::ClientInitGuard; -use sqlx::{postgres::PgPoolOptions, PgPool}; -use tracing_opentelemetry::OpenTelemetryLayer; -use tracing_subscriber::{prelude::*, EnvFilter, Registry}; -use tracing_tree::HierarchicalLayer; - -pub fn setup_tracing() -> Result<()> { - let rust_log = std::env::var("RUST_LOG") - .unwrap_or_else(|_| "warn,server=trace,tower_http=debug,cja=info".into()); - - let env_filter = EnvFilter::builder() - .parse(&rust_log) - .wrap_err_with(|| format!("Couldn't create env filter from {}", rust_log))?; - - let opentelemetry_layer = if let Ok(honeycomb_key) = std::env::var("HONEYCOMB_API_KEY") { - let mut map = HashMap::::new(); - map.insert("x-honeycomb-team".to_string(), honeycomb_key); - map.insert("x-honeycomb-dataset".to_string(), "domains".to_string()); - - let tracer = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter( - opentelemetry_otlp::new_exporter() - .http() - .with_endpoint("https://api.honeycomb.io/v1/traces") - .with_timeout(Duration::from_secs(3)) - .with_headers(map), - ) - .install_batch(opentelemetry_sdk::runtime::Tokio)?; - - let opentelemetry_layer = OpenTelemetryLayer::new(tracer); - println!("Honeycomb layer configured"); - - Some(opentelemetry_layer) - } else { - println!("Skipping Honeycomb layer"); - - None - }; - - let heirarchical = { - let heirarchical = HierarchicalLayer::default() - .with_writer(std::io::stdout) - .with_indent_lines(true) - .with_indent_amount(2) - .with_thread_names(true) - .with_thread_ids(true) - .with_verbose_exit(true) - .with_verbose_entry(true) - .with_targets(true); - - println!("Let's also log to stdout."); - - heirarchical - }; - - Registry::default() - .with(heirarchical) - .with(opentelemetry_layer) - .with(env_filter) - .try_init()?; - - Ok(()) -} - -pub fn setup_sentry() -> Option { - let git_commit: Option> = option_env!("VERGEN_GIT_SHA").map(|x| x.into()); - let release_name = - git_commit.unwrap_or_else(|| sentry::release_name!().unwrap_or_else(|| "dev".into())); - - if let Ok(sentry_dsn) = std::env::var("SENTRY_DSN") { - println!("Sentry enabled"); - - Some(sentry::init(( - sentry_dsn, - sentry::ClientOptions { - traces_sample_rate: 0.5, - release: Some(release_name), - ..Default::default() - }, - ))) - } else { - println!("Sentry not configured in this environment"); - - None - } -} - -#[tracing::instrument(err)] -pub async fn setup_db_pool() -> Result { - let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); - let pool = PgPoolOptions::new() - .max_connections(5) - .connect(&database_url) - .await?; - - const MIGRATION_LOCK_ID: i64 = 0xDB_DB_DB_DB_DB_DB_DB; - sqlx::query!("SELECT pg_advisory_lock($1)", MIGRATION_LOCK_ID) - .execute(&pool) - .await?; - - sqlx::migrate!().run(&pool).await?; - - let unlock_result = sqlx::query!("SELECT pg_advisory_unlock($1)", MIGRATION_LOCK_ID) - .fetch_one(&pool) - .await? - .pg_advisory_unlock; - - match unlock_result { - Some(b) => { - if b { - tracing::info!("Migration lock unlocked"); - } else { - tracing::info!("Failed to unlock migration lock"); - } - } - None => panic!("Failed to unlock migration lock"), - } - - Ok(pool) -} From ac9f3f8539a3b0fb2eb34bfe67cdfd469f8bf7b4 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 21:46:20 -0400 Subject: [PATCH 09/13] Try to run with a postgres sidecar --- .github/workflows/hurl_tests.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/hurl_tests.yml b/.github/workflows/hurl_tests.yml index b2e395f..3775bbb 100644 --- a/.github/workflows/hurl_tests.yml +++ b/.github/workflows/hurl_tests.yml @@ -9,6 +9,25 @@ on: jobs: tests: runs-on: ubuntu-latest + env: + DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres + services: + # Label used to access the service container + postgres: + # Docker Hub image + image: postgres + # Provide the password for postgres + env: + POSTGRES_PASSWORD: postgres + # Set health checks to wait until postgres has started + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + # Maps tcp port 5432 on service container to the host + - 5432:5432 steps: - name: Checkout uses: actions/checkout@v4 From 7a5cc8194f102df5028a7941f8bd7ef60266dc75 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 21:51:16 -0400 Subject: [PATCH 10/13] Use the .sqlx files instead of checking the db so we don't need the cargo sqlx bin installed --- .github/workflows/hurl_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/hurl_tests.yml b/.github/workflows/hurl_tests.yml index 3775bbb..489a8b1 100644 --- a/.github/workflows/hurl_tests.yml +++ b/.github/workflows/hurl_tests.yml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest env: DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres + SQLX_OFFLINE: 1 services: # Label used to access the service container postgres: From 0ba37604dc3c6c29ab4616b5a2e6b05209efd1cc Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 21:54:54 -0400 Subject: [PATCH 11/13] Add fake env vars for porkbun keys --- .github/workflows/hurl_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/hurl_tests.yml b/.github/workflows/hurl_tests.yml index 489a8b1..9c10ac7 100644 --- a/.github/workflows/hurl_tests.yml +++ b/.github/workflows/hurl_tests.yml @@ -12,6 +12,8 @@ jobs: env: DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres SQLX_OFFLINE: 1 + PORKBUN_API_KEY: FAKE + PORKBUN_SECRET_API_KEY: FAKE services: # Label used to access the service container postgres: From f599f2a37ddc3a796e178c4fefbded4e61a34c10 Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 22:04:15 -0400 Subject: [PATCH 12/13] Add disabling to cron --- .github/workflows/hurl_tests.yml | 1 + src/main.rs | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/hurl_tests.yml b/.github/workflows/hurl_tests.yml index 9c10ac7..b494f65 100644 --- a/.github/workflows/hurl_tests.yml +++ b/.github/workflows/hurl_tests.yml @@ -14,6 +14,7 @@ jobs: SQLX_OFFLINE: 1 PORKBUN_API_KEY: FAKE PORKBUN_SECRET_API_KEY: FAKE + CRON_DISABLED: true services: # Label used to access the service container postgres: diff --git a/src/main.rs b/src/main.rs index f9631de..614784a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,11 +36,13 @@ async fn _main() -> color_eyre::Result<()> { cja::sqlx::migrate!().run(app_state.db()).await?; info!("Spawning Tasks"); - let futures = vec![ + let mut futures = vec![ tokio::spawn(run_server(routes(app_state.clone()))), tokio::spawn(cja::jobs::worker::job_worker(app_state.clone(), jobs::Jobs)), - tokio::spawn(cron::run_cron(app_state.clone())), ]; + if std::env::var("CRON_DISABLED").unwrap_or_else(|_| "true".to_string()) != "true" { + futures.push(tokio::spawn(cron::run_cron(app_state.clone()))); + } info!("Tasks Spawned"); futures::future::try_join_all(futures).await?; From 44bdbeb66eb292ff49d7e6fd1cb1a98d1cf263ff Mon Sep 17 00:00:00 2001 From: Corey Alexander Date: Mon, 18 Mar 2024 22:16:29 -0400 Subject: [PATCH 13/13] Change to port 3000 --- .github/workflows/hurl_tests.yml | 2 +- Dockerfile | 2 +- fly.toml | 2 +- hurl/real_domain.hurl | 2 +- hurl/redirects.hurl | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/hurl_tests.yml b/.github/workflows/hurl_tests.yml index b494f65..273d3e5 100644 --- a/.github/workflows/hurl_tests.yml +++ b/.github/workflows/hurl_tests.yml @@ -49,4 +49,4 @@ jobs: with: command: hurl hurl/*.hurl start: cargo run - wait-on: "http://localhost:3001" + wait-on: "http://localhost:3000" diff --git a/Dockerfile b/Dockerfile index 3916117..07e8753 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,6 @@ WORKDIR /app COPY --from=builder /app/target/release/domains . -EXPOSE 3001 +EXPOSE 3000 ENTRYPOINT ["./domains"] diff --git a/fly.toml b/fly.toml index 0989df2..065f1d1 100644 --- a/fly.toml +++ b/fly.toml @@ -7,7 +7,7 @@ app = 'coreyja-domains' primary_region = 'ewr' [http_service] - internal_port = 3001 + internal_port = 3000 force_https = true auto_stop_machines = true auto_start_machines = true diff --git a/hurl/real_domain.hurl b/hurl/real_domain.hurl index 2262de0..23c95e6 100644 --- a/hurl/real_domain.hurl +++ b/hurl/real_domain.hurl @@ -1,4 +1,4 @@ -GET http://localhost:3001 +GET http://localhost:3000 HOST: redirects.coreyja.domains HTTP 200 [Asserts] diff --git a/hurl/redirects.hurl b/hurl/redirects.hurl index 59c4502..fbde95b 100644 --- a/hurl/redirects.hurl +++ b/hurl/redirects.hurl @@ -1,22 +1,22 @@ -GET http://localhost:3001 +GET http://localhost:3000 HOST: coreyja.tv HTTP 303 [Asserts] header "Location" == "https://coreyja.com/videos" -GET http://localhost:3001 +GET http://localhost:3000 HOST: coreyja.blog HTTP 303 [Asserts] header "Location" == "https://coreyja.com/posts" -GET http://localhost:3001 +GET http://localhost:3000 HOST: coreyja.club HTTP 303 [Asserts] header "Location" == "https://discord.gg/CpAPpXrgUq" -GET http://localhost:3001 +GET http://localhost:3000 HOST: coreyja.tube HTTP 303 [Asserts]