filter drives with zero capacity
This commit is contained in:
parent
0ad7de4352
commit
cb421885d0
@ -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();
|
||||||
|
265
src/reHDD.cpp
265
src/reHDD.cpp
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user