diff --git a/astyle.sh b/astyle.sh deleted file mode 100644 index 604ad39..0000000 --- a/astyle.sh +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/bash - -echo starting astyle for $PWD - -astyle --style=gnu src/*.cpp -rm -f src/*.orig - -astyle --style=gnu src/logger/*.cpp -rm -f src/logger/*.orig - -astyle --style=gnu include/*.h -rm -f include/*.orig - -astyle --style=gnu include/logger/*.h -rm -f include//logger/*.orig - -echo finished astyle for $PWD diff --git a/include/delete.h b/include/delete.h index d1e1381..831f67f 100644 --- a/include/delete.h +++ b/include/delete.h @@ -13,13 +13,11 @@ class Delete { protected: - public: - static void deleteDrive(Drive* drive); + static void deleteDrive(Drive *drive); private: Delete(void); - }; -#endif // DELETE_H_ +#endif // DELETE_H_ diff --git a/include/drive.h b/include/drive.h index 72037fe..f1e28ab 100644 --- a/include/drive.h +++ b/include/drive.h @@ -14,14 +14,16 @@ class Drive { public: - enum TaskState {NONE, - SHRED_SELECTED, - SHRED_ACTIVE, //shred iterations active - CHECK_ACTIVE, //optional checking active - DELETE_SELECTED, - DELETE_ACTIVE, - FROZEN - } state; + enum TaskState + { + NONE, + SHRED_SELECTED, + SHRED_ACTIVE, // shred iterations active + CHECK_ACTIVE, // optional checking active + DELETE_SELECTED, + DELETE_ACTIVE, + FROZEN + } state; struct { @@ -31,36 +33,35 @@ public: unsigned long ulSpeedMetricBytesWritten; } sShredSpeed; - bool bWasShredded = false; //all shred iterations done - bool bWasChecked = false; //all shred iterations and optional checking done + bool bWasShredded = false; // all shred iterations done + bool bWasChecked = false; // all shred iterations and optional checking done bool bWasDeleted = false; bool bIsOffline = false; uint32_t u32DriveChecksumAfterShredding = 0U; private: string sPath; - 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 + 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 + uint64_t u64Capacity = 0U; // in byte uint32_t u32ErrorCount = 0U; - uint32_t u32PowerOnHours = 0U; //in hours + uint32_t u32PowerOnHours = 0U; // in hours uint32_t u32PowerCycles = 0U; - uint32_t u32Temperature = 0U; //in Fahrenheit, just kidding: degree Celsius + uint32_t u32Temperature = 0U; // in Fahrenheit, just kidding: degree Celsius } sSmartData; private: void setTimestamp(); protected: - public: Drive(string path) { @@ -71,21 +72,21 @@ public: string getModelFamily(void); string getModelName(void); string getSerial(void); - uint64_t getCapacity(void); //in byte + uint64_t getCapacity(void); // in byte uint32_t getErrorCount(void); - uint32_t getPowerOnHours(void); //in hours + uint32_t getPowerOnHours(void); // in hours uint32_t getPowerCycles(void); - uint32_t getTemperature(void); //in Fahrenheit, just kidding: degree Celsius + uint32_t getTemperature(void); // in Fahrenheit, just kidding: degree Celsius void checkFrozenDrive(void); - void setDriveSMARTData( string modelFamily, - string modelName, - string serial, - uint64_t capacity, - uint32_t errorCount, - uint32_t powerOnHours, - uint32_t powerCycles, - uint32_t temperature); + void setDriveSMARTData(string modelFamily, + string modelName, + string serial, + uint64_t capacity, + uint32_t errorCount, + uint32_t powerOnHours, + uint32_t powerCycles, + uint32_t temperature); string sCapacityToText(); string sErrorCountToText(); @@ -101,7 +102,6 @@ public: void calculateTaskDuration(); time_t getTaskDuration(); - }; -#endif // DRIVE_H_ \ No newline at end of file +#endif // DRIVE_H_ \ No newline at end of file diff --git a/include/logger/logger.h b/include/logger/logger.h index b6751ea..8f883e2 100644 --- a/include/logger/logger.h +++ b/include/logger/logger.h @@ -28,26 +28,26 @@ using namespace std; -#define MENU_LINE_SIZE 110 //Size of menu lines +#define MENU_LINE_SIZE 110 // Size of menu lines #ifndef LOG_PATH -//#define LOG_PATH "./test.txt" +// #define LOG_PATH "./test.txt" #endif #ifndef DESCRIPTION -#define DESCRIPTION "Software-Name - Copyright Company 2020" //use your values here +#define DESCRIPTION "Software-Name - Copyright Company 2020" // use your values here #endif #ifndef DEVICE_ID -#define DEVICE_ID "Device-Name" //use your values here +#define DEVICE_ID "Device-Name" // use your values here #endif #ifndef SOFTWARE_VERSION -#define SOFTWARE_VERSION "0.1.1.8" //use your values here +#define SOFTWARE_VERSION "0.1.1.8" // use your values here #endif #ifndef HARDWARE_VERSION -#define HARDWARE_VERSION "7.77.9" //use your values here +#define HARDWARE_VERSION "7.77.9" // use your values here #endif class Logger @@ -68,13 +68,12 @@ private: ~Logger(); public: - void info(string s); void warning(string s); void error(string s); void newLine(); - static Logger* logThis(); + static Logger *logThis(); }; -#endif // LOGGER_H_ \ No newline at end of file +#endif // LOGGER_H_ \ No newline at end of file diff --git a/include/printer.h b/include/printer.h index 638c3e7..b67a1e4 100644 --- a/include/printer.h +++ b/include/printer.h @@ -35,18 +35,16 @@ typedef struct typedef struct { - long msg_queue_type; + long msg_queue_type; t_driveData driveData; } t_msgQueueData; - class Printer { protected: - public: - static Printer* getPrinter(); - void print(Drive* drive); + static Printer *getPrinter(); + void print(Drive *drive); private: static bool instanceFlag; @@ -54,7 +52,5 @@ private: int msqid; Printer(); ~Printer(); - - }; -#endif // PRINTER_H_ \ No newline at end of file +#endif // PRINTER_H_ \ No newline at end of file diff --git a/include/reHDD.h b/include/reHDD.h index 7b7387e..aa3085d 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -8,34 +8,34 @@ #ifndef REHDD_H_ #define REHDD_H_ -#define REHDD_VERSION "bV1.1.0" +#define REHDD_VERSION "V1.1.1" // 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 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 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 +#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 #define LOG_PATH "./reHDD.log" -#define DESCRIPTION "reHDD - Copyright Hendrik Schutter 2022" -#define DEVICE_ID "generic" -#define SOFTWARE_VERSION "alpha" -#define HARDWARE_VERSION "generic" +#define DESCRIPTION "reHDD - Copyright Hendrik Schutter 2024" +#define DEVICE_ID "generic" +#define SOFTWARE_VERSION REHDD_VERSION +#define HARDWARE_VERSION "generic" -//#define LOG_LEVEL_HIGH //log everything, like drive scan thread +// #define LOG_LEVEL_HIGH //log everything, like drive scan thread #ifndef LOG_LEVEL_HIGH -#define LOG_LEVEL_LOW //log only user actions and tasks +#define LOG_LEVEL_LOW // log only user actions and tasks #endif // Logic -//#define DRYRUN //don´t touch the drives -#define FROZEN_ALERT //show alert if drive is frozen -#define ZERO_CHECK //check drive after shred if all bytes are zero, show alert if this fails +// #define DRYRUN //don´t touch the drives +#define FROZEN_ALERT // show alert if drive is frozen +#define ZERO_CHECK // check drive after shred if all bytes are zero, show alert if this fails -//IPC pipes +// IPC pipes #define READ 0 #define WRITE 1 @@ -67,9 +67,10 @@ using namespace std; #include "printer.h" #include "logger/logger.h" -extern Logger* logging; +extern Logger *logging; -template T* iterator_to_pointer(I i) +template +T *iterator_to_pointer(I i) { return (&(*i)); } @@ -77,30 +78,29 @@ template T* iterator_to_pointer(I i) class reHDD { protected: - public: reHDD(void); static void app_logic(); 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); + 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 filterInvalidDrives(list *plistDrives); + static void filterNewDrives(list *plistOldDrives, list *plistNewDrives); + static void addSMARTData(list *plistDrives); static void ThreadScanDevices(); static void ThreadUserInput(); - static void ThreadShred(Drive* const pDrive); + static void ThreadShred(Drive *const pDrive); static void ThreadDelete(); static void ThreadCheckFrozenDrives(); static void handleArrowKey(TUI::UserInput userInput); static void handleEnter(); static void handleESC(); static void handleAbort(); - static Drive* getSelectedDrive(); + static Drive *getSelectedDrive(); }; -#endif // REHDD_H_ +#endif // REHDD_H_ diff --git a/include/shred.h b/include/shred.h index c423d36..1d9af23 100644 --- a/include/shred.h +++ b/include/shred.h @@ -17,26 +17,23 @@ #include #include +#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 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 -//#define DEMO_DRIVE_SIZE 5*1024*1024*1024L // 5GB -//#define DEMO_DRIVE_SIZE 1024*1024*1024*10L // 10GB +// #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; class Shred { protected: - public: - Shred(); ~Shred(); - int shredDrive(Drive* drive, int* ipSignalFd); + int shredDrive(Drive *drive, int *ipSignalFd); private: fileDescriptor randomSrcFileDiscr; @@ -44,16 +41,15 @@ private: 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 + unsigned long ulDriveByteOverallCount = 0; // all bytes shredded in all iterations + checking -> used for progress calculation double d32Percent = 0.0; double d32TmpPercent = 0.0; inline double calcProgress(); int iRewindDrive(fileDescriptor file); unsigned long getDriveSizeInBytes(fileDescriptor file); - unsigned int uiCalcChecksum(fileDescriptor file, Drive* drive, int* ipSignalFd); + unsigned int uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSignalFd); void cleanup(); - }; -#endif // SHRED_H_ +#endif // SHRED_H_ diff --git a/include/smart.h b/include/smart.h index 37890f1..d19d231 100644 --- a/include/smart.h +++ b/include/smart.h @@ -13,13 +13,13 @@ class SMART { protected: - public: - static void readSMARTData(Drive* drive); + static void readSMARTData(Drive *drive); private: SMART(void); + static uint8_t parseExitStatus(string sLine); static void parseModelFamily(string sLine); static void parseModelName(string sLine); static void parseSerial(string sLine); @@ -29,14 +29,14 @@ private: static void parsePowerCycle(string sLine); static void parseTemperature(string sLine); - static string modelFamily; - static string modelName; - static string serial; - static uint64_t capacity; - static uint32_t errorCount; - static uint32_t powerOnHours; - static uint32_t powerCycle; - static uint32_t temperature; + static string modelFamily; + static string modelName; + static string serial; + static uint64_t capacity; + 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 +#endif // SMART_H_ \ No newline at end of file diff --git a/include/tui.h b/include/tui.h index 87b7ac9..df7cd8d 100644 --- a/include/tui.h +++ b/include/tui.h @@ -20,10 +20,19 @@ class TUI { protected: - public: - - enum UserInput { UpKey, DownKey, Abort, Shred, ShredAll, Delete, Enter, ESC, Undefined}; + enum UserInput + { + UpKey, + DownKey, + Abort, + Shred, + ShredAll, + Delete, + Enter, + ESC, + Undefined + }; struct MenuState { bool bAbort; @@ -37,7 +46,7 @@ public: static void initTUI(); - void updateTUI(list * plistDrives, uint8_t u8SelectedEntry); + void updateTUI(list *plistDrives, uint8_t u8SelectedEntry); static enum UserInput readUserInput(); @@ -46,28 +55,28 @@ private: static string sRamUsage; static string sLocalTime; - WINDOW* overview; - WINDOW* systemview; - WINDOW* detailview; - WINDOW* menuview; - WINDOW* dialog; - WINDOW* smartWarning; + WINDOW *overview; + WINDOW *systemview; + WINDOW *detailview; + WINDOW *menuview; + WINDOW *dialog; + WINDOW *smartWarning; - static void centerTitle(WINDOW* pwin, const char* title); - 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 void centerTitle(WINDOW *pwin, const char *title); + 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, 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); - 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, 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); + 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, 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); string formatTimeDuration(time_t u32Duration); string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); - static void vTruncateText(string* psText, uint16_t u16MaxLenght); + static void vTruncateText(string *psText, uint16_t u16MaxLenght); }; -#endif // TUI_H_ \ No newline at end of file +#endif // TUI_H_ \ No newline at end of file diff --git a/makefile b/makefile index b8e3e3b..8d1f7fd 100644 --- a/makefile +++ b/makefile @@ -10,9 +10,9 @@ SRC_PATH = src # Space-separated pkg-config libraries used by this project LIBS = lib # General compiler flags -COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g +COMPILE_FLAGS = -std=c++23 -Wall -Wextra -g # Additional release-specific flags -RCOMPILE_FLAGS = -D NDEBUG -O3 +RCOMPILE_FLAGS = -D NDEBUG -Ofast # Additional debug-specific flags DCOMPILE_FLAGS = -D DEBUG # Add additional include paths diff --git a/src/delete.cpp b/src/delete.cpp index 0d60b25..b7ca4bd 100644 --- a/src/delete.cpp +++ b/src/delete.cpp @@ -12,11 +12,11 @@ * \param pointer of Drive instance * \return void */ -void Delete::deleteDrive(Drive* drive) +void Delete::deleteDrive(Drive *drive) { - size_t len = 0; //lenght of found line - char* cLine = NULL; //found line + size_t len = 0; // lenght of found line + char *cLine = NULL; // found line #ifndef DRYRUN string sCMD = ("wipefs -af "); @@ -25,18 +25,18 @@ void Delete::deleteDrive(Drive* drive) #endif #ifdef DRYRUN - //cout << "dryrun for " << drive->getPath() << endl; + // cout << "dryrun for " << drive->getPath() << endl; string sCMD = ("echo"); #endif - const char* cpComand = sCMD.c_str(); - //cout << "delete: " << cpComand << endl; + const char *cpComand = sCMD.c_str(); + // cout << "delete: " << cpComand << endl; - FILE* deleteCmdOutput = popen(cpComand, "r"); + FILE *deleteCmdOutput = popen(cpComand, "r"); while ((getline(&cLine, &len, deleteCmdOutput)) != -1) - { - //wipefs running - } + { + // wipefs running + } pclose(deleteCmdOutput); } diff --git a/src/drive.cpp b/src/drive.cpp index b2190a0..1ca3e61 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -54,16 +54,16 @@ uint32_t Drive::getTemperature(void) string Drive::sCapacityToText() { char acBuffer[16]; - double dSize = (double) getCapacity(); + double dSize = (double)getCapacity(); uint16_t u16UnitIndex = 0; - const char* units[] = {"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; - while (dSize >= 1000) //using the marketing capacity - { - dSize /= 1000; - u16UnitIndex++; - } + const char *units[] = {"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; + while (dSize >= 1000) // using the marketing capacity + { + dSize /= 1000; + u16UnitIndex++; + } - sprintf(acBuffer, "%.*f %s", u16UnitIndex-3, dSize, units[u16UnitIndex]); + sprintf(acBuffer, "%.*f %s", u16UnitIndex - 3, dSize, units[u16UnitIndex]); return acBuffer; } @@ -80,8 +80,8 @@ string Drive::sPowerOnHoursToText() stringstream streamDays; stringstream streamYears; - dDays = (double) ((double)u32Hours/(double)24U); - dYears = (double) ((double)u32Hours/(double)8760U); + dDays = (double)((double)u32Hours / (double)24U); + dYears = (double)((double)u32Hours / (double)8760U); streamDays << fixed << setprecision(0) << dDays; streamYears << fixed << setprecision(1) << dYears; @@ -98,23 +98,23 @@ string Drive::sPowerCyclesToText() string Drive::sTemperatureToText() { - return to_string(getTemperature())+" C";; + return to_string(getTemperature()) + " C"; + ; } void Drive::setTaskPercentage(double d32TaskPercentage) { - if(d32TaskPercentage <= 100) - { - this->d32TaskPercentage = d32TaskPercentage; - this->setTimestamp(); //set timestamp for this progress for detecting a frozen drive - } + if (d32TaskPercentage <= 100) + { + this->d32TaskPercentage = d32TaskPercentage; + this->setTimestamp(); // set timestamp for this progress for detecting a frozen drive + } } double Drive::getTaskPercentage(void) { return this->d32TaskPercentage; } - /** * \brief set S.M.A.R.T. values in model * \param string modelFamily @@ -127,14 +127,14 @@ double Drive::getTaskPercentage(void) * \param uint32_t temperature * \return void */ -void Drive::setDriveSMARTData( string modelFamily, - string modelName, - string serial, - uint64_t capacity, - uint32_t errorCount, - uint32_t powerOnHours, - uint32_t powerCycle, - uint32_t temperature) +void Drive::setDriveSMARTData(string modelFamily, + string modelName, + string serial, + uint64_t capacity, + uint32_t errorCount, + uint32_t powerOnHours, + uint32_t powerCycle, + uint32_t temperature) { this->sSmartData.sModelFamily = modelFamily; this->sSmartData.sModelName = modelName; @@ -179,11 +179,11 @@ void Drive::checkFrozenDrive(void) time_t u32localtime; time(&u32localtime); - if((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT*60) && (this->u32Timestamp > 0) && (this->getTaskPercentage() < 100.0)) - { - Logger::logThis()->warning("Drive Frozen: " + this->getModelName() + " " + this->getSerial()); - this->bWasDeleted = false; - this->bWasShredded = false; - this->state = Drive::FROZEN; - } + if ((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT * 60) && (this->u32Timestamp > 0) && (this->getTaskPercentage() < 100.0)) + { + Logger::logThis()->warning("Drive Frozen: " + this->getModelName() + " " + this->getSerial()); + this->bWasDeleted = false; + this->bWasShredded = false; + this->state = Drive::FROZEN; + } } \ No newline at end of file diff --git a/src/logger/logger.cpp b/src/logger/logger.cpp index f77021d..a91889b 100644 --- a/src/logger/logger.cpp +++ b/src/logger/logger.cpp @@ -5,16 +5,15 @@ * @date 04.09.2020 */ - #include "../../include/reHDD.h" //for logger settings #include "../../include/logger/logger.h" using namespace std; -string version = "0.2.1"; //logger version +string version = "0.2.1"; // logger version bool Logger::instanceFlag = false; -Logger* Logger::single = NULL; +Logger *Logger::single = NULL; /** * \brief create new logger instance @@ -95,13 +94,13 @@ void Logger::error(string s) void Logger::writeLog(string s) { ofstream logFile; - Logger::mtxLog.lock(); //lock this section for other threads + Logger::mtxLog.lock(); // lock this section for other threads logFile.open(this->logPath, ios_base::app); - logFile << (s + "\n"); //append to existing file + logFile << (s + "\n"); // append to existing file logFile.close(); - Logger::mtxLog.unlock(); //unlock this section for other threads + Logger::mtxLog.unlock(); // unlock this section for other threads } /** @@ -120,21 +119,21 @@ void Logger::newLine() */ string Logger::getTimestamp() { - struct tm * timeinfo; + struct tm *timeinfo; struct timeval tv; int millisec; - char cpDate [80]; - char buffer [120]; + char cpDate[80]; + char buffer[120]; gettimeofday(&tv, NULL); - millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec - if (millisec>=1000) // Allow for rounding up to nearest second - { - millisec -=1000; - tv.tv_sec++; - } + millisec = lrint(tv.tv_usec / 1000.0); // Round to nearest millisec + if (millisec >= 1000) // Allow for rounding up to nearest second + { + millisec -= 1000; + tv.tv_sec++; + } timeinfo = localtime(&tv.tv_sec); - strftime (cpDate,80,"%d/%m/%Y %T",timeinfo); + strftime(cpDate, 80, "%d/%m/%Y %T", timeinfo); sprintf(buffer, "%s.%03d", cpDate, millisec); return buffer; } @@ -147,18 +146,17 @@ string Logger::getTimestamp() string Logger::getMacAddress() { struct ifreq ifr; - int s = socket(AF_INET, SOCK_STREAM,0); + int s = socket(AF_INET, SOCK_STREAM, 0); strcpy(ifr.ifr_name, "eth0"); if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) - { - strcpy(ifr.ifr_name, "eno1"); - - } + { + strcpy(ifr.ifr_name, "eno1"); + } unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; - char buffer [80]; - sprintf(buffer,"%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], + char buffer[80]; + sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); close(s); string tmp = buffer; @@ -174,22 +172,22 @@ string Logger::getMacAddress() */ string Logger::padStringMenu(char cBorder, string text, uint8_t u8LineLenght) { - string result(1,cBorder); + string result(1, cBorder); uint8_t u8TextSize = text.length(); - uint8_t u8Padding = ((u8LineLenght-u8TextSize)/2); + uint8_t u8Padding = ((u8LineLenght - u8TextSize) / 2); - for(uint8_t i = 0 ; i < u8Padding; i++) - { - result.append(" "); - } + for (uint8_t i = 0; i < u8Padding; i++) + { + result.append(" "); + } result.append(text); - while((uint8_t)result.length() < (u8LineLenght-1)) - { + while ((uint8_t)result.length() < (u8LineLenght - 1)) + { - result.append(" "); - } + result.append(" "); + } result.append(string(1, cBorder)); return result; @@ -203,12 +201,12 @@ string Logger::padStringMenu(char cBorder, string text, uint8_t u8LineLenght) */ string Logger::menuLine(char cBorder, uint8_t u8LineLenght) { - string result(1,cBorder); + string result(1, cBorder); - while((uint8_t)result.length() < u8LineLenght) - { - result.append(string(1, cBorder)); - } + while ((uint8_t)result.length() < u8LineLenght) + { + result.append(string(1, cBorder)); + } return result; } @@ -216,18 +214,16 @@ string Logger::menuLine(char cBorder, uint8_t u8LineLenght) * \brief return a instance of the logger * \return logger obj */ -Logger* Logger::logThis() +Logger *Logger::logThis() { if (!instanceFlag) - { - single = new Logger(); //create new obj - instanceFlag = true; - return single; - } + { + single = new Logger(); // create new obj + instanceFlag = true; + return single; + } else - { - return single; //return existing obj - } + { + return single; // return existing obj + } } - - diff --git a/src/main.cpp b/src/main.cpp index 96a915e..30441e1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ int main(void) { // cout << "refurbishingHddTool" << endl; - reHDD* app = new reHDD(); + reHDD *app = new reHDD(); app->app_logic(); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/src/printer.cpp b/src/printer.cpp index e8db0bb..7bf620a 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -8,7 +8,7 @@ #include "../include/reHDD.h" bool Printer::instanceFlag = false; -Printer* Printer::single = NULL; +Printer *Printer::single = NULL; /** * \brief create new Printer instance @@ -19,9 +19,9 @@ Printer* Printer::single = NULL; Printer::Printer() { if (-1 == (this->msqid = msgget((key_t)IPC_MSG_QUEUE_KEY, IPC_CREAT | 0666))) - { - Logger::logThis()->error("Printer: Create mgs queue failed!"); - } + { + Logger::logThis()->error("Printer: Create mgs queue failed!"); + } } /** @@ -37,47 +37,48 @@ Printer::~Printer() * \brief send data to msg queue * \return void */ -void Printer::print(Drive* drive) +void Printer::print(Drive *drive) { - t_msgQueueData msgQueueData; + t_msgQueueData msgQueueData; msgQueueData.msg_queue_type = 1; - sprintf(msgQueueData.driveData.caDriveIndex, "%i",42); //TODO: get from tui + sprintf(msgQueueData.driveData.caDriveIndex, "%i", 42); // TODO: get from tui sprintf(msgQueueData.driveData.caDriveState, "shredded"); strcpy(msgQueueData.driveData.caDriveModelFamily, drive->getModelFamily().c_str()); strcpy(msgQueueData.driveData.caDriveModelName, drive->getModelName().c_str()); sprintf(msgQueueData.driveData.caDriveCapacity, "%li", drive->getCapacity()); strcpy(msgQueueData.driveData.caDriveSerialnumber, drive->getSerial().c_str()); - sprintf(msgQueueData.driveData.caDriveHours, "%i",drive->getPowerOnHours()); - sprintf(msgQueueData.driveData.caDriveCycles, "%i",drive->getPowerCycles()); - sprintf(msgQueueData.driveData.caDriveErrors, "%i",drive->getErrorCount()); - sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li",drive->getActionStartTimestamp()); - sprintf(msgQueueData.driveData.caDriveShredDuration, "%li",drive->getTaskDuration()); + sprintf(msgQueueData.driveData.caDriveHours, "%i", drive->getPowerOnHours()); + sprintf(msgQueueData.driveData.caDriveCycles, "%i", drive->getPowerCycles()); + sprintf(msgQueueData.driveData.caDriveErrors, "%i", drive->getErrorCount()); + sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li", drive->getActionStartTimestamp()); + sprintf(msgQueueData.driveData.caDriveShredDuration, "%li", drive->getTaskDuration()); sprintf(msgQueueData.driveData.caDriveReHddVersion, REHDD_VERSION); if (-1 == msgsnd(this->msqid, &msgQueueData, sizeof(t_msgQueueData) - sizeof(long), 0)) - { - Logger::logThis()->error("Printer: Send mgs queue failed!"); - }else{ - Logger::logThis()->info("Printer: print triggered - Drive: " + drive->getSerial()); - } + { + Logger::logThis()->error("Printer: Send mgs queue failed!"); + } + else + { + Logger::logThis()->info("Printer: print triggered - Drive: " + drive->getSerial()); + } } - /** * \brief return a instance of the printer * \return printer obj */ -Printer* Printer::getPrinter() +Printer *Printer::getPrinter() { if (!instanceFlag) - { - single = new Printer(); //create new obj - instanceFlag = true; - return single; - } + { + single = new Printer(); // create new obj + instanceFlag = true; + return single; + } else - { - return single; //return existing obj - } + { + return single; // return existing obj + } } \ No newline at end of file diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 4ed5f68..14587c1 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -7,19 +7,19 @@ #include "../include/reHDD.h" -static int fdNewDrivesInformPipe[2];//File descriptor for pipe that informs if new drives are found +static int fdNewDrivesInformPipe[2]; // File descriptor for pipe that informs if new drives are found -static int fdShredInformPipe[2];//File descriptor for pipe that informs if a wipe thread signals +static int fdShredInformPipe[2]; // File descriptor for pipe that informs if a wipe thread signals static std::mutex mxDrives; -list listNewDrives; //store found drives that are updated every 5sec +list listNewDrives; // store found drives that are updated every 5sec -static list listDrives; //stores all drive data from scan thread +static list listDrives; // stores all drive data from scan thread TUI *ui; -static uint8_t u8SelectedEntry; +static uint8_t u8SelectedEntry; static fd_set selectSet; @@ -46,251 +46,252 @@ void reHDD::app_logic(void) pipe(fdNewDrivesInformPipe); pipe(fdShredInformPipe); - thread thDevices(ThreadScanDevices); //start thread that scans for drives - thread thUserInput(ThreadUserInput); //start thread that reads user input - thread thCheckFrozenDrives(ThreadCheckFrozenDrives); //start thread that checks timeout for drives + thread thDevices(ThreadScanDevices); // start thread that scans for drives + thread thUserInput(ThreadUserInput); // start thread that reads user input + thread thCheckFrozenDrives(ThreadCheckFrozenDrives); // start thread that checks timeout for drives - while(1) + while (1) + { + FD_ZERO(&selectSet); + FD_SET(fdNewDrivesInformPipe[0], &selectSet); + FD_SET(fdShredInformPipe[0], &selectSet); + + select(FD_SETSIZE, &selectSet, NULL, NULL, NULL); + + if (FD_ISSET(fdNewDrivesInformPipe[0], &selectSet)) { - FD_ZERO(&selectSet); - FD_SET(fdNewDrivesInformPipe[0], &selectSet); - FD_SET(fdShredInformPipe[0], &selectSet); - - select(FD_SETSIZE, &selectSet, NULL, NULL, NULL); - - if(FD_ISSET(fdNewDrivesInformPipe[0], &selectSet)) - { - mxDrives.lock(); - char dummy; - read (fdNewDrivesInformPipe[0],&dummy,1); - filterNewDrives(&listDrives, &listNewDrives); //filter and copy to app logic vector - printDrives(&listDrives); - mxDrives.unlock(); - } - if(FD_ISSET(fdShredInformPipe[0], &selectSet)) - { - char dummy; - read (fdShredInformPipe[0],&dummy,1); - updateShredMetrics(&listDrives); + mxDrives.lock(); + char dummy; + read(fdNewDrivesInformPipe[0], &dummy, 1); + filterNewDrives(&listDrives, &listNewDrives); // filter and copy to app logic vector + printDrives(&listDrives); + mxDrives.unlock(); + } + if (FD_ISSET(fdShredInformPipe[0], &selectSet)) + { + char dummy; + read(fdShredInformPipe[0], &dummy, 1); + updateShredMetrics(&listDrives); #ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("got progress signal from a shred task"); + Logger::logThis()->info("got progress signal from a shred task"); #endif - } - ui->updateTUI(&listDrives, u8SelectedEntry); - } //endless loop + } + ui->updateTUI(&listDrives, u8SelectedEntry); + } // endless loop thDevices.join(); thUserInput.join(); thCheckFrozenDrives.join(); } -Drive* reHDD::getSelectedDrive() +Drive *reHDD::getSelectedDrive() { - if(u8SelectedEntry < listDrives.size() ) - { - list::iterator it = listDrives.begin(); - advance(it, u8SelectedEntry); - return &(*it); - } + if (u8SelectedEntry < listDrives.size()) + { + list::iterator it = listDrives.begin(); + advance(it, u8SelectedEntry); + return &(*it); + } else - { - Logger::logThis()->warning("selected drive not present"); - return {}; - } + { + Logger::logThis()->warning("selected drive not present"); + return {}; + } } void reHDD::ThreadScanDevices() { - while(true) - { - 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 - mxDrives.unlock(); - write(fdNewDrivesInformPipe[1], "A",1); - sleep(5); //sleep 5 sec - } + while (true) + { + 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 + filterInvalidDrives(&listNewDrives); // filter out drives that report zero capacity + mxDrives.unlock(); + write(fdNewDrivesInformPipe[1], "A", 1); + sleep(5); // sleep 5 sec + } } void reHDD::ThreadCheckFrozenDrives() { - while(true) + while (true) + { + mxDrives.lock(); + for (auto it = begin(listDrives); it != end(listDrives); ++it) { - mxDrives.lock(); - for(auto it = begin(listDrives); it != end(listDrives); ++it) - { - if(it->state == Drive::SHRED_ACTIVE) - { - it->checkFrozenDrive(); - } - } - mxDrives.unlock(); - sleep(13); //sleep 13 sec + if (it->state == Drive::SHRED_ACTIVE) + { + it->checkFrozenDrive(); + } } + mxDrives.unlock(); + sleep(13); // sleep 13 sec + } } void reHDD::ThreadUserInput() { - while(true) + while (true) + { + // cout << TUI::readUserInput() << endl; + switch (TUI::readUserInput()) { - // cout << TUI::readUserInput() << endl; - switch (TUI::readUserInput()) + case TUI::UserInput::DownKey: + // cout << "Down" << endl; + handleArrowKey(TUI::UserInput::DownKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::UpKey: + // cout << "Up" << endl; + handleArrowKey(TUI::UserInput::UpKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Undefined: + // cout << "Undefined" << endl; + break; + case TUI::UserInput::Abort: + // cout << "Abort" << endl; + handleAbort(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Delete: + // cout << "Delete" << endl; + + if (getSelectedDrive() != nullptr) + { + if (getSelectedDrive()->state == Drive::NONE) { - case TUI::UserInput::DownKey: - //cout << "Down" << endl; - handleArrowKey(TUI::UserInput::DownKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::UpKey: - //cout << "Up" << endl; - handleArrowKey(TUI::UserInput::UpKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Undefined: - //cout << "Undefined" << endl; - break; - case TUI::UserInput::Abort: - //cout << "Abort" << endl; - handleAbort(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Delete: - //cout << "Delete" << endl; - - if (getSelectedDrive() != nullptr) - { - if(getSelectedDrive()->state == Drive::NONE) - { - getSelectedDrive()->state = Drive::DELETE_SELECTED; - } - } - - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Shred: - //cout << "Shred" << endl; - - if (getSelectedDrive() != nullptr) - { - if(getSelectedDrive()->state == Drive::NONE) - { - getSelectedDrive()->state = Drive::SHRED_SELECTED; - } - } - - 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(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::ESC: - //cout << "ESC" << endl; - handleESC(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - default: - break; + getSelectedDrive()->state = Drive::DELETE_SELECTED; } + } + + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Shred: + // cout << "Shred" << endl; + + if (getSelectedDrive() != nullptr) + { + if (getSelectedDrive()->state == Drive::NONE) + { + getSelectedDrive()->state = Drive::SHRED_SELECTED; + } + } + + 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(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::ESC: + // cout << "ESC" << endl; + handleESC(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + default: + break; } + } } -void reHDD::ThreadShred(Drive* const pDrive) +void reHDD::ThreadShred(Drive *const pDrive) { if (pDrive != nullptr) - { - pDrive->setActionStartTimestamp(); //save timestamp at start of shredding - Shred* pShredTask = new Shred(); //create new shred task - pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); //start new shred task - delete pShredTask; //delete shred task - ui->updateTUI(&listDrives, u8SelectedEntry); - } + { + pDrive->setActionStartTimestamp(); // save timestamp at start of shredding + Shred *pShredTask = new Shred(); // create new shred task + pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); // start new shred task + delete pShredTask; // delete shred task + ui->updateTUI(&listDrives, u8SelectedEntry); + } } void reHDD::ThreadDelete() { if (getSelectedDrive() != nullptr) - { - getSelectedDrive()->setActionStartTimestamp(); //save timestamp at start of deleting - Delete::deleteDrive(getSelectedDrive()); //blocking, no thread - getSelectedDrive()->state = Drive::TaskState::NONE; //delete finished - getSelectedDrive()->bWasDeleted = true; - Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - ui->updateTUI(&listDrives, u8SelectedEntry); - } + { + getSelectedDrive()->setActionStartTimestamp(); // save timestamp at start of deleting + Delete::deleteDrive(getSelectedDrive()); // blocking, no thread + getSelectedDrive()->state = Drive::TaskState::NONE; // delete finished + getSelectedDrive()->bWasDeleted = true; + Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + ui->updateTUI(&listDrives, u8SelectedEntry); + } } -void reHDD::filterNewDrives(list * plistOldDrives, list * plistNewDrives) +void reHDD::filterNewDrives(list *plistOldDrives, list *plistNewDrives) { - list ::iterator itOld; //Iterator for current (old) drive list - list ::iterator itNew; //Iterator for new drive list that was created from to scan thread + list::iterator itOld; // Iterator for current (old) drive list + list::iterator itNew; // Iterator for new drive list that was created from to scan thread - //remove offline old drives from previously run + // remove offline old drives from previously run for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end();) + { + if (itOld->bIsOffline == true) { - if(itOld->bIsOffline == true) - { - Logger::logThis()->warning("Offline drive found: " + itOld->getPath()); - itOld = plistOldDrives->erase(itOld); - /* - if(plistOldDrives->size() > 0){ //This can be a risk if the user starts a task for the selected drive and the selected drive changes - u8SelectedEntry = 0U; - } - */ - } - else - { - ++itOld; - } + Logger::logThis()->warning("Offline drive found: " + itOld->getPath()); + itOld = plistOldDrives->erase(itOld); + /* + if(plistOldDrives->size() > 0){ //This can be a risk if the user starts a task for the selected drive and the selected drive changes + u8SelectedEntry = 0U; + } + */ } - - //search offline drives and mark them - for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) + else { - 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())) - { - 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()); + ++itOld; + } + } + + // search offline drives and mark them + for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) + { + 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())) + { + 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 already attached: " + itNew->getModelName()); + Logger::logThis()->info("Delete new drive, because already attached: " + itNew->getModelName()); #endif - itNew = plistNewDrives->erase(itNew); //This drive is already attached, remove from new list - } - else - { - ++itNew; - } - } + itNew = plistNewDrives->erase(itNew); // This drive is already attached, remove from new list + } + else + { + ++itNew; + } } + } - //mark offline old drives + // mark offline old drives for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) + { + if (itOld->bIsOffline == true) { - if(itOld->bIsOffline == true) - { - //cout << "offline drive found: " << itOld->getPath() << endl; - Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath()); - itOld->state = Drive::NONE; //clear state --> shred task will terminate - } + // cout << "offline drive found: " << itOld->getPath() << endl; + Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath()); + itOld->state = Drive::NONE; // clear state --> shred task will terminate } + } - //add new drives to drive list + // add new drives to drive list for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end(); ++itNew) - { - plistOldDrives->push_back(*itNew); - //Logger::logThis()->info("Add new drive: " + itNew->getModelName()); - } + { + plistOldDrives->push_back(*itNew); + // Logger::logThis()->info("Add new drive: " + itNew->getModelName()); + } plistNewDrives->clear(); } @@ -299,31 +300,40 @@ void reHDD::filterNewDrives(list * plistOldDrives, list * plistNew * \param pointer of list * plistDrives * \return void */ -void reHDD::searchDrives(list * plistDrives) +void reHDD::searchDrives(list *plistDrives) { - //Logger::logThis()->info("--> search drives <--"); - char * cLine = NULL; + // Logger::logThis()->info("--> search drives <--"); + char *cLine = NULL; size_t len = 0; - FILE* outputfileHwinfo = popen("lsblk -I 8 -d -o NAME", "r"); + FILE *outputfileHwinfo = popen("lsblk -e 11 -d -o NAME", "r"); if (outputfileHwinfo == NULL) - { - Logger::logThis()->error("Unable to scan attached drives"); - exit(EXIT_FAILURE); - } + { + Logger::logThis()->error("Unable to scan attached drives"); + exit(EXIT_FAILURE); + } while ((getline(&cLine, &len, outputfileHwinfo)) != -1) + { + if (string(cLine).length() == 4) { - if (string(cLine).length() == 4) - { - Drive* tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 3)); - tmpDrive->state = Drive::NONE; - tmpDrive->bIsOffline = false; - plistDrives->push_back(*tmpDrive); - //Logger::logThis()->info("drive found: " + tmpDrive->getPath()); - } + Drive *tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 3)); + tmpDrive->state = Drive::NONE; + tmpDrive->bIsOffline = false; + plistDrives->push_back(*tmpDrive); + // Logger::logThis()->info("SATA drive found: " + tmpDrive->getPath()); } + + if (string(cLine).length() == 8) + { + Drive *tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 7)); + tmpDrive->state = Drive::NONE; + tmpDrive->bIsOffline = false; + plistDrives->push_back(*tmpDrive); + // Logger::logThis()->info("NVME drive found: " + tmpDrive->getPath()); + } + } pclose(outputfileHwinfo); } @@ -332,59 +342,80 @@ void reHDD::searchDrives(list * plistDrives) * \param pointer of list * plistDrives * \return void */ -void reHDD::filterIgnoredDrives(list * plistDrives) +void reHDD::filterIgnoredDrives(list *plistDrives) { - list> vtlIgnoredDevices; //store drives from ignore file - ifstream input( "ignoreDrives.conf" ); //read ignore file + list> vtlIgnoredDevices; // store drives from ignore file + ifstream input("ignoreDrives.conf"); // read ignore file - for(string sLine; getline( input, sLine );) + for (string sLine; getline(input, 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 ignore file + for (auto row : vtlIgnoredDevices) + { + list::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { - //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 ignore file - for(auto row : vtlIgnoredDevices) - { - list ::iterator it; - for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + string sUUID; + char *cLine = NULL; + size_t len = 0; + string sCMD = "blkid "; + sCMD.append(it->getPath()); + // cout << "cmd: " << sCMD << endl; + FILE *outputfileBlkid = popen(sCMD.c_str(), "r"); // get UUID from drive + if (outputfileBlkid == NULL) + { + exit(EXIT_FAILURE); + } + + while ((getline(&cLine, &len, outputfileBlkid)) != -1) // parse UUID from blkid + { + if (string(cLine).find("PTUUID") != string::npos) { - string sUUID; - char * cLine = NULL; - size_t len = 0; - string sCMD = "blkid "; - sCMD.append(it->getPath()); - //cout << "cmd: " << sCMD << endl; - FILE* outputfileBlkid = popen(sCMD.c_str(), "r"); //get UUID from drive - if (outputfileBlkid == NULL) - { - exit(EXIT_FAILURE); - } - - while ((getline(&cLine, &len, outputfileBlkid)) != -1) //parse UUID from blkid - { - if (string(cLine).find("PTUUID") != string::npos) - { - string sBlkidOut = string(cLine); - sBlkidOut.erase(0, 18); - sBlkidOut.erase(8, sBlkidOut.length()); - sUUID = sBlkidOut; - //cout << "blkid uuid:" << sUUID << endl; - } - } - pclose(outputfileBlkid); - //cout << "blkid uuid:" << sUUID << endl; - - if (!get<0>(row).compare(sUUID)) //compare uuid from ignore file and uuid from drive - { - // same uuid found than in ignore file --> ignore this drive -#ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath()); -#endif - it = plistDrives->erase(it); - it--; - } + string sBlkidOut = string(cLine); + sBlkidOut.erase(0, 18); + sBlkidOut.erase(8, sBlkidOut.length()); + sUUID = sBlkidOut; + // cout << "blkid uuid:" << sUUID << endl; } + } + pclose(outputfileBlkid); + // cout << "blkid uuid:" << sUUID << endl; + + if (!get<0>(row).compare(sUUID)) // compare uuid from ignore file and uuid from drive + { + // same uuid found than in ignore file --> ignore this drive +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath()); +#endif + it = plistDrives->erase(it); + it--; + } } + } +} + +/** + * \brief filter out drives that are not indented for processing + * \param pointer of list * plistDrives + * \return void + */ +void reHDD::filterInvalidDrives(list *plistDrives) +{ + list::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if (it->getCapacity() == 0U) + { +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("Drive reports zero capacity --> ignore this drive: " + it->getPath()); +#endif + it = plistDrives->erase(it); + it--; + } + } } /** @@ -392,24 +423,24 @@ void reHDD::filterIgnoredDrives(list * plistDrives) * \param pointer of list * plistDrives * \return void */ -void reHDD::startShredAllDrives(list * plistDrives) +void reHDD::startShredAllDrives(list *plistDrives) { - list ::iterator it; + list::iterator it; mxDrives.lock(); for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if (it->state == Drive::NONE) { - if(it->state == Drive::NONE) - { - Drive* pTmpDrive = iterator_to_pointer::iterator > (it); + Drive *pTmpDrive = iterator_to_pointer::iterator>(it); #ifdef LOG_LEVEL_HIGH - ostringstream address; - address << (void const *)&(*pTmpDrive); - Logger::logThis()->info("Started shred (all) for: " + pTmpDrive->getModelName() + "-" + pTmpDrive->getSerial() + " @" + address.str()); + 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(); - } + pTmpDrive->state = Drive::TaskState::SHRED_ACTIVE; + thread(ThreadShred, pTmpDrive).detach(); } + } mxDrives.unlock(); } @@ -418,33 +449,33 @@ void reHDD::startShredAllDrives(list * plistDrives) * \param pointer of list * plistDrives * \return void */ -void reHDD::printDrives(list * plistDrives) +void reHDD::printDrives(list *plistDrives) { #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("------------DRIVES START------------"); - //cout << "------------DRIVES---------------" << endl; - list ::iterator it; + // cout << "------------DRIVES---------------" << endl; + list::iterator it; uint8_t u8Index = 0; for (it = plistDrives->begin(); it != plistDrives->end(); ++it) - { - /* - cout << " Drive: " << distance(pvecDrives->begin(), it) << endl; - cout << "Path: " << it->getPath() << endl; - cout << "ModelFamily: " << it->getModelFamily() << endl; - cout << "ModelName: " << it->getModelName() << endl; - cout << "Capacity: " << it->getCapacity() << endl; - cout << "Serial: " << it->getSerial() << endl; - cout << "PowerOnHours: " << it->getPowerOnHours() << endl; - cout << "PowerCycle: " << it->getPowerCycles() << endl; - cout << "ErrorCount: " << it->getErrorCount() << endl; - cout << endl;*/ + { + /* + cout << " Drive: " << distance(pvecDrives->begin(), it) << endl; + cout << "Path: " << it->getPath() << endl; + cout << "ModelFamily: " << it->getModelFamily() << endl; + cout << "ModelName: " << it->getModelName() << endl; + cout << "Capacity: " << it->getCapacity() << endl; + cout << "Serial: " << it->getSerial() << endl; + cout << "PowerOnHours: " << it->getPowerOnHours() << endl; + cout << "PowerCycle: " << it->getPowerCycles() << endl; + cout << "ErrorCount: " << it->getErrorCount() << endl; + cout << endl;*/ - ostringstream address; - address << (void const *)&(*it); - Logger::logThis()->info(to_string(u8Index++) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str()); - } + ostringstream address; + address << (void const *)&(*it); + Logger::logThis()->info(to_string(u8Index++) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str()); + } Logger::logThis()->info("------------DRIVES END--------------"); - //cout << "---------------------------------" << endl; + // cout << "---------------------------------" << endl; #endif } @@ -453,26 +484,26 @@ void reHDD::printDrives(list * plistDrives) * \param pointer of list * plistDrives * \return void */ -void reHDD::updateShredMetrics(list * plistDrives) +void reHDD::updateShredMetrics(list *plistDrives) { - list ::iterator it; + list::iterator it; for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if (it->state == Drive::SHRED_ACTIVE) { - 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; - } - } + 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; + } } + } } /** @@ -480,100 +511,97 @@ void reHDD::updateShredMetrics(list * plistDrives) * \param pointer of list * plistDrives * \return void */ -void reHDD::addSMARTData(list * plistDrives) +void reHDD::addSMARTData(list *plistDrives) { - list ::iterator it; + list::iterator it; for (it = plistDrives->begin(); it != plistDrives->end(); ++it) - { - Drive* pTmpDrive = iterator_to_pointer::iterator > (it); - SMART::readSMARTData(pTmpDrive); - } + { + Drive *pTmpDrive = iterator_to_pointer::iterator>(it); + SMART::readSMARTData(pTmpDrive); + } } void reHDD::handleArrowKey(TUI::UserInput userInput) { - int8_t u8EntrySize = (int8_t) listDrives.size(); + int8_t u8EntrySize = (int8_t)listDrives.size(); switch (userInput) + { + case TUI::UserInput::DownKey: + u8SelectedEntry++; + if (u8SelectedEntry >= u8EntrySize) { - case TUI::UserInput::DownKey: - u8SelectedEntry++; - if(u8SelectedEntry >= u8EntrySize) - { - u8SelectedEntry = 0; - } - break; - case TUI::UserInput::UpKey: - if(u8SelectedEntry == 0) - { - u8SelectedEntry = (u8EntrySize-1); - } - else - { - u8SelectedEntry--; - } - break; - default: u8SelectedEntry = 0; - break; } + break; + case TUI::UserInput::UpKey: + if (u8SelectedEntry == 0) + { + u8SelectedEntry = (u8EntrySize - 1); + } + else + { + u8SelectedEntry--; + } + break; + default: + u8SelectedEntry = 0; + break; + } - //Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry)); + // Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry)); } void reHDD::handleEnter() { if (getSelectedDrive() != nullptr) + { + if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) { - if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) - { - Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; - //task for drive is running --> don´t show more task options - Drive* pTmpDrive = getSelectedDrive(); - thread(ThreadShred, pTmpDrive).detach(); - } - - if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) - { - Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE; - //task for drive is running --> don´t show more task options - thread(ThreadDelete).detach(); - } + Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; + // task for drive is running --> don´t show more task options + Drive *pTmpDrive = getSelectedDrive(); + thread(ThreadShred, pTmpDrive).detach(); } + + if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + { + Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE; + // task for drive is running --> don´t show more task options + thread(ThreadDelete).detach(); + } + } } void reHDD::handleESC() { if (getSelectedDrive() != nullptr) + { + if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) { - if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) - { - getSelectedDrive()->state = Drive::TaskState::NONE; - //task for drive is selected --> remove selection - } - - if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) - { - getSelectedDrive()->state = Drive::TaskState::NONE; - //task for drive is selected --> remove selection - } + getSelectedDrive()->state = Drive::TaskState::NONE; + // task for drive is selected --> remove selection } + + if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + { + getSelectedDrive()->state = Drive::TaskState::NONE; + // task for drive is selected --> remove selection + } + } } void reHDD::handleAbort() { if (getSelectedDrive() != nullptr) + { + if (getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE) { - if(getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE ) - { - getSelectedDrive()->state = Drive::NONE; - Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - //task for drive is running --> remove selection - } + getSelectedDrive()->state = Drive::NONE; + Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + // task for drive is running --> remove selection } + } } - - - diff --git a/src/shred.cpp b/src/shred.cpp index 65bf219..158e19b 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -8,14 +8,15 @@ #include "../include/reHDD.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #include "../tfnoisegen/tfprng.h" #ifdef __cplusplus } #endif -const static char *randomsrc = (char*) "/dev/urandom"; +const static char *randomsrc = (char *)"/dev/urandom"; Shred::Shred() { @@ -30,181 +31,182 @@ Shred::~Shred() * \param pointer of Drive instance * \return void */ -int Shred::shredDrive(Drive* drive, int* ipSignalFd) +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 - for(int i = 0; i<=500; i++) + for (int i = 0; i <= 500; i++) + { + if (drive->state != Drive::SHRED_ACTIVE) { - if(drive->state != Drive::SHRED_ACTIVE) - { - return 0; - } - drive->setTaskPercentage(i+0.05); - write(*ipSignalFd, "A",1); - usleep(20000); + return 0; } + drive->setTaskPercentage(i + 0.05); + write(*ipSignalFd, "A", 1); + usleep(20000); + } #endif #ifndef DRYRUN const char *cpDrivePath = drive->getPath().c_str(); unsigned char ucKey[TFNG_KEY_SIZE]; - //open random source + // open random source randomSrcFileDiscr = open(randomsrc, O_RDONLY | O_LARGEFILE); if (randomSrcFileDiscr == -1) - { - std::string errorMsg(strerror(randomSrcFileDiscr)); - Logger::logThis()->error("Shred-Task: Open random source failed! " + errorMsg + " - Drive: " + drive->getSerial()); - perror(randomsrc); - cleanup(); - return -1; - } + { + std::string errorMsg(strerror(randomSrcFileDiscr)); + Logger::logThis()->error("Shred-Task: Open random source failed! " + errorMsg + " - Drive: " + drive->getSerial()); + perror(randomsrc); + cleanup(); + return -1; + } - //open disk + // open disk driveFileDiscr = open(cpDrivePath, O_RDWR | O_LARGEFILE); if (driveFileDiscr == -1) - { - std::string errorMsg(strerror(driveFileDiscr)); - Logger::logThis()->error("Shred-Task: Open drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); - perror(cpDrivePath); - cleanup(); - return -1; - } + { + std::string errorMsg(strerror(driveFileDiscr)); + Logger::logThis()->error("Shred-Task: Open drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); + perror(cpDrivePath); + cleanup(); + return -1; + } - //read key for random generator - ssize_t readRet = read(randomSrcFileDiscr, ucKey, sizeof(ucKey)) ; + // 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; - } + { + 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 - drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; //uses to calculate speed metric + drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + ; // set inital timestamp for 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()); #endif 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 + + if (uiShredIterationCounter == (SHRED_ITERATIONS - 1)) { - unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position + // last shred iteration --> overwrite (just the write chunk) bytes with zeros instead with random data + memset(caTfngData, 0U, CHUNK_SIZE); + } - if(uiShredIterationCounter == (SHRED_ITERATIONS-1)) - { - //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 - while (ulDriveByteCounter < ulDriveByteSize) - { - int iBytesToShred = 0; //Bytes that will be overwritten in this chunk-iteration + if (uiShredIterationCounter != (SHRED_ITERATIONS - 1)) + { + // NOT last shred iteration --> generate new random data + tfng_prng_genrandom(caTfngData, TFNG_DATA_SIZE); + } - if(uiShredIterationCounter != (SHRED_ITERATIONS-1)) - { - //NOT last shred iteration --> generate new random data - tfng_prng_genrandom(caTfngData, TFNG_DATA_SIZE); - } + if ((ulDriveByteSize - ulDriveByteCounter) < CHUNK_SIZE) + { + iBytesToShred = (ulDriveByteSize - ulDriveByteCounter); + } + else + { + iBytesToShred = CHUNK_SIZE; + } - if((ulDriveByteSize-ulDriveByteCounter) < CHUNK_SIZE) - { - iBytesToShred = (ulDriveByteSize-ulDriveByteCounter); - } - else - { - iBytesToShred = CHUNK_SIZE; - } + int iByteShredded = write(driveFileDiscr, caTfngData, iBytesToShred); - int iByteShredded = write(driveFileDiscr, caTfngData, iBytesToShred); + if (iByteShredded <= 0) + { + std::string errorMsg(strerror(iByteShredded)); + Logger::logThis()->error("Shred-Task: Write to drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); + perror("unable to write random data"); + cleanup(); + return -1; + } - if(iByteShredded <= 0) - { - std::string errorMsg(strerror(iByteShredded)); - Logger::logThis()->error("Shred-Task: Write to drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); - perror("unable to write random data"); - cleanup(); - return -1; - } - - ulDriveByteCounter += iByteShredded; - ulDriveByteOverallCount += iByteShredded; - d32Percent = this->calcProgress(); - drive->sShredSpeed.ulSpeedMetricBytesWritten += iByteShredded; + ulDriveByteCounter += iByteShredded; + ulDriveByteOverallCount += iByteShredded; + d32Percent = this->calcProgress(); + drive->sShredSpeed.ulSpeedMetricBytesWritten += iByteShredded; #ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter+1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); + 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; - //signal process in shreding - write(*ipSignalFd, "A",1); - } + if ((d32Percent - d32TmpPercent) >= 0.01) + { + // set shred percantage + drive->setTaskPercentage(d32TmpPercent); + d32TmpPercent = d32Percent; + // signal process in shreding + write(*ipSignalFd, "A", 1); + } - if(drive->state != Drive::SHRED_ACTIVE) - { - drive->setTaskPercentage(0); - d32Percent = 0.00; - d32TmpPercent = 0.00; - ulDriveByteCounter = 0U; - Logger::logThis()->info("Aborted shred for: " + drive->getModelName() + "-" + drive->getSerial()); - cleanup(); - return -1; - } - //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 + if (drive->state != Drive::SHRED_ACTIVE) + { + drive->setTaskPercentage(0); + d32Percent = 0.00; + d32TmpPercent = 0.00; + ulDriveByteCounter = 0U; + Logger::logThis()->info("Aborted shred for: " + drive->getModelName() + "-" + drive->getSerial()); + cleanup(); + return -1; + } + // end one chunk write } - //end of all shred iteratio + if (0 != iRewindDrive(driveFileDiscr)) + { + Logger::logThis()->error("Shred-Task: Unable to rewind drive! - Drive: " + drive->getSerial()); + cleanup(); + return -1; + } + // end one shred iteration + } + // end of all shred iteratio - tfng_prng_seedkey(NULL); //reset random generator + tfng_prng_seedkey(NULL); // reset random generator drive->bWasShredded = true; Logger::logThis()->info("Shred-Task finished - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); #ifdef ZERO_CHECK - drive->state=Drive::CHECK_ACTIVE; + drive->state = Drive::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->u32DriveChecksumAferShredding != 0) - { - 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 - { - 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 cleanup(); - if((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_ACTIVE)) - { - drive->state= Drive::NONE; - drive->setTaskPercentage(0.0); - Printer::getPrinter()->print(drive); - Logger::logThis()->info("Finished shred/check for: " + drive->getModelName() + "-" + drive->getSerial()); - } + if ((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_ACTIVE)) + { + drive->state = Drive::NONE; + drive->setTaskPercentage(0.0); + Printer::getPrinter()->print(drive); + Logger::logThis()->info("Finished shred/check for: " + drive->getModelName() + "-" + drive->getSerial()); + } return 0; } /** @@ -218,32 +220,32 @@ double Shred::calcProgress() unsigned int uiMaxShredIteration = SHRED_ITERATIONS; #ifdef ZERO_CHECK - uiMaxShredIteration++; //increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes + uiMaxShredIteration++; // increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes #endif - return (double) (((double) ulDriveByteOverallCount) / ((double)this->ulDriveByteSize*uiMaxShredIteration))*100.0f; + return (double)(((double)ulDriveByteOverallCount) / ((double)this->ulDriveByteSize * uiMaxShredIteration)) * 100.0f; } int Shred::iRewindDrive(fileDescriptor file) { - if(0 != lseek(file, 0L, SEEK_SET)) - { - perror("unable to rewind drive"); - return -1; - } + if (0 != lseek(file, 0L, SEEK_SET)) + { + perror("unable to rewind drive"); + return -1; + } else - { - return 0; - } + { + return 0; + } } unsigned long Shred::getDriveSizeInBytes(fileDescriptor file) { unsigned long ulDriveSizeTmp = lseek(file, 0L, SEEK_END); - if(0 != iRewindDrive(file)) - { - ulDriveSizeTmp = 0U; - } + if (0 != iRewindDrive(file)) + { + ulDriveSizeTmp = 0U; + } #ifdef DEMO_DRIVE_SIZE ulDriveSizeTmp = DEMO_DRIVE_SIZE; @@ -251,45 +253,45 @@ unsigned long Shred::getDriveSizeInBytes(fileDescriptor file) return ulDriveSizeTmp; } -unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSignalFd) +unsigned int Shred::uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSignalFd) { unsigned int uiChecksum = 0; unsigned long ulDriveByteCounter = 0U; while (ulDriveByteCounter < ulDriveByteSize) + { + int iBytesToCheck = 0; + if ((ulDriveByteSize - ulDriveByteCounter) < CHUNK_SIZE) { - int iBytesToCheck = 0; - if((ulDriveByteSize-ulDriveByteCounter) < CHUNK_SIZE) - { - iBytesToCheck = (ulDriveByteSize-ulDriveByteCounter); - } - else - { - iBytesToCheck = CHUNK_SIZE; - } - int iReadBytes = read(file, caReadBuffer, iBytesToCheck); - for (int iReadBytesCounter = 0U; iReadBytesCounter < iReadBytes; iReadBytesCounter++) - { - uiChecksum += caReadBuffer[iReadBytesCounter]; - } - 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.01) || (d32Percent == 100.0)) - { - drive->setTaskPercentage(d32TmpPercent); - d32TmpPercent = d32Percent; -#ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("send progress signal to main loop (check)"); -#endif - write(*ipSignalFd, "A",1); - } + iBytesToCheck = (ulDriveByteSize - ulDriveByteCounter); } + else + { + iBytesToCheck = CHUNK_SIZE; + } + int iReadBytes = read(file, caReadBuffer, iBytesToCheck); + for (int iReadBytesCounter = 0U; iReadBytesCounter < iReadBytes; iReadBytesCounter++) + { + uiChecksum += caReadBuffer[iReadBytesCounter]; + } + 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.01) || (d32Percent == 100.0)) + { + drive->setTaskPercentage(d32TmpPercent); + d32TmpPercent = d32Percent; +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("send progress signal to main loop (check)"); +#endif + write(*ipSignalFd, "A", 1); + } + } drive->bWasChecked = true; return uiChecksum; } diff --git a/src/smart.cpp b/src/smart.cpp index a19fa67..b26d034 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -21,7 +21,7 @@ uint32_t SMART::temperature = 0U; * \param pointer of Drive instance * \return void */ -void SMART::readSMARTData(Drive* drive) +void SMART::readSMARTData(Drive *drive) { modelFamily.clear(); modelName.clear(); @@ -32,19 +32,25 @@ void SMART::readSMARTData(Drive* drive) powerCycle = 0U; temperature = 0U; - size_t len = 0; //lenght of found line - char* cLine = NULL; //found line + string sSmartctlCommands[] = {" --json -a ", " --json -d sntjmicron -a ", " --json -d sntasmedia -a ", " --json -d sntrealtek -a "}; - string sCMD = ("smartctl --json -a "); - sCMD.append(drive->getPath()); - const char* cpComand = sCMD.c_str(); + for (string sSmartctlCommand : sSmartctlCommands) + { + string sCMD = ("smartctl"); + sCMD.append(sSmartctlCommand); + sCMD.append(drive->getPath()); + const char *cpComand = sCMD.c_str(); - FILE* outputfileSmart = popen(cpComand, "r"); + FILE *outputfileSmart = popen(cpComand, "r"); + size_t len = 0; // length of found line + char *cLine = NULL; // found line + uint8_t status = 255; - while ((getline(&cLine, &len, outputfileSmart)) != -1) + while ((getline(&cLine, &len, outputfileSmart)) != -1) { string sLine = string(cLine); + status = SMART::parseExitStatus(sLine); SMART::parseModelFamily(sLine); SMART::parseModelName(sLine); SMART::parseSerial(sLine); @@ -54,8 +60,35 @@ void SMART::readSMARTData(Drive* drive) SMART::parsePowerCycle(sLine); SMART::parseTemperature(sLine); } - pclose(outputfileSmart); - drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle, temperature); //wirte data in drive + + pclose(outputfileSmart); + + if (status == 0U) + { + // Found S.M.A.R.T. data with this command + break; + } + } + + drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle, temperature); // wirte data in drive +} + +/** + * \brief parse ExitStatus + * \param string output line of smartctl + * \return uint_8 exit status + */ +uint8_t SMART::parseExitStatus(string sLine) +{ + uint8_t exitStatus = -1; + string search("\"exit_status\": "); + size_t found = sLine.find(search); + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 1); + exitStatus = stol(sLine); + } + return exitStatus; } /** @@ -67,12 +100,12 @@ void SMART::parseModelFamily(string sLine) { string search("\"model_family\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 3); - sLine.erase(sLine.length()-3, 3); - modelFamily = sLine; - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 3); + sLine.erase(sLine.length() - 3, 3); + modelFamily = sLine; + } } /** @@ -84,12 +117,12 @@ void SMART::parseModelName(string sLine) { string search("\"model_name\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 3); - sLine.erase(sLine.length()-3, 3); - modelName = sLine; - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 3); + sLine.erase(sLine.length() - 3, 3); + modelName = sLine; + } } /** @@ -101,12 +134,12 @@ void SMART::parseSerial(string sLine) { string search("\"serial_number\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 3); - sLine.erase(sLine.length()-3, 3); - serial = sLine; - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 3); + sLine.erase(sLine.length() - 3, 3); + serial = sLine; + } } /** @@ -118,12 +151,12 @@ void SMART::parseCapacity(string sLine) { string search("\"bytes\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length()-1, 1); - capacity = stol(sLine); - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length() - 1, 1); + capacity = stol(sLine); + } } /** @@ -135,12 +168,12 @@ void SMART::parseErrorCount(string sLine) { string search("\"error_count_total\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ")+2); - sLine.erase(sLine.length()-2, 2); - errorCount = stol(sLine); - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length() - 2, 2); + errorCount = stol(sLine); + } } /** @@ -152,13 +185,12 @@ void SMART::parsePowerOnHours(string sLine) { string search("\"hours\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length()-1, 1); - powerOnHours = stol(sLine); - - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length() - 1, 1); + powerOnHours = stol(sLine); + } } /** @@ -170,13 +202,12 @@ void SMART::parsePowerCycle(string sLine) { string search("\"power_cycle_count\": "); size_t found = sLine.find(search); - if (found!=string::npos) - { - sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length()-2, 2); - powerCycle = stol(sLine); - - } + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length() - 2, 2); + powerCycle = stol(sLine); + } } /** @@ -188,17 +219,17 @@ void SMART::parseTemperature(string sLine) { string search("\"current\": "); size_t found = sLine.find(search); - if (found!=string::npos) + if (found != string::npos) + { + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length() - 1, 2); + if (sLine == "{") { - 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); - } + temperature = 0U; // this drive doesn't support temperature } + else + { + temperature = stol(sLine); + } + } } diff --git a/src/tui.cpp b/src/tui.cpp index ae43f4a..3ed1c32 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -11,7 +11,6 @@ static std::mutex mxUIrefresh; TUI::TUI(void) { - } /** @@ -24,22 +23,22 @@ void TUI::initTUI() { initscr(); raw(); - keypad(stdscr,TRUE); - if(has_colors() == TRUE) - { - start_color(); - } + keypad(stdscr, TRUE); + if (has_colors() == TRUE) + { + start_color(); + } else - { - printf("Your terminal does not support color\n"); - Logger::logThis()->error("Your terminal does not support color"); - exit(1); - } + { + printf("Your terminal does not support color\n"); + Logger::logThis()->error("Your terminal does not support color"); + exit(1); + } clear(); curs_set(0); noecho(); cbreak(); - init_pair(COLOR_AREA_STDSCR,COLOR_WHITE, COLOR_BLUE); + init_pair(COLOR_AREA_STDSCR, COLOR_WHITE, COLOR_BLUE); wbkgd(stdscr, COLOR_PAIR(COLOR_AREA_STDSCR)); init_pair(COLOR_AREA_ENTRY_EVEN, COLOR_BLACK, COLOR_WHITE); @@ -52,195 +51,195 @@ void TUI::initTUI() Logger::logThis()->info("UI successfully initialized"); } -void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) +void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) { mxUIrefresh.lock(); uint16_t u16StdscrX, u16StdscrY; getmaxyx(stdscr, u16StdscrY, u16StdscrX); - init_pair(COLOR_AREA_STDSCR,COLOR_WHITE, COLOR_BLUE); + init_pair(COLOR_AREA_STDSCR, COLOR_WHITE, COLOR_BLUE); wbkgd(stdscr, COLOR_PAIR(COLOR_AREA_STDSCR)); refresh(); - //overview window is 3/7 of the x-size - overview=createOverViewWindow((int)(u16StdscrX *(float)(3.0/7.0)), (u16StdscrY-1)); + // overview window is 3/7 of the x-size + overview = createOverViewWindow((int)(u16StdscrX * (float)(3.0 / 7.0)), (u16StdscrY - 1)); wrefresh(overview); - //system stat window is 2/7 of the x-size - systemview=createSystemStats(((int)(u16StdscrX *(float)(2.0/7.0)))-6, 12, (int)(u16StdscrX *(float)(5.0/7.0)+4), (u16StdscrY-13 )); + // system stat window is 2/7 of the x-size + systemview = createSystemStats(((int)(u16StdscrX * (float)(2.0 / 7.0))) - 6, 12, (int)(u16StdscrX * (float)(5.0 / 7.0) + 4), (u16StdscrY - 13)); wrefresh(systemview); delwin(detailview); - list ::iterator it; + list::iterator it; uint8_t u8Index = 0U; for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + string sModelFamily = it->getModelFamily(); + string sSerial = "SN: " + it->getSerial(); + string sCapacity = it->sCapacityToText(); + string sState = " "; + string sSpeed = " "; + string sTime = " "; + string sTemp = it->sTemperatureToText(); + + bool bSelectedEntry = false; + + if (u8SelectedEntry == u8Index) { - string sModelFamily = it->getModelFamily(); - string sSerial = "SN: " + it->getSerial(); - string sCapacity = it->sCapacityToText(); - string sState = " "; - string sSpeed = " "; - string sTime = " "; - string sTemp = it->sTemperatureToText(); + bSelectedEntry = true; // mark this drive in entries list + displaySelectedDrive(*it, u16StdscrX, u16StdscrY); - bool bSelectedEntry = false; + 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(), it->getTemperature()); + wrefresh(smartWarning); + } + } - if(u8SelectedEntry == u8Index) + stringstream stream; + + switch (it->state) + { + case Drive::SHRED_ACTIVE: + + stream << fixed << setprecision(3) << (it->getTaskPercentage()); + sState = "Shredding: " + stream.str() + "%"; + + it->calculateTaskDuration(); + sTime = this->formatTimeDuration(it->getTaskDuration()); + sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); + break; + case Drive::CHECK_ACTIVE: + stream << fixed << setprecision(3) << (it->getTaskPercentage()); + sState = "Checking: " + stream.str() + "%"; + it->calculateTaskDuration(); + sTime = this->formatTimeDuration(it->getTaskDuration()); + sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); + break; + case Drive::DELETE_ACTIVE: + sState = "Deleting ..."; + it->calculateTaskDuration(); + sTime = this->formatTimeDuration(it->getTaskDuration()); + break; + case Drive::NONE: + case Drive::SHRED_SELECTED: + case Drive::DELETE_SELECTED: + if (it->bWasDeleted) + { + sState = "DELETED"; // mark drive as deleted previously + } + if (it->bWasShredded) + { + if (it->bWasChecked) { - bSelectedEntry = true; //mark this drive in entries list - displaySelectedDrive(*it, u16StdscrX, u16StdscrY); - - 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(), it->getTemperature()); - wrefresh(smartWarning); - } + // drive was also checked after shredding + sState = "SHREDDED & CHECKED"; // mark drive as shredded previously and optional checked } - - stringstream stream; - - switch (it->state) + else { - case Drive::SHRED_ACTIVE: - - stream << fixed << setprecision(3) << (it->getTaskPercentage()); - sState = "Shredding: " + stream.str() + "%"; - - it->calculateTaskDuration(); - sTime = this->formatTimeDuration(it->getTaskDuration()); - sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); - break; - case Drive::CHECK_ACTIVE: - stream << fixed << setprecision(3) << (it->getTaskPercentage()); - sState = "Checking: " + stream.str() + "%"; - it->calculateTaskDuration(); - sTime = this->formatTimeDuration(it->getTaskDuration()); - sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); - break; - case Drive::DELETE_ACTIVE: - sState = "Deleting ..."; - it->calculateTaskDuration(); - sTime = this->formatTimeDuration(it->getTaskDuration()); - break; - case Drive::NONE: - case Drive::SHRED_SELECTED: - case Drive::DELETE_SELECTED: - if (it->bWasDeleted) - { - sState = "DELETED"; //mark drive as deleted previously - } - if (it->bWasShredded) - { - if(it->bWasChecked) - { - //drive was also checked after shredding - sState = "SHREDDED & CHECKED"; //mark drive as shredded previously and optional checked - } - else - { - //shredded and not checked yet - sState = "SHREDDED"; //mark drive as shredded previously - } - sTime = this->formatTimeDuration(it->getTaskDuration()); - } + // shredded and not checked yet + sState = "SHREDDED"; // mark drive as shredded previously + } + sTime = this->formatTimeDuration(it->getTaskDuration()); + } #ifdef ZERO_CHECK - if(bSelectedEntry && it->bWasChecked && (it->u32DriveChecksumAfterShredding != 0U)) - { - 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); - } + if (bSelectedEntry && it->bWasChecked && (it->u32DriveChecksumAfterShredding != 0U)) + { + 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); + } #endif - break; - case Drive::FROZEN: - stream << fixed << setprecision(3) << (it->getTaskPercentage()); + break; + case Drive::FROZEN: + stream << fixed << setprecision(3) << (it->getTaskPercentage()); #ifdef FROZEN_ALERT - if(bSelectedEntry) - { - dialog=createFrozenWarning(70, 16, ((u16StdscrX)-(int)(u16StdscrX/2)-20),(int)(u16StdscrY/2)-8, it->getPath(), it->getModelFamily(), it->getModelName(), it->getSerial(), stream.str() + "%"); - wrefresh(dialog); - } + if (bSelectedEntry) + { + dialog = createFrozenWarning(70, 16, ((u16StdscrX) - (int)(u16StdscrX / 2) - 20), (int)(u16StdscrY / 2) - 8, it->getPath(), it->getModelFamily(), it->getModelName(), it->getSerial(), stream.str() + "%"); + wrefresh(dialog); + } #endif - sState = "FROZEN " + stream.str() + "%"; //mark drive as frozen and reached progress - break; - default: - break; - } - - uint16_t u16StartOffsetY = (2 * (u8Index)); - - WINDOW * tmp = createEntryWindow( (int)(u16StdscrX *(float)(3.0/7.0) - 2), 2, 3, u16StartOffsetY + 2, (distance(plistDrives->begin(), it)+1), sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, sTemp, bSelectedEntry); - wrefresh(tmp); - u8Index++; - }//end loop though drives - - if(plistDrives->size() == 0) - { - //no selected drive present - Logger::logThis()->warning("no selected drive present"); - struct MenuState menustate; - menustate.bAbort = false; - menustate.bConfirmDelete = false; - menustate.bConfirmShred = false; - menustate.bDelete = false; - menustate.bShred = false; - - detailview=overwriteDetailViewWindow((u16StdscrX)-((int)(u16StdscrX *(float)(3.0/7.0)))-7, (u16StdscrY-15), (int)(u16StdscrX *(float)(3.0/7.0)+5)); - wrefresh(detailview); - - menuview=createMenuView(((int)(u16StdscrX *(float)(2.0/7.0)))-3, 12, (int)(u16StdscrX *(float)(3.0/7.0)+5),(u16StdscrY-13), menustate); - wrefresh(menuview); + sState = "FROZEN " + stream.str() + "%"; // mark drive as frozen and reached progress + break; + default: + break; } + uint16_t u16StartOffsetY = (2 * (u8Index)); + + WINDOW *tmp = createEntryWindow((int)(u16StdscrX * (float)(3.0 / 7.0) - 2), 2, 3, u16StartOffsetY + 2, (distance(plistDrives->begin(), it) + 1), sModelFamily, sSerial, sCapacity, sState, sTime, sSpeed, sTemp, bSelectedEntry); + wrefresh(tmp); + u8Index++; + } // end loop though drives + + if (plistDrives->size() == 0) + { + // no selected drive present + Logger::logThis()->warning("no selected drive present"); + struct MenuState menustate; + menustate.bAbort = false; + menustate.bConfirmDelete = false; + menustate.bConfirmShred = false; + menustate.bDelete = false; + menustate.bShred = false; + + detailview = overwriteDetailViewWindow((u16StdscrX) - ((int)(u16StdscrX * (float)(3.0 / 7.0))) - 7, (u16StdscrY - 15), (int)(u16StdscrX * (float)(3.0 / 7.0) + 5)); + wrefresh(detailview); + + menuview = createMenuView(((int)(u16StdscrX * (float)(2.0 / 7.0))) - 3, 12, (int)(u16StdscrX * (float)(3.0 / 7.0) + 5), (u16StdscrY - 13), menustate); + wrefresh(menuview); + } + mxUIrefresh.unlock(); } enum TUI::UserInput TUI::readUserInput() { int ch = wgetch(stdscr); - switch(ch) - { - case KEY_UP: - return TUI::UserInput::UpKey; - break; - case KEY_DOWN: - return TUI::UserInput::DownKey; - break; - case 10: - return TUI::UserInput::Enter; - break; - case 27: - return TUI::UserInput::ESC; - break; - case 'a': - return TUI::UserInput::Abort; - break; - case 'd': - return TUI::UserInput::Delete; - break; - case 's': - return TUI::UserInput::Shred; - break; - case 'S': - return TUI::UserInput::ShredAll; - break; - default: - return TUI::UserInput::Undefined; - break; - } + switch (ch) + { + case KEY_UP: + return TUI::UserInput::UpKey; + break; + case KEY_DOWN: + return TUI::UserInput::DownKey; + break; + case 10: + return TUI::UserInput::Enter; + break; + case 27: + return TUI::UserInput::ESC; + break; + case 'a': + return TUI::UserInput::Abort; + break; + case 'd': + return TUI::UserInput::Delete; + break; + case 's': + return TUI::UserInput::Shred; + break; + case 'S': + return TUI::UserInput::ShredAll; + break; + default: + return TUI::UserInput::Undefined; + break; + } return TUI::UserInput::Undefined; } -void TUI::centerTitle(WINDOW *pwin, const char * title) +void TUI::centerTitle(WINDOW *pwin, const char *title) { int x, maxX, stringSize; getmaxyx(pwin, maxX, maxX); stringSize = 4 + strlen(title); - x = (maxX - stringSize)/2; + x = (maxX - stringSize) / 2; mvwaddch(pwin, 0, x, ACS_RTEE); waddch(pwin, ' '); waddstr(pwin, title); @@ -251,7 +250,7 @@ void TUI::centerTitle(WINDOW *pwin, const char * title) /* left window that contains the drive entries */ -WINDOW* TUI::createOverViewWindow( int iXSize, int iYSize) +WINDOW *TUI::createOverViewWindow(int iXSize, int iYSize) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, 1, 2); @@ -264,7 +263,7 @@ WINDOW* TUI::createOverViewWindow( int iXSize, int iYSize) return newWindow; } -WINDOW* TUI::createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive) +WINDOW *TUI::createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive drive) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, 1, iXStart); @@ -274,33 +273,33 @@ WINDOW* TUI::createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive string title = "Selected Drive: " + drive.getModelName() + " " + drive.sCapacityToText(); centerTitle(newWindow, title.c_str()); - string sPath = "Path: " +drive.getPath(); + string sPath = "Path: " + drive.getPath(); string sModelFamily = "ModelFamily: " + drive.getModelFamily(); - string sModelName = "ModelName: " + drive.getModelName(); - string sCapacity = "Capacity: " + drive.sCapacityToText(); - string sSerial = "Serial: " + drive.getSerial(); + string sModelName = "ModelName: " + drive.getModelName(); + string sCapacity = "Capacity: " + drive.sCapacityToText(); + string sSerial = "Serial: " + drive.getSerial(); string sPowerOnHours = "PowerOnHours: " + drive.sPowerOnHoursToText(); - string sPowerCycle = "PowerCycle: " + drive.sPowerCyclesToText(); - string sErrorCount = "ErrorCount: " + drive.sErrorCountToText(); + string sPowerCycle = "PowerCycle: " + drive.sPowerCyclesToText(); + string sErrorCount = "ErrorCount: " + drive.sErrorCountToText(); uint16_t u16Line = 2; - mvwaddstr(newWindow,u16Line++, 3, sPath.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sModelFamily.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sModelName.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sCapacity.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sSerial.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sPath.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sModelFamily.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sModelName.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sCapacity.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sSerial.c_str()); attroff(COLOR_PAIR(COLOR_AREA_DETAIL)); - mvwaddstr(newWindow,u16Line++, 3, sPowerOnHours.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sPowerCycle.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sErrorCount.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sPowerOnHours.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sPowerCycle.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sErrorCount.c_str()); return newWindow; } -WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) +WINDOW *TUI::overwriteDetailViewWindow(int iXSize, int iYSize, int iXStart) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, 1, iXStart); @@ -310,61 +309,61 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart) string title = "About this tool"; centerTitle(newWindow, title.c_str()); - 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 sLine05 = "Delete: Wipe format table - this is NOT secure"; - string sLine06 = "Shred: Overwrite drive " + to_string(SHRED_ITERATIONS) + " iterations - this is secure"; + 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 sLine05 = "Delete: Wipe format table - this is NOT secure"; + string sLine06 = "Shred: Overwrite drive " + to_string(SHRED_ITERATIONS) + " iterations - this is secure"; uint16_t u16Line = 5; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine01.c_str()); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine02.size()/2), sLine02.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), sLine01.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine02.size() / 2), sLine02.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine03.size()/2), sLine03.c_str()); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine04.size()/2), sLine04.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine03.size() / 2), sLine03.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine04.size() / 2), sLine04.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine05.size()/2), sLine05.c_str()); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine06.size()/2), sLine06.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine05.size() / 2), sLine05.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine06.size() / 2), sLine06.c_str()); attroff(COLOR_PAIR(COLOR_AREA_DETAIL)); 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, string sTemp, 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); - if(!bSelected) + if (!bSelected) + { + // entry is NOT selected + if (iListIndex % 2 == 0) { - // entry is NOT selected - if(iListIndex % 2 == 0) - { - //even - attron(COLOR_PAIR(COLOR_AREA_ENTRY_EVEN)); - wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_EVEN)); - } - else - { - //odd - attron(COLOR_PAIR(COLOR_AREA_ENTRY_ODD)); - wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_ODD)); - } + // even + attron(COLOR_PAIR(COLOR_AREA_ENTRY_EVEN)); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_EVEN)); } + else + { + // odd + attron(COLOR_PAIR(COLOR_AREA_ENTRY_ODD)); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_ODD)); + } + } else - { - // entry IS selected - attron(COLOR_PAIR(COLOR_AREA_ENTRY_SELECTED)); - wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_SELECTED)); - } + { + // entry IS selected + attron(COLOR_PAIR(COLOR_AREA_ENTRY_SELECTED)); + wbkgd(newWindow, COLOR_PAIR(COLOR_AREA_ENTRY_SELECTED)); + } - //box(newWindow, ACS_VLINE, ACS_HLINE); + // box(newWindow, ACS_VLINE, ACS_HLINE); - //index number - mvwaddstr(newWindow,0, 1, to_string(iListIndex).c_str()); + // index number + mvwaddstr(newWindow, 0, 1, to_string(iListIndex).c_str()); /* 70 chars in x-axis @@ -404,7 +403,7 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, return newWindow; } -WINDOW* TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) +WINDOW *TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -415,11 +414,11 @@ WINDOW* TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) centerTitle(newWindow, "System"); time_t rawtime; - struct tm * timeinfo; + struct tm *timeinfo; char buffer[80]; - time (&rawtime); + time(&rawtime); timeinfo = localtime(&rawtime); - strftime(buffer,sizeof(buffer),"Date: %d-%m-%Y Time: %H:%M",timeinfo); + strftime(buffer, sizeof(buffer), "Date: %d-%m-%Y Time: %H:%M", timeinfo); string time(buffer); string sLine01 = "reHDD - hard drive refurbishing tool"; @@ -428,24 +427,24 @@ WINDOW* TUI::createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart) sLine03.append(__DATE__); sLine03.append(" "); sLine03.append(__TIME__); - string sLine04 = "Available under GPL 3.0"; - string sLine05 = "https://git.mosad.xyz/localhorst/reHDD"; + string sLine04 = "Available under GPL 3.0"; + string sLine05 = "https://git.mosad.xyz/localhorst/reHDD"; uint16_t u16Line = 2; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine01.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), sLine01.c_str()); u16Line++; - 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()); + 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()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), time.c_str()); return newWindow; } -WINDOW* TUI::createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate) +WINDOW *TUI::createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -457,28 +456,28 @@ WINDOW* TUI::createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, st uint16_t u16Line = 4; - if(menustate.bAbort) - { - 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 (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"; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str()); - } + if (menustate.bAbort) + { + 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 (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"; + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLineTmp.size() / 2), sLineTmp.c_str()); + } return newWindow; } -WINDOW* TUI::createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string task, string optionA, string optionB) +WINDOW *TUI::createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string task, string optionA, string optionB) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -489,14 +488,14 @@ WINDOW* TUI::createDialog(int iXSize, int iYSize, int iXStart, int iYStart, stri centerTitle(newWindow, task.c_str()); uint16_t u16Line = 3; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(optionA.size()/2), optionA.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (optionA.size() / 2), optionA.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(optionB.size()/2), optionB.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (optionB.size() / 2), optionB.c_str()); return newWindow; } -WINDOW* TUI::createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, string sProgress) +WINDOW *TUI::createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, string sProgress) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -507,10 +506,10 @@ WINDOW* TUI::createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStar string sHeader = "Drive " + sPath + " is frozen"; string sLine01 = "Please detach this drive and check it manually:"; string sShredState = "Shredding stopped after " + sProgress; - string sLinePath = "Path: " +sPath; + string sLinePath = "Path: " + sPath; string sLineModelFamlily = "ModelFamily: " + sModelFamily; - string sLineModelName = "ModelName: " + sModelName; - string sLineSerial = "Serial: " + sSerial; + string sLineModelName = "ModelName: " + sModelName; + string sLineSerial = "Serial: " + sSerial; string sLine02 = "reHDD was not able to write data to the drive."; string sLine03 = "This can be caused by an malfunctioning drive."; @@ -518,21 +517,21 @@ WINDOW* TUI::createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStar centerTitle(newWindow, sHeader.c_str()); uint16_t u16Line = 2; - mvwaddstr(newWindow,u16Line++, 3, sLine01.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine01.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, 3, sLinePath.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineModelFamlily.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineModelName.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineSerial.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLinePath.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineModelFamlily.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineModelName.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineSerial.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, 3, sLine02.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLine03.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sShredState.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine02.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine03.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sShredState.c_str()); return newWindow; } -WINDOW* TUI::createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, uint32_t u32Checksum) +WINDOW *TUI::createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, uint32_t u32Checksum) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, iYStart, iXStart); @@ -543,10 +542,10 @@ WINDOW* TUI::createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int string sHeader = "Drive " + sPath + " is NOT successfully shredded!"; string sLine01 = "Please detach this drive and check it manually:"; string sShredChecksum = "After shredding the checksum was: " + to_string(u32Checksum); - string sLinePath = "Path: " +sPath; + string sLinePath = "Path: " + sPath; string sLineModelFamily = "ModelFamily: " + sModelFamily; - string sLineModelName = "ModelName: " + sModelName; - string sLineSerial = "Serial: " + sSerial; + string sLineModelName = "ModelName: " + sModelName; + string sLineSerial = "Serial: " + sSerial; string sLine02 = "reHDD was not able to write zero into every byte on the drive."; string sLine03 = "This can be caused by an malfunctioning drive."; @@ -554,16 +553,16 @@ WINDOW* TUI::createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int centerTitle(newWindow, sHeader.c_str()); uint16_t u16Line = 2; - mvwaddstr(newWindow,u16Line++, 3, sLine01.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine01.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, 3, sLinePath.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineModelFamily.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineModelName.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLineSerial.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLinePath.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineModelFamily.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineModelName.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLineSerial.c_str()); u16Line++; - mvwaddstr(newWindow,u16Line++, 3, sLine02.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sLine03.c_str()); - mvwaddstr(newWindow,u16Line++, 3, sShredChecksum.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine02.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sLine03.c_str()); + mvwaddstr(newWindow, u16Line++, 3, sShredChecksum.c_str()); return newWindow; } @@ -571,12 +570,12 @@ WINDOW* TUI::createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int string TUI::formatTimeDuration(time_t u32Duration) { std::ostringstream out; - int dy=(int)((u32Duration)/86400); - int hr=(int)(((u32Duration)/3600)%24); - int min=((int)((u32Duration)/60))%60; - int sec=(int)((u32Duration)%60); + int dy = (int)((u32Duration) / 86400); + int hr = (int)(((u32Duration) / 3600) % 24); + int min = ((int)((u32Duration) / 60)) % 60; + int sec = (int)((u32Duration) % 60); char s[25]; - sprintf(s, "%02d:%02d:%02d:%02d", dy, hr, min, sec); + sprintf(s, "%02d:%02d:%02d:%02d", dy, hr, min, sec); out << s; return out.str(); } @@ -584,21 +583,21 @@ string TUI::formatTimeDuration(time_t u32Duration) 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); + 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::vTruncateText(string* psText, uint16_t u16MaxLenght) +void TUI::vTruncateText(string *psText, uint16_t u16MaxLenght) { if (psText->length() > u16MaxLenght) - { - psText->resize(u16MaxLenght-3); - *psText = *psText + "..."; - } + { + psText->resize(u16MaxLenght - 3); + *psText = *psText + "..."; + } } void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) @@ -606,63 +605,63 @@ void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) struct MenuState menustate; menustate.bAbort = false; menustate.bConfirmDelete = false; - menustate.bConfirmShred = false; + menustate.bConfirmShred = false; menustate.bDelete = false; menustate.bShred = false; // set menustate based on drive state switch (drive.state) - { - case Drive::NONE: //no task running or selected for this drive - menustate.bShred = true; - menustate.bDelete = true; - break; - case Drive::DELETE_ACTIVE : //delete task running for this drive - menustate.bAbort = true; - break; + { + case Drive::NONE: // no task running or selected for this drive + menustate.bShred = true; + menustate.bDelete = true; + break; + case Drive::DELETE_ACTIVE: // delete task running for this drive + menustate.bAbort = true; + break; - case Drive::SHRED_ACTIVE : //shred task running for this drive - menustate.bAbort = true; - break; + case Drive::SHRED_ACTIVE: // shred task running for this drive + menustate.bAbort = true; + break; - case Drive::CHECK_ACTIVE : //check task running for this drive - menustate.bAbort = true; - break; + case Drive::CHECK_ACTIVE: // check task running for this drive + menustate.bAbort = true; + break; - case Drive::DELETE_SELECTED : //delete task selected for this drive - menustate.bConfirmDelete = true; - break; + case Drive::DELETE_SELECTED: // delete task selected for this drive + menustate.bConfirmDelete = true; + break; - case Drive::SHRED_SELECTED : //shred task selected for this drive - menustate.bConfirmShred = true; - break; - default: - break; - } + case Drive::SHRED_SELECTED: // shred task selected for this drive + menustate.bConfirmShred = true; + break; + default: + break; + } - detailview=createDetailViewWindow((stdscrX)-((int)(stdscrX *(float)(3.0/7.0)))-7, (stdscrY-15), (int)(stdscrX *(float)(3.0/7.0)+5), drive); + detailview = createDetailViewWindow((stdscrX) - ((int)(stdscrX * (float)(3.0 / 7.0))) - 7, (stdscrY - 15), (int)(stdscrX * (float)(3.0 / 7.0) + 5), drive); wrefresh(detailview); - menuview=createMenuView(((int)(stdscrX *(float)(2.0/7.0)))-3, 12, (int)(stdscrX *(float)(3.0/7.0)+5),(stdscrY-13), menustate); + menuview = createMenuView(((int)(stdscrX * (float)(2.0 / 7.0))) - 3, 12, (int)(stdscrX * (float)(3.0 / 7.0) + 5), (stdscrY - 13), menustate); wrefresh(menuview); - if(menustate.bConfirmShred == true) - { - dialog=createDialog(40, 10, ((stdscrX)-(int)(stdscrX/3)-7)-(int)((stdscrX/3)+5)/2,(int)(stdscrY/2)-5, "Confirm SHRED", "Press ENTER for SHRED", "Press ESC for cancel"); - wrefresh(dialog); - } - else if(menustate.bConfirmDelete == true) - { - dialog=createDialog(40, 10, ((stdscrX)-(int)(stdscrX/3)-7)-(int)((stdscrX/3)+5)/2,(int)(stdscrY/2)-5, "Confirm DELETE", "Press ENTER for DELETE", "Press ESC for cancel"); - wrefresh(dialog); - } + if (menustate.bConfirmShred == true) + { + dialog = createDialog(40, 10, ((stdscrX) - (int)(stdscrX / 3) - 7) - (int)((stdscrX / 3) + 5) / 2, (int)(stdscrY / 2) - 5, "Confirm SHRED", "Press ENTER for SHRED", "Press ESC for cancel"); + wrefresh(dialog); + } + else if (menustate.bConfirmDelete == true) + { + dialog = createDialog(40, 10, ((stdscrX) - (int)(stdscrX / 3) - 7) - (int)((stdscrX / 3) + 5) / 2, (int)(stdscrY / 2) - 5, "Confirm DELETE", "Press ENTER for DELETE", "Press ESC for cancel"); + wrefresh(dialog); + } else - { - delwin(dialog); - } + { + delwin(dialog); + } } -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 *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); @@ -676,34 +675,34 @@ WINDOW* TUI::createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart centerTitle(newWindow, sHeader.c_str()); uint16_t u16Line = 2; - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLine01.c_str()); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), sLine01.c_str()); u16Line++; - if(u32PowerOnHours > WORSE_HOURS) - { - string sLineTmp = "Operating hours exceeded " + to_string(WORSE_HOURS) + " hours: " + to_string(u32PowerOnHours); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLineTmp.c_str()); - u16Line++; - } + if (u32PowerOnHours > WORSE_HOURS) + { + string sLineTmp = "Operating hours exceeded " + to_string(WORSE_HOURS) + " hours: " + to_string(u32PowerOnHours); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), sLineTmp.c_str()); + u16Line++; + } - if(u32PowerCycles > WORSE_POWERUP) - { - string sLineTmp = "Power-on exceeded " + to_string(WORSE_POWERUP) + " cycles: " + to_string(u32PowerCycles); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLineTmp.c_str()); - u16Line++; - } + if (u32PowerCycles > WORSE_POWERUP) + { + string sLineTmp = "Power-on exceeded " + to_string(WORSE_POWERUP) + " cycles: " + to_string(u32PowerCycles); + mvwaddstr(newWindow, u16Line++, (iXSize / 2) - (sLine01.size() / 2), sLineTmp.c_str()); + u16Line++; + } - if(u32ErrorCount > 0) - { - string sLineTmp = "S.M.A.R.T. errors detected: " + to_string(u32ErrorCount); - mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLine01.size()/2), sLineTmp.c_str()); - u16Line++; - } + if (u32ErrorCount > 0) + { + string sLineTmp = "S.M.A.R.T. errors 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()); - } + 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; }