This is an automated email from the ASF dual-hosted git repository.
phrocker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
The following commit(s) were added to refs/heads/master by this push:
new 443dee2 MINIFICPP-850: Add operating system to c2 response
443dee2 is described below
commit 443dee281ac14a2774fa6a22e8c2f627cb5a385d
Author: Marc Parisi <[email protected]>
AuthorDate: Thu May 16 13:10:17 2019 -0400
MINIFICPP-850: Add operating system to c2 response
This closes #557.
Approved on GH by kevdoran.
Signed-off-by: Marc Parisi <[email protected]>
---
.gitignore | 2 +
.../standard-processors/tests/CMakeLists.txt | 2 +
.../tests/unit/ManifestTests.cpp | 27 +-
.../include/core/state/nodes/DeviceInformation.h | 341 +++++++++++----------
4 files changed, 210 insertions(+), 162 deletions(-)
diff --git a/.gitignore b/.gitignore
index 26d8bfe..32230e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,8 @@
nifi-minifi-cpp.kdev4
.kdev4
+.device_id
+
# Filter out generated files from the included libuuid
thirdparty/uuid/tst_uuid*
assemblies
diff --git a/extensions/standard-processors/tests/CMakeLists.txt
b/extensions/standard-processors/tests/CMakeLists.txt
index ba685b2..f87ecf4 100644
--- a/extensions/standard-processors/tests/CMakeLists.txt
+++ b/extensions/standard-processors/tests/CMakeLists.txt
@@ -39,9 +39,11 @@ FOREACH(testfile ${PROCESSOR_UNIT_TESTS})
else ()
target_link_libraries ("${testfilename}" -Wl,--whole-archive
${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-standard-processors
minifi-civet-extensions -Wl,--no-whole-archive)
endif()
+ add_test(NAME "${testfilename}" COMMAND "${testfilename}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
MATH(EXPR PROCESSOR_INT_TEST_COUNT "${PROCESSOR_INT_TEST_COUNT}+1")
ENDFOREACH()
+message("-- Finished building ${PROCESSOR_INT_TEST_COUNT} processor unit test
file(s)...")
SET(INT_TEST_COUNT 0)
diff --git a/extensions/standard-processors/tests/unit/ManifestTests.cpp
b/extensions/standard-processors/tests/unit/ManifestTests.cpp
index d261e4d..e111636 100644
--- a/extensions/standard-processors/tests/unit/ManifestTests.cpp
+++ b/extensions/standard-processors/tests/unit/ManifestTests.cpp
@@ -17,8 +17,9 @@
*/
#include <memory>
-
+#include <algorithm>
#include "core/Processor.h"
+#include "core/state/nodes/DeviceInformation.h"
#include "core/state/nodes/AgentInformation.h"
#include "TestBase.h"
#include "io/ClientSocket.h"
@@ -68,7 +69,7 @@ TEST_CASE("Test Valid Regex", "[validRegex]") {
}
TEST_CASE("Test Relationships", "[rel1]") {
- minifi::state::response::ComponentManifest manifest("minifi-system");
+ minifi::state::response::ComponentManifest
manifest("minifi-standard-processors");
auto serialized = manifest.serialize();
REQUIRE(serialized.size() > 0);
const auto &resp = serialized[0];
@@ -95,7 +96,7 @@ TEST_CASE("Test Relationships", "[rel1]") {
}
TEST_CASE("Test Dependent", "[dependent]") {
- minifi::state::response::ComponentManifest manifest("minifi-system");
+ minifi::state::response::ComponentManifest
manifest("minifi-standard-processors");
auto serialized = manifest.serialize();
REQUIRE(serialized.size() > 0);
const auto &resp = serialized[0];
@@ -149,3 +150,23 @@ TEST_CASE("Test Scheduling Defaults", "[schedDef]") {
}
}
}
+
+TEST_CASE("Test operatingSystem Defaults", "[opsys]") {
+ minifi::state::response::DeviceInfoNode manifest("minifi-system");
+ auto serialized = manifest.serialize();
+ REQUIRE(serialized.size() > 0);
+ minifi::state::response::SerializedResponseNode proc_0;
+ for (const auto &node : serialized) {
+ if ("systemInfo" == node.name) {
+ for (const auto &sinfo : node.children) {
+ if ("operatingSystem" == sinfo.name) {
+ proc_0 = sinfo;
+ break;
+ }
+ }
+ }
+ }
+ REQUIRE(!proc_0.value.empty());
+ std::set<std::string> expected({"Linux", "Windows 32", "Windows 64", "Mac
OSX", "Unix"});
+ REQUIRE(expected.find(proc_0.value.to_string()) != std::end(expected));
+}
diff --git a/libminifi/include/core/state/nodes/DeviceInformation.h
b/libminifi/include/core/state/nodes/DeviceInformation.h
index 59f3888..cabdeab 100644
--- a/libminifi/include/core/state/nodes/DeviceInformation.h
+++ b/libminifi/include/core/state/nodes/DeviceInformation.h
@@ -98,7 +98,7 @@ class Device {
canonical_hostname_ = hostname;
std::stringstream ips;
- auto ipaddressess = getIpAddresses();
+ auto ipaddressess = getIpAddresses();
for (auto ip : ipaddressess) {
if (ipaddressess.size() > 1 && (ip.find("127") == 0 || ip.find("192") ==
0))
continue;
@@ -113,59 +113,59 @@ class Device {
std::string device_id_;
protected:
- std::vector<std::string> getIpAddresses() {
- static std::vector<std::string> ips;
- if (ips.empty()) {
+ std::vector<std::string> getIpAddresses() {
+ static std::vector<std::string> ips;
+ if (ips.empty()) {
#ifndef WIN32
- struct ifaddrs *ifaddr, *ifa;
- if (getifaddrs(&ifaddr) == -1) {
- perror("getifaddrs");
- exit(EXIT_FAILURE);
- }
-
- for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
- if ((strcmp("lo", ifa->ifa_name) == 0) ||
!(ifa->ifa_flags & (IFF_RUNNING)))
- continue;
- if ((ifa->ifa_addr != NULL) &&
(ifa->ifa_addr->sa_family == AF_INET)) {
- ips.push_back(inet_ntoa(((struct sockaddr_in
*) ifa->ifa_addr)->sin_addr));
- }
- }
-
- freeifaddrs(ifaddr);
+ struct ifaddrs *ifaddr, *ifa;
+ if (getifaddrs(&ifaddr) == -1) {
+ perror("getifaddrs");
+ exit(EXIT_FAILURE);
+ }
+
+ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+ if ((strcmp("lo", ifa->ifa_name) == 0) || !(ifa->ifa_flags &
(IFF_RUNNING)))
+ continue;
+ if ((ifa->ifa_addr != NULL) && (ifa->ifa_addr->sa_family == AF_INET)) {
+ ips.push_back(inet_ntoa(((struct sockaddr_in *)
ifa->ifa_addr)->sin_addr));
+ }
+ }
+
+ freeifaddrs(ifaddr);
#else
- PIP_ADAPTER_INFO adapterPtr;
- PIP_ADAPTER_INFO adapter = NULL;
-
- DWORD dwRetVal = 0;
-
- std::hash<std::string> hash_fn;
- std::set<std::string> macs;
-
- ULONG adapterLen = sizeof(IP_ADAPTER_INFO);
- adapterPtr = (IP_ADAPTER_INFO
*)malloc(sizeof(IP_ADAPTER_INFO));
- if (adapterPtr == NULL) {
- return ips;
- }
- if (GetAdaptersInfo(adapterPtr, &adapterLen) ==
ERROR_BUFFER_OVERFLOW) {
- free(adapterPtr);
- adapterPtr = (IP_ADAPTER_INFO *)malloc(adapterLen);
- if (adapterPtr == NULL) {
- return ips;
- }
- }
-
- if ((dwRetVal = GetAdaptersInfo(adapterPtr, &adapterLen)) ==
NO_ERROR) {
- adapter = adapterPtr;
- while (adapter) {
-
ips.emplace_back(adapter->IpAddressList.IpAddress.String);
- adapter = adapter->Next;
- }
- }
-
- if (adapterPtr)
- free(adapterPtr);
+ PIP_ADAPTER_INFO adapterPtr;
+ PIP_ADAPTER_INFO adapter = NULL;
+
+ DWORD dwRetVal = 0;
+
+ std::hash<std::string> hash_fn;
+ std::set<std::string> macs;
+
+ ULONG adapterLen = sizeof(IP_ADAPTER_INFO);
+ adapterPtr = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
+ if (adapterPtr == NULL) {
+ return ips;
+ }
+ if (GetAdaptersInfo(adapterPtr, &adapterLen) == ERROR_BUFFER_OVERFLOW) {
+ free(adapterPtr);
+ adapterPtr = (IP_ADAPTER_INFO *)malloc(adapterLen);
+ if (adapterPtr == NULL) {
+ return ips;
+ }
+ }
+
+ if ((dwRetVal = GetAdaptersInfo(adapterPtr, &adapterLen)) == NO_ERROR) {
+ adapter = adapterPtr;
+ while (adapter) {
+ ips.emplace_back(adapter->IpAddressList.IpAddress.String);
+ adapter = adapter->Next;
+ }
+ }
+
+ if (adapterPtr)
+ free(adapterPtr);
#endif
- }
+ }
return ips;
}
@@ -196,11 +196,9 @@ class Device {
/* For an AF_INET* interface address, display the address */
if (family == AF_INET || family == AF_INET6) {
- s = getnameinfo(ifa->ifa_addr,
- (family == AF_INET) ? sizeof(struct sockaddr_in) :
- sizeof(struct sockaddr_in6),
- host, NI_MAXHOST,
- NULL, 0, NI_NUMERICHOST);
+ s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct
sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST,
+ NULL,
+ 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
@@ -217,7 +215,8 @@ class Device {
char buf[1024];
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
- if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */}
+ if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */
+ }
struct ifreq* it = ifc.ifc_req;
const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));
@@ -225,21 +224,21 @@ class Device {
for (; it != end; ++it) {
strcpy(ifr.ifr_name, it->ifr_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
- if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
+ if (!(ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
unsigned char mac[6];
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
char mac_add[13];
- snprintf(mac_add,13,"%02X%02X%02X%02X%02X%02X",mac[0], mac[1],
mac[2], mac[3], mac[4], mac[5] );
+ snprintf(mac_add, 13, "%02X%02X%02X%02X%02X%02X", mac[0], mac[1],
mac[2], mac[3], mac[4], mac[5]);
- macs+= mac_add;
+ macs += mac_add;
}
}
+ } else { /* handle error */
}
- else { /* handle error */}
}
close(sock);
@@ -279,46 +278,46 @@ class Device {
return macstr.length() > 0 ? std::to_string(hash_fn(macstr)) : "8675309";
}
#else
-std::string getDeviceId() {
- PIP_ADAPTER_INFO adapterPtr;
- PIP_ADAPTER_INFO adapter = NULL;
-
- DWORD dwRetVal = 0;
-
- std::hash<std::string> hash_fn;
- std::set<std::string> macs;
-
- ULONG adapterLen = sizeof(IP_ADAPTER_INFO);
- adapterPtr = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
- if (adapterPtr == NULL) {
- return "";
- }
- if (GetAdaptersInfo(adapterPtr, &adapterLen) == ERROR_BUFFER_OVERFLOW) {
- free(adapterPtr);
- adapterPtr = (IP_ADAPTER_INFO *)malloc(adapterLen);
- if (adapterPtr == NULL) {
- return "";
- }
- }
-
- if ((dwRetVal = GetAdaptersInfo(adapterPtr, &adapterLen)) == NO_ERROR) {
- adapter = adapterPtr;
- while (adapter) {
- char mac_add[13];
- snprintf(mac_add, 13, "%02X%02X%02X%02X%02X%02X",
adapter->Address[0], adapter->Address[1], adapter->Address[2],
adapter->Address[3], adapter->Address[4], adapter->Address[5]);
- macs.insert(mac_add);
- adapter = adapter->Next;
- }
- }
-
- if (adapterPtr)
- free(adapterPtr);
- std::string macstr;
+ std::string getDeviceId() {
+ PIP_ADAPTER_INFO adapterPtr;
+ PIP_ADAPTER_INFO adapter = NULL;
+
+ DWORD dwRetVal = 0;
+
+ std::hash<std::string> hash_fn;
+ std::set<std::string> macs;
+
+ ULONG adapterLen = sizeof(IP_ADAPTER_INFO);
+ adapterPtr = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
+ if (adapterPtr == NULL) {
+ return "";
+ }
+ if (GetAdaptersInfo(adapterPtr, &adapterLen) == ERROR_BUFFER_OVERFLOW) {
+ free(adapterPtr);
+ adapterPtr = (IP_ADAPTER_INFO *)malloc(adapterLen);
+ if (adapterPtr == NULL) {
+ return "";
+ }
+ }
+
+ if ((dwRetVal = GetAdaptersInfo(adapterPtr, &adapterLen)) == NO_ERROR) {
+ adapter = adapterPtr;
+ while (adapter) {
+ char mac_add[13];
+ snprintf(mac_add, 13, "%02X%02X%02X%02X%02X%02X", adapter->Address[0],
adapter->Address[1], adapter->Address[2], adapter->Address[3],
adapter->Address[4], adapter->Address[5]);
+ macs.insert(mac_add);
+ adapter = adapter->Next;
+ }
+ }
+
+ if (adapterPtr)
+ free(adapterPtr);
+ std::string macstr;
for (auto &mac : macs) {
macstr += mac;
}
- return macstr.length() > 0 ? std::to_string(hash_fn(macstr)) :
"8675309";
-}
+ return macstr.length() > 0 ? std::to_string(hash_fn(macstr)) : "8675309";
+ }
#endif
// connection information
@@ -333,7 +332,7 @@ std::string getDeviceId() {
class DeviceInfoNode : public DeviceInformation {
public:
- DeviceInfoNode(std::string name, utils::Identifier & uuid)
+ DeviceInfoNode(std::string name, utils::Identifier & uuid)
: DeviceInformation(name, uuid) {
static Device device;
hostname_ = device.canonical_hostname_;
@@ -354,95 +353,98 @@ class DeviceInfoNode : public DeviceInformation {
}
std::vector<SerializedResponseNode> serialize() {
- std::vector<SerializedResponseNode> serialized;
+ std::vector<SerializedResponseNode> serialized;
- SerializedResponseNode identifier;
- identifier.name = "identifier";
- identifier.value = device_id_;
+ SerializedResponseNode identifier;
+ identifier.name = "identifier";
+ identifier.value = device_id_;
- SerializedResponseNode systemInfo;
- systemInfo.name = "systemInfo";
+ SerializedResponseNode systemInfo;
+ systemInfo.name = "systemInfo";
- SerializedResponseNode vcores;
- vcores.name = "vCores";
- size_t ncpus = std::thread::hardware_concurrency();
+ SerializedResponseNode vcores;
+ vcores.name = "vCores";
+ size_t ncpus = std::thread::hardware_concurrency();
- vcores.value = ncpus;
+ vcores.value = ncpus;
- systemInfo.children.push_back(vcores);
-#if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
- SerializedResponseNode mem;
- mem.name = "physicalMem";
+ systemInfo.children.push_back(vcores);
+
+ SerializedResponseNode ostype;
+ ostype.name = "operatingSystem";
+ ostype.value = getOperatingSystem();
- uint64_t mema = (size_t)sysconf(_SC_PHYS_PAGES) *
(size_t)sysconf(_SC_PAGESIZE);
+ systemInfo.children.push_back(ostype);
+#if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+ SerializedResponseNode mem;
+ mem.name = "physicalMem";
- mem.value = mema;
+ uint64_t mema = (size_t) sysconf(_SC_PHYS_PAGES) * (size_t)
sysconf(_SC_PAGESIZE);
+ mem.value = mema;
- systemInfo.children.push_back(mem);
+ systemInfo.children.push_back(mem);
#endif
#ifndef WIN32
- SerializedResponseNode arch;
- arch.name = "machinearch";
+ SerializedResponseNode arch;
+ arch.name = "machinearch";
- utsname buf;
+ utsname buf;
- if (uname(&buf) == -1) {
- arch.value = "unknown";
- }
- else {
- arch.value = buf.machine;
- }
+ if (uname(&buf) == -1) {
+ arch.value = "unknown";
+ } else {
+ arch.value = buf.machine;
+ }
- systemInfo.children.push_back(arch);
+ systemInfo.children.push_back(arch);
#else
- SYSTEM_INFO si;
- GetSystemInfo(&si);
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
- SerializedResponseNode mem;
- mem.name = "physicalMem";
+ SerializedResponseNode mem;
+ mem.name = "physicalMem";
- MEMORYSTATUSEX statex;
+ MEMORYSTATUSEX statex;
- statex.dwLength = sizeof(statex);
+ statex.dwLength = sizeof(statex);
- GlobalMemoryStatusEx(&statex);
+ GlobalMemoryStatusEx(&statex);
- mem.value = statex.ullTotalPhys;
+ mem.value = statex.ullTotalPhys;
- systemInfo.children.push_back(mem);
+ systemInfo.children.push_back(mem);
- SerializedResponseNode arch;
- arch.name = "machinearch";
+ SerializedResponseNode arch;
+ arch.name = "machinearch";
- switch (si.wProcessorArchitecture)
- {
+ switch (si.wProcessorArchitecture)
+ {
#ifdef PROCESSOR_ARCHITECTURE_ARM
- case PROCESSOR_ARCHITECTURE_ARM:
- arch.value = "arm32";
- break;
+ case PROCESSOR_ARCHITECTURE_ARM:
+ arch.value = "arm32";
+ break;
#endif
#ifdef PROCESSOR_ARCHITECTURE_ARM64
- case PROCESSOR_ARCHITECTURE_ARM64:
- arch.value = "arm64";
- break;
+ case PROCESSOR_ARCHITECTURE_ARM64:
+ arch.value = "arm64";
+ break;
#endif
- case PROCESSOR_ARCHITECTURE_INTEL:
+ case PROCESSOR_ARCHITECTURE_INTEL:
#ifdef PROCESSOR_ARCHITECTURE_IA32_ON_ARM64
- case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64:
- arch.value = "x32";
- break;
+ case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64:
+ arch.value = "x32";
+ break;
#endif
- case PROCESSOR_ARCHITECTURE_AMD64:
- case PROCESSOR_ARCHITECTURE_IA64:
- arch.value = "x64";
- break;
- default:
- arch.value = "unknown";
- }
-
-
- systemInfo.children.push_back(arch);
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ case PROCESSOR_ARCHITECTURE_IA64:
+ arch.value = "x64";
+ break;
+ default:
+ arch.value = "unknown";
+ }
+
+ systemInfo.children.push_back(arch);
#endif
serialized.push_back(identifier);
serialized.push_back(systemInfo);
@@ -468,6 +470,27 @@ class DeviceInfoNode : public DeviceInformation {
protected:
+ /**
+ * Have found various ways of identifying different operating system variants
+ * so these were either pulled from header files or online.
+ */
+ static inline std::string getOperatingSystem() {
+ /**
+ * We define WIN32, but *most* compilers should provide _WIN32.
+ */
+#if defined(WIN32) || defined(_WIN32) || defined(_WIN64)
+ return "Windows";
+#elif defined(__APPLE__) || defined(__MACH__)
+ return "Mac OSX";
+#elif defined(__linux__)
+ return "Linux";
+#elif defined(__unix) || defined(__unix__) || defined(__FreeBSD__)
+ return "Unix";
+#else
+ return "Other";
+#endif
+ }
+
std::string hostname_;
std::string ip_;
std::string device_id_;