You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by al...@apache.org on 2016/12/16 21:38:33 UTC

nifi-minifi-cpp git commit: MINIFI-159: Create AppendHostInfo processor

Repository: nifi-minifi-cpp
Updated Branches:
  refs/heads/master 19b74bf5f -> e9cfbfe0f


MINIFI-159: Create AppendHostInfo processor

This closes #27.

Signed-off-by: Aldrin Piri <al...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/e9cfbfe0
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/e9cfbfe0
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/e9cfbfe0

Branch: refs/heads/master
Commit: e9cfbfe0f0e2bd96e47e46fade63864fda251958
Parents: 19b74bf
Author: Randy Gelhausen <rg...@gmail.com>
Authored: Wed Dec 7 02:24:14 2016 -0500
Committer: Aldrin Piri <al...@apache.org>
Committed: Fri Dec 16 16:38:01 2016 -0500

----------------------------------------------------------------------
 libminifi/include/AppendHostInfo.h | 67 ++++++++++++++++++++++
 libminifi/include/FlowController.h |  1 +
 libminifi/src/AppendHostInfo.cpp   | 99 +++++++++++++++++++++++++++++++++
 libminifi/src/FlowController.cpp   |  4 ++
 4 files changed, 171 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/e9cfbfe0/libminifi/include/AppendHostInfo.h
----------------------------------------------------------------------
diff --git a/libminifi/include/AppendHostInfo.h b/libminifi/include/AppendHostInfo.h
new file mode 100644
index 0000000..8cc1d41
--- /dev/null
+++ b/libminifi/include/AppendHostInfo.h
@@ -0,0 +1,67 @@
+/**
+ * @file AppendHostInfo.h
+ * AppendHostInfo class declaration
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __APPEND_HOSTINFO_H__
+#define __APPEND_HOSTINFO_H__
+
+#include "FlowFileRecord.h"
+#include "Processor.h"
+#include "ProcessSession.h"
+
+//! AppendHostInfo Class
+class AppendHostInfo : public Processor
+{
+public:
+	//! Constructor
+	/*!
+	 * Create a new processor
+	 */
+	AppendHostInfo(std::string name, uuid_t uuid = NULL)
+	: Processor(name, uuid)
+	{
+		_logger = Logger::getLogger();
+	}
+	//! Destructor
+	virtual ~AppendHostInfo()
+	{
+	}
+	//! Processor Name
+	static const std::string ProcessorName;
+	//! Supported Properties
+	static Property InterfaceName;
+	static Property HostAttribute;
+	static Property IPAttribute;
+
+	//! Supported Relationships
+	static Relationship Success;
+
+public:
+	//! OnTrigger method, implemented by NiFi AppendHostInfo
+	virtual void onTrigger(ProcessContext *context, ProcessSession *session);
+	//! Initialize, over write by NiFi AppendHostInfo
+	virtual void initialize(void);
+
+protected:
+
+private:
+	//! Logger
+	Logger *_logger;
+};
+
+#endif

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/e9cfbfe0/libminifi/include/FlowController.h
----------------------------------------------------------------------
diff --git a/libminifi/include/FlowController.h b/libminifi/include/FlowController.h
index b02a83c..49629a2 100644
--- a/libminifi/include/FlowController.h
+++ b/libminifi/include/FlowController.h
@@ -52,6 +52,7 @@
 #include "TailFile.h"
 #include "ListenSyslog.h"
 #include "ExecuteProcess.h"
+#include "AppendHostInfo.h"
 
 //! Default NiFi Root Group Name
 #define DEFAULT_ROOT_GROUP_NAME ""

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/e9cfbfe0/libminifi/src/AppendHostInfo.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/AppendHostInfo.cpp b/libminifi/src/AppendHostInfo.cpp
new file mode 100644
index 0000000..c9ce932
--- /dev/null
+++ b/libminifi/src/AppendHostInfo.cpp
@@ -0,0 +1,99 @@
+/**
+ * @file AppendHostInfo.cpp
+ * AppendHostInfo class implementation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <set>
+#include <sys/time.h>
+#include <string.h>
+#include "AppendHostInfo.h"
+#include "ProcessContext.h"
+#include "ProcessSession.h"
+
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+
+#define __USE_POSIX
+#include <limits.h>
+
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+
+const std::string AppendHostInfo::ProcessorName("AppendHostInfo");
+Property AppendHostInfo::InterfaceName("Network Interface Name", "Network interface from which to read an IP v4 address", "eth0");
+Property AppendHostInfo::HostAttribute("Hostname Attribute", "Flowfile attribute to used to record the agent's hostname", "source.hostname");
+Property AppendHostInfo::IPAttribute("IP Attribute", "Flowfile attribute to used to record the agent's IP address", "source.ipv4");
+Relationship AppendHostInfo::Success("success", "success operational on the flow record");
+
+void AppendHostInfo::initialize()
+{
+	//! Set the supported properties
+	std::set<Property> properties;
+	properties.insert(InterfaceName);
+	properties.insert(HostAttribute);
+	properties.insert(IPAttribute);
+	setSupportedProperties(properties);
+
+	//! Set the supported relationships
+	std::set<Relationship> relationships;
+	relationships.insert(Success);
+	setSupportedRelationships(relationships);
+}
+
+void AppendHostInfo::onTrigger(ProcessContext *context, ProcessSession *session)
+{
+	FlowFileRecord *flow = session->get();
+	if (!flow)
+	  return;
+
+	//Get Hostname
+	char hostname[HOST_NAME_MAX];
+	hostname[HOST_NAME_MAX-1] = '\0'; 
+	gethostname(hostname, HOST_NAME_MAX-1);
+	struct hostent* h;
+	h = gethostbyname(hostname);
+  std::string hostAttribute;
+  context->getProperty(HostAttribute.getName(), hostAttribute);
+	flow->addAttribute(hostAttribute.c_str(), h->h_name);
+
+	//Get IP address for the specified interface
+  std::string iface;
+	context->getProperty(InterfaceName.getName(), iface);
+  //Confirm the specified interface name exists on this device
+  if (if_nametoindex(iface.c_str()) != 0){
+    struct ifreq ifr;
+    int fd = socket(AF_INET, SOCK_DGRAM, 0);
+    //Type of address to retrieve - IPv4 IP address
+    ifr.ifr_addr.sa_family = AF_INET;
+    //Copy the interface name in the ifreq structure
+    strncpy(ifr.ifr_name , iface.c_str(), IFNAMSIZ-1);
+    ioctl(fd, SIOCGIFADDR, &ifr);
+    close(fd);
+
+    std::string ipAttribute;
+    context->getProperty(IPAttribute.getName(), ipAttribute);
+    flow->addAttribute(ipAttribute.c_str(), inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+  }
+
+	// Transfer to the relationship
+	session->transfer(flow, Success);
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/e9cfbfe0/libminifi/src/FlowController.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/FlowController.cpp b/libminifi/src/FlowController.cpp
index 3598716..6f74373 100644
--- a/libminifi/src/FlowController.cpp
+++ b/libminifi/src/FlowController.cpp
@@ -195,6 +195,10 @@ Processor *FlowController::createProcessor(std::string name, uuid_t uuid)
 	{
         processor = new ExecuteProcess(name, uuid);
 	}
+	else if (name == AppendHostInfo::ProcessorName)
+	{
+        processor = new AppendHostInfo(name, uuid);
+	}
 	else
 	{
         _logger->log_error("No Processor defined for %s", name.c_str());