diff --git a/libimagstorestdhook/src/lib.rs b/libimagstorestdhook/src/lib.rs index d6c00a91..05e92f75 100644 --- a/libimagstorestdhook/src/lib.rs +++ b/libimagstorestdhook/src/lib.rs @@ -24,4 +24,5 @@ extern crate libimagutil; pub mod debug; pub mod flock; +pub mod linkverify; diff --git a/libimagstorestdhook/src/linkverify.rs b/libimagstorestdhook/src/linkverify.rs new file mode 100644 index 00000000..be2501c0 --- /dev/null +++ b/libimagstorestdhook/src/linkverify.rs @@ -0,0 +1,75 @@ +use std::path::PathBuf; + +use toml::Value; + +use libimagstore::hook::Hook; +use libimagstore::hook::accessor::HookDataAccessor as HDA; +use libimagstore::hook::accessor::HookDataAccessorProvider; +use libimagstore::hook::accessor::NonMutableHookDataAccessor; +use libimagstore::hook::result::HookResult; +use libimagstore::store::FileLockEntry; +use libimagentrylink::internal::InternalLinker; +use libimagutil::trace::trace_error; + +#[derive(Debug, Clone)] +pub struct LinkedEntriesExistHook { + store_location: PathBuf, +} + +impl LinkedEntriesExistHook { + + pub fn new(store_location: PathBuf) -> LinkedEntriesExistHook { + LinkedEntriesExistHook { + store_location: store_location, + } + } + +} + +impl Hook for LinkedEntriesExistHook { + + fn name(&self) -> &'static str { + "stdhook_linked_entries_exist" + } + + fn set_config(&mut self, _: &Value) { + () // We are not configurable here. + } + +} + +impl HookDataAccessorProvider for LinkedEntriesExistHook { + + fn accessor(&self) -> HDA { + HDA::NonMutableAccess(self) + } + +} + +impl NonMutableHookDataAccessor for LinkedEntriesExistHook { + + fn access(&self, fle: &FileLockEntry) -> HookResult<()> { + debug!("[LINKVERIFY HOOK] {:?}", fle.get_location()); + let _ = fle.get_internal_links() + .map(|links| { + for link in links { + let mut path = self.store_location.clone(); + path.push(link); + if !path.exists() { + warn!("File link does not exist: {:?} -> {:?}", fle.get_location(), path); + } else { + if !path.is_file() { + warn!("File link is not a file: {:?} -> {:?}", fle.get_location(), path); + } + } + } + }) + .map_err(|e| { + warn!("Couldn't execute Link-Verify hook"); + trace_error(&e); + }); + Ok(()) + } + +} +