diff --git a/include/reHDD.h b/include/reHDD.h index 7bd1e90..9ffa69f 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -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 @@ -101,6 +101,7 @@ private: static void handleESC(); static void handleAbort(); static Drive *getSelectedDrive(); + static bool getSystemDrive(string &systemDrive); }; #endif // REHDD_H_ diff --git a/src/reHDD.cpp b/src/reHDD.cpp index bc4f5e3..9338242 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -344,6 +344,26 @@ void reHDD::searchDrives(list *plistDrives) */ void reHDD::filterIgnoredDrives(list *plistDrives) { + string systemDrivePath; + if (getSystemDrive(systemDrivePath)) + { + // Logger::logThis()->info("Found system drive: " + systemDrivePath); + + list::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if (it->getPath().find(systemDrivePath) != std::string::npos) // compare found system drive and current drive + { + // system drive found --> ignore this drive +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("system drive found --> ignore this drive: " + it->getPath()); +#endif + it = plistDrives->erase(it); + it--; + } + } + } + list> vtlIgnoredDevices; // store drives from ignore file ifstream input("ignoreDrives.conf"); // read ignore file @@ -605,3 +625,53 @@ void reHDD::handleAbort() } } } + +bool reHDD::getSystemDrive(string &systemDrive) +{ + char *cLine = NULL; + size_t len = 0; + bool systemDriveFound = false; + + FILE *outputfileHwinfo = popen("lsblk -e 11 -o NAME,MOUNTPOINT", "r"); + + if (outputfileHwinfo == NULL) + { + Logger::logThis()->error("Unable to scan attached drives for system drive"); + exit(EXIT_FAILURE); + } + + while ((getline(&cLine, &len, outputfileHwinfo)) != -1) + { + string currentLine = cLine; + + if (currentLine.find("NAME") != std::string::npos) + { + continue; + } + + // Logger::logThis()->info(currentLine); + + if ((cLine[0U] != '|') && (cLine[0U] != '`')) + { + systemDrive = currentLine; + systemDrive.erase(std::remove(systemDrive.begin(), systemDrive.end(), '\n'), systemDrive.end()); // remove newline + systemDrive.erase(std::remove(systemDrive.begin(), systemDrive.end(), ' '), systemDrive.end()); // remove spaces + // Logger::logThis()->info("Drive found: " + systemDrive); + } + + if (currentLine.ends_with(" /boot/efi\n"s)) + { + systemDriveFound = true; + break; + } + + if (currentLine.ends_with(" /\n"s)) + { + systemDriveFound = true; + break; + } + } + pclose(outputfileHwinfo); + + return systemDriveFound; +} \ No newline at end of file diff --git a/src/smart.cpp b/src/smart.cpp index 339d94f..68df376 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -36,7 +36,7 @@ void SMART::readSMARTData(Drive *drive) sCMD.append(drive->getPath()); const char *cpComand = sCMD.c_str(); - // Logger::logThis()->info(cpComand); + //Logger::logThis()->info(cpComand); FILE *outputfileSmart = popen(cpComand, "r"); size_t len = 0U; // length of found line @@ -63,7 +63,7 @@ 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"); + //Logger::logThis()->info("Found S.M.A.R.T. data with this command"); break; } }