From 5e649f866348918b235e7dd8edee45102218fb28 Mon Sep 17 00:00:00 2001 From: zengwei Date: Thu, 9 Nov 2023 15:56:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96CPU?= =?UTF-8?q?=EF=BC=8C=E5=86=85=E5=AD=98=EF=BC=8C=E5=A4=96=E5=AD=98=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/resources_collect.h | 33 ++++++ .../resources/collect_unit/Diskinfo.cpp | 111 ++++++++++++++++++ .../resources/collect_unit/cpu.cpp | 94 +++++++++++++++ .../resources/collect_unit/meminfo_unit.cpp | 96 +++++++++++++++ .../response_unit/resources_response.cpp | 37 ++++++ 5 files changed, 371 insertions(+) create mode 100644 observer_agent/resourcesdriver/include/resources_collect.h create mode 100644 observer_agent/resourcesdriver/resources/collect_unit/Diskinfo.cpp create mode 100644 observer_agent/resourcesdriver/resources/collect_unit/cpu.cpp create mode 100644 observer_agent/resourcesdriver/resources/collect_unit/meminfo_unit.cpp create mode 100644 observer_agent/resourcesdriver/resources/response_unit/resources_response.cpp diff --git a/observer_agent/resourcesdriver/include/resources_collect.h b/observer_agent/resourcesdriver/include/resources_collect.h new file mode 100644 index 0000000..1e20eac --- /dev/null +++ b/observer_agent/resourcesdriver/include/resources_collect.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 Huawei Technologies Co., Ltd. All rights reserved. + * secDetector is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + * Author: zengwei + * Create: 2023-10-24 + * Description: secDetector userspace ringbuffer header + */ +using namespace std; + +struct MemoryInfo +{ + unsigned long totalMemory; + unsigned long usedMemory; + unsigned long freeMemory; + double usagePercentage; + double freePercentage; + bool warningFlag; + string timestamp; +}; + +MemoryInfo getMemoryInfo(); +string getTimeStamp(); +string getAllMemoryInfo(); +string getDiskUsageString(); +string getCpuUsage(); \ No newline at end of file diff --git a/observer_agent/resourcesdriver/resources/collect_unit/Diskinfo.cpp b/observer_agent/resourcesdriver/resources/collect_unit/Diskinfo.cpp new file mode 100644 index 0000000..cdbfc0c --- /dev/null +++ b/observer_agent/resourcesdriver/resources/collect_unit/Diskinfo.cpp @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include +#include +#include "resources_collect.h" + +using namespace std; + +struct DiskUsage +{ + string filesystem; + string size; + string used; + string available; + string usePercentage; + string mountPoint; +}; + +vector getDiskUsageList() +{ + vector diskUsageList; + + // Run 'df' command to get disk usage information + FILE *pipe = popen("df -h", "r"); + if (pipe) + { + char buffer[256]; + // Skip the first line + fgets(buffer, sizeof(buffer), pipe); + + while (!feof(pipe)) + { + if (fgets(buffer, sizeof(buffer), pipe) != nullptr) + { + istringstream iss(buffer); + DiskUsage diskUsage; + iss >> diskUsage.filesystem >> diskUsage.size >> diskUsage.used >> diskUsage.available >> diskUsage.usePercentage >> diskUsage.mountPoint; + diskUsageList.push_back(diskUsage); + } + } + pclose(pipe); + } + + return diskUsageList; +} + +string getDiskUsageString() +{ + static vector previousDiskUsageList; + + vector diskUsageList = getDiskUsageList(); + + string result; + double totalUsedSpace = 0.0; + double totalAvailableSpace = 0.0; + + for (size_t i = 0; i < diskUsageList.size(); ++i) + { + const DiskUsage &diskUsage = diskUsageList[i]; + result += "Filesystem: " + diskUsage.filesystem + "\n"; + result += "Size: " + diskUsage.size + "\n"; + result += "Used: " + diskUsage.used + "\n"; + result += "Available: " + diskUsage.available + "\n"; + result += "Use Percentage: " + diskUsage.usePercentage + "\n"; + result += "Mount Point: " + diskUsage.mountPoint + "\n"; + + if (i < previousDiskUsageList.size()) + { + const DiskUsage &previousDiskUsage = previousDiskUsageList[i]; + double currentUsedSpace = 0.0; + double previousUsedSpace = 0.0; + + // Extract numerical values from used strings + size_t currentUsedSizePos = diskUsage.used.find('G'); + size_t previousUsedSizePos = previousDiskUsage.used.find('G'); + if (currentUsedSizePos != string::npos && previousUsedSizePos != string::npos) + { + currentUsedSpace = stod(diskUsage.used.substr(0, currentUsedSizePos)); + previousUsedSpace = stod(previousDiskUsage.used.substr(0, previousUsedSizePos)); + } + + double usedSpaceDiff = currentUsedSpace - previousUsedSpace; + result += "Used Space Difference: " + to_string(usedSpaceDiff) + " GB\n"; + } + + + // Extract numerical values from used and available strings + size_t usedSizePos = diskUsage.used.find('G'); + if (usedSizePos != string::npos) + { + double usedSpace = stod(diskUsage.used.substr(0, usedSizePos)); + totalUsedSpace += usedSpace; + } + + size_t availableSizePos = diskUsage.available.find('G'); + if (availableSizePos != string::npos) + { + double availableSpace = stod(diskUsage.available.substr(0, availableSizePos)); + totalAvailableSpace += availableSpace; + } + } + + result += "Total Used Space: " + to_string(totalUsedSpace) + " GB\n"; + result += "Total Available Space: " + to_string(totalAvailableSpace) + " GB\n"; + + previousDiskUsageList = diskUsageList; + + return result; +} diff --git a/observer_agent/resourcesdriver/resources/collect_unit/cpu.cpp b/observer_agent/resourcesdriver/resources/collect_unit/cpu.cpp new file mode 100644 index 0000000..5b9302c --- /dev/null +++ b/observer_agent/resourcesdriver/resources/collect_unit/cpu.cpp @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include "resources_collect.h" + +using namespace std; + +bool readCpuStat(unsigned long long &user, unsigned long long &nice, unsigned long long &system, unsigned long long &idle) +{ + ifstream statFile("/proc/stat"); + string line; + + while (getline(statFile, line)) + { + istringstream iss(line); + string cpuLabel; + iss >> cpuLabel; + + if (cpuLabel == "cpu") + { + iss >> user >> nice >> system >> idle; + return true; + } + } + + return false; +} + +unsigned long long getTotalTime(unsigned long long user, unsigned long long nice, unsigned long long system, unsigned long long idle) +{ + return user + nice + system + idle; +} + +double calculateCpuUsage(unsigned long long prevTotalTime, unsigned long long currTotalTime, unsigned long long prevIdleTime, unsigned long long currIdleTime) +{ + unsigned long long totalTimeDiff = currTotalTime - prevTotalTime; + unsigned long long idleTimeDiff = currIdleTime - prevIdleTime; + + if (totalTimeDiff == 0) + { + return 0.0; // 处理除以零的情况 + } + + double cpuUsage = 100.0 * (totalTimeDiff - idleTimeDiff) / totalTimeDiff; + return cpuUsage; +} + +string getCpuUsageString(double cpuUsage, double cpuUsageDiff) +{ + ostringstream oss; + oss << "CPU Usage: " << cpuUsage << "%\n" + << "Diff: " << cpuUsageDiff << "%"; + return oss.str(); +} + +string getCpuUsage() +{ + static unsigned long long prevUser = 0, prevNice = 0, prevSystem = 0, prevIdle = 0; + static double prevCpuUsage = 0.0; + + unsigned long long currUser, currNice, currSystem, currIdle; + + if (!readCpuStat(currUser, currNice, currSystem, currIdle)) + { + cerr << "Failed to read /proc/stat" << endl; + return ""; + } + + unsigned long long prevTotal = getTotalTime(prevUser, prevNice, prevSystem, prevIdle); + unsigned long long prevIdleTime = prevIdle; + + unsigned long long currTotal = getTotalTime(currUser, currNice, currSystem, currIdle); + unsigned long long currIdleTime = currIdle; + + double currCpuUsage = calculateCpuUsage(prevTotal, currTotal, prevIdleTime, currIdleTime); + + double cpuUsageDiff = currCpuUsage - prevCpuUsage; // 计算实际的差异 + if (prevCpuUsage == 0) + { + cpuUsageDiff = 0; + } + + prevUser = currUser; + prevNice = currNice; + prevSystem = currSystem; + prevIdle = currIdle; + prevCpuUsage = currCpuUsage; + + string cpuUsageString = getCpuUsageString(currCpuUsage, cpuUsageDiff); + return cpuUsageString; +} diff --git a/observer_agent/resourcesdriver/resources/collect_unit/meminfo_unit.cpp b/observer_agent/resourcesdriver/resources/collect_unit/meminfo_unit.cpp new file mode 100644 index 0000000..fb88ef2 --- /dev/null +++ b/observer_agent/resourcesdriver/resources/collect_unit/meminfo_unit.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#include +#include +#include "resources_collect.h" + +using namespace std; + +string getTimeStamp() +{ + time_t currentTime = time(nullptr); + tm *timeInfo = localtime(¤tTime); + ostringstream oss; + oss << put_time(timeInfo, "%Y-%m-%d %H:%M:%S"); + return oss.str(); +} + +MemoryInfo getMemoryInfo() +{ + MemoryInfo memInfo; + ifstream meminfoFile("/proc/meminfo"); + + if (!meminfoFile.is_open()) + { + cout << "Failed to open /proc/meminfo." << endl; + memInfo.totalMemory = -1; + memInfo.usedMemory = -1; + memInfo.freeMemory = -1; + memInfo.usagePercentage = -1.0; + memInfo.freePercentage = -1.0; + memInfo.warningFlag = false; + return memInfo; + } + + string line; + while (getline(meminfoFile, line)) + { + istringstream iss(line); + string key; + unsigned long long value; + if (iss >> key >> value) + { + if (key == "MemTotal:") + { + memInfo.totalMemory = value; + } + else if (key == "MemAvailable:") + { + memInfo.freeMemory = value; + } + } + } + + memInfo.usedMemory = memInfo.totalMemory - memInfo.freeMemory; + memInfo.usagePercentage = (static_cast(memInfo.usedMemory) / memInfo.totalMemory) * 100.0; + memInfo.freePercentage = (static_cast(memInfo.freeMemory) / memInfo.totalMemory) * 100.0; + memInfo.timestamp = time(nullptr); + memInfo.warningFlag = (memInfo.usagePercentage > 90.0); + + return memInfo; +} + +string getAllMemoryInfo() +{ + static MemoryInfo prevMemInfo; + + MemoryInfo currentMemInfo = getMemoryInfo(); + + long usedMemoryDiff = currentMemInfo.usedMemory - prevMemInfo.usedMemory; + double usagePercentageDiff = currentMemInfo.usagePercentage - prevMemInfo.usagePercentage; + + if (prevMemInfo.usedMemory == 0) + { + usedMemoryDiff = 0; + usagePercentageDiff = 0; + } + + prevMemInfo = currentMemInfo; + + prevMemInfo.timestamp = getTimeStamp(); + + ostringstream oss; + oss << "Time:" << prevMemInfo.timestamp << " \n" + << "Used memory difference:" << usedMemoryDiff << "KB \n" + << "Usage percentage difference:" << usagePercentageDiff << "% \n" + << "Total memory:" << prevMemInfo.totalMemory << "KB \n" + << "Used memory:" << prevMemInfo.usedMemory << "KB \n" + << "Free memory:" << prevMemInfo.freeMemory << "KB \n" + << "Usage percentage:" << prevMemInfo.usagePercentage << "% \n" + << "Free percentage:" << prevMemInfo.freePercentage << "%"; + + return oss.str(); +} \ No newline at end of file diff --git a/observer_agent/resourcesdriver/resources/response_unit/resources_response.cpp b/observer_agent/resourcesdriver/resources/response_unit/resources_response.cpp new file mode 100644 index 0000000..b33080b --- /dev/null +++ b/observer_agent/resourcesdriver/resources/response_unit/resources_response.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include "resources_collect.h" + +std::string getCombinedInfo() +{ + std::string cpuUsage = getCpuUsage(); + std::string diskUsage = getDiskUsageString(); + std::string memoryInfo = getAllMemoryInfo(); + + std::stringstream combinedInfo; + combinedInfo << memoryInfo << std::endl; + combinedInfo << cpuUsage << std::endl; + combinedInfo << diskUsage << std::endl; + + return combinedInfo.str(); +} + +int resources_response() +{ + std::string combinedInfo = getCombinedInfo(); + + size_t pos = 0; + while ((pos = combinedInfo.find('\n', pos)) != std::string::npos) + { + combinedInfo.replace(pos, 1, ","); + } + + if (!combinedInfo.empty() && combinedInfo.back() == ',') + { + combinedInfo.pop_back(); + } + std::cout << combinedInfo << std::endl; + + return 0; +} \ No newline at end of file -- Gitee From d9390679a13b2766acd5780d69981d32314107e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E5=A8=81?= Date: Mon, 13 Nov 2023 05:36:05 +0000 Subject: [PATCH 2/2] update observer_agent/resourcesdriver/include/resources_collect.h. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 曾威 --- observer_agent/resourcesdriver/include/resources_collect.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/observer_agent/resourcesdriver/include/resources_collect.h b/observer_agent/resourcesdriver/include/resources_collect.h index 1e20eac..392bbcb 100644 --- a/observer_agent/resourcesdriver/include/resources_collect.h +++ b/observer_agent/resourcesdriver/include/resources_collect.h @@ -11,7 +11,7 @@ * * Author: zengwei * Create: 2023-10-24 - * Description: secDetector userspace ringbuffer header + * Description: secDetector resource collection probe */ using namespace std; -- Gitee