From 2b93aa3dca47b660d1d6cfdeafc93f4a0b953fbd Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Sun, 14 Apr 2024 01:27:48 -0700 Subject: [PATCH] protect system info --- bin/core/src/api/read/mod.rs | 3 ++- bin/core/src/api/read/server.rs | 41 ++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/bin/core/src/api/read/mod.rs b/bin/core/src/api/read/mod.rs index b8c0f9b8a..4742a195c 100644 --- a/bin/core/src/api/read/mod.rs +++ b/bin/core/src/api/read/mod.rs @@ -59,7 +59,6 @@ enum ReadRequest { ListServers(ListServers), GetServerStatus(GetServerStatus), GetPeripheryVersion(GetPeripheryVersion), - GetSystemInformation(GetSystemInformation), GetDockerContainers(GetDockerContainers), GetDockerImages(GetDockerImages), GetDockerNetworks(GetDockerNetworks), @@ -119,6 +118,8 @@ enum ReadRequest { // ==== SERVER STATS ==== #[to_string_resolver] + GetSystemInformation(GetSystemInformation), + #[to_string_resolver] GetSystemStats(GetSystemStats), #[to_string_resolver] GetSystemProcesses(GetSystemProcesses), diff --git a/bin/core/src/api/read/server.rs b/bin/core/src/api/read/server.rs index 375186861..d77f64409 100644 --- a/bin/core/src/api/read/server.rs +++ b/bin/core/src/api/read/server.rs @@ -15,8 +15,7 @@ use monitor_client::{ permission::PermissionLevel, server::{ docker_image::ImageSummary, docker_network::DockerNetwork, - stats::SystemInformation, Server, ServerActionState, - ServerListItem, ServerStatus, + Server, ServerActionState, ServerListItem, ServerStatus, }, user::User, }, @@ -162,22 +161,48 @@ impl Resolve for State { } } +// This protects the peripheries from spam requests +const SYSTEM_INFO_EXPIRY: u128 = FIFTEEN_SECONDS_MS; +type SystemInfoCache = Mutex>>; +fn system_info_cache() -> &'static SystemInfoCache { + static SYSTEM_INFO_CACHE: OnceLock = + OnceLock::new(); + SYSTEM_INFO_CACHE.get_or_init(Default::default) +} + #[async_trait] -impl Resolve for State { - async fn resolve( +impl ResolveToString for State { + async fn resolve_to_string( &self, GetSystemInformation { server }: GetSystemInformation, user: User, - ) -> anyhow::Result { + ) -> anyhow::Result { let server = Server::get_resource_check_permissions( &server, &user, PermissionLevel::Read, ) .await?; - periphery_client(&server)? - .request(api::stats::GetSystemInformation {}) - .await + + let mut lock = system_info_cache().lock().await; + let res = match lock.get(&server.id) { + Some(cached) if cached.1 > unix_timestamp_ms() => { + cached.0.clone() + } + _ => { + let stats = periphery_client(&server)? + .request(api::stats::GetSystemInformation {}) + .await?; + let res = serde_json::to_string(&stats)?; + lock.insert( + server.id, + (res.clone(), unix_timestamp_ms() + SYSTEM_INFO_EXPIRY) + .into(), + ); + res + } + }; + Ok(res) } }