Merge branch 'master' into feature/failed-state

This commit is contained in:
2025-12-10 21:59:04 +01:00
16 changed files with 459 additions and 238 deletions

View File

@ -6,6 +6,7 @@
*/
#include "../include/reHDD.h"
using namespace std;
#ifdef __cplusplus
extern "C"
@ -41,7 +42,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
#ifdef DRYRUN
for (int i = 0; i <= 500; i++)
{
if (drive->state != Drive::SHRED_ACTIVE)
if (drive->state.load() != Drive::TaskState::SHRED_ACTIVE)
{
return 0;
}
@ -60,7 +61,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
randomSrcFileDiscr = open(randomsrc, O_RDONLY | O_LARGEFILE);
if (randomSrcFileDiscr == -1)
{
std::string errorMsg(strerror(randomSrcFileDiscr));
std::string errorMsg(strerror(errno));
Logger::logThis()->error("Shred-Task: Open random source failed! " + errorMsg + " - Drive: " + drive->getSerial());
perror(randomsrc);
cleanup();
@ -71,7 +72,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
driveFileDiscr = open(cpDrivePath, O_RDWR | O_LARGEFILE);
if (driveFileDiscr == -1)
{
std::string errorMsg(strerror(driveFileDiscr));
std::string errorMsg(strerror(errno));
Logger::logThis()->error("Shred-Task: Open drive failed! " + errorMsg + " - Drive: " + drive->getSerial());
perror(cpDrivePath);
cleanup();
@ -82,7 +83,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
ssize_t readRet = read(randomSrcFileDiscr, ucKey, sizeof(ucKey));
if (readRet <= 0)
{
std::string errorMsg(strerror(readRet));
std::string errorMsg(strerror(errno));
Logger::logThis()->error("Shred-Task: Read random key failed! " + errorMsg + " - Drive: " + drive->getSerial());
perror(randomsrc);
cleanup();
@ -92,8 +93,10 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
tfng_prng_seedkey(ucKey);
this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr);
drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); // set inital timestamp for speed metric
drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric
Drive::ShredSpeed shredSpeed = drive->sShredSpeed.load();
shredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); // set inital timestamp for speed metric
shredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric
drive->sShredSpeed.store(shredSpeed);
#ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial());
@ -132,21 +135,24 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
if (iByteShredded <= 0)
{
std::string errorMsg(strerror(iByteShredded));
std::string errorMsg(strerror(errno));
Logger::logThis()->error("Shred-Task: Write to drive failed! " + errorMsg + " - Drive: " + drive->getSerial());
perror("unable to write random data");
cleanup();
return -1;
}
auto shredSpeed = drive->sShredSpeed.load();
shredSpeed.ulSpeedMetricBytesWritten += iByteShredded;
drive->sShredSpeed.store(shredSpeed);
ulDriveByteCounter += iByteShredded;
ulDriveByteOverallCount += iByteShredded;
d32Percent = this->calcProgress();
drive->sShredSpeed.ulSpeedMetricBytesWritten += iByteShredded;
#ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter + 1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial());
#endif
if ((d32Percent - d32TmpPercent) >= 0.01)
{
// set shred percantage
@ -156,7 +162,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
write(*ipSignalFd, "A", 1);
}
if (drive->state != Drive::SHRED_ACTIVE)
if (drive->state != Drive::TaskState::SHRED_ACTIVE)
{
drive->setTaskPercentage(0);
d32Percent = 0.00;
@ -183,18 +189,18 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
drive->bWasShredded = true;
Logger::logThis()->info("Shred-Task finished - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
#ifdef ZERO_CHECK
drive->state = Drive::CHECK_ACTIVE;
drive->state = Drive::TaskState::CHECK_ACTIVE;
Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
drive->u32DriveChecksumAfterShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd);
if (drive->u32DriveChecksumAfterShredding != 0)
{
drive->state = Drive::CHECK_FAILED;
drive->state = Drive::TaskState::CHECK_FAILED;
Logger::logThis()->info("Shred-Task: Checksum not zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
}
else
{
drive->state = Drive::CHECK_SUCCESSFUL;
drive->state = Drive::TaskState::CHECK_SUCCESSFUL;
Logger::logThis()->info("Shred-Task: Checksum zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
}
#endif
@ -202,9 +208,9 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
cleanup();
if ((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_SUCCESSFUL) || (drive->state == Drive::CHECK_FAILED))
if ((drive->state.load() == Drive::TaskState::SHRED_ACTIVE) || (drive->state.load() == Drive::TaskState::CHECK_ACTIVE) || (drive->state == Drive::TaskState::CHECK_FAILED))
{
drive->state = Drive::NONE;
drive->state = Drive::TaskState::NONE;
drive->setTaskPercentage(0.0);
Printer::getPrinter()->print(drive);
Logger::logThis()->info("Finished shred/check for: " + drive->getModelName() + "-" + drive->getSerial());
@ -224,6 +230,8 @@ double Shred::calcProgress()
#ifdef ZERO_CHECK
uiMaxShredIteration++; // increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes
#endif
if (this->ulDriveByteSize == 0)
return 0.0;
return (double)(((double)ulDriveByteOverallCount) / ((double)this->ulDriveByteSize * uiMaxShredIteration)) * 100.0f;
}
@ -232,6 +240,7 @@ int Shred::iRewindDrive(fileDescriptor file)
if (0 != lseek(file, 0L, SEEK_SET))
{
perror("unable to rewind drive");
Logger::logThis()->info("Unable to rewind drive! - fileDescriptor: " + to_string(file));
return -1;
}
else
@ -240,19 +249,26 @@ int Shred::iRewindDrive(fileDescriptor file)
}
}
unsigned long Shred::getDriveSizeInBytes(fileDescriptor file)
long Shred::getDriveSizeInBytes(fileDescriptor file)
{
unsigned long ulDriveSizeTmp = lseek(file, 0L, SEEK_END);
long liDriveSizeTmp = lseek(file, 0L, SEEK_END);
if (liDriveSizeTmp == -1)
{
perror("unable to get drive size");
Logger::logThis()->info("Unable to get drive size! - fileDescriptor: " + to_string(file));
return 0L;
}
if (0 != iRewindDrive(file))
{
ulDriveSizeTmp = 0U;
liDriveSizeTmp = 0L;
}
#ifdef DEMO_DRIVE_SIZE
ulDriveSizeTmp = DEMO_DRIVE_SIZE;
liDriveSizeTmp = DEMO_DRIVE_SIZE;
#endif
return ulDriveSizeTmp;
return liDriveSizeTmp;
}
unsigned int Shred::uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSignalFd)
@ -278,7 +294,9 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSig
ulDriveByteCounter += iReadBytes;
ulDriveByteOverallCount += iReadBytes;
d32Percent = this->calcProgress();
drive->sShredSpeed.ulSpeedMetricBytesWritten += iReadBytes;
auto shredSpeed = drive->sShredSpeed.load();
shredSpeed.ulSpeedMetricBytesWritten += iReadBytes;
drive->sShredSpeed.store(shredSpeed);
#ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial());