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_SELECTED,
SHRED_ACTIVE, // shred iterations active SHRED_ACTIVE, // shred iterations active
CHECK_ACTIVE, // optional checking active CHECK_ACTIVE, // optional checking active
CHECK_SUCCESSFUL,
CHECK_FAILED,
DELETE_SELECTED, DELETE_SELECTED,
DELETE_ACTIVE, DELETE_ACTIVE,
FROZEN FROZEN

View File

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

View File

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

View File

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

View File

@ -53,6 +53,23 @@ void Printer::print(Drive *drive)
sprintf(msgQueueData.driveData.caDriveErrors, "%i", drive->getErrorCount()); sprintf(msgQueueData.driveData.caDriveErrors, "%i", drive->getErrorCount());
sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li", drive->getActionStartTimestamp()); sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li", drive->getActionStartTimestamp());
sprintf(msgQueueData.driveData.caDriveShredDuration, "%li", drive->getTaskDuration()); 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); sprintf(msgQueueData.driveData.caDriveReHddVersion, REHDD_VERSION);
if (-1 == msgsnd(this->msqid, &msgQueueData, sizeof(t_msgQueueData) - sizeof(long), 0)) 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); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Terminate: case TUI::UserInput::Terminate:
cout << "Terminate" << endl; // cout << "Terminate" << endl;
stopShredAllDrives(&listDrives); stopShredAllDrives(&listDrives);
ui->terminateTUI();
sleep(5); // sleep 5 sec sleep(5); // sleep 5 sec
std::exit(1); // Terminates main, doesn't wait for threads std::exit(1); // Terminates main, doesn't wait for threads
break; break;
@ -408,10 +409,11 @@ void reHDD::filterIgnoredDrives(list<Drive> *plistDrives)
while ((getline(&cLine, &len, outputfileBlkid)) != -1) // parse UUID from blkid 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); string sBlkidOut = string(cLine);
sBlkidOut.erase(0, 18); sBlkidOut.erase(0, ptuuidPos + 8);
sBlkidOut.erase(8, sBlkidOut.length()); sBlkidOut.erase(8, sBlkidOut.length());
sUUID = sBlkidOut; sUUID = sBlkidOut;
// cout << "blkid uuid:" << sUUID << endl; // cout << "blkid uuid:" << sUUID << endl;

View File

@ -186,22 +186,23 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd)
drive->state = Drive::CHECK_ACTIVE; drive->state = Drive::CHECK_ACTIVE;
Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
drive->u32DriveChecksumAfterShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd); drive->u32DriveChecksumAfterShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd);
#ifdef LOG_LEVEL_HIGH
if (drive->u32DriveChecksumAfterShredding != 0) if (drive->u32DriveChecksumAfterShredding != 0)
{ {
drive->state = Drive::CHECK_FAILED;
Logger::logThis()->info("Shred-Task: Checksum not zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial()); Logger::logThis()->info("Shred-Task: Checksum not zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
} }
else else
{ {
drive->state = Drive::CHECK_SUCCESSFUL;
Logger::logThis()->info("Shred-Task: Checksum zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial()); Logger::logThis()->info("Shred-Task: Checksum zero: " + to_string(drive->u32DriveChecksumAfterShredding) + " - Drive: " + drive->getSerial());
} }
#endif #endif
#endif
#endif #endif
cleanup(); 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->state = Drive::NONE;
drive->setTaskPercentage(0.0); drive->setTaskPercentage(0.0);

View File

@ -63,6 +63,11 @@ void TUI::initTUI()
void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry) void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
{ {
if (isendwin())
{
return;
}
mxUIrefresh.lock(); mxUIrefresh.lock();
uint16_t u16StdscrX, u16StdscrY; uint16_t u16StdscrX, u16StdscrY;
getmaxyx(stdscr, u16StdscrY, u16StdscrX); getmaxyx(stdscr, u16StdscrY, u16StdscrX);
@ -140,6 +145,7 @@ void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
case Drive::NONE: case Drive::NONE:
case Drive::SHRED_SELECTED: case Drive::SHRED_SELECTED:
case Drive::DELETE_SELECTED: case Drive::DELETE_SELECTED:
case Drive::CHECK_SUCCESSFUL:
if (it->bWasDeleted) if (it->bWasDeleted)
{ {
sState = "DELETED"; // mark drive as deleted previously sState = "DELETED"; // mark drive as deleted previously
@ -160,7 +166,7 @@ void TUI::updateTUI(list<Drive> *plistDrives, uint8_t u8SelectedEntry)
} }
#ifdef ZERO_CHECK #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); 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); wrefresh(dialog);
@ -250,6 +256,11 @@ enum TUI::UserInput TUI::readUserInput()
return TUI::UserInput::Undefined; return TUI::UserInput::Undefined;
} }
void TUI::terminateTUI()
{
endwin();
}
void TUI::centerTitle(WINDOW *pwin, const char *title) void TUI::centerTitle(WINDOW *pwin, const char *title)
{ {
int x, maxX, stringSize; int x, maxX, stringSize;