separate shred and check process

This commit is contained in:
Hendrik Schutter 2022-09-27 21:58:59 +02:00
parent 392fe67aa2
commit b73e1765b5
5 changed files with 45 additions and 18 deletions

View File

@ -16,7 +16,8 @@ class Drive
public: public:
enum TaskState {NONE, enum TaskState {NONE,
SHRED_SELECTED, SHRED_SELECTED,
SHRED_ACTIVE, SHRED_ACTIVE, //shred iterations active
CHECK_ACTIVE, //optional checking active
DELETE_SELECTED, DELETE_SELECTED,
DELETE_ACTIVE, DELETE_ACTIVE,
FROZEN FROZEN
@ -30,7 +31,8 @@ public:
unsigned long ulSpeedMetricBytesWritten; unsigned long ulSpeedMetricBytesWritten;
} sShredSpeed; } 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 bWasDeleteted = false;
bool bIsOffline = false; bool bIsOffline = false;
uint32_t u32DriveChecksumAferShredding = 0U; uint32_t u32DriveChecksumAferShredding = 0U;

View File

@ -33,7 +33,7 @@
// Logic // Logic
//#define DRYRUN //don´t touch the drives //#define DRYRUN //don´t touch the drives
#define FROZEN_ALERT //show alert if drive is frozen #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 //IPC pipes
#define READ 0 #define READ 0

View File

@ -75,10 +75,6 @@ void reHDD::app_logic(void)
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("got progress signal from a shred task"); Logger::logThis()->info("got progress signal from a shred task");
#endif #endif
} }
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
} //endless loop } //endless loop
@ -126,6 +122,7 @@ void reHDD::ThreadCheckFrozenDrives()
{ {
if(it->state == Drive::SHRED_ACTIVE) if(it->state == Drive::SHRED_ACTIVE)
{ {
it->checkFrozenDrive(); it->checkFrozenDrive();
} }
} }
@ -531,7 +528,7 @@ void reHDD::handleEnter()
{ {
if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) 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; getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE;
//task for drive is running --> don´t show more task options //task for drive is running --> don´t show more task options
Drive* pTmpDrive = getSelectedDrive(); Drive* pTmpDrive = getSelectedDrive();

View File

@ -177,7 +177,11 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd)
tfng_prng_seedkey(NULL); //reset random generator 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); drive->u32DriveChecksumAferShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd);
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
if (drive->u32DriveChecksumAferShredding != 0) if (drive->u32DriveChecksumAferShredding != 0)
@ -194,12 +198,11 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd)
cleanup(); 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->state= Drive::NONE;
drive->setTaskPercentage(0.0); 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; return 0;
} }
@ -213,7 +216,7 @@ double Shred::calcProgress()
{ {
unsigned int uiMaxShredIteration = SHRED_ITERATIONS; 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 uiMaxShredIteration++; //increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes
#endif #endif
return (double) (((double) ulDriveByteOverallCount) / ((double)this->ulDriveByteSize*uiMaxShredIteration))*100.0f; 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; ulDriveByteOverallCount += iReadBytes;
d32Percent = this->calcProgress(); d32Percent = this->calcProgress();
drive->sShredSpeed.ulSpeedMetricBytesWritten += iReadBytes; drive->sShredSpeed.ulSpeedMetricBytesWritten += iReadBytes;
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial());
#endif #endif
if((d32Percent-d32TmpPercent) >= 0.01)
if(((d32Percent-d32TmpPercent) >= 0.01) || (d32Percent == 100.0))
{ {
drive->setTaskPercentage(d32TmpPercent); drive->setTaskPercentage(d32TmpPercent);
d32TmpPercent = d32Percent; d32TmpPercent = d32Percent;
#ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("send progress signal to main loop (check)");
#endif
write(*ipSignalFd, "A",1); write(*ipSignalFd, "A",1);
} }
} }
drive->bWasChecked = true;
return uiChecksum; return uiChecksum;
} }

View File

@ -105,6 +105,13 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
stream << fixed << setprecision(3) << (it->getTaskPercentage()); stream << fixed << setprecision(3) << (it->getTaskPercentage());
sState = "Shredding: " + stream.str() + "%"; 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(); it->calculateTaskDuration();
sTime = this->formatTimeDuration(it->getTaskDuration()); sTime = this->formatTimeDuration(it->getTaskDuration());
sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes);
@ -114,7 +121,6 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
it->calculateTaskDuration(); it->calculateTaskDuration();
sTime = this->formatTimeDuration(it->getTaskDuration()); sTime = this->formatTimeDuration(it->getTaskDuration());
break; break;
case Drive::NONE: case Drive::NONE:
case Drive::SHRED_SELECTED: case Drive::SHRED_SELECTED:
case Drive::DELETE_SELECTED: case Drive::DELETE_SELECTED:
@ -124,12 +130,21 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
} }
if (it->bWasShredded) 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()); sTime = this->formatTimeDuration(it->getTaskDuration());
} }
#ifdef ZERO_CHECK_ALERT #ifdef ZERO_CHECK
if(bSelectedEntry && it->bWasShredded && (it->u32DriveChecksumAferShredding != 0U)) 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); 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); wrefresh(dialog);
@ -554,6 +569,10 @@ void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY)
menustate.bAbort = true; menustate.bAbort = true;
break; 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 case Drive::DELETE_SELECTED : //delete task selected for this drive
menustate.bConfirmDelete = true; menustate.bConfirmDelete = true;
break; break;