From 8bf777174e00c393567e3bf4f4c9ba188a410ad7 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 2 May 2020 00:49:11 +0200 Subject: [PATCH] added smart value read and parse --- src/app.cpp | 18 +- src/app.h | 2 + src/drive.cpp | 24 +- src/drive.h | 12 +- src/makefile | 9 +- src/out.txt | 803 ++++++++++++++++++++++++++++++++++++++++ src/refurbishingHddTool | Bin 73512 -> 80216 bytes src/smart.cpp | 134 +++++++ src/smart.h | 47 +++ vcCodium.code-workspace | 6 +- 10 files changed, 1036 insertions(+), 19 deletions(-) create mode 100644 src/out.txt create mode 100644 src/smart.h diff --git a/src/app.cpp b/src/app.cpp index d7fdc92..388226e 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -29,6 +29,9 @@ void App::app_logic(void) searchDrives(&listDrives); //search for new drives and store them in list filterIgnoredDrives(&listDrives); //filter out ignored drives + + addSMARTData(&listDrives); + printDrives(&listDrives); //print currently attached drives } @@ -54,10 +57,7 @@ void App::searchDrives(list *listDrives) { if (string(cLine).find("/dev/sd") != string::npos) { - //struct drive tmpDrive; - Drive* tmpDrive = new Drive(string(cLine).substr (2,8)); - listDrives->push_back(*tmpDrive); } } @@ -162,8 +162,8 @@ void App::printDrives(list *listDrives) for (it = listDrives->begin(); it != listDrives->end(); ++it) { cout << "Path: " << it->getPath() << endl; - cout << "Model: " << it->getModel() << endl; - cout << "Manufacturer: " << it->getManufacturer() << endl; + cout << "ModelFamily: " << it->getModelFamily() << endl; + cout << "ModelName: " << it->getModelName() << endl; cout << "Capacity: " << it->getCapacity() << endl; cout << "Serial: " << it->getSerial() << endl; cout << "PowerOnHours: " << it->getPowerOnHours() << endl; @@ -173,3 +173,11 @@ void App::printDrives(list *listDrives) } cout << "---------------------------------" << endl; } + +void App::addSMARTData(list *listDrives) { + list ::iterator it; + for (it = listDrives->begin(); it != listDrives->end(); ++it) + { + SMART::readSMARTData(*it); + } +} \ No newline at end of file diff --git a/src/app.h b/src/app.h index c401972..24a7cb5 100644 --- a/src/app.h +++ b/src/app.h @@ -10,6 +10,7 @@ #include "refurbishingHddTool.h" #include "drive.h" +#include "smart.h" class App { protected: @@ -26,6 +27,7 @@ private: void searchDrives(list *listDrives); void printDrives(list *listDrives); void filterIgnoredDrives(list *listDrives); + void addSMARTData(list *listDrives); }; diff --git a/src/drive.cpp b/src/drive.cpp index 5339491..76d45cb 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -13,14 +13,14 @@ string Drive::getPath(void) return sPath; } -string Drive::getManufacturer(void) +string Drive::getModelFamily(void) { - return sManufacturer; + return sModelFamily; } -string Drive::getModel(void) +string Drive::getModelName(void) { - return sModel; + return sModelName; } string Drive::getSerial(void) @@ -47,3 +47,19 @@ uint32_t Drive::getSpinUpCount(void) return u32SpinUpCount; } +void Drive::setDriveSMARTData( string modelFamily, + string modelName, + string serial, + string capacity, + uint32_t errorCount, + uint32_t powerOnHours, + uint32_t spinUpCount) +{ + sModelFamily = modelFamily; + sModelName = modelName; + sSerial = serial; + sCapacity = capacity; + u32ErrorCount = errorCount; + u32PowerOnHours = powerOnHours; + u32SpinUpCount = spinUpCount; +} \ No newline at end of file diff --git a/src/drive.h b/src/drive.h index c0bfd06..8bc8456 100644 --- a/src/drive.h +++ b/src/drive.h @@ -19,16 +19,16 @@ public: } string getPath(void); - string getManufacturer(void); - string getModel(void); + string getModelFamily(void); + string getModelName(void); string getSerial(void); string getCapacity(void); uint32_t getErrorCount(void); uint32_t getPowerOnHours(void); uint32_t getSpinUpCount(void); - void setDriveSMARTData( string manufacturer, - string model, + void setDriveSMARTData( string modelFamily, + string modelName, string serial, string capacity, uint32_t errorCount, @@ -37,8 +37,8 @@ public: private: string sPath; - string sManufacturer; - string sModel; + string sModelFamily; + string sModelName; string sSerial; string sCapacity; uint32_t u32ErrorCount; diff --git a/src/makefile b/src/makefile index 8e669ea..2f56294 100644 --- a/src/makefile +++ b/src/makefile @@ -1,5 +1,5 @@ -refurbishingHddTool: main.o app.o drive.o - g++ -Wall -o refurbishingHddTool main.o app.o drive.o +refurbishingHddTool: main.o app.o drive.o smart.o + g++ -Wall -o refurbishingHddTool main.o app.o drive.o smart.o main.o: main.cpp g++ -c main.cpp @@ -9,6 +9,9 @@ app.o: app.cpp drive.o: drive.cpp g++ -c drive.cpp + +smart.o: smart.cpp + g++ -c smart.cpp clean : - rm refurbishingHddTool main.o app.o drive.o + rm refurbishingHddTool main.o app.o drive.o smart.o diff --git a/src/out.txt b/src/out.txt new file mode 100644 index 0000000..fdeaecf --- /dev/null +++ b/src/out.txt @@ -0,0 +1,803 @@ +{ + "json_format_version": [ + 1, + 0 + ], + "smartctl": { + "version": [ + 7, + 1 + ], + "svn_revision": "5022", + "platform_info": "x86_64-linux-5.6.4-1-default", + "build_info": "(SUSE RPM)", + "argv": [ + "smartctl", + "--json", + "-a", + "/dev/sdd" + ], + "exit_status": 0 + }, + "device": { + "name": "/dev/sdd", + "info_name": "/dev/sdd [SAT]", + "type": "sat", + "protocol": "ATA" + }, + "model_family": "Western Digital Caviar Green", + "model_name": "WDC WD15EADS-22P8B0", + "serial_number": "WD-WMAVU2708194", + "wwn": { + "naa": 5, + "oui": 5358, + "id": 28633198579 + }, + "firmware_version": "01.00A01", + "user_capacity": { + "blocks": 2930277168, + "bytes": 1500301910016 + }, + "logical_block_size": 512, + "physical_block_size": 512, + "in_smartctl_database": true, + "ata_version": { + "string": "ATA8-ACS (minor revision not indicated)", + "major_value": 510, + "minor_value": 0 + }, + "sata_version": { + "string": "SATA 2.6", + "value": 30 + }, + "interface_speed": { + "max": { + "sata_value": 6, + "string": "3.0 Gb/s", + "units_per_second": 30, + "bits_per_unit": 100000000 + } + }, + "local_time": { + "time_t": 1588373001, + "asctime": "Sat May 2 00:43:21 2020 CEST" + }, + "smart_status": { + "passed": true + }, + "ata_smart_data": { + "offline_data_collection": { + "status": { + "value": 130, + "string": "was completed without error", + "passed": true + }, + "completion_seconds": 31200 + }, + "self_test": { + "status": { + "value": 0, + "string": "completed without error", + "passed": true + }, + "polling_minutes": { + "short": 2, + "extended": 356, + "conveyance": 5 + } + }, + "capabilities": { + "values": [ + 123, + 3 + ], + "exec_offline_immediate_supported": true, + "offline_is_aborted_upon_new_cmd": false, + "offline_surface_scan_supported": true, + "self_tests_supported": true, + "conveyance_self_test_supported": true, + "selective_self_test_supported": true, + "attribute_autosave_enabled": true, + "error_logging_supported": true, + "gp_logging_supported": true + } + }, + "ata_sct_capabilities": { + "value": 12343, + "error_recovery_control_supported": false, + "feature_control_supported": true, + "data_table_supported": true + }, + "ata_smart_attributes": { + "revision": 16, + "table": [ + { + "id": 1, + "name": "Raw_Read_Error_Rate", + "value": 200, + "worst": 200, + "thresh": 51, + "when_failed": "", + "flags": { + "value": 47, + "string": "POSR-K ", + "prefailure": true, + "updated_online": true, + "performance": true, + "error_rate": true, + "event_count": false, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 3, + "name": "Spin_Up_Time", + "value": 182, + "worst": 178, + "thresh": 21, + "when_failed": "", + "flags": { + "value": 39, + "string": "POS--K ", + "prefailure": true, + "updated_online": true, + "performance": true, + "error_rate": false, + "event_count": false, + "auto_keep": true + }, + "raw": { + "value": 5858, + "string": "5858" + } + }, + { + "id": 4, + "name": "Start_Stop_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 730, + "string": "730" + } + }, + { + "id": 5, + "name": "Reallocated_Sector_Ct", + "value": 200, + "worst": 200, + "thresh": 140, + "when_failed": "", + "flags": { + "value": 51, + "string": "PO--CK ", + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 7, + "name": "Seek_Error_Rate", + "value": 100, + "worst": 253, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 46, + "string": "-OSR-K ", + "prefailure": false, + "updated_online": true, + "performance": true, + "error_rate": true, + "event_count": false, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 9, + "name": "Power_On_Hours", + "value": 99, + "worst": 99, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 1227, + "string": "1227" + } + }, + { + "id": 10, + "name": "Spin_Retry_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 11, + "name": "Calibration_Retry_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 12, + "name": "Power_Cycle_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 711, + "string": "711" + } + }, + { + "id": 192, + "name": "Power-Off_Retract_Count", + "value": 200, + "worst": 200, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 350, + "string": "350" + } + }, + { + "id": 193, + "name": "Load_Cycle_Count", + "value": 193, + "worst": 193, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 21650, + "string": "21650" + } + }, + { + "id": 194, + "name": "Temperature_Celsius", + "value": 114, + "worst": 86, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 34, + "string": "-O---K ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": false, + "auto_keep": true + }, + "raw": { + "value": 36, + "string": "36" + } + }, + { + "id": 196, + "name": "Reallocated_Event_Count", + "value": 200, + "worst": 200, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 197, + "name": "Current_Pending_Sector", + "value": 200, + "worst": 200, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 198, + "name": "Offline_Uncorrectable", + "value": 200, + "worst": 200, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 48, + "string": "----CK ", + "prefailure": false, + "updated_online": false, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 0, + "string": "0" + } + }, + { + "id": 199, + "name": "UDMA_CRC_Error_Count", + "value": 200, + "worst": 199, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 50, + "string": "-O--CK ", + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true + }, + "raw": { + "value": 332, + "string": "332" + } + }, + { + "id": 200, + "name": "Multi_Zone_Error_Rate", + "value": 200, + "worst": 200, + "thresh": 0, + "when_failed": "", + "flags": { + "value": 8, + "string": "---R-- ", + "prefailure": false, + "updated_online": false, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false + }, + "raw": { + "value": 0, + "string": "0" + } + } + ] + }, + "power_on_time": { + "hours": 1227 + }, + "power_cycle_count": 711, + "temperature": { + "current": 36 + }, + "ata_smart_error_log": { + "summary": { + "revision": 1, + "count": 0 + } + }, + "ata_smart_self_test_log": { + "standard": { + "revision": 1, + "table": [ + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1191 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1170 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1155 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1141 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1127 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1112 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1100 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1087 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1074 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1060 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1047 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1034 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1021 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1005 + }, + { + "type": { + "value": 2, + "string": "Extended offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 1003 + }, + { + "type": { + "value": 2, + "string": "Extended offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 992 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 987 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 975 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 234 + }, + { + "type": { + "value": 1, + "string": "Short offline" + }, + "status": { + "value": 0, + "string": "Completed without error", + "passed": true + }, + "lifetime_hours": 230 + } + ], + "count": 20, + "error_count_total": 0, + "error_count_outdated": 0 + } + }, + "ata_smart_selective_self_test_log": { + "revision": 1, + "table": [ + { + "lba_min": 0, + "lba_max": 0, + "status": { + "value": 0, + "string": "Not_testing" + } + }, + { + "lba_min": 0, + "lba_max": 0, + "status": { + "value": 0, + "string": "Not_testing" + } + }, + { + "lba_min": 0, + "lba_max": 0, + "status": { + "value": 0, + "string": "Not_testing" + } + }, + { + "lba_min": 0, + "lba_max": 0, + "status": { + "value": 0, + "string": "Not_testing" + } + }, + { + "lba_min": 0, + "lba_max": 0, + "status": { + "value": 0, + "string": "Not_testing" + } + } + ], + "flags": { + "value": 0, + "remainder_scan_enabled": false + }, + "power_up_scan_resume_minutes": 0 + } +} diff --git a/src/refurbishingHddTool b/src/refurbishingHddTool index 6bb29a129ec331ddb1beba1132df147950d76bd8..953e7096b2ec720379bfa033d0049f2b12c5b2ed 100755 GIT binary patch literal 80216 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 XG|eR{KYcVwW*99B@HzcBlE(iB?<^&D diff --git a/src/smart.cpp b/src/smart.cpp index e69de29..7240f0c 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -0,0 +1,134 @@ +/** + * @file smart.cpp + * @brief read S.M.A.R.T values + * @author hendrik schutter + * @date 01.05.2020 + */ + +#include "smart.h" + +string SMART::modelFamily; +string SMART::modelName; +string SMART::serial; +string SMART::capacity; +uint32_t SMART::errorCount = 0U; +uint32_t SMART::powerOnHours = 0U; +uint32_t SMART::spinUpCount = 0U; + +void SMART::readSMARTData(Drive drive) +{ + size_t len = 0; //lenght of found line + char* cLine = NULL; //found line + + string sCMD = ("./smartctl --json -a "); + sCMD.append(drive.getPath()); + const char* cpComand = sCMD.c_str(); + + FILE* outputfileSmart = popen(cpComand, "r"); + + while ((getline(&cLine, &len, outputfileSmart)) != -1) { + string sLine = string(cLine); + + SMART::parseModelFamily(sLine); + SMART::parseModelName(sLine); + SMART::parseSerial(sLine); + SMART::parseCapacity(sLine); + SMART::parseErrorCount(sLine); + SMART::parsePowerOnHours(sLine); + SMART::parseSpinUpCount(sLine); + } + fclose(outputfileSmart); + //drive.setDriveSMARTData(modelFamily, modelName, serial, capacity, errorCount, powerOnHours, spinUpCount); +} + +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; + } +} + +void SMART::parseModelName(string sLine) +{ + 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; + } +} + +void SMART::parseSerial(string sLine) +{ + 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; + } +} + +void SMART::parseCapacity(string sLine) +{ + 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; + } +} + +void SMART::parseErrorCount(string sLine) +{ + string search("\"error_count_total\": "); + size_t found = sLine.find(search); + if (found!=string::npos) { + //cout << sLine; + sLine.erase(0, sLine.find(": ")+2); + sLine.erase(sLine.length()-2, 2); + errorCount = stoi(sLine); + cout << "ErrorCount |" << sLine << "|" << endl; + } +} + +void SMART::parsePowerOnHours(string sLine) +{ +string search("\"hours\": "); + size_t found = sLine.find(search); + if (found!=string::npos) { + // cout << sLine; + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length()-1, 1); + // powerOnHours = stoi(sLine); + cout << "PowerOnHours |" << sLine << "|" << endl; + } +} + +void SMART::parseSpinUpCount(string sLine) +{ +string search("\"power_cycle_count\": "); + size_t found = sLine.find(search); + if (found!=string::npos) { + // cout << sLine; + sLine.erase(0, sLine.find(": ") + 2); + sLine.erase(sLine.length()-2, 2); + //spinUpCount = stoi(sLine); + cout << "SpinUpCount |" << sLine << "|" << endl; + } +} + diff --git a/src/smart.h b/src/smart.h new file mode 100644 index 0000000..c152b4d --- /dev/null +++ b/src/smart.h @@ -0,0 +1,47 @@ +/** + * @file smart.h + * @brief read S.M.A.R.T values + * @author hendrik schutter + * @date 01.05.2020 + */ + +#ifndef SMART_H_ +#define SMART_H_ + +#include "refurbishingHddTool.h" +#include "drive.h" + + +class SMART { +protected: + + +public: + + static void readSMARTData(Drive drive); + + +private: + SMART(void); + + static void parseModelFamily(string sLine); + static void parseModelName(string sLine); + static void parseSerial(string sLine); + static void parseCapacity(string sLine); + static void parseErrorCount(string sLine); + static void parsePowerOnHours(string sLine); + static void parseSpinUpCount(string sLine); + + static string modelFamily; + static string modelName; + static string serial; + static string capacity; + static uint32_t errorCount; + static uint32_t powerOnHours; + static uint32_t spinUpCount; + +}; + + + +#endif // SMART_H_ \ No newline at end of file diff --git a/vcCodium.code-workspace b/vcCodium.code-workspace index a921fa8..772c2aa 100644 --- a/vcCodium.code-workspace +++ b/vcCodium.code-workspace @@ -6,7 +6,11 @@ ], "settings": { "files.associations": { - "iostream": "cpp" + "iostream": "cpp", + "*.tcc": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "string_view": "cpp" } } } \ No newline at end of file