From c47b6c35acd100fe1696537d7ffe2cdf70859ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sat, 19 Mar 2022 00:40:13 +0300 Subject: [PATCH 1/2] feat(docs): support glob patterns for documentation path --- systeroid-core/src/parsers.rs | 15 +++++++------- systeroid-core/src/sysctl/controller.rs | 27 ++++++++++++++++--------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/systeroid-core/src/parsers.rs b/systeroid-core/src/parsers.rs index 7c0189b..80bf0a2 100644 --- a/systeroid-core/src/parsers.rs +++ b/systeroid-core/src/parsers.rs @@ -5,14 +5,15 @@ use parseit::regex::RegexBuilder; use rayon::prelude::*; use std::path::Path; -lazy_static! { - /// Possible locations for the Linux kernel documentation. - pub static ref KERNEL_DOCS_PATH: Vec<&'static Path> = vec![ - Path::new("/usr/share/doc/linux/"), - Path::new("/usr/share/doc/linux-doc/"), - Path::new("/usr/share/doc/linux-docs/") - ]; +/// Possible locations for the Linux kernel documentation. +pub const KERNEL_DOCS_PATH: &[&str] = &[ + "/usr/share/doc/linux/*", + "/usr/share/doc/linux-doc/*", + "/usr/share/doc/linux-docs/*", + "/usr/share/doc/kernel-doc-*/Documentation/*", +]; +lazy_static! { /// Pre-defined parsers for parsing the kernel documentation. pub static ref PARSERS: Vec> = vec![ Parser { diff --git a/systeroid-core/src/sysctl/controller.rs b/systeroid-core/src/sysctl/controller.rs index a75d24c..d5e924c 100644 --- a/systeroid-core/src/sysctl/controller.rs +++ b/systeroid-core/src/sysctl/controller.rs @@ -5,6 +5,7 @@ use crate::parsers::{parse_kernel_docs, KERNEL_DOCS_PATH}; use crate::sysctl::parameter::Parameter; use crate::sysctl::section::Section; use crate::sysctl::{DISABLE_CACHE_ENV, PARAMETERS_CACHE_LABEL, PROC_PATH}; +use parseit::globwalk; use rayon::prelude::*; use std::convert::TryFrom; use std::env; @@ -78,9 +79,21 @@ impl Sysctl { kernel_docs: Option<&PathBuf>, cache: &Cache, ) -> Result<()> { - let mut kernel_docs_path = KERNEL_DOCS_PATH.clone(); - if let Some(path) = kernel_docs { - kernel_docs_path.insert(0, path); + let mut kernel_docs_path = if let Some(path) = kernel_docs { + vec![path.to_path_buf()] + } else { + Vec::new() + }; + for path in KERNEL_DOCS_PATH { + if let Some(mut path) = globwalk::glob(path).ok().and_then(|glob| { + glob.filter_map(StdResult::ok) + .filter(|entry| entry.file_type().is_file()) + .map(|entry| entry.into_path()) + .next() + }) { + path.pop(); + kernel_docs_path.push(path); + } } if let Some(path) = kernel_docs_path.iter().find(|path| path.exists()) { if cache.exists(PARAMETERS_CACHE_LABEL) && kernel_docs.is_none() { @@ -160,10 +173,10 @@ impl Sysctl { #[cfg(test)] mod tests { use super::*; - use crate::parsers::KERNEL_DOCS_PATH; #[test] fn test_sysctl_controller() -> Result<()> { + env::set_var(DISABLE_CACHE_ENV, "1"); let config = Config::default(); let mut sysctl = Sysctl::init(config)?; assert!(sysctl.get_parameter("kernel.hostname").is_some()); @@ -174,11 +187,7 @@ mod tests { ); assert!(sysctl.get_parameters("---").is_empty()); - for path in KERNEL_DOCS_PATH.iter() { - if path.exists() { - sysctl.update_docs(&path)?; - } - } + sysctl.update_docs_from_cache(None, &Cache::init()?)?; let parameter = sysctl.get_parameter("kernel.hostname").unwrap().clone(); let old_value = parameter.docs_title; From 36e9a7693b2f3f4bebc2d536dfedb3edb76f5cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sat, 19 Mar 2022 00:54:05 +0300 Subject: [PATCH 2/2] refactor(env): rename `NOCACHE` to `NO_CACHE` --- Dockerfile | 2 +- systeroid-core/src/sysctl/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d9af05d..80aa87c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,5 +17,5 @@ COPY --from=builder \ /home/rust/src/linux-docs \ /usr/share/doc/linux-docs USER 1000:1000 -ENV NOCACHE=1 +ENV NO_CACHE=1 ENTRYPOINT ["systeroid"] diff --git a/systeroid-core/src/sysctl/mod.rs b/systeroid-core/src/sysctl/mod.rs index 9dad57b..394e756 100644 --- a/systeroid-core/src/sysctl/mod.rs +++ b/systeroid-core/src/sysctl/mod.rs @@ -34,7 +34,7 @@ pub const DEPRECATED_PARAMS: &[&str] = &["base_reachable_time", "retrans_time"]; pub const KERNEL_DOCS_ENV: &str = "KERNEL_DOCS"; /// Environment variable for disabling the cache. -pub(crate) const DISABLE_CACHE_ENV: &str = "NOCACHE"; +pub(crate) const DISABLE_CACHE_ENV: &str = "NO_CACHE"; /// Label for caching the kernel parameters. pub(crate) const PARAMETERS_CACHE_LABEL: &str = "parameters";