Compare commits
8 Commits
b0.2.2
...
4862a45ef6
Author | SHA1 | Date | |
---|---|---|---|
4862a45ef6 | |||
70f5727eb3 | |||
b6f0c5e89f | |||
e3aefb24ee | |||
9863c5591e | |||
c61859ed4e | |||
8de45505e4 | |||
f8ba9c6732 |
5
.gitignore
vendored
5
.gitignore
vendored
@ -41,7 +41,8 @@
|
|||||||
|
|
||||||
reHDD
|
reHDD
|
||||||
|
|
||||||
reHDD.log
|
*.log
|
||||||
|
*.ods
|
||||||
|
*.txt
|
||||||
|
|
||||||
ignoreDrives.conf
|
ignoreDrives.conf
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
4673974d
|
4673974d
|
||||||
2cb3dea4
|
2cb3dea4
|
||||||
|
8ffbc421
|
||||||
|
@ -22,6 +22,13 @@ public:
|
|||||||
FROZEN
|
FROZEN
|
||||||
} state;
|
} state;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
time_t u32ShredTimeDelta;
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> chronoShredTimestamp;
|
||||||
|
unsigned long ulWrittenBytes;
|
||||||
|
} sShredSpeed;
|
||||||
|
|
||||||
bool bWasShredded = false;
|
bool bWasShredded = false;
|
||||||
bool bWasDeleteted = false;
|
bool bWasDeleteted = false;
|
||||||
bool bIsOffline = false;
|
bool bIsOffline = false;
|
||||||
|
@ -83,12 +83,13 @@ private:
|
|||||||
|
|
||||||
static void searchDrives(list <Drive>* plistDrives);
|
static void searchDrives(list <Drive>* plistDrives);
|
||||||
static void printDrives(list <Drive>* plistDrives);
|
static void printDrives(list <Drive>* plistDrives);
|
||||||
|
static void startShredAllDrives(list <Drive>* plistDrives);
|
||||||
static void filterIgnoredDrives(list <Drive>* plistDrives);
|
static void filterIgnoredDrives(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 ThreadScannDevices();
|
static void ThreadScannDevices();
|
||||||
static void ThreadUserInput();
|
static void ThreadUserInput();
|
||||||
static void ThreadShred();
|
static void ThreadShred(Drive* const pDrive);
|
||||||
static void ThreadDelete();
|
static void ThreadDelete();
|
||||||
static void ThreadCheckFrozenDrives();
|
static void ThreadCheckFrozenDrives();
|
||||||
static void handleArrowKey(TUI::UserInput userInput);
|
static void handleArrowKey(TUI::UserInput userInput);
|
||||||
|
@ -22,7 +22,7 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum UserInput { UpKey, DownKey, Abort, Shred, Delete, Enter, ESC, Undefined};
|
enum UserInput { UpKey, DownKey, Abort, Shred, ShredAll, Delete, Enter, ESC, Undefined};
|
||||||
struct MenuState
|
struct MenuState
|
||||||
{
|
{
|
||||||
bool bAbort;
|
bool bAbort;
|
||||||
@ -56,7 +56,7 @@ private:
|
|||||||
static WINDOW *createOverViewWindow( int iXSize, int iYSize);
|
static WINDOW *createOverViewWindow( int iXSize, int iYSize);
|
||||||
static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive);
|
static WINDOW *createDetailViewWindow( int iXSize, int iYSize, int iXStart, Drive drive);
|
||||||
static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart);
|
static WINDOW *overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart);
|
||||||
static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, bool bSelected);
|
static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected);
|
||||||
static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart);
|
static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart);
|
||||||
static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate);
|
static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate);
|
||||||
static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB);
|
static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB);
|
||||||
@ -66,6 +66,7 @@ private:
|
|||||||
|
|
||||||
void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY);
|
void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY);
|
||||||
string formatTimeDuration(time_t u32Duration);
|
string formatTimeDuration(time_t u32Duration);
|
||||||
|
string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // TUI_H_
|
#endif // TUI_H_
|
2
makefile
2
makefile
@ -12,7 +12,7 @@ LIBS =
|
|||||||
# General compiler flags
|
# General compiler flags
|
||||||
COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g
|
COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g
|
||||||
# Additional release-specific flags
|
# Additional release-specific flags
|
||||||
RCOMPILE_FLAGS = -D NDEBUG
|
RCOMPILE_FLAGS = -D NDEBUG -O3
|
||||||
# Additional debug-specific flags
|
# Additional debug-specific flags
|
||||||
DCOMPILE_FLAGS = -D DEBUG
|
DCOMPILE_FLAGS = -D DEBUG
|
||||||
# Add additional include paths
|
# Add additional include paths
|
||||||
|
@ -2,15 +2,17 @@
|
|||||||
|
|
||||||
echo starting update
|
echo starting update
|
||||||
|
|
||||||
|
systemctl stop /lib/systemd/system/getty@tty1.service.d
|
||||||
|
|
||||||
|
cd /root/reHDD/
|
||||||
|
|
||||||
FILE=./ignoreDrives.conf
|
FILE=./ignoreDrives.conf
|
||||||
if test -f "$FILE"; then
|
if test -f "$FILE"; then
|
||||||
echo backup exits
|
echo backup exits
|
||||||
else
|
else
|
||||||
cp reHDD/ignoreDrives.conf ./ignoreDrives.conf
|
cp /root/reHDD/ignoreDrives.conf /root/ignoreDrives.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd reHDD
|
|
||||||
|
|
||||||
git reset
|
git reset
|
||||||
|
|
||||||
git stash force
|
git stash force
|
||||||
@ -23,4 +25,6 @@ git pull
|
|||||||
|
|
||||||
make release
|
make release
|
||||||
|
|
||||||
cp ../ignoreDrives.conf ./
|
cp /root/ignoreDrives.conf /root/reHDD/ignoreDrives.conf
|
||||||
|
|
||||||
|
systemctl start /lib/systemd/system/getty@tty1.service.d
|
@ -67,7 +67,6 @@ string Drive::sErrorCountToText()
|
|||||||
return to_string(getErrorCount());
|
return to_string(getErrorCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string Drive::sPowerOnHoursToText()
|
string Drive::sPowerOnHoursToText()
|
||||||
{
|
{
|
||||||
double dDays = 0U;
|
double dDays = 0U;
|
||||||
|
@ -11,7 +11,7 @@ static int fdNewDrivesInformPipe[2];//File descriptor for pipe that informs if n
|
|||||||
|
|
||||||
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 mxScannDrives;
|
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
|
||||||
|
|
||||||
@ -60,12 +60,12 @@ void reHDD::app_logic(void)
|
|||||||
|
|
||||||
if(FD_ISSET(fdNewDrivesInformPipe[0], &selectSet))
|
if(FD_ISSET(fdNewDrivesInformPipe[0], &selectSet))
|
||||||
{
|
{
|
||||||
mxScannDrives.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);
|
||||||
mxScannDrives.unlock();
|
mxDrives.unlock();
|
||||||
}
|
}
|
||||||
if(FD_ISSET(fdShredInformPipe[0], &selectSet))
|
if(FD_ISSET(fdShredInformPipe[0], &selectSet))
|
||||||
{
|
{
|
||||||
@ -101,12 +101,12 @@ void reHDD::ThreadScannDevices()
|
|||||||
{
|
{
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
mxScannDrives.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
|
||||||
mxScannDrives.unlock();
|
mxDrives.unlock();
|
||||||
write(fdNewDrivesInformPipe[1], "A",1);
|
write(fdNewDrivesInformPipe[1], "A",1);
|
||||||
sleep(5); //sleep 5 sec
|
sleep(5); //sleep 5 sec
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ void reHDD::ThreadCheckFrozenDrives()
|
|||||||
{
|
{
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
mxScannDrives.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)
|
||||||
@ -124,7 +124,7 @@ void reHDD::ThreadCheckFrozenDrives()
|
|||||||
it->checkFrozenDrive();
|
it->checkFrozenDrive();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mxScannDrives.unlock();
|
mxDrives.unlock();
|
||||||
sleep(13); //sleep 13 sec
|
sleep(13); //sleep 13 sec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,6 +164,7 @@ void reHDD::ThreadUserInput()
|
|||||||
getSelectedDrive()->state = Drive::DELETE_SELECTED;
|
getSelectedDrive()->state = Drive::DELETE_SELECTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||||
break;
|
break;
|
||||||
case TUI::UserInput::Shred:
|
case TUI::UserInput::Shred:
|
||||||
@ -176,6 +177,12 @@ void reHDD::ThreadUserInput()
|
|||||||
getSelectedDrive()->state = Drive::SHRED_SELECTED;
|
getSelectedDrive()->state = Drive::SHRED_SELECTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||||
|
break;
|
||||||
|
case TUI::UserInput::ShredAll:
|
||||||
|
//cout << "ShredAll" << endl;
|
||||||
|
startShredAllDrives(&listDrives);
|
||||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||||
break;
|
break;
|
||||||
case TUI::UserInput::Enter:
|
case TUI::UserInput::Enter:
|
||||||
@ -194,13 +201,13 @@ void reHDD::ThreadUserInput()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void reHDD::ThreadShred()
|
void reHDD::ThreadShred(Drive* const pDrive)
|
||||||
{
|
{
|
||||||
if (getSelectedDrive() != nullptr)
|
if (pDrive != nullptr)
|
||||||
{
|
{
|
||||||
getSelectedDrive()->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(getSelectedDrive(), &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);
|
||||||
}
|
}
|
||||||
@ -246,7 +253,7 @@ 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 befor seachring 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()))
|
||||||
@ -279,7 +286,7 @@ void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNew
|
|||||||
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();
|
||||||
}
|
}
|
||||||
@ -291,7 +298,7 @@ void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNew
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
|
|
||||||
@ -329,7 +336,7 @@ void reHDD::filterIgnoredDrives(list <Drive>* plistDrives)
|
|||||||
|
|
||||||
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 ingnore file
|
//loop through found entries in ingnore file
|
||||||
@ -377,6 +384,32 @@ void reHDD::filterIgnoredDrives(list <Drive>* plistDrives)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief start shred for all drives
|
||||||
|
* \param pointer of list <Drive>* plistDrives
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
void reHDD::startShredAllDrives(list <Drive>* plistDrives)
|
||||||
|
{
|
||||||
|
list <Drive>::iterator it;
|
||||||
|
mxDrives.lock();
|
||||||
|
for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
|
||||||
|
{
|
||||||
|
if(it->state == Drive::NONE)
|
||||||
|
{
|
||||||
|
Drive* pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator > (it);
|
||||||
|
#ifdef LOG_LEVEL_HIGH
|
||||||
|
ostringstream address;
|
||||||
|
address << (void const *)&(*pTmpDrive);
|
||||||
|
Logger::logThis()->info("Started shred (all) for: " + pTmpDrive->getModelName() + "-" + pTmpDrive->getSerial() + " @" + address.str());
|
||||||
|
#endif
|
||||||
|
pTmpDrive->state = Drive::TaskState::SHRED_ACTIVE;
|
||||||
|
thread(ThreadShred, pTmpDrive).detach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mxDrives.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief print drives with all information
|
* \brief print drives with all information
|
||||||
* \param pointer of list <Drive>* plistDrives
|
* \param pointer of list <Drive>* plistDrives
|
||||||
@ -454,11 +487,12 @@ 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()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (getSelectedDrive() != nullptr)
|
if (getSelectedDrive() != nullptr)
|
||||||
{
|
{
|
||||||
if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED)
|
if(getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED)
|
||||||
@ -466,7 +500,8 @@ void reHDD::handleEnter()
|
|||||||
Logger::logThis()->info("Started shred for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
|
Logger::logThis()->info("Started shred 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
|
||||||
thread(ThreadShred).detach();
|
Drive* pTmpDrive = getSelectedDrive();
|
||||||
|
thread(ThreadShred, pTmpDrive).detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
|
if(getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
|
||||||
|
@ -24,6 +24,9 @@ Shred::~Shred()
|
|||||||
*/
|
*/
|
||||||
int Shred::shredDrive(Drive* drive, int* ipSignalFd)
|
int Shred::shredDrive(Drive* drive, int* ipSignalFd)
|
||||||
{
|
{
|
||||||
|
ostringstream address;
|
||||||
|
address << (void const *)&(*drive);
|
||||||
|
Logger::logThis()->info("Shred-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str());
|
||||||
|
|
||||||
#ifdef DRYRUN
|
#ifdef DRYRUN
|
||||||
for(int i = 0; i<=500; i++)
|
for(int i = 0; i<=500; i++)
|
||||||
@ -64,6 +67,8 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr);
|
this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr);
|
||||||
|
drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now();; //set inital timestamp for speed metric
|
||||||
|
unsigned long ulSpeedMetricBytesWritten = 0U; //uses to calculate speed metric
|
||||||
|
|
||||||
#ifdef LOG_LEVEL_HIGH
|
#ifdef LOG_LEVEL_HIGH
|
||||||
Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial());
|
Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial());
|
||||||
@ -74,6 +79,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd)
|
|||||||
unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position
|
unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position
|
||||||
uint32_t u32ChunkDimensionIndex = 0U;
|
uint32_t u32ChunkDimensionIndex = 0U;
|
||||||
|
|
||||||
|
|
||||||
if(uiShredIterationCounter == (SHRED_ITERATIONS-1))
|
if(uiShredIterationCounter == (SHRED_ITERATIONS-1))
|
||||||
{
|
{
|
||||||
//last shred iteration --> overwrite with zeros instead with random data
|
//last shred iteration --> overwrite with zeros instead with random data
|
||||||
@ -136,14 +142,25 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd)
|
|||||||
ulDriveByteCounter += iByteShredded;
|
ulDriveByteCounter += iByteShredded;
|
||||||
ulDriveByteOverallCount += iByteShredded;
|
ulDriveByteOverallCount += iByteShredded;
|
||||||
d32Percent = this->calcProgress();
|
d32Percent = this->calcProgress();
|
||||||
|
ulSpeedMetricBytesWritten += iByteShredded;
|
||||||
|
|
||||||
#ifdef LOG_LEVEL_HIGH
|
#ifdef LOG_LEVEL_HIGH
|
||||||
Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter+1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial());
|
Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter+1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial());
|
||||||
#endif
|
#endif
|
||||||
if((d32Percent-d32TmpPercent) >= 0.01)
|
if((d32Percent-d32TmpPercent) >= 0.01)
|
||||||
{
|
{
|
||||||
|
//set shred percantage
|
||||||
drive->setTaskPercentage(d32TmpPercent);
|
drive->setTaskPercentage(d32TmpPercent);
|
||||||
d32TmpPercent = d32Percent;
|
d32TmpPercent = d32Percent;
|
||||||
|
|
||||||
|
//set metrics for calculating shred speed
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> chronoCurrentTimestamp = std::chrono::system_clock::now();
|
||||||
|
drive->sShredSpeed.u32ShredTimeDelta = (chronoCurrentTimestamp - drive->sShredSpeed.chronoShredTimestamp).count();
|
||||||
|
drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now();
|
||||||
|
drive->sShredSpeed.ulWrittenBytes = ulSpeedMetricBytesWritten;
|
||||||
|
ulSpeedMetricBytesWritten = 0U;
|
||||||
|
|
||||||
|
//signal process in shreding
|
||||||
write(*ipSignalFd, "A",1);
|
write(*ipSignalFd, "A",1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
src/tui.cpp
31
src/tui.cpp
@ -77,9 +77,9 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
|
|||||||
string sModelName = it->getModelName();
|
string sModelName = it->getModelName();
|
||||||
string sCapacity = it->sCapacityToText();
|
string sCapacity = it->sCapacityToText();
|
||||||
string sState = " ";
|
string sState = " ";
|
||||||
|
string sSpeed = " ";
|
||||||
string sTime = " ";
|
string sTime = " ";
|
||||||
|
|
||||||
|
|
||||||
bool bSelectedEntry = false;
|
bool bSelectedEntry = false;
|
||||||
|
|
||||||
if(u8SelectedEntry == u8Index)
|
if(u8SelectedEntry == u8Index)
|
||||||
@ -97,7 +97,6 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
|
|||||||
|
|
||||||
stringstream stream;
|
stringstream stream;
|
||||||
|
|
||||||
|
|
||||||
switch (it->state)
|
switch (it->state)
|
||||||
{
|
{
|
||||||
case Drive::SHRED_ACTIVE:
|
case Drive::SHRED_ACTIVE:
|
||||||
@ -107,6 +106,7 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
|
|||||||
|
|
||||||
it->calculateTaskDuration();
|
it->calculateTaskDuration();
|
||||||
sTime = this->formatTimeDuration(it->getTaskDuration());
|
sTime = this->formatTimeDuration(it->getTaskDuration());
|
||||||
|
sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes);
|
||||||
break;
|
break;
|
||||||
case Drive::DELETE_ACTIVE:
|
case Drive::DELETE_ACTIVE:
|
||||||
sState = "Deleting ...";
|
sState = "Deleting ...";
|
||||||
@ -151,7 +151,7 @@ void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, bSelectedEntry);
|
WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, sSpeed, bSelectedEntry);
|
||||||
wrefresh(tmp);
|
wrefresh(tmp);
|
||||||
u8Index++;
|
u8Index++;
|
||||||
}//end loop though drives
|
}//end loop though drives
|
||||||
@ -203,6 +203,9 @@ enum TUI::UserInput TUI::readUserInput()
|
|||||||
case 's':
|
case 's':
|
||||||
return TUI::UserInput::Shred;
|
return TUI::UserInput::Shred;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
return TUI::UserInput::ShredAll;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return TUI::UserInput::Undefined;
|
return TUI::UserInput::Undefined;
|
||||||
break;
|
break;
|
||||||
@ -305,7 +308,7 @@ WINDOW* TUI::overwriteDetailViewWindow( int iXSize, int iYSize, int iXStart)
|
|||||||
return newWindow;
|
return newWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, bool bSelected)
|
WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, string sModelFamily, string sModelName, string sCapacity, string sState, string sTime, string sSpeed, bool bSelected)
|
||||||
{
|
{
|
||||||
WINDOW *newWindow;
|
WINDOW *newWindow;
|
||||||
newWindow = newwin(iYSize, iXSize, iYStart, iXStart);
|
newWindow = newwin(iYSize, iXSize, iYStart, iXStart);
|
||||||
@ -329,8 +332,9 @@ WINDOW* TUI::createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart,
|
|||||||
mvwaddstr(newWindow,2, 1, sModelName.c_str());
|
mvwaddstr(newWindow,2, 1, sModelName.c_str());
|
||||||
mvwaddstr(newWindow,3, 1, sCapacity.c_str());
|
mvwaddstr(newWindow,3, 1, sCapacity.c_str());
|
||||||
|
|
||||||
|
mvwaddstr(newWindow,1, iXSize-sSpeed.length()-5, sSpeed.c_str());
|
||||||
mvwaddstr(newWindow,2, iXSize-sState.length()-5, sState.c_str());
|
mvwaddstr(newWindow,2, iXSize-sState.length()-5, sState.c_str());
|
||||||
mvwaddstr(newWindow,3, iXSize-sState.length()-5, sTime.c_str());
|
mvwaddstr(newWindow,3, iXSize-sTime.length()-5, sTime.c_str());
|
||||||
|
|
||||||
return newWindow;
|
return newWindow;
|
||||||
}
|
}
|
||||||
@ -384,19 +388,19 @@ WINDOW* TUI::createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, st
|
|||||||
|
|
||||||
if(menustate.bAbort)
|
if(menustate.bAbort)
|
||||||
{
|
{
|
||||||
string sLineTmp = "Press A for Abort";
|
string sLineTmp = "Press a for Abort";
|
||||||
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
||||||
u16Line++;
|
u16Line++;
|
||||||
}
|
}
|
||||||
if(menustate.bShred)
|
if(menustate.bShred)
|
||||||
{
|
{
|
||||||
string sLineTmp = "Press S for Shred ";
|
string sLineTmp = "Press s for Shred (S for all drives)";
|
||||||
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
||||||
u16Line++;
|
u16Line++;
|
||||||
}
|
}
|
||||||
if(menustate.bDelete)
|
if(menustate.bDelete)
|
||||||
{
|
{
|
||||||
string sLineTmp = "Press D for Delete";
|
string sLineTmp = "Press d for Delete";
|
||||||
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
mvwaddstr(newWindow,u16Line++, (iXSize/2)-(sLineTmp.size()/2), sLineTmp.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -506,6 +510,17 @@ string TUI::formatTimeDuration(time_t u32Duration)
|
|||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string TUI::formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes)
|
||||||
|
{
|
||||||
|
std::ostringstream out;
|
||||||
|
double dDeltaSec = ((double)((u32ShredTimeDelta)/1000000000.0)); //convert nano in sec
|
||||||
|
double speed = ((ulWrittenBytes/1000000.0)/dDeltaSec);
|
||||||
|
char s[25];
|
||||||
|
sprintf(s, "%0.2lf MB/s", speed);
|
||||||
|
out << s;
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY)
|
void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY)
|
||||||
{
|
{
|
||||||
struct MenuState menustate;
|
struct MenuState menustate;
|
||||||
|
Reference in New Issue
Block a user