filter drives with zero capacity

This commit is contained in:
Hendrik Schutter 2024-04-24 22:04:52 +02:00
parent 0ad7de4352
commit cb421885d0
2 changed files with 397 additions and 377 deletions

View File

@ -89,6 +89,7 @@ private:
static void startShredAllDrives(list <Drive>* plistDrives); static void startShredAllDrives(list <Drive>* plistDrives);
static void updateShredMetrics(list <Drive>* plistDrives); static void updateShredMetrics(list <Drive>* plistDrives);
static void filterIgnoredDrives(list <Drive>* plistDrives); static void filterIgnoredDrives(list <Drive>* plistDrives);
static void filterInvalidDrives(list <Drive>* plistDrives);
static void filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNewDrives); static void filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNewDrives);
static void addSMARTData(list <Drive>* plistDrives); static void addSMARTData(list <Drive>* plistDrives);
static void ThreadScanDevices(); static void ThreadScanDevices();

View File

@ -7,15 +7,15 @@
#include "../include/reHDD.h" #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; static std::mutex mxDrives;
list <Drive> listNewDrives; //store found drives that are updated every 5sec list<Drive> listNewDrives; // store found drives that are updated every 5sec
static list <Drive> listDrives; //stores all drive data from scan thread static list<Drive> listDrives; // stores all drive data from scan thread
TUI *ui; TUI *ui;
@ -46,11 +46,11 @@ void reHDD::app_logic(void)
pipe(fdNewDrivesInformPipe); pipe(fdNewDrivesInformPipe);
pipe(fdShredInformPipe); pipe(fdShredInformPipe);
thread thDevices(ThreadScanDevices); //start thread that scans for drives thread thDevices(ThreadScanDevices); // start thread that scans for drives
thread thUserInput(ThreadUserInput); //start thread that reads user input thread thUserInput(ThreadUserInput); // start thread that reads user input
thread thCheckFrozenDrives(ThreadCheckFrozenDrives); //start thread that checks timeout for drives thread thCheckFrozenDrives(ThreadCheckFrozenDrives); // start thread that checks timeout for drives
while(1) while (1)
{ {
FD_ZERO(&selectSet); FD_ZERO(&selectSet);
FD_SET(fdNewDrivesInformPipe[0], &selectSet); FD_SET(fdNewDrivesInformPipe[0], &selectSet);
@ -58,34 +58,34 @@ void reHDD::app_logic(void)
select(FD_SETSIZE, &selectSet, NULL, NULL, NULL); select(FD_SETSIZE, &selectSet, NULL, NULL, NULL);
if(FD_ISSET(fdNewDrivesInformPipe[0], &selectSet)) if (FD_ISSET(fdNewDrivesInformPipe[0], &selectSet))
{ {
mxDrives.lock(); mxDrives.lock();
char dummy; char dummy;
read (fdNewDrivesInformPipe[0],&dummy,1); read(fdNewDrivesInformPipe[0], &dummy, 1);
filterNewDrives(&listDrives, &listNewDrives); //filter and copy to app logic vector filterNewDrives(&listDrives, &listNewDrives); // filter and copy to app logic vector
printDrives(&listDrives); printDrives(&listDrives);
mxDrives.unlock(); mxDrives.unlock();
} }
if(FD_ISSET(fdShredInformPipe[0], &selectSet)) if (FD_ISSET(fdShredInformPipe[0], &selectSet))
{ {
char dummy; char dummy;
read (fdShredInformPipe[0],&dummy,1); read(fdShredInformPipe[0], &dummy, 1);
updateShredMetrics(&listDrives); updateShredMetrics(&listDrives);
#ifdef LOG_LEVEL_HIGH #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 #endif
} }
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
} //endless loop } // endless loop
thDevices.join(); thDevices.join();
thUserInput.join(); thUserInput.join();
thCheckFrozenDrives.join(); thCheckFrozenDrives.join();
} }
Drive* reHDD::getSelectedDrive() Drive *reHDD::getSelectedDrive()
{ {
if(u8SelectedEntry < listDrives.size() ) if (u8SelectedEntry < listDrives.size())
{ {
list<Drive>::iterator it = listDrives.begin(); list<Drive>::iterator it = listDrives.begin();
advance(it, u8SelectedEntry); advance(it, u8SelectedEntry);
@ -100,67 +100,68 @@ Drive* reHDD::getSelectedDrive()
void reHDD::ThreadScanDevices() void reHDD::ThreadScanDevices()
{ {
while(true) while (true)
{ {
mxDrives.lock(); mxDrives.lock();
listNewDrives.clear(); listNewDrives.clear();
searchDrives(&listNewDrives); //search for new drives and store them in list searchDrives(&listNewDrives); // search for new drives and store them in list
filterIgnoredDrives(&listNewDrives); //filter out ignored drives filterIgnoredDrives(&listNewDrives); // filter out ignored drives
addSMARTData(&listNewDrives); //add S.M.A.R.T. Data to the drives addSMARTData(&listNewDrives); // add S.M.A.R.T. Data to the drives
filterInvalidDrives(&listNewDrives); // filter out drives that report zero capacity
mxDrives.unlock(); mxDrives.unlock();
write(fdNewDrivesInformPipe[1], "A",1); write(fdNewDrivesInformPipe[1], "A", 1);
sleep(5); //sleep 5 sec sleep(5); // sleep 5 sec
} }
} }
void reHDD::ThreadCheckFrozenDrives() void reHDD::ThreadCheckFrozenDrives()
{ {
while(true) while (true)
{ {
mxDrives.lock(); mxDrives.lock();
for(auto it = begin(listDrives); it != end(listDrives); ++it) for (auto it = begin(listDrives); it != end(listDrives); ++it)
{ {
if(it->state == Drive::SHRED_ACTIVE) if (it->state == Drive::SHRED_ACTIVE)
{ {
it->checkFrozenDrive(); it->checkFrozenDrive();
} }
} }
mxDrives.unlock(); mxDrives.unlock();
sleep(13); //sleep 13 sec sleep(13); // sleep 13 sec
} }
} }
void reHDD::ThreadUserInput() void reHDD::ThreadUserInput()
{ {
while(true) while (true)
{ {
// cout << TUI::readUserInput() << endl; // cout << TUI::readUserInput() << endl;
switch (TUI::readUserInput()) switch (TUI::readUserInput())
{ {
case TUI::UserInput::DownKey: case TUI::UserInput::DownKey:
//cout << "Down" << endl; // cout << "Down" << endl;
handleArrowKey(TUI::UserInput::DownKey); handleArrowKey(TUI::UserInput::DownKey);
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::UpKey: case TUI::UserInput::UpKey:
//cout << "Up" << endl; // cout << "Up" << endl;
handleArrowKey(TUI::UserInput::UpKey); handleArrowKey(TUI::UserInput::UpKey);
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Undefined: case TUI::UserInput::Undefined:
//cout << "Undefined" << endl; // cout << "Undefined" << endl;
break; break;
case TUI::UserInput::Abort: case TUI::UserInput::Abort:
//cout << "Abort" << endl; // cout << "Abort" << endl;
handleAbort(); handleAbort();
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Delete: case TUI::UserInput::Delete:
//cout << "Delete" << endl; // cout << "Delete" << endl;
if (getSelectedDrive() != nullptr) if (getSelectedDrive() != nullptr)
{ {
if(getSelectedDrive()->state == Drive::NONE) if (getSelectedDrive()->state == Drive::NONE)
{ {
getSelectedDrive()->state = Drive::DELETE_SELECTED; getSelectedDrive()->state = Drive::DELETE_SELECTED;
} }
@ -169,11 +170,11 @@ void reHDD::ThreadUserInput()
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Shred: case TUI::UserInput::Shred:
//cout << "Shred" << endl; // cout << "Shred" << endl;
if (getSelectedDrive() != nullptr) if (getSelectedDrive() != nullptr)
{ {
if(getSelectedDrive()->state == Drive::NONE) if (getSelectedDrive()->state == Drive::NONE)
{ {
getSelectedDrive()->state = Drive::SHRED_SELECTED; getSelectedDrive()->state = Drive::SHRED_SELECTED;
} }
@ -182,17 +183,17 @@ void reHDD::ThreadUserInput()
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::ShredAll: case TUI::UserInput::ShredAll:
//cout << "ShredAll" << endl; // cout << "ShredAll" << endl;
startShredAllDrives(&listDrives); startShredAllDrives(&listDrives);
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Enter: case TUI::UserInput::Enter:
//cout << "Enter" << endl; // cout << "Enter" << endl;
handleEnter(); handleEnter();
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::ESC: case TUI::UserInput::ESC:
//cout << "ESC" << endl; // cout << "ESC" << endl;
handleESC(); handleESC();
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
@ -202,14 +203,14 @@ void reHDD::ThreadUserInput()
} }
} }
void reHDD::ThreadShred(Drive* const pDrive) void reHDD::ThreadShred(Drive *const pDrive)
{ {
if (pDrive != nullptr) if (pDrive != nullptr)
{ {
pDrive->setActionStartTimestamp(); //save timestamp at start of shredding pDrive->setActionStartTimestamp(); // save timestamp at start of shredding
Shred* pShredTask = new Shred(); //create new shred task Shred *pShredTask = new Shred(); // create new shred task
pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); //start new shred task pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); // start new shred task
delete pShredTask; //delete shred task delete pShredTask; // delete shred task
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
} }
} }
@ -218,24 +219,24 @@ void reHDD::ThreadDelete()
{ {
if (getSelectedDrive() != nullptr) if (getSelectedDrive() != nullptr)
{ {
getSelectedDrive()->setActionStartTimestamp(); //save timestamp at start of deleting getSelectedDrive()->setActionStartTimestamp(); // save timestamp at start of deleting
Delete::deleteDrive(getSelectedDrive()); //blocking, no thread Delete::deleteDrive(getSelectedDrive()); // blocking, no thread
getSelectedDrive()->state = Drive::TaskState::NONE; //delete finished getSelectedDrive()->state = Drive::TaskState::NONE; // delete finished
getSelectedDrive()->bWasDeleted = true; getSelectedDrive()->bWasDeleted = true;
Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
ui->updateTUI(&listDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
} }
} }
void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNewDrives) void reHDD::filterNewDrives(list<Drive> *plistOldDrives, list<Drive> *plistNewDrives)
{ {
list <Drive>::iterator itOld; //Iterator for current (old) drive list list<Drive>::iterator itOld; // Iterator for current (old) drive list
list <Drive>::iterator itNew; //Iterator for new drive list that was created from to scan thread list<Drive>::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();) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end();)
{ {
if(itOld->bIsOffline == true) if (itOld->bIsOffline == true)
{ {
Logger::logThis()->warning("Offline drive found: " + itOld->getPath()); Logger::logThis()->warning("Offline drive found: " + itOld->getPath());
itOld = plistOldDrives->erase(itOld); itOld = plistOldDrives->erase(itOld);
@ -251,21 +252,21 @@ void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNew
} }
} }
//search offline drives and mark them // search offline drives and mark them
for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld)
{ {
itOld->bIsOffline = true; //set offline before searching in the new list itOld->bIsOffline = true; // set offline before searching in the new list
for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end();) for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end();)
{ {
if((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath())) if ((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath()))
{ {
itOld->bIsOffline = false; //drive is still attached itOld->bIsOffline = false; // drive is still attached
//copy new smart data to existing drive // 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->setDriveSMARTData(itNew->getModelFamily(), itNew->getModelName(), itNew->getSerial(), itNew->getCapacity(), itNew->getErrorCount(), itNew->getPowerOnHours(), itNew->getPowerCycles(), itNew->getTemperature());
#ifdef LOG_LEVEL_HIGH #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 #endif
itNew = plistNewDrives->erase(itNew); //This drive is already attached, remove from new list itNew = plistNewDrives->erase(itNew); // This drive is already attached, remove from new list
} }
else else
{ {
@ -274,22 +275,22 @@ void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNew
} }
} }
//mark offline old drives // mark offline old drives
for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld)
{ {
if(itOld->bIsOffline == true) if (itOld->bIsOffline == true)
{ {
//cout << "offline drive found: " << itOld->getPath() << endl; // cout << "offline drive found: " << itOld->getPath() << endl;
Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath()); Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath());
itOld->state = Drive::NONE; //clear state --> shred task will terminate 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) for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end(); ++itNew)
{ {
plistOldDrives->push_back(*itNew); plistOldDrives->push_back(*itNew);
//Logger::logThis()->info("Add new drive: " + itNew->getModelName()); // Logger::logThis()->info("Add new drive: " + itNew->getModelName());
} }
plistNewDrives->clear(); plistNewDrives->clear();
} }
@ -299,13 +300,13 @@ void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNew
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::searchDrives(list <Drive>* plistDrives) void reHDD::searchDrives(list<Drive> *plistDrives)
{ {
//Logger::logThis()->info("--> search drives <--"); // Logger::logThis()->info("--> search drives <--");
char * cLine = NULL; char *cLine = NULL;
size_t len = 0; size_t len = 0;
FILE* outputfileHwinfo = popen("lsblk -e 11 -d -o NAME", "r"); FILE *outputfileHwinfo = popen("lsblk -e 11 -d -o NAME", "r");
if (outputfileHwinfo == NULL) if (outputfileHwinfo == NULL)
{ {
@ -317,20 +318,20 @@ void reHDD::searchDrives(list <Drive>* plistDrives)
{ {
if (string(cLine).length() == 4) if (string(cLine).length() == 4)
{ {
Drive* tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 3)); Drive *tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 3));
tmpDrive->state = Drive::NONE; tmpDrive->state = Drive::NONE;
tmpDrive->bIsOffline = false; tmpDrive->bIsOffline = false;
plistDrives->push_back(*tmpDrive); plistDrives->push_back(*tmpDrive);
//Logger::logThis()->info("SATA drive found: " + tmpDrive->getPath()); // Logger::logThis()->info("SATA drive found: " + tmpDrive->getPath());
} }
if (string(cLine).length() == 8) if (string(cLine).length() == 8)
{ {
Drive* tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 7)); Drive *tmpDrive = new Drive("/dev/" + string(cLine).substr(0, 7));
tmpDrive->state = Drive::NONE; tmpDrive->state = Drive::NONE;
tmpDrive->bIsOffline = false; tmpDrive->bIsOffline = false;
plistDrives->push_back(*tmpDrive); plistDrives->push_back(*tmpDrive);
//Logger::logThis()->info("NVME drive found: " + tmpDrive->getPath()); // Logger::logThis()->info("NVME drive found: " + tmpDrive->getPath());
} }
} }
pclose(outputfileHwinfo); pclose(outputfileHwinfo);
@ -341,35 +342,35 @@ void reHDD::searchDrives(list <Drive>* plistDrives)
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::filterIgnoredDrives(list <Drive>* plistDrives) void reHDD::filterIgnoredDrives(list<Drive> *plistDrives)
{ {
list<tuple<string>> vtlIgnoredDevices; //store drives from ignore file list<tuple<string>> vtlIgnoredDevices; // store drives from ignore file
ifstream input( "ignoreDrives.conf" ); //read 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); // Logger::logThis()->info("read uuid: " + sLine);
vtlIgnoredDevices.emplace_back(sLine); //add found path and uuid from ignore file to vector vtlIgnoredDevices.emplace_back(sLine); // add found path and uuid from ignore file to vector
} }
//loop through found entries in ignore file // loop through found entries in ignore file
for(auto row : vtlIgnoredDevices) for (auto row : vtlIgnoredDevices)
{ {
list <Drive>::iterator it; list<Drive>::iterator it;
for (it = plistDrives->begin(); it != plistDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
string sUUID; string sUUID;
char * cLine = NULL; char *cLine = NULL;
size_t len = 0; size_t len = 0;
string sCMD = "blkid "; string sCMD = "blkid ";
sCMD.append(it->getPath()); sCMD.append(it->getPath());
//cout << "cmd: " << sCMD << endl; // cout << "cmd: " << sCMD << endl;
FILE* outputfileBlkid = popen(sCMD.c_str(), "r"); //get UUID from drive FILE *outputfileBlkid = popen(sCMD.c_str(), "r"); // get UUID from drive
if (outputfileBlkid == NULL) if (outputfileBlkid == NULL)
{ {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
while ((getline(&cLine, &len, outputfileBlkid)) != -1) //parse UUID from blkid while ((getline(&cLine, &len, outputfileBlkid)) != -1) // parse UUID from blkid
{ {
if (string(cLine).find("PTUUID") != string::npos) if (string(cLine).find("PTUUID") != string::npos)
{ {
@ -377,13 +378,13 @@ void reHDD::filterIgnoredDrives(list <Drive>* plistDrives)
sBlkidOut.erase(0, 18); sBlkidOut.erase(0, 18);
sBlkidOut.erase(8, sBlkidOut.length()); sBlkidOut.erase(8, sBlkidOut.length());
sUUID = sBlkidOut; sUUID = sBlkidOut;
//cout << "blkid uuid:" << sUUID << endl; // cout << "blkid uuid:" << sUUID << endl;
} }
} }
pclose(outputfileBlkid); pclose(outputfileBlkid);
//cout << "blkid uuid:" << sUUID << endl; // cout << "blkid uuid:" << sUUID << endl;
if (!get<0>(row).compare(sUUID)) //compare uuid from ignore file and uuid from drive 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 // same uuid found than in ignore file --> ignore this drive
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
@ -396,20 +397,41 @@ void reHDD::filterIgnoredDrives(list <Drive>* plistDrives)
} }
} }
/**
* \brief filter out drives that are not indented for processing
* \param pointer of list <Drive>* plistDrives
* \return void
*/
void reHDD::filterInvalidDrives(list<Drive> *plistDrives)
{
list<Drive>::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--;
}
}
}
/** /**
* \brief start shred for all drives * \brief start shred for all drives
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::startShredAllDrives(list <Drive>* plistDrives) void reHDD::startShredAllDrives(list<Drive> *plistDrives)
{ {
list <Drive>::iterator it; list<Drive>::iterator it;
mxDrives.lock(); mxDrives.lock();
for (it = plistDrives->begin(); it != plistDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
if(it->state == Drive::NONE) if (it->state == Drive::NONE)
{ {
Drive* pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator > (it); Drive *pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator>(it);
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
ostringstream address; ostringstream address;
address << (void const *)&(*pTmpDrive); address << (void const *)&(*pTmpDrive);
@ -427,12 +449,12 @@ void reHDD::startShredAllDrives(list <Drive>* plistDrives)
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::printDrives(list <Drive>* plistDrives) void reHDD::printDrives(list<Drive> *plistDrives)
{ {
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("------------DRIVES START------------"); Logger::logThis()->info("------------DRIVES START------------");
//cout << "------------DRIVES---------------" << endl; // cout << "------------DRIVES---------------" << endl;
list <Drive>::iterator it; list<Drive>::iterator it;
uint8_t u8Index = 0; uint8_t u8Index = 0;
for (it = plistDrives->begin(); it != plistDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
@ -453,7 +475,7 @@ void reHDD::printDrives(list <Drive>* plistDrives)
Logger::logThis()->info(to_string(u8Index++) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str()); Logger::logThis()->info(to_string(u8Index++) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str());
} }
Logger::logThis()->info("------------DRIVES END--------------"); Logger::logThis()->info("------------DRIVES END--------------");
//cout << "---------------------------------" << endl; // cout << "---------------------------------" << endl;
#endif #endif
} }
@ -462,18 +484,18 @@ void reHDD::printDrives(list <Drive>* plistDrives)
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::updateShredMetrics(list <Drive>* plistDrives) void reHDD::updateShredMetrics(list<Drive> *plistDrives)
{ {
list <Drive>::iterator it; list<Drive>::iterator it;
for (it = plistDrives->begin(); it != plistDrives->end(); ++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<Drive, std::list<Drive>::iterator > (it); Drive *pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator>(it);
//set metrics for calculating shred speed // set metrics for calculating shred speed
std::chrono::time_point<std::chrono::system_clock> chronoCurrentTimestamp = std::chrono::system_clock::now(); std::chrono::time_point<std::chrono::system_clock> chronoCurrentTimestamp = std::chrono::system_clock::now();
time_t u32ShredTimeDelta = (chronoCurrentTimestamp - pTmpDrive->sShredSpeed.chronoShredTimestamp).count(); time_t u32ShredTimeDelta = (chronoCurrentTimestamp - pTmpDrive->sShredSpeed.chronoShredTimestamp).count();
if(u32ShredTimeDelta > METRIC_THRESHOLD) if (u32ShredTimeDelta > METRIC_THRESHOLD)
{ {
pTmpDrive->sShredSpeed.u32ShredTimeDelta = u32ShredTimeDelta; pTmpDrive->sShredSpeed.u32ShredTimeDelta = u32ShredTimeDelta;
pTmpDrive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); pTmpDrive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now();
@ -489,32 +511,32 @@ void reHDD::updateShredMetrics(list <Drive>* plistDrives)
* \param pointer of list <Drive>* plistDrives * \param pointer of list <Drive>* plistDrives
* \return void * \return void
*/ */
void reHDD::addSMARTData(list <Drive>* plistDrives) void reHDD::addSMARTData(list<Drive> *plistDrives)
{ {
list <Drive>::iterator it; list<Drive>::iterator it;
for (it = plistDrives->begin(); it != plistDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
Drive* pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator > (it); Drive *pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator>(it);
SMART::readSMARTData(pTmpDrive); SMART::readSMARTData(pTmpDrive);
} }
} }
void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleArrowKey(TUI::UserInput userInput)
{ {
int8_t u8EntrySize = (int8_t) listDrives.size(); int8_t u8EntrySize = (int8_t)listDrives.size();
switch (userInput) switch (userInput)
{ {
case TUI::UserInput::DownKey: case TUI::UserInput::DownKey:
u8SelectedEntry++; u8SelectedEntry++;
if(u8SelectedEntry >= u8EntrySize) if (u8SelectedEntry >= u8EntrySize)
{ {
u8SelectedEntry = 0; u8SelectedEntry = 0;
} }
break; break;
case TUI::UserInput::UpKey: case TUI::UserInput::UpKey:
if(u8SelectedEntry == 0) if (u8SelectedEntry == 0)
{ {
u8SelectedEntry = (u8EntrySize-1); u8SelectedEntry = (u8EntrySize - 1);
} }
else else
{ {
@ -526,7 +548,7 @@ void reHDD::handleArrowKey(TUI::UserInput userInput)
break; break;
} }
//Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry)); // Logger::logThis()->info("ArrowKey - selected drive: " + to_string(u8SelectedEntry));
} }
void reHDD::handleEnter() void reHDD::handleEnter()
@ -534,20 +556,20 @@ void reHDD::handleEnter()
if (getSelectedDrive() != nullptr) 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()); Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; 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(); Drive *pTmpDrive = getSelectedDrive();
thread(ThreadShred, pTmpDrive).detach(); thread(ThreadShred, pTmpDrive).detach();
} }
if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
{ {
Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE; 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(); thread(ThreadDelete).detach();
} }
} }
@ -557,16 +579,16 @@ void reHDD::handleESC()
{ {
if (getSelectedDrive() != nullptr) if (getSelectedDrive() != nullptr)
{ {
if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED)
{ {
getSelectedDrive()->state = Drive::TaskState::NONE; getSelectedDrive()->state = Drive::TaskState::NONE;
//task for drive is selected --> remove selection // task for drive is selected --> remove selection
} }
if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
{ {
getSelectedDrive()->state = Drive::TaskState::NONE; getSelectedDrive()->state = Drive::TaskState::NONE;
//task for drive is selected --> remove selection // task for drive is selected --> remove selection
} }
} }
} }
@ -575,14 +597,11 @@ void reHDD::handleAbort()
{ {
if (getSelectedDrive() != nullptr) 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; getSelectedDrive()->state = Drive::NONE;
Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
//task for drive is running --> remove selection // task for drive is running --> remove selection
} }
} }
} }