From 6610442bf1410ece8a70b99bdbf9d69b4bc728d3 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Wed, 1 Jan 2025 21:17:18 +0100 Subject: [PATCH] feat: add error handling; update dockerfile --- Dockerfile | 4 ++-- src/main.rs | 12 +----------- src/server/mod.rs | 19 ++++++++++++------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index 62ecb30..5e8d868 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.69-alpine3.16 AS builder +FROM rust:1.83-alpine3.21 AS builder ARG DI_VER=1.2.5 @@ -18,7 +18,7 @@ COPY . ./ RUN cargo build --release -FROM alpine:3.16 +FROM alpine:3.21 COPY --from=builder /app/target/release/site /bin/site COPY --from=builder /app/dumb-init /bin/dumb-init diff --git a/src/main.rs b/src/main.rs index 3379817..8c97478 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,27 +43,17 @@ async fn main() { let data_dir = PathBuf::from(std::env::var("DATA_DIR").expect("No DATA_DIR was provided.")); let static_dir = data_dir.join(STATIC_DIR_NAME); - std::fs::create_dir_all(&static_dir); + std::fs::create_dir_all(&static_dir).unwrap(); let state = Context { static_dir, tmp_dir: std::env::temp_dir(), }; - tracing::info!("tmpdir = {}", state.tmp_dir.display()); - // Initialize metrics // let recorder_handle = metrics::setup_metrics_recorder(); let app = server::app(state, &api_key, &REDIRECTS); - // Each static site gets mounted explicitely so that the default site can be used as fallback - // Each entry is of the form (route, static dir name) - let sites = [ - ("/docs/vieter", "docs-vieter"), - ("/api-docs/vieter", "api-docs-vieter"), - ("/man/vieter", "man-vieter"), - ]; - let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); let listener = TcpListener::bind(addr).await.unwrap(); tracing::debug!("listening on {}", addr); diff --git a/src/server/mod.rs b/src/server/mod.rs index dea2fef..097ee25 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -21,7 +21,7 @@ use std::{ path::{Path, PathBuf}, }; -use crate::STATIC_ROOT_NAME; +use crate::{error::Result, STATIC_ROOT_NAME}; pub fn app( ctx: crate::Context, @@ -41,6 +41,7 @@ pub fn app( .route( "/{*path}", post(post_static_archive) + .delete(delete_dir) .route_layer(ValidateRequestHeaderLayer::bearer(api_key)) .get_service(serve_dir), ) @@ -58,16 +59,16 @@ pub async fn post_static_archive( State(ctx): State, extract::Path(path): extract::Path, body: Body, -) { +) -> Result<()> { // Copy tarball data to file for parsing let stream = body.into_data_stream(); let mut reader = StreamReader::new(stream.map_err(io::Error::other)); let uuid = uuid::Uuid::new_v4(); let ar_path = ctx.tmp_dir.join(uuid.to_string()); - let mut f = File::create(&ar_path).await; + let mut f = File::create(&ar_path).await?; - tokio::io::copy(&mut reader, &mut f.unwrap()).await; + tokio::io::copy(&mut reader, &mut f).await?; // Root is stored in its own specifc directory, as otherwise it would wipe all other uploaded // directories every time it's updated @@ -80,7 +81,9 @@ pub async fn post_static_archive( tokio::task::spawn_blocking(move || process_archive(&ar_path, &dest_dir)) .await - .unwrap(); + .unwrap()?; + + Ok(()) } fn process_archive(ar_path: &Path, dest_dir: &Path) -> io::Result<()> { @@ -116,7 +119,7 @@ fn process_archive(ar_path: &Path, dest_dir: &Path) -> io::Result<()> { pub async fn delete_dir( State(ctx): State, extract::Path(path): extract::Path, -) { +) -> Result<()> { let dest_dir = if path.is_empty() { String::from(crate::STATIC_ROOT_NAME) } else { @@ -124,5 +127,7 @@ pub async fn delete_dir( }; let dest_dir = ctx.static_dir.join(dest_dir); - tokio::fs::remove_dir_all(dest_dir).await; + tokio::fs::remove_dir_all(dest_dir).await?; + + Ok(()) }