diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-11 18:47:21 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-11 18:47:21 +0200 |
commit | c37a282a3fe4405e455abc4992b5516db7f75cc6 (patch) | |
tree | fdcc0990197c17bad2c0ad70eedec513d7c8a286 | |
parent | 9b7a525b2dfd55c8400418045ed9342c92ca21eb (diff) |
add api to read or write individual files
-rw-r--r-- | Cargo.lock | 15 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 34 |
3 files changed, 50 insertions, 0 deletions
@@ -910,6 +910,7 @@ dependencies = [ "nix", "rustls", "rustls-pemfile", + "serde", "thiserror", ] @@ -967,6 +968,20 @@ name = "serde" version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.162" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] [[package]] name = "serde_json" @@ -12,4 +12,5 @@ constant_time_eq = "0.2.5" nix = "0.26.2" rustls = "0.20.0" rustls-pemfile = "1.0.2" +serde = { version = "1.0", features = ["derive"] } thiserror = "1.0" diff --git a/src/main.rs b/src/main.rs index 8513288..2c11228 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,12 +13,18 @@ use constant_time_eq::constant_time_eq; use nix::sys::reboot::{reboot, RebootMode}; use rustls::{Certificate, PrivateKey, ServerConfig}; use rustls_pemfile::{certs, pkcs8_private_keys}; +use serde::Deserialize; #[allow(non_upper_case_globals)] const KiB: usize = 1024; #[allow(non_upper_case_globals)] const MiB: usize = 1024 * KiB; +#[derive(Clone, Debug, Deserialize)] +struct DataRequest { + path: String, +} + async fn handle_reboot() -> HttpResponse { println!("[admind] request reboot"); @@ -136,6 +142,32 @@ async fn handle_switch() -> HttpResponse { } } +async fn handle_data_read(info: web::Query<DataRequest>) -> HttpResponse { + let query = info.into_inner(); + + match fs::read(&query.path) { + Ok(data) => HttpResponse::Ok() + .content_type(ContentType::octet_stream()) + .body(data), + Err(e) => HttpResponse::NotFound() + .content_type(ContentType::plaintext()) + .body(format!("can't read file at {}: {}", query.path, e)), + } +} + +async fn handle_data_write(info: web::Query<DataRequest>, data: web::Bytes) -> HttpResponse { + let query = info.into_inner(); + + match stream_to(&query.path, &data).await { + Ok(_) => HttpResponse::Ok() + .content_type(ContentType::plaintext()) + .body(format!("successfully wrote to {}", query.path)), + Err(e) => HttpResponse::InternalServerError() + .content_type(ContentType::plaintext()) + .body(format!("can't write file at {}: {}", query.path, e)), + } +} + #[actix_web::main] async fn main() -> io::Result<()> { match start().await { @@ -165,6 +197,8 @@ async fn start() -> Result<()> { .service(web::resource("/update/mbr").to(handle_update_mbr)) .service(web::resource("/update/root").to(handle_update_root)) .service(web::resource("/switch").to(handle_switch)) + .service(web::resource("/data/read").to(handle_data_read)) + .service(web::resource("/data/write").to(handle_data_write)) }) .bind_rustls("[::]:8443", config)? .run() |