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 ;
2020-05-02 00:49:11 +02:00
2020-05-02 17:15:55 +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
{
2020-05-02 17:15:55 +02:00
modelFamily . clear ( ) ;
modelName . clear ( ) ;
serial . clear ( ) ;
capacity = 0U ;
errorCount = 0U ;
powerOnHours = 0U ;
powerCycle = 0U ;
2020-05-02 00:49:11 +02:00
size_t len = 0 ; //lenght of found line
char * cLine = NULL ; //found line
2020-05-03 18:00:05 +02:00
string sCMD = ( " smartctl --json -a " ) ;
2020-05-02 17:15:55 +02:00
sCMD . append ( drive - > getPath ( ) ) ;
2020-05-02 00:49:11 +02:00
const char * cpComand = sCMD . c_str ( ) ;
FILE * outputfileSmart = popen ( cpComand , " r " ) ;
2020-05-02 17:15:55 +02:00
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 ) ;
}
2022-01-26 15:44:32 +01:00
pclose ( outputfileSmart ) ;
2020-05-02 17:15:55 +02:00
drive - > setDriveSMARTData ( modelFamily , modelName , serial , capacity , errorCount , powerOnHours , powerCycle ) ; //wirte data in drive
2020-05-02 00:49:11 +02:00
}
2020-05-02 17:15:55 +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
}
2020-05-02 17:15:55 +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 )
{
2020-05-02 17:15:55 +02:00
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
}
2020-05-02 17:15:55 +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 )
{
2020-05-02 17:15:55 +02:00
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
}
2020-05-02 17:15:55 +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 )
{
2020-05-02 17:15:55 +02:00
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
}
2020-05-02 17:15:55 +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 )
{
2020-05-02 17:15:55 +02:00
string search ( " \" error_count_total \" : " ) ;
2020-05-02 00:49:11 +02:00
size_t found = sLine . find ( search ) ;
2020-05-02 17:15:55 +02:00
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
}
2020-05-02 17:15:55 +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 )
{
2020-05-02 17:15:55 +02:00
string search ( " \" hours \" : " ) ;
2020-05-02 00:49:11 +02:00
size_t found = sLine . find ( search ) ;
2020-05-02 17:15:55 +02:00
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-05-02 17:15:55 +02:00
2020-08-07 11:38:00 +02:00
}
2020-05-02 00:49:11 +02:00
}
2020-05-02 17:15:55 +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
{
2020-05-02 17:15:55 +02:00
string search ( " \" power_cycle_count \" : " ) ;
2020-05-02 00:49:11 +02:00
size_t found = sLine . find ( search ) ;
2020-05-02 17:15:55 +02:00
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-05-02 17:15:55 +02:00
2020-08-07 11:38:00 +02:00
}
2020-05-02 00:49:11 +02:00
}