From b73e1765b5fddd194289df0b587cb4f900defd45 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 27 Sep 2022 21:58:59 +0200 Subject: [PATCH] separate shred and check process --- include/drive.h | 6 ++++-- include/reHDD.h | 2 +- src/reHDD.cpp | 7 ++----- src/shred.cpp | 21 +++++++++++++++------ src/tui.cpp | 27 +++++++++++++++++++++++---- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/include/drive.h b/include/drive.h index e61bc8f..25ab646 100644 --- a/include/drive.h +++ b/include/drive.h @@ -16,7 +16,8 @@ class Drive public: enum TaskState {NONE, SHRED_SELECTED, - SHRED_ACTIVE, + SHRED_ACTIVE, //shred iterations active + CHECK_ACTIVE, //optional checking active DELETE_SELECTED, DELETE_ACTIVE, FROZEN @@ -30,7 +31,8 @@ public: unsigned long ulSpeedMetricBytesWritten; } sShredSpeed; - bool bWasShredded = false; + bool bWasShredded = false; //all shred iterations done + bool bWasChecked = false; //all shred iterations and optional checking done bool bWasDeleteted = false; bool bIsOffline = false; uint32_t u32DriveChecksumAferShredding = 0U; diff --git a/include/reHDD.h b/include/reHDD.h index 2fd2722..c15069b 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -33,7 +33,7 @@ // Logic //#define DRYRUN //don´t touch the drives #define FROZEN_ALERT //show alert if drive is frozen -#define ZERO_CHECK_ALERT //check drive after shred if all bytes are zero, show alert if this fails +#define ZERO_CHECK //check drive after shred if all bytes are zero, show alert if this fails //IPC pipes #define READ 0 diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 5dcd2eb..b38be3f 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -75,10 +75,6 @@ void reHDD::app_logic(void) #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("got progress signal from a shred task"); #endif - - - - } ui->updateTUI(&listDrives, u8SelectedEntry); } //endless loop @@ -126,6 +122,7 @@ void reHDD::ThreadCheckFrozenDrives() { if(it->state == Drive::SHRED_ACTIVE) { + it->checkFrozenDrive(); } } @@ -531,7 +528,7 @@ void reHDD::handleEnter() { if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) { - Logger::logThis()->info("Started shred for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; //task for drive is running --> don´t show more task options Drive* pTmpDrive = getSelectedDrive(); diff --git a/src/shred.cpp b/src/shred.cpp index aaf541f..f8d92c1 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -177,7 +177,11 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) tfng_prng_seedkey(NULL); //reset random generator -#ifdef ZERO_CHECK_ALERT + drive->bWasShredded = true; + Logger::logThis()->info("Shred-Task finished - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); +#ifdef ZERO_CHECK + drive->state=Drive::CHECK_ACTIVE; + Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); drive->u32DriveChecksumAferShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd); #ifdef LOG_LEVEL_HIGH if (drive->u32DriveChecksumAferShredding != 0) @@ -194,12 +198,11 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) cleanup(); - if(drive->state == Drive::SHRED_ACTIVE) + if((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_ACTIVE)) { - drive->bWasShredded = true; drive->state= Drive::NONE; drive->setTaskPercentage(0.0); - Logger::logThis()->info("Finished shred for: " + drive->getModelName() + "-" + drive->getSerial()); + Logger::logThis()->info("Finished shred/check for: " + drive->getModelName() + "-" + drive->getSerial()); } return 0; } @@ -213,7 +216,7 @@ double Shred::calcProgress() { unsigned int uiMaxShredIteration = SHRED_ITERATIONS; -#ifdef ZERO_CHECK_ALERT +#ifdef ZERO_CHECK uiMaxShredIteration++; //increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes #endif return (double) (((double) ulDriveByteOverallCount) / ((double)this->ulDriveByteSize*uiMaxShredIteration))*100.0f; @@ -271,16 +274,22 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSign ulDriveByteOverallCount += iReadBytes; d32Percent = this->calcProgress(); drive->sShredSpeed.ulSpeedMetricBytesWritten += iReadBytes; + #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); #endif - if((d32Percent-d32TmpPercent) >= 0.01) + + if(((d32Percent-d32TmpPercent) >= 0.01) || (d32Percent == 100.0)) { drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("send progress signal to main loop (check)"); +#endif write(*ipSignalFd, "A",1); } } + drive->bWasChecked = true; return uiChecksum; } diff --git a/src/tui.cpp b/src/tui.cpp index 895c506..8cd84e1 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -105,6 +105,13 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) stream << fixed << setprecision(3) << (it->getTaskPercentage()); sState = "Shredding: " + stream.str() + "%"; + it->calculateTaskDuration(); + sTime = this->formatTimeDuration(it->getTaskDuration()); + sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); + break; + case Drive::CHECK_ACTIVE: + stream << fixed << setprecision(3) << (it->getTaskPercentage()); + sState = "Checking: " + stream.str() + "%"; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); @@ -114,7 +121,6 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); break; - case Drive::NONE: case Drive::SHRED_SELECTED: case Drive::DELETE_SELECTED: @@ -124,12 +130,21 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) } if (it->bWasShredded) { - sState = "SHREDDED"; //mark drive as shreded previously, overwrite if deleted + if(it->bWasChecked) + { + //drive was also checked after shredding + sState = "SHREDDED & CHECKED"; //mark drive as shredded previously and optional checked + } + else + { + //shredded and not checked yet + sState = "SHREDDED"; //mark drive as shredded previously + } sTime = this->formatTimeDuration(it->getTaskDuration()); } -#ifdef ZERO_CHECK_ALERT - if(bSelectedEntry && it->bWasShredded && (it->u32DriveChecksumAferShredding != 0U)) +#ifdef ZERO_CHECK + if(bSelectedEntry && it->bWasChecked && (it->u32DriveChecksumAferShredding != 0U)) { dialog=createZeroChecksumWarning(70, 16, ((u16StdscrX)-(int)(u16StdscrX/2)-20),(int)(u16StdscrY/2)-8, it->getPath(), it->getModelFamily(), it->getModelName(), it->getSerial(), it->u32DriveChecksumAferShredding); wrefresh(dialog); @@ -554,6 +569,10 @@ void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) menustate.bAbort = true; break; + case Drive::CHECK_ACTIVE : //check task running for this drive + menustate.bAbort = true; + break; + case Drive::DELETE_SELECTED : //delete task selected for this drive menustate.bConfirmDelete = true; break;