extern crate users; extern crate hex; use std::io; use std::fs; use std::os::unix::fs::PermissionsExt; use std::os::linux::fs::MetadataExt; use std::io::prelude::*; use walkdir::DirEntry; use chrono::prelude::DateTime; use chrono::{Utc}; use crypto_hash::{Algorithm, Hasher}; use serde_yaml; pub fn name(e: &DirEntry) -> serde_yaml::Value { serde_yaml::to_value(&e.path().to_string_lossy()).unwrap() } pub fn mtime(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); let mtime = meta.modified().unwrap(); let datetime = DateTime::::from(mtime); let mtime = datetime.format("%Y-%m-%d %H:%M:%S.%f %z").to_string(); serde_yaml::to_value(mtime).unwrap() } pub fn mode(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); let mode = meta.permissions().mode(); serde_yaml::to_value(mode).unwrap() } pub fn inode(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.st_ino()).unwrap() } pub fn dev(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.st_dev()).unwrap() } pub fn nlink(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.st_nlink()).unwrap() } pub fn size(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.len()).unwrap() } pub fn uid(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.st_uid()).unwrap() } pub fn gid(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); serde_yaml::to_value(meta.st_gid()).unwrap() } pub fn username(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); if let Some(u) = users::get_user_by_uid(meta.st_uid()) { serde_yaml::to_value(u.name()).unwrap() } else { serde_yaml::to_value("unknown user").unwrap() } } pub fn group(e: &DirEntry) -> serde_yaml::Value { let meta = e.metadata().unwrap(); if let Some(g) = users::get_group_by_gid(meta.st_gid()) { serde_yaml::to_value(g.name()).unwrap() } else { serde_yaml::to_value("unknown group").unwrap() } } pub fn sha256(e: &DirEntry) -> serde_yaml::Value { let mut ok = true; let mut hasher = Hasher::new(Algorithm::SHA256); if let Ok(file) = fs::File::open(e.path()) { let mut reader = io::BufReader::new(file); let mut buf = [0; 1024 * 1024]; let mut done = false; while ok && !done{ if let Ok(n) = reader.read(&mut buf) { if n == 0 { done = true; } else if let Err(_) = hasher.write(&buf[0..n]) { ok = false; } } else { ok = false; } } } else { ok = false; } if ok { let digest = hasher.finish(); serde_yaml::to_value(hex::encode(digest)).unwrap() } else { serde_yaml::to_value(format!("can't read file")).unwrap() } }