diff --git a/include/reHDD.h b/include/reHDD.h index aa3085d..eb5b670 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -8,7 +8,7 @@ #ifndef REHDD_H_ #define REHDD_H_ -#define REHDD_VERSION "V1.1.1" +#define REHDD_VERSION "V1.1.2" // Drive handling Settings #define WORSE_HOURS 19200 // mark drive if at this limit or beyond @@ -31,7 +31,7 @@ #endif // Logic -// #define DRYRUN //don´t touch the drives +#define DRYRUN //don´t touch the drives #define FROZEN_ALERT // show alert if drive is frozen #define ZERO_CHECK // check drive after shred if all bytes are zero, show alert if this fails diff --git a/include/smart.h b/include/smart.h index d19d231..735f92e 100644 --- a/include/smart.h +++ b/include/smart.h @@ -19,24 +19,15 @@ public: private: SMART(void); - static uint8_t parseExitStatus(string sLine); - static void parseModelFamily(string sLine); - static void parseModelName(string sLine); - static void parseSerial(string sLine); - static void parseCapacity(string sLine); - static void parseErrorCount(string sLine); - static void parsePowerOnHours(string sLine); - static void parsePowerCycle(string sLine); - static void parseTemperature(string sLine); - - static string modelFamily; - static string modelName; - static string serial; - static uint64_t capacity; - static uint32_t errorCount; - static uint32_t powerOnHours; - static uint32_t powerCycle; - static uint32_t temperature; + static bool parseExitStatus(string sLine, uint8_t &status); + static bool parseModelFamily(string sLine, string &modelFamily); + static bool parseModelName(string sLine, string &modelName); + static bool parseSerial(string sLine, string &serial); + static bool parseCapacity(string sLine, uint64_t &capacity); + static bool parseErrorCount(string sLine, uint32_t &errorCount); + static bool parsePowerOnHours(string sLine, uint32_t &powerOnHours); + static bool parsePowerCycles(string sLine, uint32_t &powerCycles); + static bool parseTemperature(string sLine, uint32_t &temperature); }; #endif // SMART_H_ \ No newline at end of file diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 14587c1..bc4f5e3 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -560,7 +560,7 @@ void reHDD::handleEnter() { 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 + // task for drive is running --> don't show more task options Drive *pTmpDrive = getSelectedDrive(); thread(ThreadShred, pTmpDrive).detach(); } @@ -569,7 +569,7 @@ void reHDD::handleEnter() { 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 + // task for drive is running --> don't show more task options thread(ThreadDelete).detach(); } } diff --git a/src/smart.cpp b/src/smart.cpp index b26d034..6478caa 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -7,15 +7,6 @@ #include "../include/reHDD.h" -string SMART::modelFamily; -string SMART::modelName; -string SMART::serial; -uint64_t SMART::capacity = 0U; -uint32_t SMART::errorCount = 0U; -uint32_t SMART::powerOnHours = 0U; -uint32_t SMART::powerCycle = 0U; -uint32_t SMART::temperature = 0U; - /** * \brief get and set S.M.A.R.T. values in Drive * \param pointer of Drive instance @@ -23,14 +14,18 @@ uint32_t SMART::temperature = 0U; */ void SMART::readSMARTData(Drive *drive) { + string modelFamily; + string modelName; + string serial; + uint64_t capacity = 0U; + uint32_t errorCount = 0U; + uint32_t powerOnHours = 0U; + uint32_t powerCycles = 0U; + uint32_t temperature = 0U; + modelFamily.clear(); modelName.clear(); serial.clear(); - capacity = 0U; - errorCount = 0U; - powerOnHours = 0U; - powerCycle = 0U; - temperature = 0U; string sSmartctlCommands[] = {" --json -a ", " --json -d sntjmicron -a ", " --json -d sntasmedia -a ", " --json -d sntrealtek -a "}; @@ -41,24 +36,26 @@ void SMART::readSMARTData(Drive *drive) sCMD.append(drive->getPath()); const char *cpComand = sCMD.c_str(); + // Logger::logThis()->info(cpComand); + FILE *outputfileSmart = popen(cpComand, "r"); - size_t len = 0; // length of found line + size_t len = 0U; // length of found line char *cLine = NULL; // found line - uint8_t status = 255; + uint8_t status = 255U; while ((getline(&cLine, &len, outputfileSmart)) != -1) { string sLine = string(cLine); - status = SMART::parseExitStatus(sLine); - SMART::parseModelFamily(sLine); - SMART::parseModelName(sLine); - SMART::parseSerial(sLine); - SMART::parseCapacity(sLine); - SMART::parseErrorCount(sLine); - SMART::parsePowerOnHours(sLine); - SMART::parsePowerCycle(sLine); - SMART::parseTemperature(sLine); + SMART::parseExitStatus(sLine, status); + SMART::parseModelFamily(sLine, modelFamily); + SMART::parseModelName(sLine, modelName); + SMART::parseSerial(sLine, serial); + SMART::parseCapacity(sLine, capacity); + SMART::parseErrorCount(sLine, errorCount); + SMART::parsePowerOnHours(sLine, powerOnHours); + SMART::parsePowerCycles(sLine, powerCycles); + SMART::parseTemperature(sLine, temperature); } pclose(outputfileSmart); @@ -66,71 +63,89 @@ void SMART::readSMARTData(Drive *drive) if (status == 0U) { // Found S.M.A.R.T. data with this command + // Logger::logThis()->info("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 + drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycles, temperature); // write data in drive } /** - * \brief parse ExitStatus - * \param string output line of smartctl - * \return uint_8 exit status + * \brief parse ExitStatus + * \param string output line of smartctl + * \param uint8_t parsed status + * \return bool if parsing was possible */ -uint8_t SMART::parseExitStatus(string sLine) +bool SMART::parseExitStatus(string sLine, uint8_t &status) { - 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); + sLine.erase(0U, sLine.find(": ") + 1U); + status = stol(sLine); + return true; + } + else + { + return false; } - return exitStatus; } /** - * \brief parse ModelFamiliy - * \param string output line of smartctl - * \return void + * \brief parse ModelFamily + * \param string output line of smartctl + * \param string parsed model family + * \return bool if parsing was possible */ -void SMART::parseModelFamily(string sLine) +bool SMART::parseModelFamily(string sLine, string &modelFamily) { 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); + sLine.erase(0U, sLine.find(": ") + 3U); + sLine.erase(sLine.length() - 3U, 3U); modelFamily = sLine; + return true; + } + else + { + return false; } } /** - * \brief parse ModelName - * \param string output line of smartctl - * \return void + * \brief parse ModelName + * \param string output line of smartctl + * \param string parsed model name + * \return bool if parsing was possible */ -void SMART::parseModelName(string sLine) +bool SMART::parseModelName(string sLine, string &modelName) { 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); + sLine.erase(0U, sLine.find(": ") + 3U); + sLine.erase(sLine.length() - 3U, 3U); modelName = sLine; + return true; + } + else + { + return false; } } /** - * \brief parse Serial - * \param string output line of smartctl - * \return void + * \brief parse Serial + * \param string output line of smartctl + * \param string parsed serial + * \return bool if parsing was possible */ -void SMART::parseSerial(string sLine) +bool SMART::parseSerial(string sLine, string &serial) { string search("\"serial_number\": "); size_t found = sLine.find(search); @@ -139,15 +154,21 @@ void SMART::parseSerial(string sLine) sLine.erase(0, sLine.find(": ") + 3); sLine.erase(sLine.length() - 3, 3); serial = sLine; + return true; + } + else + { + return false; } } /** - * \brief parse Capacity - * \param string output line of smartctl - * \return void + * \brief parse Capacity + * \param string output line of smartctl + * \param string parsed capacity + * \return bool if parsing was possible */ -void SMART::parseCapacity(string sLine) +bool SMART::parseCapacity(string sLine, uint64_t &capacity) { string search("\"bytes\": "); size_t found = sLine.find(search); @@ -156,49 +177,67 @@ void SMART::parseCapacity(string sLine) sLine.erase(0, sLine.find(": ") + 2); sLine.erase(sLine.length() - 1, 1); capacity = stol(sLine); + return true; + } + else + { + return false; } } /** - * \brief parse ErrorCount - * \param string output line of smartctl - * \return void + * \brief parse ErrorCount + * \param string output line of smartctl + * \param uint32_t parsed error count + * \return bool if parsing was possible */ -void SMART::parseErrorCount(string sLine) +bool SMART::parseErrorCount(string sLine, uint32_t &errorCount) { 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); + sLine.erase(0U, sLine.find(": ") + 2U); + sLine.erase(sLine.length() - 2U, 2U); errorCount = stol(sLine); + return true; + } + else + { + return false; } } /** - * \brief parse PowerOnHours - * \param string output line of smartctl - * \return void + * \brief parse PowerOnHours + * \param string output line of smartctl\ + * \param uint32_t parsed power on hours + * \return bool if parsing was possible */ -void SMART::parsePowerOnHours(string sLine) +bool SMART::parsePowerOnHours(string sLine, uint32_t &powerOnHours) { 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); + sLine.erase(0U, sLine.find(": ") + 2U); + sLine.erase(sLine.length() - 1U, 1U); powerOnHours = stol(sLine); + return true; + } + else + { + return false; } } /** - * \brief parse PowerCycle - * \param string output line of smartctl - * \return void + * \brief parse PowerCycle + * \param string output line of smartctl + * \param uint32_t parsed power cycles + * \return bool if parsing was possible */ -void SMART::parsePowerCycle(string sLine) +bool SMART::parsePowerCycles(string sLine, uint32_t &powerCycles) { string search("\"power_cycle_count\": "); size_t found = sLine.find(search); @@ -206,23 +245,29 @@ void SMART::parsePowerCycle(string sLine) { sLine.erase(0, sLine.find(": ") + 2); sLine.erase(sLine.length() - 2, 2); - powerCycle = stol(sLine); + powerCycles = stol(sLine); + return true; + } + else + { + return false; } } /** - * \brief parse temperature - * \param string output line of smartctl - * \return void + * \brief parse temperature + * \param string output line of smartctl + * \param uint32_t parsed temperature + * \return bool if parsing was possible */ -void SMART::parseTemperature(string sLine) +bool SMART::parseTemperature(string sLine, uint32_t &temperature) { string search("\"current\": "); size_t found = sLine.find(search); if (found != string::npos) { - sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length() - 1, 2); + sLine.erase(0U, sLine.find(": ") + 2U); + sLine.erase(sLine.length() - 1U, 2U); if (sLine == "{") { temperature = 0U; // this drive doesn't support temperature @@ -231,5 +276,10 @@ void SMART::parseTemperature(string sLine) { temperature = stol(sLine); } + return true; + } + else + { + return false; } } diff --git a/src/tui.cpp b/src/tui.cpp index 3ed1c32..b14036e 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -43,11 +43,21 @@ void TUI::initTUI() init_pair(COLOR_AREA_ENTRY_EVEN, COLOR_BLACK, COLOR_WHITE); init_pair(COLOR_AREA_ENTRY_ODD, COLOR_BLUE, COLOR_WHITE); + +#ifdef DRYRUN + init_pair(COLOR_AREA_ENTRY_SELECTED, COLOR_WHITE, COLOR_GREEN); +#elif init_pair(COLOR_AREA_ENTRY_SELECTED, COLOR_WHITE, COLOR_RED); +#endif + init_pair(COLOR_AREA_OVERVIEW, COLOR_BLACK, COLOR_WHITE); init_pair(COLOR_AREA_DETAIL, COLOR_BLACK, COLOR_WHITE); +#ifdef DRYRUN + mvprintw(0, 2, "reHDD - HDD refurbishing tool - GPL 3.0 DRYRUN is active! Don't use in production!"); +#elif mvprintw(0, 2, "reHDD - HDD refurbishing tool - GPL 3.0 "); +#endif Logger::logThis()->info("UI successfully initialized"); }