reHDD/src/smart.cpp

205 lines
4.9 KiB
C++
Raw Normal View History

2020-05-02 00:49:11 +02:00
/**
2020-05-02 22:06:47 +02:00
* @file smart.cpp
* @brief read S.M.A.R.T values
* @author hendrik schutter
* @date 01.05.2020
2020-05-02 00:49:11 +02:00
*/
2020-05-02 22:06:47 +02:00
#include "../include/reHDD.h"
2020-05-02 00:49:11 +02:00
string SMART::modelFamily;
string SMART::modelName;
string SMART::serial;
2020-05-02 13:25:27 +02:00
uint64_t SMART::capacity = 0U;
2020-05-02 00:49:11 +02:00
uint32_t SMART::errorCount = 0U;
uint32_t SMART::powerOnHours = 0U;
2020-05-02 13:25:27 +02:00
uint32_t SMART::powerCycle = 0U;
uint32_t SMART::temperature = 0U;
2020-05-02 00:49:11 +02:00
/**
* \brief get and set S.M.A.R.T. values in Drive
* \param pointer of Drive instance
* \return void
*/
void SMART::readSMARTData(Drive* drive)
2020-05-02 00:49:11 +02:00
{
modelFamily.clear();
modelName.clear();
serial.clear();
capacity = 0U;
errorCount = 0U;
powerOnHours = 0U;
powerCycle = 0U;
temperature = 0U;
2020-05-02 00:49:11 +02:00
size_t len = 0; //lenght of found line
char* cLine = NULL; //found line
string sCMD = ("smartctl --json -a ");
sCMD.append(drive->getPath());
2020-05-02 00:49:11 +02:00
const char* cpComand = sCMD.c_str();
FILE* outputfileSmart = popen(cpComand, "r");
while ((getline(&cLine, &len, outputfileSmart)) != -1)
2020-08-07 11:38:00 +02:00
{
string sLine = string(cLine);
SMART::parseModelFamily(sLine);
SMART::parseModelName(sLine);
SMART::parseSerial(sLine);
SMART::parseCapacity(sLine);
SMART::parseErrorCount(sLine);
SMART::parsePowerOnHours(sLine);
SMART::parsePowerCycle(sLine);
SMART::parseTemperature(sLine);
2020-08-07 11:38:00 +02:00
}
2022-01-26 15:44:32 +01:00
pclose(outputfileSmart);
drive->setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, powerCycle, temperature); //wirte data in drive
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse ModelFamiliy
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parseModelFamily(string sLine)
{
string search("\"model_family\": ");
size_t found = sLine.find(search);
2020-08-07 11:38:00 +02:00
if (found!=string::npos)
{
sLine.erase(0, sLine.find(": ") + 3);
sLine.erase(sLine.length()-3, 3);
modelFamily = sLine;
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse ModelName
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parseModelName(string sLine)
{
string search("\"model_name\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
2020-08-07 11:38:00 +02:00
if (found!=string::npos)
{
sLine.erase(0, sLine.find(": ") + 3);
sLine.erase(sLine.length()-3, 3);
modelName = sLine;
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse Serial
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parseSerial(string sLine)
{
string search("\"serial_number\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
2020-08-07 11:38:00 +02:00
if (found!=string::npos)
{
sLine.erase(0, sLine.find(": ") + 3);
sLine.erase(sLine.length()-3, 3);
serial = sLine;
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse Capacity
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parseCapacity(string sLine)
{
string search("\"bytes\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
2020-08-07 11:38:00 +02:00
if (found!=string::npos)
{
sLine.erase(0, sLine.find(": ") + 2);
sLine.erase(sLine.length()-1, 1);
capacity = stol(sLine);
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse ErrorCount
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parseErrorCount(string sLine)
{
string search("\"error_count_total\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
if (found!=string::npos)
2020-08-07 11:38:00 +02:00
{
sLine.erase(0, sLine.find(": ")+2);
sLine.erase(sLine.length()-2, 2);
errorCount = stol(sLine);
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse PowerOnHours
* \param string output line of smartctl
* \return void
*/
2020-05-02 00:49:11 +02:00
void SMART::parsePowerOnHours(string sLine)
{
string search("\"hours\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
if (found!=string::npos)
2020-08-07 11:38:00 +02:00
{
sLine.erase(0, sLine.find(": ") + 2);
sLine.erase(sLine.length()-1, 1);
powerOnHours = stol(sLine);
2020-08-07 11:38:00 +02:00
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse PowerCycle
* \param string output line of smartctl
* \return void
*/
2020-05-02 13:25:27 +02:00
void SMART::parsePowerCycle(string sLine)
2020-05-02 00:49:11 +02:00
{
string search("\"power_cycle_count\": ");
2020-05-02 00:49:11 +02:00
size_t found = sLine.find(search);
if (found!=string::npos)
2020-08-07 11:38:00 +02:00
{
sLine.erase(0, sLine.find(": ") + 2);
sLine.erase(sLine.length()-2, 2);
powerCycle = stol(sLine);
2020-08-07 11:38:00 +02:00
}
2020-05-02 00:49:11 +02:00
}
/**
* \brief parse temperature
* \param string output line of smartctl
* \return void
*/
void SMART::parseTemperature(string sLine)
{
string search("\"current\": ");
size_t found = sLine.find(search);
if (found!=string::npos)
{
sLine.erase(0, sLine.find(": ") + 2);
sLine.erase(sLine.length()-1, 2);
if(sLine == "{")
{
temperature = 0U; // this drive doesn't support temperatur
}
else
{
temperature = stol(sLine);
}
}
}