From cb361acfd4d1d9afadf624456b3c83c68626a02f Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 9 Sep 2020 16:11:25 +0200 Subject: [PATCH] fixed bug with filtering new attached drives --- include/drive.h | 2 ++ include/reHDD.h | 2 -- src/reHDD.cpp | 74 +++++++++++++++++++++++++++++++++------------ src/shred/shred.cpp | 2 +- 4 files changed, 58 insertions(+), 22 deletions(-) diff --git a/include/drive.h b/include/drive.h index 33cd10d..5f7063a 100644 --- a/include/drive.h +++ b/include/drive.h @@ -23,6 +23,7 @@ public: bool bWasShredded = false; bool bWasDeleteted = false; + bool bIsOffline = false; private: string sPath; @@ -36,6 +37,7 @@ private: double d32TaskPercentage = 0U; //in percent for Shred (1 to 100) + protected: public: diff --git a/include/reHDD.h b/include/reHDD.h index 04a3187..b1defd5 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -74,8 +74,6 @@ public: private: - //static Logger* logging; - static void searchDrives(vector * pvecDrives); static void printDrives(vector * pvecDrives); static void filterIgnoredDrives(vector * pvecDrives); diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 6053a6c..1b55a6e 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -13,7 +13,7 @@ static int fdShredInformPipe[2];//File descriptor for pipe that informs if a wip static std::mutex mxScannDrives; -static vector vecNewDrives; //store found drives that are updated every 5sec +vector vecNewDrives; //store found drives that are updated every 5sec static vector vecDrives; //stores all drive data from scann thread @@ -33,6 +33,8 @@ static fd_set selectSet; reHDD::reHDD(void) { u8SelectedEntry = 0U; + + vecDrives.reserve(128); } /** @@ -64,8 +66,8 @@ void reHDD::app_logic(void) char dummy; read (fdNewDrivesInformPipe[0],&dummy,1); mxScannDrives.lock(); - filterNewDrives(&vecDrives, &vecNewDrives); //filter and copy to app logic vector + printDrives(&vecDrives); mxScannDrives.unlock(); } @@ -104,7 +106,6 @@ void reHDD::ThreadScannDevices() addSMARTData(&vecNewDrives); //add S.M.A.R.T. Data to the drives mxScannDrives.unlock(); write(fdNewDrivesInformPipe[1], "A",1); - printDrives(&vecNewDrives); sleep(5); //sleep 5 sec } } @@ -190,35 +191,64 @@ void reHDD::filterNewDrives(vector * pvecOldDrives, vector * pvecN vector ::iterator itOld; //Iterator for current (old) drive list vector ::iterator itNew; //Iterator for new drive list that was created from to scann thread + //remove offline old drives from previously run + for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end();) + { + if(itOld->bIsOffline == true) + { + Logger::logThis()->warning("Offline drive found: " + itOld->getPath()); + itOld = pvecOldDrives->erase(itOld); + /* + if(pvecOldDrives->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; + } + } + + //search offline drives and mark them for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end(); ++itOld) { - bool bOldDriveIsOffline = true; - for (itNew = pvecNewDrives->begin(); itNew != pvecNewDrives->end(); ++itNew) + itOld->bIsOffline = true; //set offline befor seachring in the new list + for (itNew = pvecNewDrives->begin(); itNew != pvecNewDrives->end();) { if(itOld->getSerial() == itNew->getSerial()) { - bOldDriveIsOffline = false; - // copy old drive instance date in new instance - itNew->state = itOld->state; //copy state - itNew->setTaskPercentage(itOld->getTaskPercentage()); //copy percentage - itNew->bWasDeleteted = itOld->bWasDeleteted; //copy finished task delete - itNew->bWasShredded = itOld->bWasShredded; //copy finished task shred + itOld->bIsOffline = false; //drive is still attached +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("Delete new drive, because allready attached: " + itNew->getModelName()); +#endif + itNew = pvecNewDrives->erase(itNew); //This drive is allready attached, remove from new list + } + else + { + ++itNew; } } + } - if(bOldDriveIsOffline == true) + //mark offline old drives + for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end(); ++itOld) + { + if(itOld->bIsOffline == true) { //cout << "offline drive found: " << itOld->getPath() << endl; - Logger::logThis()->warning("offline drive found delete for: " + itOld->getPath()); - itOld->state = Drive::NONE; + Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath()); + itOld->state = Drive::NONE; //clear state --> shred task will terminate } } - pvecOldDrives->clear(); - for (long unsigned int i=0; isize(); i++) + //add new drives to drive list + for (itNew = pvecNewDrives->begin(); itNew != pvecNewDrives->end(); ++itNew) { - pvecOldDrives->push_back((*pvecNewDrives)[i]); + pvecOldDrives->push_back(pvecNewDrives->at(itNew - pvecNewDrives->begin())); + Logger::logThis()->info("Add new drive: " + itNew->getModelName()); } + pvecNewDrives->clear(); } /** @@ -246,6 +276,7 @@ void reHDD::searchDrives(vector * pvecDrives) { Drive* tmpDrive = new Drive(string(cLine).substr (2,8)); tmpDrive->state = Drive::NONE; + tmpDrive->bIsOffline = false; pvecDrives->push_back(*tmpDrive); } } @@ -361,7 +392,12 @@ void reHDD::printDrives(vector * pvecDrives) cout << "PowerCycle: " << it->getPowerCycles() << endl; cout << "ErrorCount: " << it->getErrorCount() << endl; cout << endl;*/ - Logger::logThis()->info(to_string(it - pvecDrives->begin()) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial()); + + ostringstream address; + address << (void const *)&pvecDrives->at(it - pvecDrives->begin()); + + + Logger::logThis()->info(to_string(it - pvecDrives->begin()) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str()); } Logger::logThis()->info("---------------------------------"); //cout << "---------------------------------" << endl; @@ -463,7 +499,7 @@ void reHDD::handleAbort() if(getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE ) { getSelectedDrive()->state = Drive::NONE; - Logger::logThis()->info("Abort-Shred for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); //task for drive is running --> remove selection } } diff --git a/src/shred/shred.cpp b/src/shred/shred.cpp index 48c2a2c..d5b3969 100644 --- a/src/shred/shred.cpp +++ b/src/shred/shred.cpp @@ -288,7 +288,7 @@ _return: drive->bWasShredded = true; drive->state= Drive::NONE; drive->setTaskPercentage(0); - Logger::logThis()->info("Finished shred for: " + drive->getModelName() + "-" + drive->getSerial()); + Logger::logThis()->info("Finished shred for: " + drive->getModelName() + "-" + drive->getSerial()); } } #ifndef DRYRUN