From f08fe6bfad6f9d044512142f104609d5c092a4f1 Mon Sep 17 00:00:00 2001 From: Brian Freeman Date: Fri, 4 Aug 2017 17:14:28 +0000 Subject: Initial KEA DHCP Hook Change-Id: I21c8184c8845e620400d0c2419b6ff16c7ffecc9 Signed-off-by: Brian Freeman --- vnfs/vCPE/kea-sdnc-notify-mod/.gitignore | 2 + vnfs/vCPE/kea-sdnc-notify-mod/LICENSE.TXT | 22 +++ vnfs/vCPE/kea-sdnc-notify-mod/README.md | 68 ++++++++ vnfs/vCPE/kea-sdnc-notify-mod/build.sh | 6 + .../kea-sdnc-notify-mod/etc/kea-dhcp4.conf.example | 64 ++++++++ .../kea-sdnc-notify-mod/etc/kea-sdnc-notify.conf | 3 + vnfs/vCPE/kea-sdnc-notify-mod/pom.xml | 86 ++++++++++ vnfs/vCPE/kea-sdnc-notify-mod/src/assembly/dep.xml | 28 ++++ vnfs/vCPE/kea-sdnc-notify-mod/src/library_common.h | 35 ++++ vnfs/vCPE/kea-sdnc-notify-mod/src/load_unload.cc | 47 ++++++ vnfs/vCPE/kea-sdnc-notify-mod/src/pkt4_send.cc | 181 +++++++++++++++++++++ vnfs/vCPE/kea-sdnc-notify-mod/src/version.cc | 26 +++ vnfs/vCPE/kea-sdnc-notify-mod/test/README.md | 16 ++ vnfs/vCPE/kea-sdnc-notify-mod/test/sdnc.php | 32 ++++ 14 files changed, 616 insertions(+) create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/.gitignore create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/LICENSE.TXT create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/README.md create mode 100755 vnfs/vCPE/kea-sdnc-notify-mod/build.sh create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-dhcp4.conf.example create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-sdnc-notify.conf create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/pom.xml create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/src/assembly/dep.xml create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/src/library_common.h create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/src/load_unload.cc create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/src/pkt4_send.cc create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/src/version.cc create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/test/README.md create mode 100644 vnfs/vCPE/kea-sdnc-notify-mod/test/sdnc.php diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/.gitignore b/vnfs/vCPE/kea-sdnc-notify-mod/.gitignore new file mode 100644 index 00000000..b00a8b97 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/.gitignore @@ -0,0 +1,2 @@ +build/* +target/* diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/LICENSE.TXT b/vnfs/vCPE/kea-sdnc-notify-mod/LICENSE.TXT new file mode 100644 index 00000000..34422812 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/LICENSE.TXT @@ -0,0 +1,22 @@ +/* + * ============LICENSE_START========================================== + * =================================================================== + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * Licensed 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. + * ============LICENSE_END============================================ + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + * + */ diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/README.md b/vnfs/vCPE/kea-sdnc-notify-mod/README.md new file mode 100644 index 00000000..cee91073 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/README.md @@ -0,0 +1,68 @@ +# +# kea-sdnc-notify-mod + +Kea module utilizing hooks api to notify SDNC of macaddr, yiaddr, dhcp-msg-name via HTTP POST request. + +# ONAP installation of vDHCP will intall and configure on the vDHCP VM +# +# for local development/testing follow these steps. +# + +# +# install kea on ubuntu +apt-get install kea-dhcp4-server + + +# +# Usage +Install the compiled library from the ./build direction to /usr/local/lib/kea-sdnc-notify.so + +Configure /etc/kea/kea-sdnc-notify.conf using the ./etc example + +Configure /etc/kea/kea-dhcp4.conf usign the ./etc example + +The hook will POST json from the the variables from the DHCP Acknowledgement message to the SDNC "url" in the form of "url+macaddr" +"url": "http://localhost/sdnc.php?macaddr=" + +Example: http://localhost/sdnc.php?macaddr=aa:bb:cc:dd:ee:ff + +In the ONAP installation instead of localhost it will be to either a DMaaP Topic or to SDNC directly. + + +## START DHCP +[as root] +cd /etc/init.d +./kea-dhcp4-server start or +./kea-dhcp4-server restart + +./kea-dhcp4-server stop + +## logs are in +/var/log/kea-dhcp4.log + +## Build requirements +This software has been developed on Ubuntu 16.04. + +apt-get install g++ libcurl4-gnutls-dev libboost-dev kea-dev + +./build.sh + +## Intallation in ONAP +The vdhcp install scripts for ONAP will do the build on the vDHCP VM from these source files and copy the resulting library into /usr/local/lib and the configuration files into /etc/kea + +## Testing locally + +#### USE THIS ON OPENSTACK UBUNTU 16.04 GUEST VM + +Create a veth pair: + +ip link add veth0 type veth peer name veth1 + +ip link set veth0 up && ip link set veth1 up + +ip address add dev veth0 10.3.0.1/24 + +dhclient -d -v veth1 + +dhclient -d -v veth1 -r (to release) + diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/build.sh b/vnfs/vCPE/kea-sdnc-notify-mod/build.sh new file mode 100755 index 00000000..70abbd8a --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/build.sh @@ -0,0 +1,6 @@ +rm -rf ./build +mkdir ./build +g++ -ggdb -I /usr/include/kea -L /usr/lib/kea/lib -fpic -shared -o ./build/kea-sdnc-notify.so \ + src/load_unload.cc src/pkt4_send.cc src/version.cc \ + -lkea-dhcpsrv -lkea-dhcp++ -lkea-hooks -lkea-log -lkea-util \ + -lkea-exceptions -lcurl diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-dhcp4.conf.example b/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-dhcp4.conf.example new file mode 100644 index 00000000..b3149af1 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-dhcp4.conf.example @@ -0,0 +1,64 @@ +{ +"Dhcp4": + { +# For testing, you can use veth pair as described in README.md + "interfaces-config": { + "interfaces": ["veth0" ] + }, + +# How to load the hook library. + "hooks-libraries": [ + {"library": "/usr/local/lib/kea-sdnc-notify.so"} + ], + + "lease-database": { + "type": "memfile" + }, + + "expired-leases-processing": { + "reclaim-timer-wait-time": 10, + "flush-reclaimed-timer-wait-time": 25, + "hold-reclaimed-time": 3600, + "max-reclaim-leases": 100, + "max-reclaim-time": 250, + "unwarned-reclaim-cycles": 5 + }, + + "valid-lifetime": 300, + +# Ensure you set some sensible defaults for the siaddr and option-data, +# otherwise the options won't be added at all. +# Also keep in mind that if kea doesn't receive the desired values for some +# reason, these values will be sent to the client. + "subnet4": [ + { "subnet": "10.3.0.0/24", + "pools" : [ { "pool": "10.3.0.2 - 10.3.0.255"} ], + "next-server": "10.3.0.1", + "option-data": [ + {"name": "tftp-server-name", + "data": "10.4.0.1"}, + {"name": "boot-file-name", + "data": "/dev/null"} + ] + } + ] + +}, + +"Logging": +{ + "loggers": [ + { + "name": "kea-dhcp4", + "output_options": [ + { + "output": "/var/log/kea-dhcp4.log" + } + ], + "severity": "DEBUG", + "debuglevel": 0 + }, + ] +} + +} diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-sdnc-notify.conf b/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-sdnc-notify.conf new file mode 100644 index 00000000..1a8ee2e3 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/etc/kea-sdnc-notify.conf @@ -0,0 +1,3 @@ +{"url": "http://localhost/sdnc.php?macaddr=", + "siaddr": "siaddr" +} diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/pom.xml b/vnfs/vCPE/kea-sdnc-notify-mod/pom.xml new file mode 100644 index 00000000..737da797 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/pom.xml @@ -0,0 +1,86 @@ + + + + + + + + org.onap.demo.vnf + demo-aggregator + 1.1.0-SNAPSHOT + ../../../pom.xml + + + 4.0.0 + org.onap.demo.vnf.vCPE + kea-sdnc-notify-mod + + + + + + maven-jar-plugin + 2.3.2 + + + default-jar + never + + + + + + maven-assembly-plugin + 2.5.3 + + src/assembly/dep.xml + + + + create-archive + package + + single + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + none + + + + true + + + + + + + diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/src/assembly/dep.xml b/vnfs/vCPE/kea-sdnc-notify-mod/src/assembly/dep.xml new file mode 100644 index 00000000..d938e10a --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/src/assembly/dep.xml @@ -0,0 +1,28 @@ + + demo + + tar.gz + + + + + ${project.basedir} + / + + **/*.md + **/*.cc + **/*.h + **/*.conf + **/*.sh + **/*.TXT + + + build/* + test/* + + + + + diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/src/library_common.h b/vnfs/vCPE/kea-sdnc-notify-mod/src/library_common.h new file mode 100644 index 00000000..9b33b95e --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/src/library_common.h @@ -0,0 +1,35 @@ +/**************************************************************************//** +* @file +* common headers +* +* +* License +* ------- +* +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* +* Licensed 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 LIBRARY_COMMON_H +#define LIBRARY_COMMON_H +#include +#include +#include +#include +#include + +extern std::string json_params[3]; +#endif diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/src/load_unload.cc b/vnfs/vCPE/kea-sdnc-notify-mod/src/load_unload.cc new file mode 100644 index 00000000..2296379c --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/src/load_unload.cc @@ -0,0 +1,47 @@ +/**************************************************************************//** +* @file +* load_unload the module in kea +* +* +* License +* ------- +* +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* +* Licensed 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 "library_common.h" + +using namespace isc::hooks; +namespace pt = boost::property_tree; + +std::string param_url; +std::string json_params[3]; + +extern "C" { +int load(LibraryHandle& handle) { + pt::ptree root; + pt::read_json("/etc/kea/kea-sdnc-notify.conf", root); + + json_params[0] = (root.get("url")); + json_params[1] = (root.get("siaddr")); + + std::cout << "kea-sdnc-notify.so loaded\n" << std::endl; + return 0; +} +int unload() { + return (0); +} +} diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/src/pkt4_send.cc b/vnfs/vCPE/kea-sdnc-notify-mod/src/pkt4_send.cc new file mode 100644 index 00000000..231a0a8b --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/src/pkt4_send.cc @@ -0,0 +1,181 @@ +/***************************************************************************** +* @file +* main function to process ipv4 packets +* ------- +* +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* +* Licensed 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 +#include +#include +#include +#include "library_common.h" +#include +#include + +using namespace isc::dhcp; +using namespace isc::hooks; +using namespace std; +using namespace isc::log; +namespace pt = boost::property_tree; + + +isc::log::Logger logger("sdnc-notify-logger"); +const char* log_messages[] = { + "SNL_BASE", "message: %1", + "SNL_PKT_SEND", "Outgoing packet: \n%1", + "SNL_CURL_RECEIVED", "Received: \n%1", + "SNL_CURL_FAILED", "Unable to receive data from %1", + NULL +}; + +/// Initializer for log messages. +const MessageInitializer message_initializer(log_messages); + +extern "C" { +int pkt4_send(CalloutHandle& handle) { + + // Curl variables + CURL *curl; + CURLcode res; + struct curl_slist *list=NULL; + bool perform_updates = 0; + int curl_opt_res = 0; + + // "C" variables. + char *bp; + size_t size; + FILE *response_memfile; + + // String variables + string hwaddr; + string final_url; + string msg_name; + string yiaddr; + string post_data; + + + // Pkt4 variables. + Pkt4Ptr response4_ptr; + HWAddrPtr hwaddr_ptr; + + // Boost / json related variables. + pt::ptree root; + std::stringstream ss; + boost::optional siaddr_json_field; + + /* Begin Code */ + handle.getArgument("response4", response4_ptr); + hwaddr_ptr = response4_ptr->getHWAddr(); + isc::asiolink::IOAddress new_yiaddr(response4_ptr->getYiaddr()); + hwaddr = hwaddr_ptr->toText(false); + yiaddr = new_yiaddr.toText(); + msg_name = response4_ptr->getName(); + post_data = "{ macaddr=" + hwaddr + "&yiaddr=" + yiaddr + "&msg=" + msg_name + "}"; + final_url = json_params[0] + hwaddr; + LOG_DEBUG(logger, 0, "SNL_BASE").arg(final_url); + LOG_DEBUG(logger, 0, "SNL_BASE").arg(yiaddr); + + + if ( msg_name == "DHCPACK") + perform_updates = 1; + + if (!perform_updates) { + LOG_WARN(logger, "SNL_BASE").arg("Nothing to update."); + return(0); + } + + curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + if(!curl) { + curl_global_cleanup(); + LOG_ERROR(logger, "SNL_BASE").arg("Could not initialize curl"); + return(1); + } + + list = curl_slist_append(list, "Accept: application/json"); + if (list == NULL) { + curl_easy_cleanup(curl); + curl_global_cleanup(); + LOG_ERROR(logger, "SNL_BASE").arg("Could not create curl slist."); + return(1); + } + + response_memfile = open_memstream (&bp, &size); + if (response_memfile == NULL) { + curl_easy_cleanup(curl); + curl_global_cleanup(); + LOG_ERROR(logger, "SNL_BASE").arg("Could not create memfile."); + return(1); + } + + // DEBUGGING + curl_opt_res += curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + curl_opt_res += curl_easy_setopt(curl, CURLOPT_HEADER, 1L); + + // If we don't set a timeout, curl will try for 300 seconds by default. + curl_opt_res += curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1L); + curl_opt_res += curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 1L); + // libcurl's docs say to cast as void, don't blame me. + curl_opt_res += curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)response_memfile); + // CURLOPT_URL takes a char* + curl_opt_res += curl_easy_setopt(curl, CURLOPT_URL, (final_url).c_str()); + + // let curl use strlen + curl_opt_res += curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, -1L ); + curl_opt_res += curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str() ); + curl_opt_res += curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + #ifdef SKIP_PEER_VERIFICATION + curl_opt_res += curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + #endif + + #ifdef SKIP_HOSTNAME_VERIFICATION + curl_opt_res += curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + #endif + if (curl_opt_res > 0) { + fclose(response_memfile); + free(bp); + curl_easy_cleanup(curl); + curl_global_cleanup(); + LOG_ERROR(logger, "SNL_BASE").arg("Error setting curl options."); + return(1); + } + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) { + fclose(response_memfile); + free(bp); + curl_easy_cleanup(curl); + curl_global_cleanup(); + LOG_ERROR(logger, "SNL_CURL_FAILED").arg(ss.str()); + return(1); + } + // make bp available for reading. + fclose(response_memfile); + curl_easy_cleanup(curl); + curl_global_cleanup(); + ss << bp; + free(bp); + LOG_DEBUG(logger, 0, "SNL_CURL_RECEIVED").arg(ss.str()); + // Load the json file in this ptree + + + LOG_DEBUG(logger, 0, "SNL_PKT_SEND").arg(response4_ptr->toText()); + + return(0); +} +} diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/src/version.cc b/vnfs/vCPE/kea-sdnc-notify-mod/src/version.cc new file mode 100644 index 00000000..ce71d758 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/src/version.cc @@ -0,0 +1,26 @@ +/**************************************************************************** +* @file +* add hook +* ------- +* +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* +* Licensed 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 +extern "C" { +int version() { + return (KEA_HOOKS_VERSION); +} +} diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/test/README.md b/vnfs/vCPE/kea-sdnc-notify-mod/test/README.md new file mode 100644 index 00000000..90076945 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/test/README.md @@ -0,0 +1,16 @@ + + + +# sdnc emulator +# install in /var/www/html with standard apache2 and php install +# create /var/log/onap directoy +# set owner to 'www-data' on /var/log/onap and /var/log/onap/macaddr.log + +# test with curl http://localhost/sdnc.php?macaddr=11:22:33:44 +# or +# curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost/sdnc.php?macaddr=12:34:56:66 +# +# response is {"succes"} +# +# macaddr.log should record the data submitted + diff --git a/vnfs/vCPE/kea-sdnc-notify-mod/test/sdnc.php b/vnfs/vCPE/kea-sdnc-notify-mod/test/sdnc.php new file mode 100644 index 00000000..85c59a66 --- /dev/null +++ b/vnfs/vCPE/kea-sdnc-notify-mod/test/sdnc.php @@ -0,0 +1,32 @@ +################################################################################### +# simple php script to act as sdnc emulator for testing DHCP notifications +# +# License +# ------- +# +# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +# +# Licensed 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. +# +################################################################################### + +format("y:m:d h:i:s"); +$req_dump = print_r( $_REQUEST, true ); +$fp = file_put_contents( '/var/log/onap/macaddr.log', $date . "|" . $req_dump . "|" ,FILE_APPEND | LOCK_EX ); +$fp = file_put_contents( '/var/log/onap/macaddr.log', file_get_contents('php://input'),FILE_APPEND | LOCK_EX ); +$fp = file_put_contents( '/var/log/onap/macaddr.log', "\n",FILE_APPEND | LOCK_EX ); + +print "{\"succes\"}"; +?> -- cgit 1.2.3-korg