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_;

Reply via email to