vmspect 0.3.1

Blazing-fast static inspection, forensic analysis and information extraction library for virtual machine disk images (VMDK, RAW, QCOW2, VHD, VHDX, VDI).
use crate::error::Result;
use crate::models::traits::{AnalysisResult, OsInspector, VmDriver};
use crate::models::{GuestInfo, Options, Partition};

pub(crate) struct UnknownInspector;

impl OsInspector for UnknownInspector {
    fn analyze(
        &self,
        _driver: &dyn VmDriver,
        _partitions: &[Partition],
        _chunk_size: u64,
        options: &Options,
    ) -> Result<AnalysisResult> {
        Ok(AnalysisResult {
            guest_info: if options.should_analyze_system() {
                GuestInfo {
                    os_name: "Unknown operating system".to_string(),
                    ..GuestInfo::default()
                }
            } else {
                GuestInfo::default()
            },
            programs: Vec::new(),
            warnings: Vec::new(),
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_unknown_inspector() {
        let inspector = UnknownInspector;
        let options = Options::default();
        let res = inspector.analyze(&MockDriver, &[], 4096, &options).unwrap();
        assert_eq!(res.guest_info.os_name, "Unknown operating system");
        assert!(res.programs.is_empty());

        let options_nosys = Options {
            no_system: true,
            ..Options::default()
        };
        let res_nosys = inspector
            .analyze(&MockDriver, &[], 4096, &options_nosys)
            .unwrap();
        assert_eq!(res_nosys.guest_info.os_name, "");
    }

    struct MockDriver;
    impl VmDriver for MockDriver {
        fn virtual_size(&self) -> u64 {
            0
        }
        fn read_range(&self, _offset: u64, _buf: &mut [u8]) -> Result<()> {
            Ok(())
        }
        fn access_mode(&self) -> &str {
            "mock"
        }
        fn is_native(&self) -> bool {
            true
        }
    }
}