summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-10-02 11:01:10 +0300
committerLars Wirzenius <liw@liw.fi>2018-10-02 11:01:10 +0300
commitd022dc87fa03ab54256711bf1daf9e2030e3f377 (patch)
tree121f38fb77d36f80e9f098666532dc1142a767d8
parent7a8bdeb72979493c58c9cd8c79fa2fd6df6cf8c5 (diff)
downloadsummainrs-d022dc87fa03ab54256711bf1daf9e2030e3f377.tar.gz
Add: missing format.rs
-rw-r--r--src/format.rs119
1 files changed, 119 insertions, 0 deletions
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::<Utc>::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")
+ }
+}