From fdfdd0ca93c892a065f45866630d7b6bf596939d Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 2 May 2020 17:15:55 +0200 Subject: [PATCH] S.M.A.R.T. values are added to drive instace --- src/app.cpp | 66 ++-- src/app.h | 22 +- src/drive.cpp | 14 +- src/drive.h | 8 +- src/out.txt | 803 ---------------------------------------- src/reHDD | Bin 80248 -> 87584 bytes src/smart.cpp | 110 ++++-- src/smart.h | 10 +- vcCodium.code-workspace | 3 +- 9 files changed, 145 insertions(+), 891 deletions(-) delete mode 100644 src/out.txt diff --git a/src/app.cpp b/src/app.cpp index 75fda34..cc39b93 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -9,38 +9,35 @@ /** * \brief app constructor - * \param void + * \param void * \return instance of App */ -App::App(void) { +App::App(void) +{ cout << "created app" << endl; } /** * \brief app logic - * \param void + * \param void * \return void */ void App::app_logic(void) { cout << "app logic" << endl; - //Drive* tmp = new Drive("test"); - - 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 + searchDrives(&vecDrives); //search for new drives and store them in list + filterIgnoredDrives(&vecDrives); //filter out ignored drives + addSMARTData(&vecDrives); //add S.M.A.R.T. Data to the drives + printDrives(&vecDrives); //print currently attached drives } /** * \brief search attached drives on /dev/sd* - * \param pointer of list *listDrives + * \param pointer of vector * pvecDrives * \return void */ -void App::searchDrives(list *listDrives) +void App::searchDrives(vector * pvecDrives) { cout << "search drives ..." << endl; char * cLine = NULL; @@ -58,7 +55,7 @@ void App::searchDrives(list *listDrives) if (string(cLine).find("/dev/sd") != string::npos) { Drive* tmpDrive = new Drive(string(cLine).substr (2,8)); - listDrives->push_back(*tmpDrive); + pvecDrives->push_back(*tmpDrive); } } fclose(outputfileHwinfo); @@ -66,10 +63,10 @@ void App::searchDrives(list *listDrives) /** * \brief filter out drives that are listed in "ignoreDrives.conf" - * \param pointer of list *listDrives + * \param pointer of vector * pvecDrives * \return void */ -void App::filterIgnoredDrives(list *listDrives) +void App::filterIgnoredDrives(vector * pvecDrives) { string sDelimiter = ":"; string sIgnoredDrivePath; @@ -101,11 +98,10 @@ void App::filterIgnoredDrives(list *listDrives) //loop through found entries in ingnore file for(auto row : vtlIgnoredDevices) { - //cout << get<0>(row) << " is " << get<1>(row) << endl; - list ::iterator it; - // loop through found drives - for (it = listDrives->begin(); it != listDrives->end(); ++it) + auto it = pvecDrives->begin(); + while (it != pvecDrives->end()) { + it++; string sUUID; if (!get<0>(row).compare(it->getPath())) //find same drive based on path { @@ -133,7 +129,7 @@ void App::filterIgnoredDrives(list *listDrives) } } fclose(outputfileBlkid); - //cout << "blkid uuid:" << sUUID << endl; + // cout << "blkid uuid:" << sUUID << endl; if (get<1>(row).compare(sUUID)) //compare uuid from ignore file and uuid from drive { @@ -143,8 +139,9 @@ void App::filterIgnoredDrives(list *listDrives) else { // same uuid found than in ignore file --> ignore this drive - it = listDrives->erase(it); + it = pvecDrives->erase(it); } + } } } @@ -152,14 +149,14 @@ void App::filterIgnoredDrives(list *listDrives) /** * \brief print drives with all information - * \param pointer of list *listDrives + * \param pointer of vector * pvecDrives * \return void */ -void App::printDrives(list *listDrives) +void App::printDrives(vector * pvecDrives) { cout << "------------DRIVES---------------" << endl; - list ::iterator it; - for (it = listDrives->begin(); it != listDrives->end(); ++it) + vector ::iterator it; + for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) { cout << "Path: " << it->getPath() << endl; cout << "ModelFamily: " << it->getModelFamily() << endl; @@ -167,17 +164,24 @@ void App::printDrives(list *listDrives) cout << "Capacity: " << it->getCapacity() << endl; cout << "Serial: " << it->getSerial() << endl; cout << "PowerOnHours: " << it->getPowerOnHours() << endl; - cout << "PowerCycle: " << it->getPowerCycles() << endl; + cout << "PowerCycle: " << it->getPowerCycles() << endl; cout << "ErrorCount: " << it->getErrorCount() << endl; cout << endl; } cout << "---------------------------------" << endl; } -void App::addSMARTData(list *listDrives) { - list ::iterator it; - for (it = listDrives->begin(); it != listDrives->end(); ++it) +/** + * \brief add S.M.A.R.T data from SMART + * \param pointer of vector * pvecDrives + * \return void + */ +void App::addSMARTData(vector * pvecDrives) +{ + vector ::iterator it; + for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) { - SMART::readSMARTData(*it); + Drive* pTmpDrive = iterator_to_pointer::iterator > (it); + SMART::readSMARTData(pTmpDrive); } } \ No newline at end of file diff --git a/src/app.h b/src/app.h index 24a7cb5..f4e891d 100644 --- a/src/app.h +++ b/src/app.h @@ -12,9 +12,15 @@ #include "drive.h" #include "smart.h" -class App { -protected: +template +T* iterator_to_pointer(I i) +{ + return (&(*i)); +} +class App +{ +protected: public: App(void); @@ -22,15 +28,13 @@ public: private: - list listDrives; //stores all drive data + vector vecDrives; //stores all drive data - void searchDrives(list *listDrives); - void printDrives(list *listDrives); - void filterIgnoredDrives(list *listDrives); - void addSMARTData(list *listDrives); + void searchDrives(vector * pvecDrives); + void printDrives(vector * pvecDrives); + void filterIgnoredDrives(vector * pvecDrives); + void addSMARTData(vector * pvecDrives); }; - - #endif // APP_H_ \ No newline at end of file diff --git a/src/drive.cpp b/src/drive.cpp index 40957e1..aabc55b 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -7,7 +7,6 @@ #include "drive.h" - string Drive::getPath(void) { return sPath; @@ -47,6 +46,17 @@ uint32_t Drive::getPowerCycles(void) return u32PowerCycles; } +/** + * \brief set S.M.A.R.T. values in model + * \param string modelFamily + * \param string modelName + * \param string serial + * \param uint64_t capacity + * \param uint32_t errorCount + * \param uint32_t powerOnHours + * \param uint32_t powerCycle + * \return void + */ void Drive::setDriveSMARTData( string modelFamily, string modelName, string serial, @@ -55,7 +65,7 @@ void Drive::setDriveSMARTData( string modelFamily, uint32_t powerOnHours, uint32_t powerCycle) { - sModelFamily = modelFamily; + this->sModelFamily = modelFamily; sModelName = modelName; sSerial = serial; u64Capacity = capacity; diff --git a/src/drive.h b/src/drive.h index cc579c4..3b331be 100644 --- a/src/drive.h +++ b/src/drive.h @@ -10,12 +10,14 @@ #include "refurbishingHddTool.h" -class Drive { +class Drive +{ protected: public: - Drive(string path) { - sPath = path; + Drive(string path) + { + this->sPath = path; } string getPath(void); diff --git a/src/out.txt b/src/out.txt deleted file mode 100644 index c9040be..0000000 --- a/src/out.txt +++ /dev/null @@ -1,803 +0,0 @@ -{ - "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": 1588412611, - "asctime": "Sat May 2 11:43:31 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": 183, - "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": 5850, - "string": "5850" - } - }, - { - "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": 731, - "string": "731" - } - }, - { - "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": 712, - "string": "712" - } - }, - { - "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": 351, - "string": "351" - } - }, - { - "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": 21656, - "string": "21656" - } - }, - { - "id": 194, - "name": "Temperature_Celsius", - "value": 120, - "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": 30, - "string": "30" - } - }, - { - "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": 712, - "temperature": { - "current": 30 - }, - "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/reHDD b/src/reHDD index 5e9a6696e0bcac19fca204d52ff196c2ee07d69a..3cedd21f74b1c4509513e67a9cb08899db1d12e8 100755 GIT binary patch literal 87584 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

3aciCcPe0y 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 diff --git a/src/smart.cpp b/src/smart.cpp index 0d54509..d0da3f5 100644 --- a/src/smart.cpp +++ b/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); + } } diff --git a/src/smart.h b/src/smart.h index 0c107a7..50ee1fa 100644 --- a/src/smart.h +++ b/src/smart.h @@ -12,14 +12,13 @@ #include "drive.h" -class SMART { +class SMART +{ protected: public: - - static void readSMARTData(Drive drive); - + static void readSMARTData(Drive* drive); private: SMART(void); @@ -39,9 +38,6 @@ private: static uint32_t errorCount; static uint32_t powerOnHours; static uint32_t powerCycle; - }; - - #endif // SMART_H_ \ No newline at end of file diff --git a/vcCodium.code-workspace b/vcCodium.code-workspace index 772c2aa..a924abd 100644 --- a/vcCodium.code-workspace +++ b/vcCodium.code-workspace @@ -10,7 +10,8 @@ "*.tcc": "cpp", "string": "cpp", "unordered_map": "cpp", - "string_view": "cpp" + "string_view": "cpp", + "ostream": "cpp" } } } \ No newline at end of file