From 20cfc44b51bb5e0973d18c58c7f22ecae0dac8e3 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 8 Nov 2018 22:26:42 +0100 Subject: [PATCH] able to find all devices in /dev/ --- README.md | 2 +- src/drives.cpp | 0 src/mainTest.cpp | 141 ++++++++++++++++++++++++++++++++++++++ src/mainTest.cpp.orig | 133 +++++++++++++++++++++++++++++++++++ src/refurbishingHddTool.h | 0 src/smart.cpp | 0 src/test | Bin 0 -> 32952 bytes src/wipe.cpp | 0 8 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 src/drives.cpp create mode 100644 src/mainTest.cpp create mode 100644 src/mainTest.cpp.orig create mode 100644 src/refurbishingHddTool.h create mode 100644 src/smart.cpp create mode 100755 src/test create mode 100644 src/wipe.cpp diff --git a/README.md b/README.md index 3c43fa4..0da769b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## planned Features: * search for new attached Hard Drives via USB -* display Hard Drive Manufacturer, Model, Spin Speed and Capacity +* display Hard Drive Manufacturer, Model, Rotation Rate and Capacity * Check S.M.A.R.T. values and make an 'passed' or 'not passed' decision * If passed, wipe the data securely diff --git a/src/drives.cpp b/src/drives.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/mainTest.cpp b/src/mainTest.cpp new file mode 100644 index 0000000..ce80899 --- /dev/null +++ b/src/mainTest.cpp @@ -0,0 +1,141 @@ + +#include +#include +#include +#include + +using namespace std; + +struct deviceData{ + string model; + string manufacturer; + short rotationRate; //in rpm + short capacity; //in Gigabytes +}; + + + +string removeLastNewLine(string s); +deviceData getDeviceData(string path); + + + +/* + * + * clear && g++ -Wall -o test mainTest.cpp + * + */ +int main(void) +{ + cout << "Hello World!\n"; + + + char * cLine = NULL; + string path; + size_t len = 0; + + int loop = 0; + + int devicesSize = 0; + + string devices[5]; + + + FILE* outputfileHwinfo = popen("hwinfo --short --disk", "r"); + + if (outputfileHwinfo == NULL) { + exit(EXIT_FAILURE); + } + + while ((getline(&cLine, &len, outputfileHwinfo)) != -1) { + + if(loop > 0) { + + string line = string(cLine); + + path = line.substr (2,8); + + devices[devicesSize] = path; + + devicesSize++; + } + + loop++; + } + + fclose(outputfileHwinfo); + + + + cout << "Model: " << getDeviceData(devices[0]) << endl; + + + + return 0; +} + +deviceData getDeviceData(string path) { + + size_t len = 0; //lenght of found line + char * cLine = NULL; //found line + + string comand = ("smartctl -a " + path); + const char *cComand = comand.c_str(); + + FILE* outputfileSmart = popen(cComand, "r"); + + while ((getline(&cLine, &len, outputfileSmart)) != -1) { + + string line = string(cLine); + string search ("Device Model:"); + + size_t found = line.find(search); + + if (found!=string::npos) { + + int lenght = line.length(); //lenght of line + + + string str3 (":"); + found = line.find(str3); + + //cout << "Found1: " << found << endl; + + for(int i = (found+1); i < lenght; i++) { + + if(line[i] != ' ') { + // cout << i << endl; + found = i; + break; + } + + } + + + + string model = line.substr (found, lenght); + + model = removeLastNewLine(model); + + // cout << model << endl; + + return model; + + } + + } + + fclose(outputfileSmart); + + return "error"; + +} + + + +string removeLastNewLine(string s) { + if (!s.empty() && s[s.length()-1] == '\n') { + s.erase(s.length()-1); + } + return s; +} diff --git a/src/mainTest.cpp.orig b/src/mainTest.cpp.orig new file mode 100644 index 0000000..3d3f0d4 --- /dev/null +++ b/src/mainTest.cpp.orig @@ -0,0 +1,133 @@ + +#include +#include +#include +#include + +using namespace std; + + +string removeLastNewLine(string s); +string getModel(string path); + +/* + * + * g++ -Wall -o cctv_radar cctv_radar.cpp mcp3008Spi.cpp logger.cpp libftpclient.a -lcurl -lwiringPi -pthread + * + */ +int main(void) +{ + cout << "Hello World!\n"; + + + char * cLine = NULL; + string path; + size_t len = 0; + + int loop = 0; + + int devicesSize = 0; + + string devices[5]; + + + FILE* outputfileHwinfo = popen("hwinfo --short --disk", "r"); + + if (outputfileHwinfo == NULL) { + exit(EXIT_FAILURE); + } + + while ((getline(&cLine, &len, outputfileHwinfo)) != -1) { + + if(loop > 0) { + + string line = string(cLine); + + path = line.substr (2,8); + + devices[devicesSize] = path; + + devicesSize++; + } + + loop++; + } + + fclose(outputfileHwinfo); + + + +cout << "Model: " << getModel(devices[0]) << endl; + + + + return 0; +} + +string getModel(string path){ + + size_t len = 0; + + char * cLine = NULL; + + string comand = ("smartctl -a " + path); + const char *cComand = comand.c_str(); + + FILE* outputfileSmart = popen(cComand, "r"); + + while ((getline(&cLine, &len, outputfileSmart)) != -1) { + + string line = string(cLine); + + //cout << line << endl; + + string str2 ("Device Model:"); + size_t found = line.find(str2); + if (found!=string::npos) { + // cout << "Device Model: at: " << found << '\n'; + // cout << line << endl; + + int size = line.length(); + + + string str3 (":"); + found = line.find(str3); + + //cout << "Found1: " << found << endl; + + for(int i = (found+1); i < size; i++) { + + if(line[i] != ' ') { + // cout << i << endl; + found = i; + break; + } + + } + + + + string model = line.substr (found, size); + + model = removeLastNewLine(model); + + // cout << model << endl; + + return model; + + } + + } + + return "error"; + +} + + + +string removeLastNewLine(string s) { + if (!s.empty() && s[s.length()-1] == '\n') { + s.erase(s.length()-1); + } + return s; +} diff --git a/src/refurbishingHddTool.h b/src/refurbishingHddTool.h new file mode 100644 index 0000000..e69de29 diff --git a/src/smart.cpp b/src/smart.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/test b/src/test new file mode 100755 index 0000000000000000000000000000000000000000..172a8e64ee2fb3c659343e6676fab51255a8025f GIT binary patch literal 32952 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