S.M.A.R.T. values are added to drive instace
This commit is contained in:
110
src/smart.cpp
110
src/smart.cpp
@ -15,18 +15,32 @@ uint32_t SMART::errorCount = 0U;
|
||||
uint32_t SMART::powerOnHours = 0U;
|
||||
uint32_t SMART::powerCycle = 0U;
|
||||
|
||||
void SMART::readSMARTData(Drive drive)
|
||||
/**
|
||||
* \brief get and set S.M.A.R.T. values in Drive
|
||||
* \param pointer of Drive instance
|
||||
* \return void
|
||||
*/
|
||||
void SMART::readSMARTData(Drive* drive)
|
||||
{
|
||||
modelFamily.clear();
|
||||
modelName.clear();
|
||||
serial.clear();
|
||||
capacity = 0U;
|
||||
errorCount = 0U;
|
||||
powerOnHours = 0U;
|
||||
powerCycle = 0U;
|
||||
|
||||
size_t len = 0; //lenght of found line
|
||||
char* cLine = NULL; //found line
|
||||
|
||||
string sCMD = ("./smartctl --json -a ");
|
||||
sCMD.append(drive.getPath());
|
||||
sCMD.append(drive->getPath());
|
||||
const char* cpComand = sCMD.c_str();
|
||||
|
||||
FILE* outputfileSmart = popen(cpComand, "r");
|
||||
|
||||
while ((getline(&cLine, &len, outputfileSmart)) != -1) {
|
||||
while ((getline(&cLine, &len, outputfileSmart)) != -1)
|
||||
{
|
||||
string sLine = string(cLine);
|
||||
|
||||
SMART::parseModelFamily(sLine);
|
||||
@ -38,97 +52,123 @@ void SMART::readSMARTData(Drive drive)
|
||||
SMART::parsePowerCycle(sLine);
|
||||
}
|
||||
fclose(outputfileSmart);
|
||||
//drive.setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, spinUpCount);
|
||||
drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle); //wirte data in drive
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse ModelFamiliy
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parseModelFamily(string sLine)
|
||||
{
|
||||
string search("\"model_family\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
sLine.erase(0, sLine.find(": ") + 3);
|
||||
sLine.erase(sLine.length()-3, 3);
|
||||
// modelFamily = sLine;
|
||||
cout << "ModelFamily |" << sLine << "|" << endl;
|
||||
modelFamily = sLine;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse ModelName
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parseModelName(string sLine)
|
||||
{
|
||||
string search("\"model_name\": ");
|
||||
string search("\"model_name\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
sLine.erase(0, sLine.find(": ") + 3);
|
||||
sLine.erase(sLine.length()-3, 3);
|
||||
// modelName = sLine;
|
||||
cout << "ModelName |" << sLine << "|" << endl;
|
||||
modelName = sLine;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse Serial
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parseSerial(string sLine)
|
||||
{
|
||||
string search("\"serial_number\": ");
|
||||
string search("\"serial_number\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
sLine.erase(0, sLine.find(": ") + 3);
|
||||
sLine.erase(sLine.length()-3, 3);
|
||||
// serial = sLine;
|
||||
cout << "Serial |" << sLine << "|" << endl;
|
||||
serial = sLine;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse Capacity
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parseCapacity(string sLine)
|
||||
{
|
||||
string search("\"bytes\": ");
|
||||
string search("\"bytes\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
sLine.erase(0, sLine.find(": ") + 2);
|
||||
sLine.erase(sLine.length()-1, 1);
|
||||
// capacity = sLine;
|
||||
cout << "Capacity |" << sLine << "|" << endl;
|
||||
capacity = stol(sLine);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse ErrorCount
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parseErrorCount(string sLine)
|
||||
{
|
||||
string search("\"error_count_total\": ");
|
||||
string search("\"error_count_total\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
//cout << sLine;
|
||||
if (found!=string::npos)
|
||||
{
|
||||
sLine.erase(0, sLine.find(": ")+2);
|
||||
sLine.erase(sLine.length()-2, 2);
|
||||
errorCount = stoi(sLine);
|
||||
cout << "ErrorCount |" << sLine << "|" << endl;
|
||||
errorCount = stol(sLine);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse PowerOnHours
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parsePowerOnHours(string sLine)
|
||||
{
|
||||
string search("\"hours\": ");
|
||||
string search("\"hours\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
if (found!=string::npos)
|
||||
{
|
||||
sLine.erase(0, sLine.find(": ") + 2);
|
||||
sLine.erase(sLine.length()-1, 1);
|
||||
// powerOnHours = stoi(sLine);
|
||||
cout << "PowerOnHours |" << sLine << "|" << endl;
|
||||
powerOnHours = stol(sLine);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief parse PowerCycle
|
||||
* \param string output line of smartctl
|
||||
* \return void
|
||||
*/
|
||||
void SMART::parsePowerCycle(string sLine)
|
||||
{
|
||||
string search("\"power_cycle_count\": ");
|
||||
string search("\"power_cycle_count\": ");
|
||||
size_t found = sLine.find(search);
|
||||
if (found!=string::npos) {
|
||||
// cout << sLine;
|
||||
sLine.erase(0, sLine.find(": ") + 2);
|
||||
if (found!=string::npos)
|
||||
{
|
||||
sLine.erase(0, sLine.find(": ") + 2);
|
||||
sLine.erase(sLine.length()-2, 2);
|
||||
//spinUpCount = stoi(sLine);
|
||||
cout << "PowerCycle |" << sLine << "|" << endl;
|
||||
powerCycle = stol(sLine);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user