Output formatting improvements, additional work on progress calculation
This commit is contained in:
parent
3bfd9c653f
commit
3474f9abf5
45
wipe.pl
45
wipe.pl
@ -5,7 +5,7 @@ use Digest::MD5 "md5_base64";
|
|||||||
use POSIX;
|
use POSIX;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|
||||||
$| = 1; #turn off IO buffering
|
$| = 1; #turn off IO buffering for STDOUT
|
||||||
|
|
||||||
# set CONFIRMATION_PHRASE to anything falsy (like zero) if you are a fast and
|
# set CONFIRMATION_PHRASE to anything falsy (like zero) if you are a fast and
|
||||||
# loose badass and you don't need no stinkin' safety net.
|
# loose badass and you don't need no stinkin' safety net.
|
||||||
@ -39,10 +39,10 @@ my %color = (
|
|||||||
"reset" => `tput sgr0`
|
"reset" => `tput sgr0`
|
||||||
);
|
);
|
||||||
|
|
||||||
my $notreally = grep /--notreally/, @ARGV;
|
my $pretend = grep /--dryrun/, @ARGV;
|
||||||
my $longrun = grep /--long/, @ARGV;
|
my $longrun = grep /--long/, @ARGV;
|
||||||
|
|
||||||
if (!$notreally && CONFIRMATION_PHRASE) {
|
if (!$pretend && CONFIRMATION_PHRASE) {
|
||||||
say "$color{brightred}WARNING$color{reset}: This program will $color{brightred}COMPLETELY DESTROY ALL DATA ON ALL SYSTEM DRIVES$color{reset}";
|
say "$color{brightred}WARNING$color{reset}: This program will $color{brightred}COMPLETELY DESTROY ALL DATA ON ALL SYSTEM DRIVES$color{reset}";
|
||||||
print 'Please type "'.CONFIRMATION_PHRASE.qq(" if you are $color{brightred}CERTAIN$color{reset} you want to continue: );
|
print 'Please type "'.CONFIRMATION_PHRASE.qq(" if you are $color{brightred}CERTAIN$color{reset} you want to continue: );
|
||||||
chomp(my $confirm = <STDIN>);
|
chomp(my $confirm = <STDIN>);
|
||||||
@ -106,13 +106,13 @@ sub wipethemdrives {
|
|||||||
my $disksum2;
|
my $disksum2;
|
||||||
my $spacer = 29;
|
my $spacer = 29;
|
||||||
# Write
|
# Write
|
||||||
if ($notreally) {
|
if ($pretend) {
|
||||||
$spacer = 18;
|
$spacer = 18;
|
||||||
print "Pretend wipe complete, pretending to check...";
|
print "Pretend wipe complete, pretending to check...";
|
||||||
$disksum = $clobsum;
|
$disksum = $clobsum;
|
||||||
$disksum2 = $clobsum;
|
$disksum2 = $clobsum;
|
||||||
} else {
|
} else {
|
||||||
system("hdparm -W 0 ".$disks->{$diskid}{path}) and do {
|
system("hdparm -W 0 ".$disks->{$diskid}{path}." 1>/dev/null 2>/dev/null") and do {
|
||||||
print "Cannot turn off drive write caching: $!\n";
|
print "Cannot turn off drive write caching: $!\n";
|
||||||
print "Disk considered $color{red}FAILED$color{reset}\n";
|
print "Disk considered $color{red}FAILED$color{reset}\n";
|
||||||
$disks->{$diskid}{failure} = "Cannot turn off write caching";
|
$disks->{$diskid}{failure} = "Cannot turn off write caching";
|
||||||
@ -125,6 +125,12 @@ sub wipethemdrives {
|
|||||||
close($diskw);
|
close($diskw);
|
||||||
print "Wipe attempt complete, checking...";
|
print "Wipe attempt complete, checking...";
|
||||||
# Read
|
# Read
|
||||||
|
system("hdparm -F ".$disks->{$diskid}{path}." 1> /dev/null 2>/dev/null") and do {
|
||||||
|
print "Cannot flush drive buffer: $!\n";
|
||||||
|
print "Disk considered $color{red}FAILED$color{reset}\n";
|
||||||
|
$disks->{$diskid}{failure} = "Cannot flush drive buffer";
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
open(my $diskr, "<", $disks->{$diskid}{path}) or return warning("could not open $disks->{$diskid}{path}");
|
open(my $diskr, "<", $disks->{$diskid}{path}) or return warning("could not open $disks->{$diskid}{path}");
|
||||||
my $diskdata;
|
my $diskdata;
|
||||||
read($diskr, $diskdata, 10240000);
|
read($diskr, $diskdata, 10240000);
|
||||||
@ -150,19 +156,32 @@ sub wipethemdrives {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
# If long flag than zero whole disk and give a progress bar
|
# If long flag than zero whole disk and give a progress bar
|
||||||
if ($longrun && !$notreally) {
|
if ($longrun && !$pretend) {
|
||||||
say "Zeroing $disks->{$diskid}{path}...";
|
|
||||||
open(my $longdiskw, ">:raw", $disks->{$diskid}{path}) or return warning("could not open $disks->{$diskid}{path}");
|
open(my $longdiskw, ">:raw", $disks->{$diskid}{path}) or return warning("could not open $disks->{$diskid}{path}");
|
||||||
|
binmode($longdiskw);
|
||||||
|
my $old_file_handle = select($longdiskw); #Disable I/O buffering on $longdiskw
|
||||||
|
$| = 1;
|
||||||
|
select($old_file_handle);
|
||||||
seek($longdiskw,0,2);
|
seek($longdiskw,0,2);
|
||||||
my $totalBytes = tell($longdiskw);
|
my $totalBytes = tell($longdiskw);
|
||||||
seek($longdiskw,0,0);
|
seek($longdiskw,0,0);
|
||||||
#################################################### Need to double check this math, its not calculating % right
|
for (0..($totalBytes/4096 - 1)) {
|
||||||
for (0..($totalBytes/4096)) {
|
|
||||||
print $longdiskw "\0"x4096;
|
print $longdiskw "\0"x4096;
|
||||||
if ( !(tell($longdiskw) % (16*4096)) ) {
|
if ( !($_ % 4) ) {
|
||||||
printf(" %5.5s%%\r", sprintf("%.2f", (tell($longdiskw)/$totalBytes)) );
|
system("hdparm -F ".$disks->{$diskid}{path}." 1>/dev/null 2>/dev/null");
|
||||||
|
}
|
||||||
|
if ( !($_ % 16) ) {
|
||||||
|
printf("\r%31.31s%-".($spacer+11).".".($spacer+11)."s%6.2f%% ",
|
||||||
|
"Zeroing ".$disks->{$diskid}{path},
|
||||||
|
"."x(tell($longdiskw)/$totalBytes*($spacer+11)),
|
||||||
|
(tell($longdiskw)/$totalBytes)*100 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my $leftover = $totalBytes - tell($longdiskw);
|
||||||
|
print $longdiskw "\0"x$leftover;
|
||||||
|
system("hdparm -F ".$disks->{$diskid}{path}." 1>/dev/null 2>/dev/null");
|
||||||
|
close($longdiskw);
|
||||||
|
printf("\r%31.31s...".("."x($spacer-1))."Zeroing Complete\n", "Zeroing".$disks->{$diskid}{path});
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -173,7 +192,7 @@ sub smartcheck {
|
|||||||
my $diskid = shift;
|
my $diskid = shift;
|
||||||
my $disks = shift;
|
my $disks = shift;
|
||||||
print "Checking overall-health self-assessment test result: ".(" "x19);
|
print "Checking overall-health self-assessment test result: ".(" "x19);
|
||||||
(my $smartassess = `smartctl $disks->{$diskid}{path} -H | grep overall`) or (say "\n$!\ncould not check smart data, skipping" and return 1);
|
(my $smartassess = `smartctl $disks->{$diskid}{path} -H 2>/dev/null | grep overall`) or (($disks->{$diskid}{failure} = "No Smart Data") and say +"N/A\n$!" and return 1);
|
||||||
$disks->{$diskid}{selftest} = (split(": ", $smartassess))[1];
|
$disks->{$diskid}{selftest} = (split(": ", $smartassess))[1];
|
||||||
if ( "FAILED" eq $disks->{$diskid}{selftest} ) {
|
if ( "FAILED" eq $disks->{$diskid}{selftest} ) {
|
||||||
say "$color{red}Failed$color{reset}";
|
say "$color{red}Failed$color{reset}";
|
||||||
@ -182,7 +201,7 @@ sub smartcheck {
|
|||||||
} else { say "$color{green}Passed$color{reset}"; }
|
} else { say "$color{green}Passed$color{reset}"; }
|
||||||
say "Checking S.M.A.R.T. variables...";
|
say "Checking S.M.A.R.T. variables...";
|
||||||
# say qq(smartctl $disks->{$diskid}{path} -A -f hex,id | grep "^0x");
|
# say qq(smartctl $disks->{$diskid}{path} -A -f hex,id | grep "^0x");
|
||||||
(my $smartcommand = `smartctl $disks->{$diskid}{path} -A -f hex,id | grep "^0x"`) or (say "$!\ncould not check smart data, skipping" and return 1);
|
(my $smartcommand = `smartctl $disks->{$diskid}{path} -A -f hex,id 2>/dev/null | grep "^0x"`) or (($disks->{$diskid}{failure} = "No Smart Data") and say +"N/A\n$!" and return 1);
|
||||||
for (split("\n",$smartcommand)) {
|
for (split("\n",$smartcommand)) {
|
||||||
my @smartdata = split(/\s+/,$_);
|
my @smartdata = split(/\s+/,$_);
|
||||||
$disks->{$diskid}{smart}{$smartdata[0]}{id} = $smartdata[0];
|
$disks->{$diskid}{smart}{$smartdata[0]}{id} = $smartdata[0];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user