aboutsummaryrefslogtreecommitdiffstats
path: root/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog
diff options
context:
space:
mode:
Diffstat (limited to 'vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog')
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/LICENSE.TXT22
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/Makefile52
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/README.md37
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/dep.xml25
-rwxr-xr-xvnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client.sh6
-rwxr-xr-xvnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client_2_collectors.sh12
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.c672
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.h136
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/pom.xml83
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/sample_syslog_event.txt30
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/syslog_config.json20
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/ves_syslog_reporter.c375
12 files changed, 1470 insertions, 0 deletions
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/LICENSE.TXT b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/LICENSE.TXT
new file mode 100644
index 00000000..16285cd2
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/LICENSE.TXT
@@ -0,0 +1,22 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Unless otherwise specified, all software contained herein is
+ * 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 is trademark and service mark of AT&T Intellectual Property.
+ *
+ */
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/Makefile b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/Makefile
new file mode 100644
index 00000000..4b0fd85d
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/Makefile
@@ -0,0 +1,52 @@
+#############################################################################
+#
+# Copyright © 2019 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.
+#
+#############################################################################
+
+CC=gcc
+ARCH=$(shell getconf LONG_BIT)
+CODE_ROOT=$(CURDIR)/../..
+#CODE_ROOT=../code/evel-library
+LIBS_DIR=$(CODE_ROOT)/libs/x86_$(ARCH)
+#LIBS_DIR=/usr/lib
+INCLUDE_DIR= -I $(CODE_ROOT)/code/evel_library -I .
+
+#******************************************************************************
+# Standard compiler flags. *
+#******************************************************************************
+CPPFLAGS=
+CFLAGS=-Wall -g -fPIC
+FILEOBJLIST= jsmn.o ves_syslog_reporter.o
+
+all: ves_syslog_reporter
+
+clean:
+ rm -f *.o ves_syslog_reporter
+
+%.o: %.c
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(INCLUDE_DIR) -c $< -o $@
+
+jsmn.o: jsmn.c jsmn.h
+ves_syslog_reporter.o: ves_syslog_reporter.c
+
+ves_syslog_reporter: $(FILEOBJLIST)
+ $(CC) $(CPPFLAGS) $(CFLAGS) -o ves_syslog_reporter \
+ -L $(LIBS_DIR) \
+ $(FILEOBJLIST) \
+ -lpthread \
+ -level \
+ -lcurl
+
+
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/README.md b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/README.md
new file mode 100644
index 00000000..9aecc2ac
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/README.md
@@ -0,0 +1,37 @@
+
+PROJECT DESCRIPTION
+
+---
+This project contains the source code and scripts for the generation of syslog events. The folder contains:
+
+ - README.md: this file.
+
+ - LICENSE.TXT: the license text.
+
+ - ves_syslog_reporter.c and other .c files: source code that uses the ECOMP Vendor Event Listener Library (VES) to generate the syslog events. Syslog events are generated based on /var/log/syslog entries. If a specific pattern is observed in the syslog file, then it generates the syslog event. The application reads syslog_config.json file for parameter values and poppulate the syslog event. If eventName, eventSourceType, syslogTag and tmp_syslogFile parameter value is not given, the application terminates. If reportingEntityName and/or sourceName parameter values are not given, then it gets the hostname and poppulates it.
+
+ - Makefile: makefile that compiles ves_syslog_reporter.c and generates ves_syslog_reporter binary.
+
+ - go-client.sh/go-client_2_collectors.sh: bash script that starts up the ves_syslog_reporter. It reads input parameters like DCAE IP address and port from configuration files contained in /opt/config. Based on the collector configuration, use go-client.sh for single collector configuration, or use go-client_2_collectors.sh for 2 collectors configuration.
+
+
+USAGE
+-----
+
+Update the configuration files with proper parameters values so that events generated would contain those values
+
+To run the ves_syslog_reporter in single collector configuration, please execute the following steps:
+
+ - Make the go-client.sh script executable
+ chmod +x go-client.sh
+
+ - Run the go-client.sh script
+ ./go-client.sh
+
+For 2 collectors configuration, please execute following steps:
+
+ - Make the go-client.sh script executable
+ chmod +x go-client_2_collectors.sh
+
+ - Run the go-client_2_collectors.sh script
+ ./go-client_2_collectors.sh
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/dep.xml b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/dep.xml
new file mode 100644
index 00000000..fc18229f
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/dep.xml
@@ -0,0 +1,25 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <id>demo</id>
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <fileSets>
+
+ <fileSet>
+ <directory>.</directory>
+ <outputDirectory>/</outputDirectory>
+ <includes>
+ <include>*.sh</include>
+ <include>*.md</include>
+ <include>*.TXT</include>
+ <include>*.c</include>
+ <include>Makefile</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+</assembly>
+
+
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client.sh b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client.sh
new file mode 100755
index 00000000..0701456a
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH="/opt/VES/evel/evel-library/libs/x86_64/"
+DCAE_COLLECTOR_IP=$(cat /opt/config/dcae_collector_ip.txt)
+DCAE_COLLECTOR_PORT=$(cat /opt/config/dcae_collector_port.txt)
+./ves_syslog_reporter $DCAE_COLLECTOR_IP $DCAE_COLLECTOR_PORT
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client_2_collectors.sh b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client_2_collectors.sh
new file mode 100755
index 00000000..492d76d2
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/go-client_2_collectors.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH="/opt/VES/evel/evel-library/libs/x86_64/"
+
+#Usage for 2 collectors:
+#./ves_syslog_reporter <FQDN>|<IP address> <port> <FQDN>|<IP address> <port>
+
+DCAE_COLLECTOR_IP=$(cat /opt/config/dcae_collector_ip.txt)
+DCAE_COLLECTOR_PORT=$(cat /opt/config/dcae_collector_port.txt)
+DCAE_COLLECTOR_IP2=$(cat /opt/config/dcae_collector_ip2.txt)
+DCAE_COLLECTOR_PORT2=$(cat /opt/config/dcae_collector_port2.txt)
+./ves_syslog_reporter $DCAE_COLLECTOR_IP $DCAE_COLLECTOR_PORT $DCAE_COLLECTOR_IP2 $DCAE_COLLECTOR_PORT2
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.c b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.c
new file mode 100644
index 00000000..1d72ba4d
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.c
@@ -0,0 +1,672 @@
+/*************************************************************************//**
+ *
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ *
+ * Unless otherwise specified, all software contained herein is
+ * 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.
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ ****************************************************************************/
+#include<stdio.h>
+#include<stdlib.h>
+#include<string.h>
+#include "jsmn.h"
+
+/**
+ * Allocates a fresh unused token from the token pull.
+ */
+static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
+ jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *tok;
+ if (parser->toknext >= num_tokens) {
+ return NULL;
+ }
+ tok = &tokens[parser->toknext++];
+ tok->start = tok->end = -1;
+ tok->size = 0;
+//#ifdef JSMN_PARENT_LINKS
+ tok->parent = -1;
+//#endif
+ return tok;
+}
+
+/**
+ * Fills token type and boundaries.
+ */
+static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
+ int start, int end) {
+//printf("jsmn_fill_token:: start-%d, end-%d\n", start, end);
+ token->type = type;
+ token->start = start;
+ token->end = end;
+ token->size = 0;
+}
+
+/**
+ * Fills next available token with JSON primitive.
+ */
+static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *token;
+ int start;
+
+ start = parser->pos;
+
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+//printf("jsmn_parse_primitive:: the char is - %c\n", js[parser->pos]);
+ switch (js[parser->pos]) {
+#ifndef JSMN_STRICT
+ /* In strict mode primitive must be followed by "," or "}" or "]" */
+ case ':':
+#endif
+ case '\t' : case '\r' : case '\n' : case ' ' :
+ case ',' : case ']' : case '}' :
+ goto found;
+ }
+ if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ }
+#ifdef JSMN_STRICT
+ /* In strict mode primitive must be followed by a comma/object/array */
+ parser->pos = start;
+ return JSMN_ERROR_PART;
+#endif
+
+found:
+ if (tokens == NULL) {
+ parser->pos--;
+ return 0;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+ if (token == NULL) {
+ parser->pos = start;
+ return JSMN_ERROR_NOMEM;
+ }
+ jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
+//#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+//#endif
+ parser->pos--;
+ return 0;
+}
+
+/**
+ * Fills next token with JSON string.
+ */
+static int jsmn_parse_string(jsmn_parser *parser, const char *js,
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *token;
+
+ int start = parser->pos;
+
+ parser->pos++;
+
+ /* Skip starting quote */
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ char c = js[parser->pos];
+ char d = js[parser->pos + 1];
+// char e = js[parser->pos + 2];
+//printf("jsmn_parse_string: value-%c, pos-%d\n", c,parser->pos);
+
+ /* Quote: end of string */
+// if (c == '\"') {
+ if (d == '\"') {
+// if ((d == '\"')&&((e == ' ')||(e == ','))) {
+parser->pos++;
+//printf("jsmn_parse_string: end of string\n");
+ if (tokens == NULL) {
+//printf("jsmn_parse_string: end tokens is NULL\n");
+ return 0;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+//printf("jsmn_parse_string: Allocated tokens \n");
+ if (token == NULL) {
+//printf("jsmn_parse_string: Allocated tokens is NULL\n");
+ parser->pos = start;
+ return JSMN_ERROR_NOMEM;
+ }
+ jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
+//printf("jsmn_parse_string: Allocated tokens is filled\n");
+//#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+//#endif
+ return 0;
+ }
+
+ /* Backslash: Quoted symbol expected */
+ if (c == '\\' && parser->pos + 1 < len) {
+ int i;
+ parser->pos++;
+//printf("jsmn_parse_string: value - %c, POS-%3d \n",c, js[parser->pos]);
+ switch (js[parser->pos]) {
+ /* Allowed escaped symbols */
+ case '\"': case '/' : case '\\' : case 'b' :
+ case 'f' : case 'r' : case 'n' : case 't' :
+ break;
+ /* Allows escaped symbol \uXXXX */
+ case 'u':
+ parser->pos++;
+ for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) {
+ /* If it isn't a hex character we have an error */
+ if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
+ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
+ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ parser->pos++;
+ }
+ parser->pos--;
+ break;
+ /* Unexpected symbol */
+ default:
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ }
+ }
+ parser->pos = start;
+printf("jsmn_parse_string: exiting with ERROR_PART, pos-%d", parser->pos);
+ return JSMN_ERROR_PART;
+}
+
+/**
+ * Parse JSON string and fill tokens.
+ */
+int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
+ jsmntok_t *tokens, unsigned int num_tokens) {
+ int r;
+ int i;
+ jsmntok_t *token;
+ int count = parser->toknext;
+
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ char c;
+ jsmntype_t type;
+
+ c = js[parser->pos];
+//printf("jsmn_parse: value of c - %c\n",c);
+ switch (c) {
+ case '{': case '[':
+ count++;
+ if (tokens == NULL) {
+ break;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+ if (token == NULL)
+ return JSMN_ERROR_NOMEM;
+ if (parser->toksuper != -1) {
+ tokens[parser->toksuper].size++;
+//#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+//#endif
+ }
+ token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
+ token->start = parser->pos;
+ parser->toksuper = parser->toknext - 1;
+ break;
+ case '}': case ']':
+ if (tokens == NULL)
+ break;
+ type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
+//#ifdef JSMN_PARENT_LINKS
+ if (parser->toknext < 1) {
+ return JSMN_ERROR_INVAL;
+ }
+ token = &tokens[parser->toknext - 1];
+ for (;;) {
+ if (token->start != -1 && token->end == -1) {
+ if (token->type != type) {
+ return JSMN_ERROR_INVAL;
+ }
+ token->end = parser->pos + 1;
+ parser->toksuper = token->parent;
+ break;
+ }
+ if (token->parent == -1) {
+ break;
+ }
+ token = &tokens[token->parent];
+ }
+//#else
+// for (i = parser->toknext - 1; i >= 0; i--) {
+// token = &tokens[i];
+// if (token->start != -1 && token->end == -1) {
+// if (token->type != type) {
+// return JSMN_ERROR_INVAL;
+// }
+// parser->toksuper = -1;
+// token->end = parser->pos + 1;
+// break;
+// }
+// }
+// /* Error if unmatched closing bracket */
+// if (i == -1) return JSMN_ERROR_INVAL;
+// for (; i >= 0; i--) {
+// token = &tokens[i];
+// if (token->start != -1 && token->end == -1) {
+// parser->toksuper = i;
+// break;
+// }
+// }
+//#endif
+ break;
+ case '\"':
+ r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
+ if (r < 0) return r;
+ count++;
+ if (parser->toksuper != -1 && tokens != NULL)
+ tokens[parser->toksuper].size++;
+ break;
+ case '\t' : case '\r' : case '\n' : case ' ':
+ break;
+ case ':':
+ parser->toksuper = parser->toknext - 1;
+//printf("jsmn_parse: value of c is :: - %c\n",c);
+ break;
+ case ',':
+ if (tokens != NULL && parser->toksuper != -1 &&
+ tokens[parser->toksuper].type != JSMN_ARRAY &&
+ tokens[parser->toksuper].type != JSMN_OBJECT) {
+//#ifdef JSMN_PARENT_LINKS
+ parser->toksuper = tokens[parser->toksuper].parent;
+//#else
+// for (i = parser->toknext - 1; i >= 0; i--) {
+// if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
+// if (tokens[i].start != -1 && tokens[i].end == -1) {
+// parser->toksuper = i;
+// break;
+// }
+// }
+// }
+//#endif
+ }
+ break;
+#ifdef JSMN_STRICT
+ /* In strict mode primitives are: numbers and booleans */
+ case '-': case '0': case '1' : case '2': case '3' : case '4':
+ case '5': case '6': case '7' : case '8': case '9':
+ case 't': case 'f': case 'n' :
+ /* And they must not be keys of the object */
+ if (tokens != NULL && parser->toksuper != -1) {
+ jsmntok_t *t = &tokens[parser->toksuper];
+ if (t->type == JSMN_OBJECT ||
+ (t->type == JSMN_STRING && t->size != 0)) {
+ return JSMN_ERROR_INVAL;
+ }
+ }
+#else
+ /* In non-strict mode every unquoted value is a primitive */
+ default:
+#endif
+ r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
+ if (r < 0) return r;
+ count++;
+ if (parser->toksuper != -1 && tokens != NULL)
+ tokens[parser->toksuper].size++;
+ break;
+
+#ifdef JSMN_STRICT
+ /* Unexpected char in strict mode */
+ default:
+ return JSMN_ERROR_INVAL;
+#endif
+ }
+ }
+
+ if (tokens != NULL) {
+ for (i = parser->toknext - 1; i >= 0; i--) {
+//printf("index -%2d, start is %3d, end is %3d\n", i, tokens[i].start, tokens[i].end);
+ /* Unmatched opened object or array */
+ if (tokens[i].start != -1 && tokens[i].end == -1) {
+ return JSMN_ERROR_PART;
+ }
+ }
+ }
+
+ return count;
+}
+
+/**
+ * Creates a new parser based over a given buffer with an array of tokens
+ * available.
+ */
+void jsmn_init(jsmn_parser *parser) {
+ parser->pos = 0;
+ parser->toknext = 0;
+ parser->toksuper = -1;
+}
+
+int jsoneq(const char *json, jsmntok_t *tok, const char *s)
+{
+ if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
+ strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
+ return 0;
+ }
+ return -1;
+}
+
+void printToken(char * js, jsmntok_t * tokens, int numToken)
+{
+ for (int i = 1; i < numToken; i++)
+ {
+ printf("Token number-%2d, parent-%2d, type-%d size-%2d, parameter -", i, tokens[i].parent, tokens[i].type, tokens[i].size);
+ if (tokens[i].type == JSMN_STRING || tokens[i].type == JSMN_PRIMITIVE) {
+ printf("%.*s\n", tokens[i].end - tokens[i].start, js + tokens[i].start);
+ } else if (tokens[i].type == JSMN_ARRAY) {
+ printf("[%d elems]\n", tokens[i].size);
+ } else if (tokens[i].type == JSMN_OBJECT) {
+ printf("{%d elems}\n", tokens[i].size);
+ } else {
+ printf("value?? - ");
+ TOKEN_PRINT(tokens[i]);
+ }
+ }
+}
+
+int getStringToken(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, char * value, int maxValueSize)
+{
+ int i = 0;
+ int dpToken = 0;
+
+ memset(value, 0, maxValueSize);
+
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Parent token not seen
+ }
+ for (i=1; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+ if(jsoneq(js, &tokens[i], param) != 0)
+ continue;
+ TOKEN_COPY(js, tokens[i+1], value);
+
+ return 0; //Success
+ }
+ }
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //parameter not found
+}
+
+
+int getStringTokenV2(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, char * gParam,char * value, int maxValueSize)
+{
+ int i = 0;
+ int dpToken = 0;
+
+ memset(value, 0, maxValueSize);
+
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], gParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Grand Parent token not seen
+ }
+
+ for (i=dpToken; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 2; //Parent token not seen
+ }
+
+ for (i=dpToken; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+ if(jsoneq(js, &tokens[i], param) != 0)
+ continue;
+ TOKEN_COPY(js, tokens[i+1], value);
+
+ return 0; //Success
+ }
+ }
+
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //parameter not found
+}
+
+int getIntToken(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, int * value)
+{
+ int i = 0;
+ int dpToken = 0;
+ char val[128];
+
+ memset(val, 0, 128);
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Parent token not seen
+ }
+ for (i=1; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+ if(jsoneq(js, &tokens[i], param) != 0)
+ {
+ continue;
+ }
+
+ if(tokens[i+1].type != JSMN_PRIMITIVE)
+ return 3; //Wrong parameter type
+
+// printf("INT parameter / Value - %s", param);
+ TOKEN_COPY(js, tokens[i+1], val);
+ *value = atoi(val);
+// printf(" - %d\n", *value);
+
+ return 0; //success
+ }
+ }
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //parameter not found
+}
+
+void parseDirectParameters(char * js, jsmntok_t * tokens, int numToken)
+{
+ int i = 0;
+ int dpToken = 0;
+ char param[128];
+ char value[128];
+
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], "directParameters") == 0)
+ break;
+ }
+
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+
+ for (int i = 1; i < numToken; i++)
+ {
+ memset(param, 0, 128);
+ memset(value, 0, 128);
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+ TOKEN_COPY(js, tokens[i], param);
+// printf("parameter / Value - %s", param);
+ TOKEN_COPY(js, tokens[i+1], value);
+// printf(" - %s\n", value);
+ }
+ }
+}
+
+int getArrayTokens(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, ARRAYVAL * arrayValue, int * numElements)
+{
+ int i = 0;
+ int dpToken = 0;
+
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Parent token not seen
+ }
+ for (i=1; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+// printf("value of token %d\n", i);
+ if(jsoneq(js, &tokens[i], param) != 0)
+ continue;
+
+ if (tokens[i+1].type == JSMN_ARRAY)
+ {
+ *numElements = tokens[i+1].size;
+// printf("[%d elems]\n", *numElements);
+
+ for (int k = 0; k < *numElements; k++)
+ {
+ TOKEN_COPY(js, tokens[i+2+k], arrayValue[k].arrayString);
+// printf(" - %s\n", arrayValue[k].arrayString);
+ }
+ return 0; //Success
+ }
+ }
+ }
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //parameter not found
+}
+
+int isTokenPresent(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam)
+{
+ int i = 0;
+ int dpToken = 0;
+ char val[128];
+
+ memset(val, 0, 128);
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Parent token not seen
+ }
+ for (i=1; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING)
+ {
+ if(jsoneq(js, &tokens[i], param) == 0)
+ {
+ return 0; //Token present
+ }
+ }
+ }
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //Token Not present
+}
+
+int read_keyVal_params(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, KEYVALRESULT * keyValueResultList, int * numElements)
+{
+ int i = 0;
+ int dpToken = 0;
+
+ for (i = 1; i < numToken; i++)
+ {
+ if(jsoneq(js, &tokens[i], pParam) == 0)
+ break;
+ }
+ if (i < numToken)
+ {
+ dpToken = ++i;
+ }
+ else
+ {
+ printf("The parameter %s is not present in JSON file\n", pParam);
+ return 1; //Parent token not seen
+ }
+ for (i=1; i < numToken; i++)
+ {
+ if (tokens[i].parent == dpToken && tokens[i].type == JSMN_STRING && tokens[i].size == 1)
+ {
+// printf("value of token %d\n", i);
+ if(jsoneq(js, &tokens[i], param) != 0)
+ continue;
+
+ if (tokens[i+1].type == JSMN_OBJECT)
+ {
+ *numElements = tokens[i+1].size;
+// printf("{%d elems}\n", *numElements);
+
+ for (int k = 0; k < *numElements; k++)
+ {
+ TOKEN_COPY(js, tokens[i+2+k*2], keyValueResultList[k].keyStr);
+// printf("Key - %s", keyValueResultList[k].keyStr);
+ TOKEN_COPY(js, tokens[i+3+k*2], keyValueResultList[k].valStr);
+// printf("Value - %s\n", keyValueResultList[k].valStr);
+ }
+ return 0; //Success
+ }
+ }
+ }
+ printf("The parameter %s is not present in JSON file\n", param);
+ return 2; //parameter not found
+}
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.h b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.h
new file mode 100644
index 00000000..f9d838b6
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/jsmn.h
@@ -0,0 +1,136 @@
+/*************************************************************************//**
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __JSMN_H_
+#define __JSMN_H_
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * JSON type identifier. Basic types are:
+ * o Object
+ * o Array
+ * o String
+ * o Other primitive: number, boolean (true/false) or null
+ */
+typedef enum {
+ JSMN_UNDEFINED = 0,
+ JSMN_OBJECT = 1,
+ JSMN_ARRAY = 2,
+ JSMN_STRING = 3,
+ JSMN_PRIMITIVE = 4
+} jsmntype_t;
+
+enum jsmnerr {
+ /* Not enough tokens were provided */
+ JSMN_ERROR_NOMEM = -1,
+ /* Invalid character inside JSON string */
+ JSMN_ERROR_INVAL = -2,
+ /* The string is not a full JSON packet, more bytes expected */
+ JSMN_ERROR_PART = -3
+};
+
+typedef struct arrayValues {
+ char arrayString[32];
+} ARRAYVAL;
+
+typedef struct keyValResult {
+ char keyStr[80];
+ char valStr[250];
+ char resultStr[80];
+} KEYVALRESULT;
+
+/**
+ * JSON token description.
+ * @param type type (object, array, string etc.)
+ * @param start start position in JSON data string
+ * @param end end position in JSON data string
+ */
+typedef struct {
+ jsmntype_t type;
+ int start;
+ int end;
+ int size;
+//#ifdef JSMN_PARENT_LINKS
+ int parent;
+//#endif
+} jsmntok_t;
+
+/**
+ * JSON parser. Contains an array of token blocks available. Also stores
+ * the string being parsed now and current position in that string
+ */
+typedef struct {
+ unsigned int pos; /* offset in the JSON string */
+ unsigned int toknext; /* next token to allocate */
+ int toksuper; /* superior token node, e.g parent object or array */
+} jsmn_parser;
+
+#define TOKEN_EQ(t, tok_start, tok_end, tok_type) \
+ ((t).start == tok_start \
+ && (t).end == tok_end \
+ && (t).type == (tok_type))
+
+#define TOKEN_STRING(js, t, s) \
+ (strncmp(js+(t).start, s, (t).end - (t).start) == 0 \
+ && strlen(s) == (t).end - (t).start)
+
+#define TOKEN_COPY(js, t, s) \
+ strncpy(s, js+(t).start, (t).end - (t).start)
+
+#define TOKEN_PRINT(t) \
+ printf("start: %d, end: %d, type: %d, size: %d\n", \
+ (t).start, (t).end, (t).type, (t).size)
+
+
+/**
+ * Create JSON parser over an array of tokens
+ */
+void jsmn_init(jsmn_parser *parser);
+
+/**
+ * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
+ * a single JSON object.
+ */
+int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
+ jsmntok_t *tokens, unsigned int num_tokens);
+
+int jsoneq(const char *json, jsmntok_t *tok, const char *s);
+
+void printToken(char * js, jsmntok_t * tokens, int numToken);
+
+int getStringToken(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, char * value, int maxValueSize);
+
+int getIntToken(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, int * value);
+
+int getArrayTokens(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, ARRAYVAL * arrayValue, int * numElements);
+
+int isTokenPresent(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam);
+
+int read_keyVal_params(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, KEYVALRESULT * keyValueResultList, int * numElements);
+
+int getStringTokenV2(char * js, jsmntok_t * tokens, int numToken, char * param, char * pParam, char *gParam, char * value, int maxValueSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __JSMN_H_ */
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/pom.xml b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/pom.xml
new file mode 100644
index 00000000..f9f42ebb
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+<parent>
+ <groupId>org.onap.demo.vnf</groupId>
+ <artifactId>demo-aggregator</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.demo.vnf.ves5</groupId>
+ <artifactId>ves_vfw_reporting</artifactId>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.3.2</version>
+ <executions>
+ <execution>
+ <id>default-jar</id>
+ <phase>never</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.5.3</version>
+ <configuration>
+ <descriptor>dep.xml</descriptor>
+ </configuration>
+ <executions>
+ <execution>
+ <id>create-archive</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>none</phase>
+ </execution>
+ </executions>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>
+
+</project>
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/sample_syslog_event.txt b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/sample_syslog_event.txt
new file mode 100644
index 00000000..3a6ec916
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/sample_syslog_event.txt
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "domain": "syslog",
+ "eventId": "syslog000000000",
+ "eventName": "syslog_vFirewall-AT&T_connectionReset",
+ "eventType": "applicationVnf",
+ "lastEpochMicrosec": 1548493308853168,
+ "nfNamingCode": "AFX",
+ "nfcNamingCode": "AFX",
+ "priority": "Normal",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sequence": 0,
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "startEpochMicrosec": 1548493278782875,
+ "version": 3.0
+ },
+ "syslogFields": {
+ "eventSourceType": "virtualMachine",
+ "syslogFacility": 16,
+ "syslogFieldsVersion": 3.0,
+ "syslogMsg": "Jan 26 14:31:46 prakash-VirtualBox prakash: peer reset qwerty",
+ "syslogProc": "vSyslog",
+ "syslogTag": "peer reset"
+ }
+ }
+}
+
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/syslog_config.json b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/syslog_config.json
new file mode 100644
index 00000000..6a434e43
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/syslog_config.json
@@ -0,0 +1,20 @@
+{
+ "tmp_directParameters": {
+ "eventName": "syslog_vFirewall-AT&T_connectionReset",
+ "eventType": "applicationVnf",
+ "nfcNamingCode": "AFX",
+ "nfNamingCode": "AFX",
+ "nfVendorName": "AT&T",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "timeZoneOffset": "UTC-05:30",
+ "eventSourceType": "virtualMachine",
+ "syslogProc": "vSyslog",
+ "syslogTag": "peer reset"
+ },
+ "tmp_indirectParameters": {
+ "tmp_syslogFile": "/var/log/syslog"
+ }
+}
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/ves_syslog_reporter.c b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/ves_syslog_reporter.c
new file mode 100644
index 00000000..b7226e74
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_syslog/ves_syslog_reporter.c
@@ -0,0 +1,375 @@
+/*************************************************************************//**
+ *
+ * Copyright © 2018 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <string.h>
+#include <netdb.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include "jsmn.h"
+#include "evel.h"
+
+#define BUFSIZE 128
+#define MAX_BUFFER_SIZE 4096
+#define MAX_TOKENS 1000
+
+void *SyslogThread(void *threadarg);
+
+unsigned long long epoch_start = 0;
+
+void report_syslog(char * js, jsmntok_t * tokens, int numToken, char * syslog_tag, char * eName, int srcTyp, char * syslog_msg)
+{
+ EVENT_HEARTBEAT_FIELD * event = NULL;
+ EVENT_HEADER* syslog_header = NULL;
+ EVEL_ERR_CODES evel_rc = EVEL_SUCCESS;
+ char stringVal[BUFSIZE];
+
+ char event_id1[10] = "syslog";
+ char event_id2[15] = {0};
+ int event_id3 = 0;
+ char event_id[BUFSIZE] = {0};
+
+ int ret = 0;
+ /***************************************************************************/
+ /* Syslog */
+ /***************************************************************************/
+ memset(event_id, 0, BUFSIZE);
+ memset(event_id2, 0, 15);
+ sprintf(event_id2, "%09d", event_id3++);
+ strcat(event_id, event_id1);
+ strcat(event_id, event_id2);
+
+
+ event = evel_new_syslog(eName, event_id, srcTyp, syslog_msg, syslog_tag);
+
+ if (event != NULL)
+ {
+ syslog_header = (EVENT_HEADER *)event;
+
+ ret = getStringToken(js, tokens, numToken, "syslogProc", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_syslog_proc_set(event, stringVal);
+ evel_syslog_facility_set(event, EVEL_SYSLOG_FACILITY_LOCAL0);
+ ret = getStringToken(js, tokens, numToken, "eventType", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_header_type_set(&event->header, stringVal);
+
+ struct timeval tv_now;
+ gettimeofday(&tv_now, NULL);
+ unsigned long long epoch_now = tv_now.tv_usec + 1000000 * tv_now.tv_sec;
+
+ evel_start_epoch_set(&event->header, epoch_start);
+ evel_last_epoch_set(&event->header, epoch_now);
+ epoch_start = epoch_now;
+
+ ret = getStringToken(js, tokens, numToken, "nfcNamingCode", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_nfcnamingcode_set(&event->header, stringVal);
+
+ ret = getStringToken(js, tokens, numToken, "nfNamingCode", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_nfnamingcode_set(&event->header, stringVal);
+
+ ret = getStringToken(js, tokens, numToken, "reportingEntityName", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_reporting_entity_name_set(&event->header, stringVal);
+ else
+ {
+ printf("Missing mandatory parameters - reportingEntityName is not there in tmp_directParameters\n");
+ printf("Defaulting reportingEntityName to hostname\n");
+ }
+
+ ret = getStringToken(js, tokens, numToken, "reportingEntityId", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_reporting_entity_id_set(&event->header, stringVal);
+
+ ret = getStringToken(js, tokens, numToken, "sourceId", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_source_id_set(&event->header, stringVal);
+
+ ret = getStringToken(js, tokens, numToken, "sourceName", "tmp_directParameters", stringVal, BUFSIZE);
+ if (ret == 0)
+ evel_source_name_set(&event->header, stringVal);
+ else
+ {
+ printf("Missing mandatory parameters - sourceName is not there in tmp_directParameters\n");
+ printf("Defaulting sourceName to hostname\n");
+ }
+
+ evel_rc = evel_post_event(syslog_header);
+ if (evel_rc != EVEL_SUCCESS)
+ {
+ EVEL_ERROR("Post failed %d (%s)", evel_rc, evel_error_string());
+ }
+ }
+ else
+ {
+ EVEL_ERROR("New Syslog failed");
+ }
+ printf(" Processed Syslog\n");
+}
+
+int get_source(char * inStr)
+{
+ int result = -1;
+
+ if(strcmp(inStr, "other") == 0)
+ result = EVEL_SOURCE_OTHER;
+ else if(strcmp(inStr, "router") == 0)
+ result = EVEL_SOURCE_ROUTER;
+ else if(strcmp(inStr, "switch") == 0)
+ result = EVEL_SOURCE_SWITCH;
+ else if(strcmp(inStr, "host") == 0)
+ result = EVEL_SOURCE_HOST;
+ else if(strcmp(inStr, "card") == 0)
+ result = EVEL_SOURCE_CARD;
+ else if(strcmp(inStr, "port") == 0)
+ result = EVEL_SOURCE_PORT;
+ else if(strcmp(inStr, "slotThreshold") == 0)
+ result = EVEL_SOURCE_SLOT_THRESHOLD;
+ else if(strcmp(inStr, "portThreshold") == 0)
+ result = EVEL_SOURCE_PORT_THRESHOLD;
+ else if(strcmp(inStr, "virtualMachine") == 0)
+ result = EVEL_SOURCE_VIRTUAL_MACHINE;
+ else if(strcmp(inStr, "virtualNetworkFunction") == 0)
+ result = EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION;
+
+ return result;
+}
+
+
+int main(int argc, char** argv)
+{
+ char* fqdn = argv[1];
+ int port = atoi(argv[2]);
+ int i=0;
+ int rc;
+ pthread_attr_t attr;
+ pthread_t syslog_thread;
+ char* fqdn2 = NULL;
+ int port2 = 0;
+
+ if(argc == 5)
+ {
+ fqdn2 = argv[3];
+ port2 = atoi(argv[4]);
+ }
+
+ if (!((argc == 3) || (argc == 5)))
+ {
+ fprintf(stderr, "Usage: %s <FQDN>|<IP address> <port> <FQDN>|<IP address> <port> \n", argv[0]);
+ fprintf(stderr, "OR\n");
+ fprintf(stderr, "Usage: %s <FQDN>|<IP address> <port> \n", argv[0]);
+ exit(-1);
+ }
+
+ /**************************************************************************/
+ /* Initialize */
+ /**************************************************************************/
+ if(evel_initialize(fqdn, /* FQDN */
+ port, /* Port */
+ fqdn2, /* Backup FQDN */
+ port2, /* Backup port */
+ NULL, /* optional path */
+ NULL, /* optional topic */
+ 100, /* Ring Buffer size */
+ 0, /* HTTPS? */
+ NULL, /* cert file */
+ NULL, /* key file */
+ NULL, /* ca info */
+ NULL, /* ca file */
+ 0, /* verify peer */
+ 0, /* verify host */
+ "sample1", /* Username */
+ "sample1", /* Password */
+ "sample1", /* Username2 */
+ "sample1", /* Password2 */
+ NULL, /* Source ip */
+ NULL, /* Source ip2 */
+ EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */
+ "vSyslog", /* Role */
+ 1)) /* Verbosity */
+ {
+ fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n");
+ exit(-1);
+ }
+ else
+ {
+ printf("\nInitialization completed\n");
+ }
+
+ /* Initialize and set thread detached attribute */
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ printf("Main:Creating thread \n");
+ rc = pthread_create(&syslog_thread, NULL, SyslogThread, &i);
+ if (rc)
+ {
+ printf("ERROR; return code from pthread_create() is %d\n", rc);
+ exit(-1);
+ }
+ printf("Main:Created Syslog thread \n");
+
+ pthread_join(syslog_thread, NULL);
+
+ evel_terminate();
+ printf("Terminated\n");
+ return 0;
+}
+
+void *SyslogThread(void *threadarg)
+{
+
+ int numToken;
+ jsmntok_t tokens[MAX_TOKENS];
+ char js[MAX_BUFFER_SIZE];
+ FILE * fp;
+ jsmn_parser p;
+ char ch[BUFSIZE];
+ int ret = 0;
+ char eName[BUFSIZE];
+ char eventSrcTyp[BUFSIZE];
+ char syslog_tag[BUFSIZE];
+ char syslog_msg[8*BUFSIZE];
+ char str[8*BUFSIZE];
+ char syslog_file[BUFSIZE];
+ int srcTyp = 0;
+ int count = 0;
+ unsigned long long pos;
+ unsigned long long prevpos = 0;
+
+ sleep(1);
+ printf("Running Syslog thread \n");
+ fflush(stdout);
+
+ while(1)
+ {
+
+ FILE * file = fopen("syslog_config.json", "r");
+
+ memset(js, 0, MAX_BUFFER_SIZE);
+ memset(ch, 0, BUFSIZE);
+
+ while((fgets(ch, (BUFSIZE-1), file)) !=NULL)
+ {
+ strcat(js, ch);
+ memset(ch, 0, BUFSIZE);
+ }
+// printf("the file content is \n %s \n", js);
+
+ jsmn_init(&p);
+ numToken = jsmn_parse(&p, js, strlen(js), tokens, MAX_TOKENS);
+// printf("Token count-%d\n", numToken);
+
+// printToken(js,tokens, numToken);
+
+ ret = getStringToken(js, tokens, numToken, "tmp_syslogFile", "tmp_indirectParameters", syslog_file, BUFSIZE);
+ if (ret != 0)
+ {
+ printf("Missing mandatory parameters - tmp_syslogFile is not there in tmp_indirectParameters. Exiting...\n");
+ exit(1);
+ }
+
+ ret = getStringToken(js, tokens, numToken, "syslogTag", "tmp_directParameters", syslog_tag, BUFSIZE);
+ if (ret != 0)
+ {
+ printf("Missing mandatory parameters - syslogTag is not there in tmp_directParameters, exiting..\n");
+ exit(1);
+ }
+
+ ret = getStringToken(js, tokens, numToken, "eventName", "tmp_directParameters", eName, BUFSIZE);
+ if (ret != 0)
+ {
+ printf("Missing mandatory parameters - eventName is not there in tmp_directParameters. Exiting...\n");
+ exit(1);
+ }
+
+ ret = getStringToken(js, tokens, numToken, "eventSourceType", "tmp_directParameters", eventSrcTyp, BUFSIZE);
+ if (ret != 0)
+ {
+ printf("Missing mandatory parameters - eventSourceType is not there in tmp_directParameters, exiting..\n");
+ exit(1);
+ }
+ srcTyp = get_source(eventSrcTyp);
+ if(srcTyp == -1)
+ {
+ printf("Fault eventSourceType value is not matching, eventSourceType-%s \n", eventSrcTyp);
+ exit(1);
+ }
+
+ // Open file in read mode
+ fp = fopen(syslog_file, "r");
+ if (fp == NULL)
+ {
+ printf("Error while opening file");
+ exit(EXIT_FAILURE);
+ }
+
+ memset(str, 0, 8*BUFSIZE);
+ if (fseek(fp, 0, SEEK_END))
+ perror("fseek() failed");
+ else
+ {
+ // pos will contain no. of chars in input file.
+ int n = 8;
+ pos = ftell(fp);
+
+ // search for '\n' characters
+ while (pos>prevpos)
+ {
+ // Move 'pos' away from end of file.
+ if (!fseek(fp, --pos, SEEK_SET))
+ {
+ if (fgetc(fp) == '\n')
+
+ // stop reading when n newlines is found
+ if (count++ == n)
+ break;
+ }
+ else
+ perror("fseek() failed");
+ }
+ //printf("pos %d prevpos %d\n",pos,prevpos);
+
+ // print last n lines
+ prevpos = pos;
+
+ while (fgets(str, sizeof(str), fp))
+ {
+ char * position;
+ // printf("str is - %s\n", str);
+ if ((position=strchr(str, '\n')) != NULL)
+ *position = '\0';
+ if(strstr(str, syslog_tag) && !strstr(str,"EVEL") && !strstr(str,"commonEventHeader") && !strstr(str,"syslogMsg") && !strstr(str,"syslogTag"))
+ {
+ memset(syslog_msg, 0, 8*BUFSIZE);
+ memcpy(syslog_msg, str, 8*BUFSIZE);
+ report_syslog(js, tokens, numToken, syslog_tag, eName, srcTyp, syslog_msg);
+ }
+
+ prevpos += strlen(str);
+ //printf("new prevpos is %d, size of str is %d\n", prevpos, strlen(str));
+ }
+ }
+ sleep(3);
+ }
+}
+