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}; pub fn name(e: &DirEntry) -> String { e.path().to_string_lossy().to_string() } pub fn mtime(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); let mtime = meta.modified().unwrap(); let datetime = DateTime::::from(mtime); datetime.format("%Y-%m-%d %H:%M:%S.%f %z").to_string() } pub fn mode(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); let mode = meta.permissions().mode(); format!("{:06o}", mode) } pub fn inode(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.st_ino()) } pub fn dev(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.st_dev()) } pub fn nlink(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.st_nlink()) } pub fn size(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.len()) } pub fn uid(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.st_uid()) } pub fn gid(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); format!("{}", meta.st_gid()) } pub fn username(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); if let Some(u) = users::get_user_by_uid(meta.st_uid()) { format!("{}", u.name()) } else { format!("unknown user") } } pub fn group(e: &DirEntry) -> String { let meta = e.metadata().unwrap(); if let Some(g) = users::get_group_by_gid(meta.st_gid()) { format!("{}", g.name()) } else { format!("unknown group") } } pub fn sha256(e: &DirEntry) -> String { 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(); hex::encode(digest) } else { format!("can't read file") } }