8 Commits

Author SHA1 Message Date
298192111d new states 2025-12-07 18:36:32 +01:00
80ffb3c6c3 Merge pull request 'Improve UUID parsing' (#78) from hannesbraun/reHDD:master into master
Reviewed-on: #78
Reviewed-by: Hendrik Schutter <localhorst@mosad.xyz>
2025-12-07 18:15:28 +01:00
ebe0ef9ec1 Merge pull request 'fix(UI): Restore terminal state on termination' (#77) from hannesbraun/reHDD:terminal-restore into master
Reviewed-on: #77
2025-12-07 18:11:02 +01:00
86660cb112 Merge pull request 'feature/drive-type-ipc' (#80) from feature/drive-type-ipc into master
Reviewed-on: #80
2025-12-07 18:05:36 +01:00
47ab9cc36f update Version 2025-12-07 18:04:52 +01:00
aaf4695656 IPC connection type 2025-12-07 17:51:16 +01:00
664582f01d Improve UUID parsing
The previous approach only worked if the drive name had three letters (usually sda).
2025-07-25 14:26:20 +02:00
9f6cfc17f8 Restore terminal state on termination 2025-07-24 18:55:49 +02:00
8 changed files with 48 additions and 13 deletions

View File

@ -20,6 +20,8 @@ public:
SHRED_SELECTED,
SHRED_ACTIVE, // shred iterations active
CHECK_ACTIVE, // optional checking active
CHECK_SUCCESSFUL,
CHECK_FAILED,
DELETE_SELECTED,
DELETE_ACTIVE,
FROZEN

View File

@ -26,11 +26,11 @@ typedef struct
char caDriveShredDuration[STR_BUFFER_SIZE];
char caDriveCapacity[STR_BUFFER_SIZE];
char caDriveState[STR_BUFFER_SIZE];
char caDriveConnectionType[STR_BUFFER_SIZE];
char caDriveModelFamily[STR_BUFFER_SIZE];
char caDriveModelName[STR_BUFFER_SIZE];
char caDriveSerialnumber[STR_BUFFER_SIZE];
char caDriveReHddVersion[STR_BUFFER_SIZE];
} t_driveData;
typedef struct

View File

@ -8,7 +8,7 @@
#ifndef REHDD_H_
#define REHDD_H_
#define REHDD_VERSION "V1.2.0"
#define REHDD_VERSION "V1.2.1"
// Drive handling Settings
#define WORSE_HOURS 19200 // mark drive if at this limit or beyond

View File

@ -51,6 +51,8 @@ public:
static enum UserInput readUserInput();
static void terminateTUI();
private:
static string sCpuUsage;
static string sRamUsage;

View File

@ -53,6 +53,23 @@ void Printer::print(Drive *drive)
sprintf(msgQueueData.driveData.caDriveErrors, "%i", drive->getErrorCount());
sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li", drive->getActionStartTimestamp());
sprintf(msgQueueData.driveData.caDriveShredDuration, "%li", drive->getTaskDuration());
switch (drive->connectionType)
{
case Drive::USB:
strcpy(msgQueueData.driveData.caDriveConnectionType, "usb");
break;
case Drive::SATA:
strcpy(msgQueueData.driveData.caDriveConnectionType, "sata");
break;
case Drive::NVME:
strcpy(msgQueueData.driveData.caDriveConnectionType, "nvme");
break;
case Drive::UNKNOWN:
default:
strcpy(msgQueueData.driveData.caDriveConnectionType, "na");
}
sprintf(msgQueueData.driveData.caDriveReHddVersion, REHDD_VERSION);
if (-1 == msgsnd(this->msqid, &msgQueueData, sizeof(t_msgQueueData) - sizeof(long), 0))

View File

@ -198,8 +198,9 @@ void reHDD::ThreadUserInput()
ui->updateTUI(&listDrives, u8SelectedEntry);
break;
case TUI::UserInput::Terminate:
cout << "Terminate" << endl;
// cout << "Terminate" << endl;
stopShredAllDrives(&listDrives);
ui->terminateTUI();
sleep(5); // sleep 5 sec
std::exit(1); // Terminates main, doesn't wait for threads
break;
@ -408,10 +409,11 @@ void reHDD::filterIgnoredDrives(list<Drive> *plistDrives)
while ((getline(&cLine, &len, outputfileBlkid)) != -1) // parse UUID from blkid
{
if (string(cLine).find("PTUUID") != string::npos)
size_t ptuuidPos = string(cLine).find("PTUUID");
if (ptuuidPos != string::npos)
{
string sBlkidOut = string(cLine);
sBlkidOut.erase(0, 18);
sBlkidOut.erase(0, ptuuidPos + 8);
sBlkidOut.erase(8, sBlkidOut.length());
sUUID = sBlkidOut;
// cout << "blkid uuid:" << sUUID << endl;

View File

@ -36,7 +36,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
ostringstream address;
address << (void const *)&(*drive);
Logger::logThis()->info("Shred-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
drive->bWasShredStarted = true; //Mark drive as partly shredded
drive->bWasShredStarted = true; // Mark drive as partly shredded
#ifdef DRYRUN
for (int i = 0; i <= 500; i++)
@ -93,7 +93,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
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->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric
#ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial());
@ -186,22 +186,23 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
drive->state = Drive::CHECK_ACTIVE;
Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
drive->u32DriveChecksumAfterShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd);
#ifdef LOG_LEVEL_HIGH
if (drive->u32DriveChecksumAfterShredding != 0)
{
drive->state = Drive::CHECK_FAILED;
Logger::logThis()->info("Shred-Task: Checksum not zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
}
else
{
drive->state = Drive::CHECK_SUCCESSFUL;
Logger::logThis()->info("Shred-Task: Checksum zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
}
#endif
#endif
#endif
cleanup();
if ((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_ACTIVE))
if ((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_SUCCESSFUL) || (drive->state == Drive::CHECK_FAILED))
{
drive->state = Drive::NONE;
drive->setTaskPercentage(0.0);

View File

@ -63,6 +63,11 @@ void TUI::initTUI()
void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
{
if (isendwin())
{
return;
}
mxUIrefresh.lock();
uint16_t u16StdscrX, u16StdscrY;
getmaxyx(stdscr, u16StdscrY, u16StdscrX);
@ -140,6 +145,7 @@ void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
case Drive::NONE:
case Drive::SHRED_SELECTED:
case Drive::DELETE_SELECTED:
case Drive::CHECK_SUCCESSFUL:
if (it->bWasDeleted)
{
sState = "DELETED"; // mark drive as deleted previously
@ -160,7 +166,7 @@ void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
}
#ifdef ZERO_CHECK
if (bSelectedEntry && it->bWasChecked && (it->u32DriveChecksumAfterShredding != 0U))
if (bSelectedEntry && it->bWasChecked && (it->state == Drive::CHECK_FAILED))
{
dialog = createZeroChecksumWarning(70, 16, ((u16StdscrX) - (int)(u16StdscrX / 2) - 20), (int)(u16StdscrY / 2) - 8, it->getPath(), it->getModelFamily(), it->getModelName(), it->getSerial(), it->u32DriveChecksumAfterShredding);
wrefresh(dialog);
@ -250,6 +256,11 @@ enum TUI::UserInput TUI::readUserInput()
return TUI::UserInput::Undefined;
}
void TUI::terminateTUI()
{
endwin();
}
void TUI::centerTitle(WINDOW *pwin, const char *title)
{
int x, maxX, stringSize;