From d115716d456c37e037ad8e916b7ea07cb8089380 Mon Sep 17 00:00:00 2001 From: Russell Date: Mon, 28 Jul 2025 18:56:50 +0200 Subject: [PATCH] Created the core functionality for Fedora. Need to update the logic to include filtering from input, not just dnf --- readme.md | 23 ++++++++++------- src/cli/mod.rs | 2 +- src/cli/scan.rs | 68 ++++++++++++++++++++++++++++++++++++------------- 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/readme.md b/readme.md index 128437e..eb5db8c 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # CARTO - Universal System File and Package Mapper -A command-line tool that provides comprehensive observability into your Linux system's package installations and file ownership. Built in Rust for performance and reliability. +A command-line tool that provides comprehensive observability into your Linux system's package installations and file ownership. Providing a clear, tracable providence for every executable, and configuration file on your system. ## Installation @@ -13,22 +13,27 @@ just install ## Usage # Show package file tree -carto tree --package bash -carto tree --package "Signal Desktop (org.signal.Signal)" +`carto tree --package bash` + +`carto tree --package "Signal Desktop (org.signal.Signal)"` # Package information -carto package bash +`carto package bash` # File ownership -carto file /usr/bin/bash + +`carto file /usr/bin/bash` # List packages -carto packages -carto packages --source dnf -carto packages --source flatpak +`carto packages` + +`carto packages --source dnf` + +`carto packages --source flatpak` # Find files in package -carto find --package bash + +`carto find --package bash` ## Example Output diff --git a/src/cli/mod.rs b/src/cli/mod.rs index f9a9b1f..db62161 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -42,7 +42,7 @@ pub enum Commands { include_expected: bool, /// Force full rescan - #[arg(short, long)] + #[arg(short = 'F', long)] force: bool, }, diff --git a/src/cli/scan.rs b/src/cli/scan.rs index 78cd12b..9420755 100644 --- a/src/cli/scan.rs +++ b/src/cli/scan.rs @@ -48,15 +48,30 @@ pub struct Scanner<'a> { } impl<'a> Scanner<'a> { pub fn new(managers: &'a [Box]) -> Self { - let exclude_paths = vec![ - PathBuf::from("/proc"), - PathBuf::from("/sys"), - PathBuf::from("/dev"), - PathBuf::from("/run"), - PathBuf::from("/var/run"), - PathBuf::from("/tmp/.X11-unix"), - PathBuf::from("/tmp/.ICE-unix"), - ]; + let exclude_paths = vec![ + // Existing exclusions + PathBuf::from("/proc"), + PathBuf::from("/sys"), + PathBuf::from("/dev"), + PathBuf::from("/run"), + PathBuf::from("/var/run"), + PathBuf::from("/tmp/.X11-unix"), + PathBuf::from("/tmp/.ICE-unix"), + + PathBuf::from("/var/lib/containers"), + PathBuf::from("/var/lib/docker"), + PathBuf::from("/home/.local/share/containers"), // Your specific issue + PathBuf::from("/var/lib/flatpak"), + PathBuf::from("/var/cache"), + PathBuf::from("/var/tmp"), + PathBuf::from("/tmp"), + PathBuf::from("/var/log"), + PathBuf::from("/var/spool"), + PathBuf::from("/boot"), + PathBuf::from("/usr/src"), // Kernel sources + PathBuf::from("/home"), // User data isn't "orphaned" + PathBuf::from("/root"), + ]; Self { managers, @@ -71,11 +86,17 @@ impl<'a> Scanner<'a> { ) -> Result { let start_time = std::time::Instant::now(); let scan_paths = if paths.is_empty() { - vec!["/".to_string()] + vec![ + "/usr".to_string(), + "/etc".to_string(), + "/opt".to_string(), + "/lib".to_string(), + "/lib64".to_string(), + ] } else { paths.to_vec() }; - + let mut results = ScanResults::new(scan_paths.clone()); let mut orphans: Vec = Vec::new(); @@ -168,13 +189,26 @@ impl<'a> Scanner<'a> { } } - // Additional exclusions for common mount points and special directories let path_str = path.to_string_lossy(); - if path_str.contains("/.git/") || - path_str.contains("/.cache/") || - path_str.contains("/.local/share/Trash/") || - path_str.starts_with("/media/") || - path_str.starts_with("/mnt/") { + + // Container storage patterns + if path_str.contains("/containers/storage/") || + path_str.contains("/overlay/") || + path_str.contains("/docker/") || + + // Build and cache directories + path_str.contains("/.git/") || + path_str.contains("/.cache/") || + path_str.contains("/cache/") || + path_str.contains("/.local/share/Trash/") || + + // Mount points and removable media + path_str.starts_with("/media/") || + path_str.starts_with("/mnt/") || + + // Snap and flatpak user data + path_str.contains("/snap/") || + path_str.contains("/.var/app/") { return true; }