From 8de45505e418ab7b937e4841414384a23200b303 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 29 Jun 2022 19:08:43 +0200 Subject: [PATCH 01/24] fix update script --- scripts/update.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/update.sh b/scripts/update.sh index f2b4394..c4479c0 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -2,15 +2,17 @@ echo starting update +systemctl stop /lib/systemd/system/getty@tty1.service.d + +cd /root/reHDD/ + FILE=./ignoreDrives.conf if test -f "$FILE"; then echo backup exits else - cp reHDD/ignoreDrives.conf ./ignoreDrives.conf + cp /root/reHDD/ignoreDrives.conf /root/ignoreDrives.conf fi -cd reHDD - git reset git stash force @@ -23,4 +25,6 @@ git pull make release -cp ../ignoreDrives.conf ./ +cp /root/ignoreDrives.conf /root/reHDD/ignoreDrives.conf + +systemctl start /lib/systemd/system/getty@tty1.service.d \ No newline at end of file From c61859ed4e01b863e4111bd679bfd7315bc43a37 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 29 Jun 2022 19:27:37 +0200 Subject: [PATCH 02/24] added shred speed to TUI --- include/reHDD.h | 2 +- include/tui.h | 2 +- src/tui.cpp | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 08d2ac4..a6cd242 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -29,7 +29,7 @@ #endif // 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 ZERO_CHECK_ALERT //check drive after shred if all bytes are zero, show alert if this fails diff --git a/include/tui.h b/include/tui.h index c18e64d..568affd 100644 --- a/include/tui.h +++ b/include/tui.h @@ -56,7 +56,7 @@ private: static WINDOW *createOverViewWindow( int iXSize, int iYSize); static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive); static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart); - static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, bool bSelected); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); diff --git a/src/tui.cpp b/src/tui.cpp index 6d2b4c0..fbbe9a0 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -151,7 +151,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, "424 MB/s", bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -305,7 +305,7 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) return newWindow; } -WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, bool bSelected) +WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -329,8 +329,9 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, mvwaddstr(newWindow,2, 1, sModelName.c_str()); mvwaddstr(newWindow,3, 1, sCapacity.c_str()); + mvwaddstr(newWindow,1, iXSize-sSpeed.length()-5, sSpeed.c_str()); mvwaddstr(newWindow,2, iXSize-sState.length()-5, sState.c_str()); - mvwaddstr(newWindow,3, iXSize-sState.length()-5, sTime.c_str()); + mvwaddstr(newWindow,3, iXSize-sTime.length()-5, sTime.c_str()); return newWindow; } From 9863c5591e5d5d10afc646994917b47d4f6a19f2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 30 Jun 2022 00:32:13 +0200 Subject: [PATCH 03/24] cal metric: shred speed --- include/drive.h | 6 ++++++ include/reHDD.h | 2 +- include/tui.h | 1 + makefile | 4 ++-- src/shred.cpp | 14 ++++++++++++++ src/tui.cpp | 15 +++++++++++++-- 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/drive.h b/include/drive.h index 5427eeb..6c76568 100644 --- a/include/drive.h +++ b/include/drive.h @@ -22,6 +22,12 @@ public: FROZEN } state; + struct { + time_t u32ShredTimeDelta; + std::chrono::time_point chronoShredTimestamp; + unsigned long ulWrittenBytes; + } sShredSpeed; + bool bWasShredded = false; bool bWasDeleteted = false; bool bIsOffline = false; diff --git a/include/reHDD.h b/include/reHDD.h index a6cd242..08d2ac4 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -29,7 +29,7 @@ #endif // 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 ZERO_CHECK_ALERT //check drive after shred if all bytes are zero, show alert if this fails diff --git a/include/tui.h b/include/tui.h index 568affd..18ad654 100644 --- a/include/tui.h +++ b/include/tui.h @@ -66,6 +66,7 @@ private: void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY); string formatTimeDuration(time_t u32Duration); + string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); }; #endif // TUI_H_ \ No newline at end of file diff --git a/makefile b/makefile index fe3ada5..9761a26 100644 --- a/makefile +++ b/makefile @@ -12,7 +12,7 @@ LIBS = # General compiler flags COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g # Additional release-specific flags -RCOMPILE_FLAGS = -D NDEBUG +RCOMPILE_FLAGS = -D NDEBUG -O3 # Additional debug-specific flags DCOMPILE_FLAGS = -D DEBUG # Add additional include paths @@ -51,7 +51,7 @@ ifeq ($(V),true) endif # Combine compiler and linker flags -release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) +release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) debug: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(DCOMPILE_FLAGS) debug: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(DLINK_FLAGS) diff --git a/src/shred.cpp b/src/shred.cpp index 8eee2d2..8476e2d 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -64,6 +64,8 @@ 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 + unsigned long 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()); @@ -73,6 +75,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) { unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position uint32_t u32ChunkDimensionIndex = 0U; + if(uiShredIterationCounter == (SHRED_ITERATIONS-1)) { @@ -136,14 +139,25 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) ulDriveByteCounter += iByteShredded; ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); + 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 drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; + + //set metrics for calculating shred speed + std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); + drive->sShredSpeed.u32ShredTimeDelta = (chronoCurrentTimestamp - drive->sShredSpeed.chronoShredTimestamp).count(); + drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + drive->sShredSpeed.ulWrittenBytes = ulSpeedMetricBytesWritten; + ulSpeedMetricBytesWritten = 0U; + + //signal process in shreding write(*ipSignalFd, "A",1); } diff --git a/src/tui.cpp b/src/tui.cpp index fbbe9a0..2a02ee6 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -77,9 +77,9 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) string sModelName = it->getModelName(); string sCapacity = it->sCapacityToText(); string sState = " "; + string sSpeed = " "; string sTime = " "; - bool bSelectedEntry = false; if(u8SelectedEntry == u8Index) @@ -107,6 +107,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); + sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); break; case Drive::DELETE_ACTIVE: sState = "Deleting ..."; @@ -151,7 +152,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, "424 MB/s", bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, sSpeed, bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -507,6 +508,16 @@ string TUI::formatTimeDuration(time_t u32Duration) return out.str(); } +string TUI::formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes){ + std::ostringstream out; + double dDeltaSec = ((double)((u32ShredTimeDelta)/1000000000.0)); //convert nano in sec + double speed = ((ulWrittenBytes/1000000.0)/dDeltaSec); + char s[25]; + sprintf(s, "%0.2lf MB/s", speed); + out << s; + return out.str(); +} + void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) { struct MenuState menustate; From e3aefb24eefbd5721cd6dc390ad5eb79bbbb3d91 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 20 Aug 2022 16:09:40 +0200 Subject: [PATCH 04/24] added feature to start shredding for all drives --- include/drive.h | 5 +++-- include/reHDD.h | 7 +++++-- include/shred.h | 2 +- include/tui.h | 2 +- src/reHDD.cpp | 44 +++++++++++++++++++++++++++++++++++--------- src/shred.cpp | 3 ++- src/tui.cpp | 13 ++++++++----- 7 files changed, 55 insertions(+), 21 deletions(-) diff --git a/include/drive.h b/include/drive.h index 6c76568..6d08433 100644 --- a/include/drive.h +++ b/include/drive.h @@ -22,12 +22,13 @@ public: FROZEN } state; - struct { + struct + { time_t u32ShredTimeDelta; std::chrono::time_point chronoShredTimestamp; unsigned long ulWrittenBytes; } sShredSpeed; - + bool bWasShredded = false; bool bWasDeleteted = false; bool bIsOffline = false; diff --git a/include/reHDD.h b/include/reHDD.h index 08d2ac4..d542b94 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -64,6 +64,8 @@ using namespace std; #include "tui.h" #include "logger/logger.h" +#include "chunk.h" + extern Logger* logging; template T* iterator_to_pointer(I i) @@ -83,12 +85,13 @@ private: static void searchDrives(list * plistDrives); static void printDrives(list * plistDrives); - static void filterIgnoredDrives(list * plistDrives); + static void startShredAllDrives(list * plistDrives); + static void filterIgnoredDrives(list * plistDrives); static void filterNewDrives(list * plistOldDrives, list * plistNewDrives); static void addSMARTData(list * plistDrives); static void ThreadScannDevices(); static void ThreadUserInput(); - static void ThreadShred(); + static void ThreadShred(Drive* const pDrive); static void ThreadDelete(); static void ThreadCheckFrozenDrives(); static void handleArrowKey(TUI::UserInput userInput); diff --git a/include/shred.h b/include/shred.h index a89457e..26f2154 100644 --- a/include/shred.h +++ b/include/shred.h @@ -22,7 +22,7 @@ //#define DEMO_DRIVE_SIZE 1024*1024*256L // 256MB //#define DEMO_DRIVE_SIZE 1024*1024*1024L // 1GB -//#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB +#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB typedef int fileDescriptor; diff --git a/include/tui.h b/include/tui.h index 18ad654..d20e890 100644 --- a/include/tui.h +++ b/include/tui.h @@ -22,7 +22,7 @@ protected: public: - enum UserInput { UpKey, DownKey, Abort, Shred, Delete, Enter, ESC, Undefined}; + enum UserInput { UpKey, DownKey, Abort, Shred, ShredAll, Delete, Enter, ESC, Undefined}; struct MenuState { bool bAbort; diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 3c05ddc..dc2dd19 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -178,6 +178,11 @@ void reHDD::ThreadUserInput() } ui->updateTUI(&listDrives, u8SelectedEntry); break; + case TUI::UserInput::ShredAll: + cout << "ShredAll" << endl; + startShredAllDrives(&listDrives); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; case TUI::UserInput::Enter: //cout << "Enter" << endl; handleEnter(); @@ -194,13 +199,13 @@ void reHDD::ThreadUserInput() } } -void reHDD::ThreadShred() +void reHDD::ThreadShred(Drive* const pDrive) { - if (getSelectedDrive() != nullptr) + if (pDrive != nullptr) { - getSelectedDrive()->setActionStartTimestamp(); //save timestamp at start of shredding + pDrive->setActionStartTimestamp(); //save timestamp at start of shredding Shred* pShredTask = new Shred(); //create new shred task - pShredTask->shredDrive(getSelectedDrive(), &fdShredInformPipe[1]); //start new shred task + pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); //start new shred task delete pShredTask; //delete shred task ui->updateTUI(&listDrives, u8SelectedEntry); } @@ -279,7 +284,7 @@ void reHDD::filterNewDrives(list * plistOldDrives, list * plistNew for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end(); ++itNew) { plistOldDrives->push_back(*itNew); - Logger::logThis()->info("Add new drive: " + itNew->getModelName()); + //Logger::logThis()->info("Add new drive: " + itNew->getModelName()); } plistNewDrives->clear(); } @@ -291,7 +296,7 @@ void reHDD::filterNewDrives(list * plistOldDrives, list * plistNew */ void reHDD::searchDrives(list * plistDrives) { - Logger::logThis()->info("--> search drives <--"); + //Logger::logThis()->info("--> search drives <--"); char * cLine = NULL; size_t len = 0; @@ -329,7 +334,7 @@ void reHDD::filterIgnoredDrives(list * plistDrives) for(string sLine; getline( input, sLine );) { - Logger::logThis()->info("read uuid: " + sLine); + //Logger::logThis()->info("read uuid: " + sLine); vtlIgnoredDevices.emplace_back(sLine); //add found path and uuid from ignore file to vector } //loop through found entries in ingnore file @@ -377,6 +382,26 @@ void reHDD::filterIgnoredDrives(list * plistDrives) } } +/** + * \brief start shred for all drives + * \param pointer of list * plistDrives + * \return void + */ +void reHDD::startShredAllDrives(list * plistDrives) +{ + list ::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if(it->state == Drive::NONE) + { + it->state = Drive::SHRED_ACTIVE; + Logger::logThis()->info("all start: " + it->getSerial()); + Drive* pTmpDrive = iterator_to_pointer::iterator > (it); + thread(ThreadShred, std::ref(pTmpDrive)).detach(); + } + } +} + /** * \brief print drives with all information * \param pointer of list * plistDrives @@ -454,7 +479,7 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) break; } - Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry)); + //Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry)); } void reHDD::handleEnter() @@ -466,7 +491,8 @@ void reHDD::handleEnter() Logger::logThis()->info("Started shred for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; //task for drive is running --> don´t show more task options - thread(ThreadShred).detach(); + Drive* pTmpDrive = getSelectedDrive(); + thread(ThreadShred, std::ref(pTmpDrive)).detach(); } if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) diff --git a/src/shred.cpp b/src/shred.cpp index 8476e2d..258b526 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -26,6 +26,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) { #ifdef DRYRUN + Logger::logThis()->info("Shred-Task started - Drive: " + drive->getSerial()); for(int i = 0; i<=500; i++) { if(drive->state != Drive::SHRED_ACTIVE) @@ -75,7 +76,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) { unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position uint32_t u32ChunkDimensionIndex = 0U; - + if(uiShredIterationCounter == (SHRED_ITERATIONS-1)) { diff --git a/src/tui.cpp b/src/tui.cpp index 2a02ee6..12a9432 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -97,7 +97,6 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) stringstream stream; - switch (it->state) { case Drive::SHRED_ACTIVE: @@ -204,6 +203,9 @@ enum TUI::UserInput TUI::readUserInput() case 's': return TUI::UserInput::Shred; break; + case 'S': + return TUI::UserInput::ShredAll; + break; default: return TUI::UserInput::Undefined; break; @@ -386,19 +388,19 @@ WINDOW* TUI::createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, st if(menustate.bAbort) { - string sLineTmp = "Press A for Abort"; + string sLineTmp = "Press a for Abort"; mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str()); u16Line++; } if(menustate.bShred) { - string sLineTmp = "Press S for Shred "; + string sLineTmp = "Press s for Shred (S for all drives)"; mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str()); u16Line++; } if(menustate.bDelete) { - string sLineTmp = "Press D for Delete"; + string sLineTmp = "Press d for Delete"; mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str()); } @@ -508,7 +510,8 @@ string TUI::formatTimeDuration(time_t u32Duration) return out.str(); } -string TUI::formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes){ +string TUI::formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes) +{ std::ostringstream out; double dDeltaSec = ((double)((u32ShredTimeDelta)/1000000000.0)); //convert nano in sec double speed = ((ulWrittenBytes/1000000.0)/dDeltaSec); From b6f0c5e89ffe377112a18fdd17e1ad7d7128e1fa Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 20 Aug 2022 16:11:48 +0200 Subject: [PATCH 05/24] fix missing include --- include/reHDD.h | 2 -- include/shred.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index d542b94..47dc8bd 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -64,8 +64,6 @@ using namespace std; #include "tui.h" #include "logger/logger.h" -#include "chunk.h" - extern Logger* logging; template T* iterator_to_pointer(I i) diff --git a/include/shred.h b/include/shred.h index 26f2154..a89457e 100644 --- a/include/shred.h +++ b/include/shred.h @@ -22,7 +22,7 @@ //#define DEMO_DRIVE_SIZE 1024*1024*256L // 256MB //#define DEMO_DRIVE_SIZE 1024*1024*1024L // 1GB -#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB +//#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB typedef int fileDescriptor; From 70f5727eb3de813ff63a407ddd017fdccb98c440 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 21 Aug 2022 15:52:47 +0200 Subject: [PATCH 06/24] protect lists with mutex --- .gitignore | 5 +++-- ignoreDrives.conf | 1 + src/drive.cpp | 1 - src/reHDD.cpp | 40 +++++++++++++++++++++++++--------------- src/shred.cpp | 4 +++- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 9862cb4..68a7334 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,8 @@ reHDD -reHDD.log - +*.log +*.ods +*.txt ignoreDrives.conf diff --git a/ignoreDrives.conf b/ignoreDrives.conf index 06e17c4..b9453cc 100644 --- a/ignoreDrives.conf +++ b/ignoreDrives.conf @@ -1,2 +1,3 @@ 4673974d 2cb3dea4 +8ffbc421 diff --git a/src/drive.cpp b/src/drive.cpp index 35f934e..837b089 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -67,7 +67,6 @@ string Drive::sErrorCountToText() return to_string(getErrorCount()); } - string Drive::sPowerOnHoursToText() { double dDays = 0U; diff --git a/src/reHDD.cpp b/src/reHDD.cpp index dc2dd19..0b70e92 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -11,7 +11,7 @@ static int fdNewDrivesInformPipe[2];//File descriptor for pipe that informs if n static int fdShredInformPipe[2];//File descriptor for pipe that informs if a wipe thread signals -static std::mutex mxScannDrives; +static std::mutex mxDrives; list listNewDrives; //store found drives that are updated every 5sec @@ -60,12 +60,12 @@ void reHDD::app_logic(void) if(FD_ISSET(fdNewDrivesInformPipe[0], &selectSet)) { - mxScannDrives.lock(); + mxDrives.lock(); char dummy; read (fdNewDrivesInformPipe[0],&dummy,1); filterNewDrives(&listDrives, &listNewDrives); //filter and copy to app logic vector printDrives(&listDrives); - mxScannDrives.unlock(); + mxDrives.unlock(); } if(FD_ISSET(fdShredInformPipe[0], &selectSet)) { @@ -101,12 +101,12 @@ void reHDD::ThreadScannDevices() { while(true) { - mxScannDrives.lock(); + mxDrives.lock(); listNewDrives.clear(); searchDrives(&listNewDrives); //search for new drives and store them in list filterIgnoredDrives(&listNewDrives); //filter out ignored drives addSMARTData(&listNewDrives); //add S.M.A.R.T. Data to the drives - mxScannDrives.unlock(); + mxDrives.unlock(); write(fdNewDrivesInformPipe[1], "A",1); sleep(5); //sleep 5 sec } @@ -116,7 +116,7 @@ void reHDD::ThreadCheckFrozenDrives() { while(true) { - mxScannDrives.lock(); + mxDrives.lock(); for(auto it = begin(listDrives); it != end(listDrives); ++it) { if(it->state == Drive::SHRED_ACTIVE) @@ -124,7 +124,7 @@ void reHDD::ThreadCheckFrozenDrives() it->checkFrozenDrive(); } } - mxScannDrives.unlock(); + mxDrives.unlock(); sleep(13); //sleep 13 sec } } @@ -156,7 +156,7 @@ void reHDD::ThreadUserInput() break; case TUI::UserInput::Delete: //cout << "Delete" << endl; - + mxDrives.lock(); if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::NONE) @@ -164,11 +164,12 @@ void reHDD::ThreadUserInput() getSelectedDrive()->state = Drive::DELETE_SELECTED; } } + mxDrives.unlock(); ui->updateTUI(&listDrives, u8SelectedEntry); break; case TUI::UserInput::Shred: //cout << "Shred" << endl; - + mxDrives.lock(); if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::NONE) @@ -176,10 +177,11 @@ void reHDD::ThreadUserInput() getSelectedDrive()->state = Drive::SHRED_SELECTED; } } + mxDrives.unlock(); ui->updateTUI(&listDrives, u8SelectedEntry); break; case TUI::UserInput::ShredAll: - cout << "ShredAll" << endl; + //cout << "ShredAll" << endl; startShredAllDrives(&listDrives); ui->updateTUI(&listDrives, u8SelectedEntry); break; @@ -251,7 +253,7 @@ void reHDD::filterNewDrives(list * plistOldDrives, list * plistNew //search offline drives and mark them for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) { - itOld->bIsOffline = true; //set offline befor seachring in the new list + itOld->bIsOffline = true; //set offline before searching in the new list for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end();) { if((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath())) @@ -390,16 +392,22 @@ void reHDD::filterIgnoredDrives(list * plistDrives) void reHDD::startShredAllDrives(list * plistDrives) { list ::iterator it; + mxDrives.lock(); for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { if(it->state == Drive::NONE) { - it->state = Drive::SHRED_ACTIVE; - Logger::logThis()->info("all start: " + it->getSerial()); Drive* pTmpDrive = iterator_to_pointer::iterator > (it); - thread(ThreadShred, std::ref(pTmpDrive)).detach(); +#ifdef LOG_LEVEL_HIGH + ostringstream address; + address << (void const *)&(*pTmpDrive); + Logger::logThis()->info("Started shred (all) for: " + pTmpDrive->getModelName() + "-" + pTmpDrive->getSerial() + " @" + address.str()); +#endif + pTmpDrive->state = Drive::TaskState::SHRED_ACTIVE; + thread(ThreadShred, pTmpDrive).detach(); } } + mxDrives.unlock(); } /** @@ -484,6 +492,7 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleEnter() { + mxDrives.lock(); if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) @@ -492,7 +501,7 @@ void reHDD::handleEnter() getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; //task for drive is running --> don´t show more task options Drive* pTmpDrive = getSelectedDrive(); - thread(ThreadShred, std::ref(pTmpDrive)).detach(); + thread(ThreadShred, pTmpDrive).detach(); } if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) @@ -503,6 +512,7 @@ void reHDD::handleEnter() thread(ThreadDelete).detach(); } } + mxDrives.unlock(); } void reHDD::handleESC() diff --git a/src/shred.cpp b/src/shred.cpp index 258b526..b1281c3 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -24,9 +24,11 @@ Shred::~Shred() */ 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()); #ifdef DRYRUN - Logger::logThis()->info("Shred-Task started - Drive: " + drive->getSerial()); for(int i = 0; i<=500; i++) { if(drive->state != Drive::SHRED_ACTIVE) From 4862a45ef67e6f9aee05b79d08d03734a223ffca Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 21 Aug 2022 16:24:55 +0200 Subject: [PATCH 07/24] remove unnecessary mutesx --- src/reHDD.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 0b70e92..198b059 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -156,7 +156,7 @@ void reHDD::ThreadUserInput() break; case TUI::UserInput::Delete: //cout << "Delete" << endl; - mxDrives.lock(); + if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::NONE) @@ -164,12 +164,12 @@ void reHDD::ThreadUserInput() getSelectedDrive()->state = Drive::DELETE_SELECTED; } } - mxDrives.unlock(); + ui->updateTUI(&listDrives, u8SelectedEntry); break; case TUI::UserInput::Shred: //cout << "Shred" << endl; - mxDrives.lock(); + if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::NONE) @@ -177,7 +177,7 @@ void reHDD::ThreadUserInput() getSelectedDrive()->state = Drive::SHRED_SELECTED; } } - mxDrives.unlock(); + ui->updateTUI(&listDrives, u8SelectedEntry); break; case TUI::UserInput::ShredAll: @@ -492,7 +492,7 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleEnter() { - mxDrives.lock(); + if (getSelectedDrive() != nullptr) { if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) @@ -512,7 +512,6 @@ void reHDD::handleEnter() thread(ThreadDelete).detach(); } } - mxDrives.unlock(); } void reHDD::handleESC() From d7aaa9647d31a529734ce47e19b6a17d294ab160 Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 14:24:31 +0200 Subject: [PATCH 08/24] added Threefish cipher as submodule --- .gitmodules | 6 ++++++ makefile | 19 ++++++++++++++++--- src/shred.cpp | 22 ++++++++++++++++++++++ tfnoisegen | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 .gitmodules create mode 160000 tfnoisegen diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d2aa5f1 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "--force"] + path = --force + url = https://git.mosad.xyz/localhorst/tfnoisegen.git +[submodule "tfnoisegen"] + path = tfnoisegen + url = https://git.mosad.xyz/localhorst/tfnoisegen.git diff --git a/makefile b/makefile index 9761a26..a667dce 100644 --- a/makefile +++ b/makefile @@ -8,7 +8,7 @@ SRC_EXT = cpp # Path to the source directory, relative to the makefile SRC_PATH = src # Space-separated pkg-config libraries used by this project -LIBS = +LIBS = lib # General compiler flags COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g # Additional release-specific flags @@ -18,9 +18,12 @@ DCOMPILE_FLAGS = -D DEBUG # Add additional include paths INCLUDES = include # General linker settings -LINK_FLAGS = -lpthread -lncurses +LINK_FLAGS = -Llib -lpthread -lncurses -ltfng + # Doc DOCDIR = doc +TFRANDDIR = tfnoisegen +TFRANDLIB = libtfng.a #### END PROJECT SETTINGS #### # Optionally you may move the section above to a separate config.mk file, and @@ -52,7 +55,7 @@ endif # Combine compiler and linker flags release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) -release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) +release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) debug: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(DCOMPILE_FLAGS) debug: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(DLINK_FLAGS) @@ -158,6 +161,7 @@ dirs: @echo "Creating directories" @mkdir -p $(dir $(OBJECTS)) @mkdir -p $(BIN_PATH) + @mkdir -p $(LIBS) # Removes all build files .PHONY: clean @@ -167,18 +171,27 @@ clean: @echo "Deleting directories" @$(RM) -r build @$(RM) -r bin + @$(RM) -r $(LIBS) @$(RM) -f reHDD.log + $(MAKE) clean -C tfnoisegen # Main rule, checks the executable and symlinks to the output all: $(BIN_PATH)/$(BIN_NAME) + $(MAKE) libtfng.a -C tfnoisegen + @cp $(TFRANDDIR)/$(TFRANDLIB) $(LIBS) + @echo "Making symlink: $(BIN_NAME) -> $<" @$(RM) $(BIN_NAME) @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME) # Link the executable $(BIN_PATH)/$(BIN_NAME): $(OBJECTS) + $(MAKE) libtfng.a -C tfnoisegen + @cp $(TFRANDDIR)/$(TFRANDLIB) $(LIBS) @echo "Linking: $@" @$(START_TIME) + @echo $(LDFLAGS) + @ls lib/ $(CMD_PREFIX)$(CXX) $(OBJECTS) $(LDFLAGS) -o $@ @echo -en "\t Link time: " @$(END_TIME) diff --git a/src/shred.cpp b/src/shred.cpp index b1281c3..457f7c9 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -7,10 +7,32 @@ #include "../include/reHDD.h" +#ifdef __cplusplus +extern "C" { +#endif +#include "../tfnoisegen/tfprng.h" +#ifdef __cplusplus +} +#endif + const static char *randomsrc = (char*) "/dev/urandom"; + +#define DATASIZE 65536 + + + Shred::Shred() { + +static char data[DATASIZE]; +static char key[TFNG_KEY_SIZE]; +tfng_prng_seedkey(key); + + tfng_prng_genrandom(data, DATASIZE); + + Logger::logThis()->info("RandomData: " + to_string(data[0])); + } Shred::~Shred() diff --git a/tfnoisegen b/tfnoisegen new file mode 160000 index 0000000..488716e --- /dev/null +++ b/tfnoisegen @@ -0,0 +1 @@ +Subproject commit 488716ef22ac5a1aae235a59bea2997ac7e8e45a From f0f1e4fd93494fe60b1b7c63ddd881b4b50c8cf3 Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 14:27:42 +0200 Subject: [PATCH 09/24] remove false git submodule --- .gitignore | 2 ++ .gitmodules | 3 --- makefile | 5 ++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 68a7334..fef63b0 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,6 @@ reHDD *.ods *.txt +.vscode/ + ignoreDrives.conf diff --git a/.gitmodules b/.gitmodules index d2aa5f1..fec9e60 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "--force"] - path = --force - url = https://git.mosad.xyz/localhorst/tfnoisegen.git [submodule "tfnoisegen"] path = tfnoisegen url = https://git.mosad.xyz/localhorst/tfnoisegen.git diff --git a/makefile b/makefile index a667dce..0e51b7b 100644 --- a/makefile +++ b/makefile @@ -54,8 +54,8 @@ ifeq ($(V),true) endif # Combine compiler and linker flags -release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) -release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) +release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) +release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) debug: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(DCOMPILE_FLAGS) debug: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(DLINK_FLAGS) @@ -179,7 +179,6 @@ clean: all: $(BIN_PATH)/$(BIN_NAME) $(MAKE) libtfng.a -C tfnoisegen @cp $(TFRANDDIR)/$(TFRANDLIB) $(LIBS) - @echo "Making symlink: $(BIN_NAME) -> $<" @$(RM) $(BIN_NAME) @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME) From 4cf1efea7ab3f71907a5b81761827f480a237c10 Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 14:36:52 +0200 Subject: [PATCH 10/24] updated readme for submodules --- README.md | 7 +++++++ makefile | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6f37f0..5ed75bc 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ ## Debian Build Notes * `apt-get install ncurses-dev git make g++` +* `git submodule init` +* `git submodule update` * `make release` ## Create Standalone with Debian 11 @@ -29,6 +31,11 @@ Instructions how to create a standalone machine that boots directly to reHDD. Th clone this repo into /root/ +``` +git submodule init +git submodule update +``` + `cd /root/reHDD/` `make release` diff --git a/makefile b/makefile index 0e51b7b..b8e3e3b 100644 --- a/makefile +++ b/makefile @@ -189,8 +189,6 @@ $(BIN_PATH)/$(BIN_NAME): $(OBJECTS) @cp $(TFRANDDIR)/$(TFRANDLIB) $(LIBS) @echo "Linking: $@" @$(START_TIME) - @echo $(LDFLAGS) - @ls lib/ $(CMD_PREFIX)$(CXX) $(OBJECTS) $(LDFLAGS) -o $@ @echo -en "\t Link time: " @$(END_TIME) From 09446b52ca91386c990b61b5c3ed9709a44b451a Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 15:27:29 +0200 Subject: [PATCH 11/24] using tfng instead of urandom --- include/shred.h | 6 ++-- src/reHDD.cpp | 2 +- src/shred.cpp | 83 +++++++++++++++++++------------------------------ 3 files changed, 37 insertions(+), 54 deletions(-) diff --git a/include/shred.h b/include/shred.h index a89457e..2e34556 100644 --- a/include/shred.h +++ b/include/shred.h @@ -18,7 +18,8 @@ #include #define CHUNK_SIZE 1024*1024*2 //amount of bytes that are overwritten at once --> 2MB -#define CHUNK_DIMENSION 100U //amount of chunks are read at once from random source +//#define CHUNK_SIZE 1024U*4U //amount of bytes that are overwritten at once +#define TFNG_DATA_SIZE 65536U //amount of bytes used by tfng //#define DEMO_DRIVE_SIZE 1024*1024*256L // 256MB //#define DEMO_DRIVE_SIZE 1024*1024*1024L // 1GB @@ -39,7 +40,8 @@ public: private: fileDescriptor randomSrcFileDiscr; fileDescriptor driveFileDiscr; - unsigned char caChunk[CHUNK_DIMENSION][CHUNK_SIZE]; + unsigned char caTfngData[TFNG_DATA_SIZE]; + unsigned char caReadBuffer[CHUNK_SIZE]; unsigned long ulDriveByteSize; unsigned long ulDriveByteOverallCount = 0; //all bytes shredded in all iterations + checking -> used for progress calculation double d32Percent = 0.0; diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 198b059..265b091 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -402,7 +402,7 @@ void reHDD::startShredAllDrives(list * plistDrives) ostringstream address; address << (void const *)&(*pTmpDrive); Logger::logThis()->info("Started shred (all) for: " + pTmpDrive->getModelName() + "-" + pTmpDrive->getSerial() + " @" + address.str()); -#endif +#endif pTmpDrive->state = Drive::TaskState::SHRED_ACTIVE; thread(ThreadShred, pTmpDrive).detach(); } diff --git a/src/shred.cpp b/src/shred.cpp index 457f7c9..4eeb2b3 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -2,7 +2,7 @@ * @file shred.cpp * @brief shred drive * @author hendrik schutter - * @date 03.05.2020 + * @date 22.08.2022 */ #include "../include/reHDD.h" @@ -17,22 +17,8 @@ extern "C" { const static char *randomsrc = (char*) "/dev/urandom"; - -#define DATASIZE 65536 - - - Shred::Shred() { - -static char data[DATASIZE]; -static char key[TFNG_KEY_SIZE]; -tfng_prng_seedkey(key); - - tfng_prng_genrandom(data, DATASIZE); - - Logger::logThis()->info("RandomData: " + to_string(data[0])); - } Shred::~Shred() @@ -65,6 +51,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) #ifndef DRYRUN const char *cpDrivePath = drive->getPath().c_str(); + unsigned char ucKey[TFNG_KEY_SIZE]; //open random source randomSrcFileDiscr = open(randomsrc, O_RDONLY | O_LARGEFILE); @@ -88,6 +75,19 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) return -1; } + //read key for random generator + ssize_t readRet = read(randomSrcFileDiscr, ucKey, sizeof(ucKey)) ; + if (readRet <= 0) + { + std::string errorMsg(strerror(readRet)); + Logger::logThis()->error("Shred-Task: Read random key failed! " + errorMsg + " - Drive: " + drive->getSerial()); + perror(randomsrc); + cleanup(); + return -1; + } + + tfng_prng_seedkey(ucKey); + this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr); drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now();; //set inital timestamp for speed metric unsigned long ulSpeedMetricBytesWritten = 0U; //uses to calculate speed metric @@ -99,45 +99,21 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) for (unsigned int uiShredIterationCounter = 0U; uiShredIterationCounter < SHRED_ITERATIONS; uiShredIterationCounter++) { unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position - uint32_t u32ChunkDimensionIndex = 0U; - if(uiShredIterationCounter == (SHRED_ITERATIONS-1)) { - //last shred iteration --> overwrite with zeros instead with random data - memset(caChunk, 0U, CHUNK_DIMENSION*CHUNK_SIZE); + //last shred iteration --> overwrite (just the write chunk) bytes with zeros instead with random data + memset(caTfngData, 0U, CHUNK_SIZE); } while (ulDriveByteCounter < ulDriveByteSize) { int iBytesToShred = 0; //Bytes that will be overwritten in this chunk-iteration - if((u32ChunkDimensionIndex == 0U) && (uiShredIterationCounter != (SHRED_ITERATIONS-1))) + if(uiShredIterationCounter != (SHRED_ITERATIONS-1)) { - //read new chunks from random source if needed and this is NOT the last shred iteration - unsigned long ulBytesInChunkBuffer = 0U; - - while (ulBytesInChunkBuffer < CHUNK_DIMENSION*CHUNK_SIZE) - { - //read new random bytes - int iReadBytes = read(randomSrcFileDiscr, caChunk, ((CHUNK_DIMENSION*CHUNK_SIZE)-ulBytesInChunkBuffer)); - if (iReadBytes > 0) - { - ulBytesInChunkBuffer += iReadBytes; - } - else - { - std::string errorMsg(strerror(iReadBytes)); - Logger::logThis()->error("Shred-Task: Read from random source failed! " + errorMsg + " - Drive: " + drive->getSerial()); - perror("unable to read random data"); - cleanup(); - return -1;; - } - } //end chunk read -#ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("Shred-Task: Read new random data - Drive: " + drive->getSerial()); -#endif - + //NOT last shred iteration --> generate new random data + tfng_prng_genrandom(caTfngData, TFNG_DATA_SIZE); } if((ulDriveByteSize-ulDriveByteCounter) < CHUNK_SIZE) @@ -149,7 +125,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) iBytesToShred = CHUNK_SIZE; } - int iByteShredded = write(driveFileDiscr, caChunk[u32ChunkDimensionIndex], iBytesToShred); + int iByteShredded = write(driveFileDiscr, caTfngData, iBytesToShred); if(iByteShredded <= 0) { @@ -160,7 +136,6 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) return -1; } - u32ChunkDimensionIndex = (u32ChunkDimensionIndex+1)%CHUNK_DIMENSION; ulDriveByteCounter += iByteShredded; ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); @@ -196,13 +171,19 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) cleanup(); return -1; } - }//end one chunk write + //end one chunk write + } if(0 != iRewindDrive(driveFileDiscr)) { + Logger::logThis()->error("Shred-Task: Unable to rewind drive! - Drive: " + drive->getSerial()); cleanup(); return -1; } - } //end one shred iteration + //end one shred iteration + } + //end of all shred iteratio + + tfng_prng_seedkey(NULL); //reset random generator #ifdef ZERO_CHECK_ALERT drive->u32DriveChecksumAferShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd); @@ -289,10 +270,10 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSign { iBytesToCheck = CHUNK_SIZE; } - int iReadBytes = read(file, caChunk, iBytesToCheck); + int iReadBytes = read(file, caReadBuffer, iBytesToCheck); for (int iReadBytesCounter = 0U; iReadBytesCounter < iReadBytes; iReadBytesCounter++) { - uiChecksum += caChunk[0][iReadBytesCounter]; + uiChecksum += caReadBuffer[iReadBytesCounter]; } ulDriveByteCounter += iReadBytes; ulDriveByteOverallCount += iReadBytes; @@ -313,5 +294,5 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSign void Shred::cleanup() { close(driveFileDiscr); - close( randomSrcFileDiscr); + close(randomSrcFileDiscr); } \ No newline at end of file From edcf680b95023b8fc49205bc1e0859fee350e3fb Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 18:35:27 +0200 Subject: [PATCH 12/24] update shred metric in main thread instead of shred thread --- include/drive.h | 1 + include/reHDD.h | 2 ++ src/reHDD.cpp | 32 ++++++++++++++++++++++++++++++++ src/shred.cpp | 12 ++---------- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/include/drive.h b/include/drive.h index 6d08433..a4e0771 100644 --- a/include/drive.h +++ b/include/drive.h @@ -27,6 +27,7 @@ public: time_t u32ShredTimeDelta; std::chrono::time_point chronoShredTimestamp; unsigned long ulWrittenBytes; + unsigned long ulSpeedMetricBytesWritten; } sShredSpeed; bool bWasShredded = false; diff --git a/include/reHDD.h b/include/reHDD.h index 47dc8bd..0dbbda2 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -15,6 +15,7 @@ #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond #define SHRED_ITERATIONS 3U #define FROZEN_TIMEOUT 10 //After this timeout (minutes) the drive will be marked as frozen +#define METRIC_THRESHOLD 3UL*1000UL*1000UL*1000UL //calc shred speed with this minimum of time delta // Logger Settings #define LOG_PATH "./reHDD.log" @@ -84,6 +85,7 @@ private: static void searchDrives(list * plistDrives); static void printDrives(list * plistDrives); static void startShredAllDrives(list * plistDrives); + static void updateShredMetrics(list * plistDrives); static void filterIgnoredDrives(list * plistDrives); static void filterNewDrives(list * plistOldDrives, list * plistNewDrives); static void addSMARTData(list * plistDrives); diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 265b091..d462d8d 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -71,9 +71,14 @@ void reHDD::app_logic(void) { char dummy; read (fdShredInformPipe[0],&dummy,1); + updateShredMetrics(&listDrives); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("got progress signal from a shred task"); #endif + + + + } ui->updateTUI(&listDrives, u8SelectedEntry); } //endless loop @@ -445,6 +450,33 @@ void reHDD::printDrives(list * plistDrives) #endif } +/** + * \brief update shred metrics for all drives + * \param pointer of list * plistDrives + * \return void + */ +void reHDD::updateShredMetrics(list * plistDrives) +{ + list ::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if(it->state == Drive::SHRED_ACTIVE) + { + Drive* pTmpDrive = iterator_to_pointer::iterator > (it); + //set metrics for calculating shred speed + std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); + time_t u32ShredTimeDelta = (chronoCurrentTimestamp - pTmpDrive->sShredSpeed.chronoShredTimestamp).count(); + if(u32ShredTimeDelta > METRIC_THRESHOLD) + { + pTmpDrive->sShredSpeed.u32ShredTimeDelta = u32ShredTimeDelta; + pTmpDrive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + pTmpDrive->sShredSpeed.ulWrittenBytes = pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten; + pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; + } + } + } +} + /** * \brief add S.M.A.R.T data from SMART * \param pointer of list * plistDrives diff --git a/src/shred.cpp b/src/shred.cpp index 4eeb2b3..0734030 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -90,7 +90,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 - unsigned long 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()); @@ -139,7 +139,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) ulDriveByteCounter += iByteShredded; ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); - ulSpeedMetricBytesWritten += iByteShredded; + 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()); @@ -149,14 +149,6 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) //set shred percantage drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; - - //set metrics for calculating shred speed - std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); - drive->sShredSpeed.u32ShredTimeDelta = (chronoCurrentTimestamp - drive->sShredSpeed.chronoShredTimestamp).count(); - drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); - drive->sShredSpeed.ulWrittenBytes = ulSpeedMetricBytesWritten; - ulSpeedMetricBytesWritten = 0U; - //signal process in shreding write(*ipSignalFd, "A",1); } From d92448aa97299670967cdd9aef0abf34e1cbd3da Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 23:09:41 +0200 Subject: [PATCH 13/24] optimal chunk size --- include/reHDD.h | 2 +- include/shred.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 0dbbda2..eb56a2e 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -15,7 +15,7 @@ #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond #define SHRED_ITERATIONS 3U #define FROZEN_TIMEOUT 10 //After this timeout (minutes) the drive will be marked as frozen -#define METRIC_THRESHOLD 3UL*1000UL*1000UL*1000UL //calc shred speed with this minimum of time delta +#define METRIC_THRESHOLD 3L*1000L*1000L*1000L //calc shred speed with this minimum of time delta // Logger Settings #define LOG_PATH "./reHDD.log" diff --git a/include/shred.h b/include/shred.h index 2e34556..f44a32e 100644 --- a/include/shred.h +++ b/include/shred.h @@ -17,9 +17,9 @@ #include #include -#define CHUNK_SIZE 1024*1024*2 //amount of bytes that are overwritten at once --> 2MB -//#define CHUNK_SIZE 1024U*4U //amount of bytes that are overwritten at once -#define TFNG_DATA_SIZE 65536U //amount of bytes used by tfng + +#define CHUNK_SIZE 1024*1024*32 //amount of bytes that are overwritten at once --> 32MB +#define TFNG_DATA_SIZE CHUNK_SIZE //amount of bytes used by tfng //#define DEMO_DRIVE_SIZE 1024*1024*256L // 256MB //#define DEMO_DRIVE_SIZE 1024*1024*1024L // 1GB From 50bd896cb9bff538e20ee7ff86e5b9ea616494cf Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 23:42:20 +0200 Subject: [PATCH 14/24] display SN in overview for entry --- include/tui.h | 2 +- src/tui.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/tui.h b/include/tui.h index d20e890..c10d3be 100644 --- a/include/tui.h +++ b/include/tui.h @@ -56,7 +56,7 @@ private: static WINDOW *createOverViewWindow( int iXSize, int iYSize); static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive); static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart); - static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); diff --git a/src/tui.cpp b/src/tui.cpp index 12a9432..ce7d1e2 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -74,7 +74,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { string sModelFamily = it->getModelFamily(); - string sModelName = it->getModelName(); + string sSerial = it->getSerial(); string sCapacity = it->sCapacityToText(); string sState = " "; string sSpeed = " "; @@ -151,7 +151,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, sSpeed, bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -308,7 +308,7 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) return newWindow; } -WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) +WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -329,7 +329,7 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, box(newWindow, ACS_VLINE, ACS_HLINE); mvwaddstr(newWindow,1, 1, sModelFamily.c_str()); - mvwaddstr(newWindow,2, 1, sModelName.c_str()); + mvwaddstr(newWindow,2, 1, sSerial.c_str()); mvwaddstr(newWindow,3, 1, sCapacity.c_str()); mvwaddstr(newWindow,1, iXSize-sSpeed.length()-5, sSpeed.c_str()); From a656d0a9f4df68653f3377035425bde425470b50 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 23 Aug 2022 00:03:45 +0200 Subject: [PATCH 15/24] UI: display drive count with index --- include/tui.h | 2 +- src/tui.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/tui.h b/include/tui.h index c10d3be..7f122f7 100644 --- a/include/tui.h +++ b/include/tui.h @@ -56,7 +56,7 @@ private: static WINDOW *createOverViewWindow( int iXSize, int iYSize); static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive); static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart); - static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); diff --git a/src/tui.cpp b/src/tui.cpp index ce7d1e2..b6c54c5 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -151,7 +151,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, (distance(plistDrives->begin(), it)+1), sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -308,7 +308,7 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) return newWindow; } -WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) +WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -328,9 +328,11 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, box(newWindow, ACS_VLINE, ACS_HLINE); - mvwaddstr(newWindow,1, 1, sModelFamily.c_str()); - mvwaddstr(newWindow,2, 1, sSerial.c_str()); - mvwaddstr(newWindow,3, 1, sCapacity.c_str()); + mvwaddstr(newWindow,1, 1, to_string(iListIndex).c_str()); + + mvwaddstr(newWindow,1, 5, sModelFamily.c_str()); + mvwaddstr(newWindow,2, 5, sSerial.c_str()); + mvwaddstr(newWindow,3, 5, sCapacity.c_str()); mvwaddstr(newWindow,1, iXSize-sSpeed.length()-5, sSpeed.c_str()); mvwaddstr(newWindow,2, iXSize-sState.length()-5, sState.c_str()); From bb69a5979478d0bb571ee4996a155a567f28a6fd Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 23 Aug 2022 23:20:50 +0200 Subject: [PATCH 16/24] fix frozen and metric for checking iteration --- include/reHDD.h | 2 +- include/shred.h | 1 + src/drive.cpp | 2 +- src/shred.cpp | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index eb56a2e..30a59a8 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -14,7 +14,7 @@ #define WORSE_HOURS 19200 //mark drive if at this limit or beyond #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond #define SHRED_ITERATIONS 3U -#define FROZEN_TIMEOUT 10 //After this timeout (minutes) the drive will be marked as frozen +#define FROZEN_TIMEOUT 20 //After this timeout (minutes) the drive will be marked as frozen #define METRIC_THRESHOLD 3L*1000L*1000L*1000L //calc shred speed with this minimum of time delta // Logger Settings diff --git a/include/shred.h b/include/shred.h index f44a32e..c423d36 100644 --- a/include/shred.h +++ b/include/shred.h @@ -23,6 +23,7 @@ //#define DEMO_DRIVE_SIZE 1024*1024*256L // 256MB //#define DEMO_DRIVE_SIZE 1024*1024*1024L // 1GB +//#define DEMO_DRIVE_SIZE 5*1024*1024*1024L // 5GB //#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB typedef int fileDescriptor; diff --git a/src/drive.cpp b/src/drive.cpp index 837b089..70006f8 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -167,7 +167,7 @@ void Drive::checkFrozenDrive(void) time_t u32localtime; time(&u32localtime); - if((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT*60) && (this->u32Timestamp > 0)) + if((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT*60) && (this->u32Timestamp > 0) && (this->getTaskPercentage() < 100.0)) { Logger::logThis()->warning("Drive Frozen: " + this->getModelName() + " " + this->getSerial()); this->bWasDeleteted = false; diff --git a/src/shred.cpp b/src/shred.cpp index 0734030..aaf541f 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -270,10 +270,11 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSign ulDriveByteCounter += iReadBytes; 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.9) + if((d32Percent-d32TmpPercent) >= 0.01) { drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; From 7dfa80504453c7f421ac8ed52614f530aa752481 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 24 Aug 2022 14:27:43 +0200 Subject: [PATCH 17/24] decrease shred iterations --- include/reHDD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/reHDD.h b/include/reHDD.h index 30a59a8..6b3c79d 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -13,7 +13,7 @@ // Drive handling Settings #define WORSE_HOURS 19200 //mark drive if at this limit or beyond #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond -#define SHRED_ITERATIONS 3U +#define SHRED_ITERATIONS 2U #define FROZEN_TIMEOUT 20 //After this timeout (minutes) the drive will be marked as frozen #define METRIC_THRESHOLD 3L*1000L*1000L*1000L //calc shred speed with this minimum of time delta From 2df5ceb0c804a31440410a936e36ead8a600f649 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 24 Aug 2022 16:00:18 +0200 Subject: [PATCH 18/24] read temperature via S.M.A.R.T and display --- include/drive.h | 7 ++++++- include/smart.h | 2 ++ include/tui.h | 2 +- src/drive.cpp | 14 +++++++++++++- src/smart.cpp | 28 +++++++++++++++++++++++++++- src/tui.cpp | 8 +++++--- 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/include/drive.h b/include/drive.h index a4e0771..7e46575 100644 --- a/include/drive.h +++ b/include/drive.h @@ -44,11 +44,13 @@ private: uint32_t u32ErrorCount = 0U; uint32_t u32PowerOnHours = 0U; //in hours uint32_t u32PowerCycles = 0U; + uint32_t u32Temperature = 0U; //in Fahrenheit, just kidding: degree Celsius time_t u32Timestamp = 0U; //unix timestamp for detecting a frozen drive double d32TaskPercentage = 0U; //in percent for Shred (1 to 100) time_t u32TimestampTaskStart = 0U; //unix timestamp for duration of an action time_t u32TaskDuration = 0U; //time needed to complete the task + private: void setTimestamp(); @@ -68,6 +70,7 @@ public: uint32_t getErrorCount(void); uint32_t getPowerOnHours(void); //in hours uint32_t getPowerCycles(void); + uint32_t getTemperature(void); //in Fahrenheit, just kidding: degree Celsius void checkFrozenDrive(void); void setDriveSMARTData( string modelFamily, @@ -76,12 +79,14 @@ public: uint64_t capacity, uint32_t errorCount, uint32_t powerOnHours, - uint32_t powerCycles); + uint32_t powerCycles, + uint32_t temperature); string sCapacityToText(); string sErrorCountToText(); string sPowerOnHoursToText(); string sPowerCyclesToText(); + string sTemperatureToText(); void setTaskPercentage(double d32TaskPercentage); double getTaskPercentage(void); diff --git a/include/smart.h b/include/smart.h index 99e6cca..37890f1 100644 --- a/include/smart.h +++ b/include/smart.h @@ -27,6 +27,7 @@ private: static void parseErrorCount(string sLine); static void parsePowerOnHours(string sLine); static void parsePowerCycle(string sLine); + static void parseTemperature(string sLine); static string modelFamily; static string modelName; @@ -35,6 +36,7 @@ private: static uint32_t errorCount; static uint32_t powerOnHours; static uint32_t powerCycle; + static uint32_t temperature; }; #endif // SMART_H_ \ No newline at end of file diff --git a/include/tui.h b/include/tui.h index 7f122f7..ed37805 100644 --- a/include/tui.h +++ b/include/tui.h @@ -56,7 +56,7 @@ private: static WINDOW *createOverViewWindow( int iXSize, int iYSize); static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive); static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart); - static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, string sTemp, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); diff --git a/src/drive.cpp b/src/drive.cpp index 70006f8..35f90aa 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -46,6 +46,11 @@ uint32_t Drive::getPowerCycles(void) return u32PowerCycles; } +uint32_t Drive::getTemperature(void) +{ + return u32Temperature; +} + string Drive::sCapacityToText() { char acBuffer[16]; @@ -91,6 +96,11 @@ string Drive::sPowerCyclesToText() return to_string(getPowerCycles()); } +string Drive::sTemperatureToText() +{ + return to_string(getTemperature())+" C";; +} + void Drive::setTaskPercentage(double d32TaskPercentage) { if(d32TaskPercentage <= 100) @@ -122,7 +132,8 @@ void Drive::setDriveSMARTData( string modelFamily, uint64_t capacity, uint32_t errorCount, uint32_t powerOnHours, - uint32_t powerCycle) + uint32_t powerCycle, + uint32_t temperature) { this->sModelFamily = modelFamily; sModelName = modelName; @@ -131,6 +142,7 @@ void Drive::setDriveSMARTData( string modelFamily, u32ErrorCount = errorCount; u32PowerOnHours = powerOnHours; u32PowerCycles = powerCycle; + u32Temperature = temperature; } diff --git a/src/smart.cpp b/src/smart.cpp index 1a787af..a19fa67 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -14,6 +14,7 @@ uint64_t SMART::capacity = 0U; uint32_t SMART::errorCount = 0U; uint32_t SMART::powerOnHours = 0U; uint32_t SMART::powerCycle = 0U; +uint32_t SMART::temperature = 0U; /** * \brief get and set S.M.A.R.T. values in Drive @@ -29,6 +30,7 @@ void SMART::readSMARTData(Drive* drive) errorCount = 0U; powerOnHours = 0U; powerCycle = 0U; + temperature = 0U; size_t len = 0; //lenght of found line char* cLine = NULL; //found line @@ -50,9 +52,10 @@ void SMART::readSMARTData(Drive* drive) SMART::parseErrorCount(sLine); SMART::parsePowerOnHours(sLine); SMART::parsePowerCycle(sLine); + SMART::parseTemperature(sLine); } pclose(outputfileSmart); - drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle); //wirte data in drive + drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle, temperature); //wirte data in drive } /** @@ -176,3 +179,26 @@ void SMART::parsePowerCycle(string sLine) } } +/** + * \brief parse temperature + * \param string output line of smartctl + * \return void + */ +void SMART::parseTemperature(string sLine) +{ + string search("\"current\": "); + size_t found = sLine.find(search); + if (found!=string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length()-1, 2); + if(sLine == "{") + { + temperature = 0U; // this drive doesn't support temperatur + } + else + { + temperature = stol(sLine); + } + } +} diff --git a/src/tui.cpp b/src/tui.cpp index b6c54c5..78ca451 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -74,11 +74,12 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { string sModelFamily = it->getModelFamily(); - string sSerial = it->getSerial(); + string sSerial = "SN: " + it->getSerial(); string sCapacity = it->sCapacityToText(); string sState = " "; string sSpeed = " "; string sTime = " "; + string sTemp = it->sTemperatureToText(); bool bSelectedEntry = false; @@ -151,7 +152,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, (distance(plistDrives->begin(), it)+1), sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, (distance(plistDrives->begin(), it)+1), sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, sTemp, bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -308,7 +309,7 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) return newWindow; } -WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected) +WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, string sTemp, bool bSelected) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -333,6 +334,7 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, mvwaddstr(newWindow,1, 5, sModelFamily.c_str()); mvwaddstr(newWindow,2, 5, sSerial.c_str()); mvwaddstr(newWindow,3, 5, sCapacity.c_str()); + mvwaddstr(newWindow,3, 5+sCapacity.length()+3, sTemp.c_str()); mvwaddstr(newWindow,1, iXSize-sSpeed.length()-5, sSpeed.c_str()); mvwaddstr(newWindow,2, iXSize-sState.length()-5, sState.c_str()); From 69fd10207ddfd9a1d8fd80d0b2e3e670295ed806 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 24 Aug 2022 16:11:36 +0200 Subject: [PATCH 19/24] copy newer S.M.A.R.T. values to existing drive --- include/drive.h | 19 +++++++++++-------- src/drive.cpp | 34 +++++++++++++++++----------------- src/reHDD.cpp | 2 ++ 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/include/drive.h b/include/drive.h index 7e46575..e61bc8f 100644 --- a/include/drive.h +++ b/include/drive.h @@ -37,19 +37,22 @@ public: private: string sPath; - string sModelFamily; - string sModelName; - string sSerial; - uint64_t u64Capacity = 0U; //in byte - uint32_t u32ErrorCount = 0U; - uint32_t u32PowerOnHours = 0U; //in hours - uint32_t u32PowerCycles = 0U; - uint32_t u32Temperature = 0U; //in Fahrenheit, just kidding: degree Celsius time_t u32Timestamp = 0U; //unix timestamp for detecting a frozen drive double d32TaskPercentage = 0U; //in percent for Shred (1 to 100) time_t u32TimestampTaskStart = 0U; //unix timestamp for duration of an action time_t u32TaskDuration = 0U; //time needed to complete the task + struct + { + string sModelFamily; + string sModelName; + string sSerial; + uint64_t u64Capacity = 0U; //in byte + uint32_t u32ErrorCount = 0U; + uint32_t u32PowerOnHours = 0U; //in hours + uint32_t u32PowerCycles = 0U; + uint32_t u32Temperature = 0U; //in Fahrenheit, just kidding: degree Celsius + } sSmartData; private: void setTimestamp(); diff --git a/src/drive.cpp b/src/drive.cpp index 35f90aa..f31367f 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -14,41 +14,41 @@ string Drive::getPath(void) string Drive::getModelFamily(void) { - return sModelFamily; + return sSmartData.sModelFamily; } string Drive::getModelName(void) { - return sModelName; + return sSmartData.sModelName; } string Drive::getSerial(void) { - return sSerial; + return sSmartData.sSerial; } uint64_t Drive::getCapacity(void) { - return u64Capacity; + return sSmartData.u64Capacity; } uint32_t Drive::getErrorCount(void) { - return u32ErrorCount; + return sSmartData.u32ErrorCount; } uint32_t Drive::getPowerOnHours(void) { - return u32PowerOnHours; + return sSmartData.u32PowerOnHours; } uint32_t Drive::getPowerCycles(void) { - return u32PowerCycles; + return sSmartData.u32PowerCycles; } uint32_t Drive::getTemperature(void) { - return u32Temperature; + return sSmartData.u32Temperature; } string Drive::sCapacityToText() @@ -124,6 +124,7 @@ double Drive::getTaskPercentage(void) * \param uint32_t errorCount * \param uint32_t powerOnHours * \param uint32_t powerCycle + * \param uint32_t temperature * \return void */ void Drive::setDriveSMARTData( string modelFamily, @@ -135,15 +136,14 @@ void Drive::setDriveSMARTData( string modelFamily, uint32_t powerCycle, uint32_t temperature) { - this->sModelFamily = modelFamily; - sModelName = modelName; - sSerial = serial; - u64Capacity = capacity; - u32ErrorCount = errorCount; - u32PowerOnHours = powerOnHours; - u32PowerCycles = powerCycle; - u32Temperature = temperature; - + this->sSmartData.sModelFamily = modelFamily; + this->sSmartData.sModelName = modelName; + this->sSmartData.sSerial = serial; + this->sSmartData.u64Capacity = capacity; + this->sSmartData.u32ErrorCount = errorCount; + this->sSmartData.u32PowerOnHours = powerOnHours; + this->sSmartData.u32PowerCycles = powerCycle; + this->sSmartData.u32Temperature = temperature; } void Drive::setTimestamp() diff --git a/src/reHDD.cpp b/src/reHDD.cpp index d462d8d..5dcd2eb 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -264,6 +264,8 @@ void reHDD::filterNewDrives(list * plistOldDrives, list * plistNew if((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath())) { itOld->bIsOffline = false; //drive is still attached + //copy new smart data to existing drive + itOld->setDriveSMARTData(itNew->getModelFamily(), itNew->getModelName(), itNew->getSerial(), itNew->getCapacity(), itNew->getErrorCount(), itNew->getPowerOnHours(), itNew->getPowerCycles(), itNew->getTemperature()); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Delete new drive, because allready attached: " + itNew->getModelName()); #endif From a347bf433c6db593fae412cc5a538a3717a1bbc4 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 24 Aug 2022 16:27:51 +0200 Subject: [PATCH 20/24] display temperature alert if drive too hot --- include/reHDD.h | 3 ++- include/tui.h | 2 +- src/tui.cpp | 13 ++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 6b3c79d..6938d45 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -13,8 +13,9 @@ // Drive handling Settings #define WORSE_HOURS 19200 //mark drive if at this limit or beyond #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond +#define WORSE_TEMPERATURE 55 //mark drive if at this limit or beyond #define SHRED_ITERATIONS 2U -#define FROZEN_TIMEOUT 20 //After this timeout (minutes) the drive will be marked as frozen +#define FROZEN_TIMEOUT 20 //After this timeout (minutes) the drive will be marked as frozen, if no progress #define METRIC_THRESHOLD 3L*1000L*1000L*1000L //calc shred speed with this minimum of time delta // Logger Settings diff --git a/include/tui.h b/include/tui.h index ed37805..c4595fa 100644 --- a/include/tui.h +++ b/include/tui.h @@ -61,7 +61,7 @@ private: static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); static WINDOW* createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, string sProgress); - static WINDOW* createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount); + static WINDOW* createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount, uint32_t u32Temperature); static WINDOW* createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, uint32_t u32Checksum); void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY); diff --git a/src/tui.cpp b/src/tui.cpp index 78ca451..d299bdb 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -88,10 +88,10 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) bSelectedEntry = true; //mark this drive in entries list displaySelectedDrive(*it, u16StdscrX, u16StdscrY); - if((it->getPowerOnHours() >= WORSE_HOURS) || (it->getPowerCycles() >= WORSE_POWERUP) || (it->getErrorCount() > 0)) + if((it->getPowerOnHours() >= WORSE_HOURS) || (it->getPowerCycles() >= WORSE_POWERUP) || (it->getErrorCount() > 0) || (it->getTemperature() >= WORSE_TEMPERATURE)) { // smart values are bad --> show warning - smartWarning=createSmartWarning(50, 10, ((u16StdscrX)-(int)(u16StdscrX/2)+35),(int)(u16StdscrY/2)-5, it->getPath(), it->getPowerOnHours(), it->getPowerCycles(), it->getErrorCount()); + smartWarning=createSmartWarning(50, 10, ((u16StdscrX)-(int)(u16StdscrX/2)+35),(int)(u16StdscrY/2)-5, it->getPath(), it->getPowerOnHours(), it->getPowerCycles(), it->getErrorCount(), it->getTemperature()); wrefresh(smartWarning); } } @@ -582,7 +582,7 @@ void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) } } -WINDOW* TUI::createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount) +WINDOW* TUI::createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount, uint32_t u32Temperature) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -617,6 +617,13 @@ WINDOW* TUI::createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart { string sLineTmp = "S.M.A.R.T. erros detected: " + to_string(u32ErrorCount); mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLineTmp.c_str()); + u16Line++; + } + + if(u32Temperature >= WORSE_TEMPERATURE) + { + string sLineTmp = "Drive too hot: " + to_string(u32Temperature)+" C"; + mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLineTmp.c_str()); } return newWindow; } \ No newline at end of file From 1b9fa348d36390a0746ce96f104efef97ea20157 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 24 Aug 2022 16:35:12 +0200 Subject: [PATCH 21/24] display software build time --- src/tui.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/tui.cpp b/src/tui.cpp index d299bdb..895c506 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -361,10 +361,14 @@ WINDOW* TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) strftime(buffer,sizeof(buffer),"Date: %d-%m-%Y Time: %H:%M",timeinfo); string time(buffer); - string sLine01 = "reHDD - hard drive refurbishing tool"; - string sLine02 = "Version: " + string(REHDD_VERSION); - string sLine03 = "Available under GPL 3.0"; - string sLine04 = "https://git.mosad.xyz/localhorst/reHDD"; + string sLine01 = "reHDD - hard drive refurbishing tool"; + string sLine02 = "Version: " + string(REHDD_VERSION); + string sLine03 = "Build time: "; + sLine03.append(__DATE__); + sLine03.append(" "); + sLine03.append(__TIME__); + string sLine04 = "Available under GPL 3.0"; + string sLine05 = "https://git.mosad.xyz/localhorst/reHDD"; uint16_t u16Line = 2; @@ -372,6 +376,7 @@ WINDOW* TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine02.c_str()); mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine03.c_str()); mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine04.c_str()); + mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine05.c_str()); u16Line++; mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), time.c_str()); From 7d69096df31baa208c3dfe575fd60145a1fa9f4a Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 25 Aug 2022 09:18:12 +0200 Subject: [PATCH 22/24] Revert "decrease shred iterations" This reverts commit 7dfa80504453c7f421ac8ed52614f530aa752481. --- include/reHDD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/reHDD.h b/include/reHDD.h index 6938d45..9b24a8a 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -14,7 +14,7 @@ #define WORSE_HOURS 19200 //mark drive if at this limit or beyond #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond #define WORSE_TEMPERATURE 55 //mark drive if at this limit or beyond -#define SHRED_ITERATIONS 2U +#define SHRED_ITERATIONS 3U #define FROZEN_TIMEOUT 20 //After this timeout (minutes) the drive will be marked as frozen, if no progress #define METRIC_THRESHOLD 3L*1000L*1000L*1000L //calc shred speed with this minimum of time delta From 17cc41dc5f6add3a431b5c30e9ec01775ff639a8 Mon Sep 17 00:00:00 2001 From: Hendrik Schutter Date: Thu, 25 Aug 2022 12:07:57 +0200 Subject: [PATCH 23/24] display human readable timestamp --- scripts/getty@tty2.service.d_override.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/getty@tty2.service.d_override.conf b/scripts/getty@tty2.service.d_override.conf index 4dc5b66..cd17cf8 100644 --- a/scripts/getty@tty2.service.d_override.conf +++ b/scripts/getty@tty2.service.d_override.conf @@ -4,7 +4,7 @@ Description=dmesg on tty2 [Service] WorkingDirectory=/usr/bin/ ExecStart= -ExecStart=-/usr/bin/dmesg -wH +ExecStart=-/usr/bin/dmesg -wHT StandardInput=tty StandardOutput=tty Restart=always From 1f50f87f972bc4c303a857a05d6c0178731f2d6c Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 20 Sep 2022 21:53:43 +0200 Subject: [PATCH 24/24] update version and readme --- README.md | 2 +- include/reHDD.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ed75bc..5751534 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Instructions how to create a standalone machine that boots directly to reHDD. Th * Upload reHDD log every 12h if wanted ### Software requirements -* `apt-get install hwinfo smartmontools curl` +* `apt-get install hwinfo smartmontools curl htop sudo` ### Installation diff --git a/include/reHDD.h b/include/reHDD.h index 9b24a8a..e3d3856 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -8,7 +8,7 @@ #ifndef REHDD_H_ #define REHDD_H_ -#define REHDD_VERSION "bV0.2.2" +#define REHDD_VERSION "bV0.3.0" // Drive handling Settings #define WORSE_HOURS 19200 //mark drive if at this limit or beyond