From d022dc87fa03ab54256711bf1daf9e2030e3f377 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 2 Oct 2018 11:01:10 +0300 Subject: Add: missing format.rs --- src/format.rs | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/format.rs diff --git a/src/format.rs b/src/format.rs new file mode 100644 index 0000000..e2d5f92 --- /dev/null +++ b/src/format.rs @@ -0,0 +1,119 @@ +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") + } +} -- cgit v1.2.1