mirror of
https://github.com/Prominence/rshred.git
synced 2026-01-09 02:06:46 +03:00
Added draft progress bar.
This commit is contained in:
parent
8ddca513ae
commit
57f49387a3
71
Cargo.lock
generated
71
Cargo.lock
generated
@ -47,6 +47,27 @@ dependencies = [
|
|||||||
"vec_map",
|
"vec_map",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "console"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa"
|
||||||
|
dependencies = [
|
||||||
|
"encode_unicode",
|
||||||
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
|
"regex",
|
||||||
|
"terminal_size",
|
||||||
|
"unicode-width",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "encode_unicode"
|
||||||
|
version = "0.3.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
@ -67,6 +88,24 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indicatif"
|
||||||
|
version = "0.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4"
|
||||||
|
dependencies = [
|
||||||
|
"console",
|
||||||
|
"lazy_static",
|
||||||
|
"number_prefix",
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.82"
|
version = "0.2.82"
|
||||||
@ -114,6 +153,12 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "number_prefix"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppv-lite86"
|
name = "ppv-lite86"
|
||||||
version = "0.2.10"
|
version = "0.2.10"
|
||||||
@ -187,11 +232,27 @@ dependencies = [
|
|||||||
"rand_core",
|
"rand_core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a"
|
||||||
|
dependencies = [
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.6.22"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rshred"
|
name = "rshred"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
|
"indicatif",
|
||||||
"ntest",
|
"ntest",
|
||||||
"rand",
|
"rand",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
@ -229,6 +290,16 @@ dependencies = [
|
|||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "terminal_size"
|
||||||
|
version = "0.1.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "textwrap"
|
name = "textwrap"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
|
|||||||
@ -12,6 +12,7 @@ license-file = "LICENSE"
|
|||||||
clap = "2.33.3"
|
clap = "2.33.3"
|
||||||
rand = "0.8.3"
|
rand = "0.8.3"
|
||||||
walkdir = "2.3.1"
|
walkdir = "2.3.1"
|
||||||
|
indicatif = "0.15.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
ntest = "0.7.3"
|
ntest = "0.7.3"
|
||||||
|
|||||||
33
src/lib.rs
33
src/lib.rs
@ -6,6 +6,7 @@ use std::io;
|
|||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
use indicatif::{ProgressBar, ProgressStyle};
|
||||||
|
|
||||||
const BATCH_SIZE: usize = 8192;
|
const BATCH_SIZE: usize = 8192;
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ impl Shredder {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if *verbosity > Verbosity::None {
|
if *verbosity > Verbosity::Low {
|
||||||
println!("Using input file: {}", &self.options.raw_path);
|
println!("Using input file: {}", &self.options.raw_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,17 +55,17 @@ impl Shredder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shred_file(options: &ShredOptions, path: &str) {
|
fn shred_file(options: &ShredOptions, path: &str) -> bool {
|
||||||
if options.verbosity > Verbosity::Low {
|
if options.verbosity > Verbosity::Low {
|
||||||
println!("Trying to shred {}", path);
|
println!("Trying to shred {}", path);
|
||||||
}
|
}
|
||||||
match std::fs::canonicalize(path) {
|
return match std::fs::canonicalize(path) {
|
||||||
Ok(path) => {
|
Ok(path) => {
|
||||||
let file_length = path.metadata().unwrap().len();
|
let file_length = path.metadata().unwrap().len();
|
||||||
let absolute_path = path.to_str().unwrap();
|
let absolute_path = path.to_str().unwrap();
|
||||||
if options.is_interactive {
|
if options.is_interactive {
|
||||||
if !Shredder::user_prompt(absolute_path) {
|
if !Shredder::user_prompt(absolute_path) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,9 +76,17 @@ impl Shredder {
|
|||||||
}
|
}
|
||||||
let mut buffer = BufWriter::new(&file);
|
let mut buffer = BufWriter::new(&file);
|
||||||
|
|
||||||
for _ in 0..options.rewrite_iterations {
|
println!("{}", absolute_path);
|
||||||
|
for iteration in 0..options.rewrite_iterations {
|
||||||
let mut bytes_processed = 0;
|
let mut bytes_processed = 0;
|
||||||
|
|
||||||
|
let pb = ProgressBar::new(file_length);
|
||||||
|
pb.set_prefix(&format!("Iteration #{}", iteration + 1));
|
||||||
|
pb.set_message(absolute_path);
|
||||||
|
pb.set_style(ProgressStyle::default_bar()
|
||||||
|
.template("{prefix} {spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} {bytes_per_sec} ({eta})")
|
||||||
|
.progress_chars("#>-"));
|
||||||
|
|
||||||
while bytes_processed < file_length {
|
while bytes_processed < file_length {
|
||||||
let bytes_to_write = if file_length - bytes_processed > BATCH_SIZE as u64 {
|
let bytes_to_write = if file_length - bytes_processed > BATCH_SIZE as u64 {
|
||||||
BATCH_SIZE
|
BATCH_SIZE
|
||||||
@ -91,7 +100,10 @@ impl Shredder {
|
|||||||
buffer.write(&random_bytes).unwrap();
|
buffer.write(&random_bytes).unwrap();
|
||||||
|
|
||||||
bytes_processed = bytes_processed + bytes_to_write as u64;
|
bytes_processed = bytes_processed + bytes_to_write as u64;
|
||||||
|
|
||||||
|
pb.set_position(bytes_processed);
|
||||||
}
|
}
|
||||||
|
pb.finish_with_message("shredded");
|
||||||
|
|
||||||
buffer.flush().unwrap();
|
buffer.flush().unwrap();
|
||||||
file.sync_all().unwrap();
|
file.sync_all().unwrap();
|
||||||
@ -101,14 +113,20 @@ impl Shredder {
|
|||||||
if !options.keep_files {
|
if !options.keep_files {
|
||||||
fs::remove_file(absolute_path).unwrap();
|
fs::remove_file(absolute_path).unwrap();
|
||||||
}
|
}
|
||||||
|
if options.verbosity > Verbosity::None {
|
||||||
|
println!("File '{}' shredded!", absolute_path);
|
||||||
|
}
|
||||||
|
true
|
||||||
}
|
}
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
println!("{}", error);
|
println!("{}", error);
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
println!("{}", error);
|
println!("{}", error);
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,8 +135,9 @@ impl Shredder {
|
|||||||
let mut files_count = 0;
|
let mut files_count = 0;
|
||||||
for entry in WalkDir::new(dir).into_iter().filter_map(|e| e.ok()) {
|
for entry in WalkDir::new(dir).into_iter().filter_map(|e| e.ok()) {
|
||||||
if entry.metadata().unwrap().is_file() {
|
if entry.metadata().unwrap().is_file() {
|
||||||
Shredder::shred_file(options, entry.path().to_str().unwrap());
|
if Shredder::shred_file(options, entry.path().to_str().unwrap()) {
|
||||||
files_count = files_count + 1;
|
files_count = files_count + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if options.verbosity != Verbosity::None {
|
if options.verbosity != Verbosity::None {
|
||||||
|
|||||||
@ -25,13 +25,6 @@ pub fn setup(data_type: TestDataType) -> EnvironmentDetails {
|
|||||||
|
|
||||||
EnvironmentDetails::single(tmp_file_path)
|
EnvironmentDetails::single(tmp_file_path)
|
||||||
}
|
}
|
||||||
TestDataType::SingleFile(filename) => {
|
|
||||||
let tmp_file_path = format!("{}/{}", TEST_DIR, filename);
|
|
||||||
|
|
||||||
prepare_file(&tmp_file_path);
|
|
||||||
|
|
||||||
EnvironmentDetails::single(tmp_file_path)
|
|
||||||
}
|
|
||||||
TestDataType::MultipleFiles(files) => {
|
TestDataType::MultipleFiles(files) => {
|
||||||
let files = files.iter().map(|file| format!("{}/{}", TEST_DIR, file)).collect::<Vec<String>>();
|
let files = files.iter().map(|file| format!("{}/{}", TEST_DIR, file)).collect::<Vec<String>>();
|
||||||
for file in files.iter() {
|
for file in files.iter() {
|
||||||
@ -98,6 +91,5 @@ impl EnvironmentDetails {
|
|||||||
|
|
||||||
pub enum TestDataType {
|
pub enum TestDataType {
|
||||||
RandomSingleFile,
|
RandomSingleFile,
|
||||||
SingleFile(String),
|
|
||||||
MultipleFiles(Vec<String>),
|
MultipleFiles(Vec<String>),
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user