From 0294cfc029ca3402c1070165a6c585fc56b3f199 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Fri, 26 May 2017 01:58:33 -0700 Subject: WIP --- src/bin/bhash.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/bin/bhash.rs (limited to 'src/bin') diff --git a/src/bin/bhash.rs b/src/bin/bhash.rs new file mode 100644 index 0000000..691db2a --- /dev/null +++ b/src/bin/bhash.rs @@ -0,0 +1,76 @@ +// bad-hashish: a tool for recursively, remotely multi-hashing files +// Copyright (C) 2017 Bryan Newbold +// GPLv3 + +extern crate bad_hashish; + +#[macro_use] +extern crate error_chain; + +extern crate clap; +extern crate tree_magic; +extern crate flate2; +extern crate tar; +extern crate crypto; + +use clap::App; +use bad_hashish::Result; +use std::path::Path; +use std::io::{self, BufReader}; +use std::io::prelude::*; +use std::fs::File; +use flate2::read::GzDecoder; +use tar::Archive; +use crypto::digest::Digest; +use crypto::sha1::Sha1; + + +fn run() -> Result<()> { + + let matches = App::new("bad-hashish") + .version(env!("CARGO_PKG_VERSION")) + .about("a tool for recursively, remotely multi-hashing files") + .arg_from_usage("... 'files to hash from'") + .get_matches(); + + for f in matches.values_of("FILE").unwrap() { + let path: &Path = Path::new(f); + println!("{} ({})", f, tree_magic::from_filepath(path)); + + if tree_magic::match_filepath("application/zip", path) { + println!("It's a zip."); + } else if tree_magic::match_filepath("application/gzip", path) { + println!("It's gzip."); + let f = File::open(path)?; + let mut gz = GzDecoder::new(f)?; + + let mut reader = BufReader::with_capacity(4*1024*1024, gz); + let is_tar: bool = { + let buf = reader.fill_buf()?; + println!("Inside is: {}", tree_magic::from_u8(&buf)); + tree_magic::match_u8("application/x-tar", &buf) + }; + + if is_tar { + println!("It's a tar inside"); + let mut a = Archive::new(reader); + for inner in a.entries().unwrap() { + let mut inner = inner.unwrap(); + let mut hasher = Sha1::new(); + let mut buf: [u8; 1*1024*1024] = [0; 1*1024*1024]; + loop { + let got = inner.read(&mut buf[..])?; + if got <= 0 { break }; + hasher.input(&buf[0..got]); + } + println!("\t{} {:?}", hasher.result_str(), inner.header().path().unwrap()); + } + } + } + } + + Ok(()) +} + +// At least for now... +quick_main!(run); -- cgit v1.2.3