aboutsummaryrefslogtreecommitdiffstats
path: root/vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c')
-rw-r--r--vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c353
1 files changed, 353 insertions, 0 deletions
diff --git a/vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c b/vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c
new file mode 100644
index 00000000..9cbb63c5
--- /dev/null
+++ b/vnfs/VES5.0/evel/evel-library/code/VESreporting_vAFX/afx_bgpsyslog.c
@@ -0,0 +1,353 @@
+ /*****************************************************************************//***
+ * Copyright(c) <2017>, AT&T Intellectual Property. All other rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement: This product includes
+ * software developed by the AT&T.
+ * 4. Neither the name of AT&T nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AT&T INTELLECTUAL PROPERTY ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AT&T INTELLECTUAL PROPERTY BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include "evel.h"
+#include "afx_ves_reporter.h"
+
+/* tracks syslog file */
+static unsigned long long prevpos=0;
+/* memory for word parsing */
+static char ** bgp_res = NULL;
+/* Search list of words */
+char* searchlist[MAX_SYSLOG_WORDS];
+int numWords=0;
+
+/**************************************************************************//**
+ * Sends syslog message with parsed syslog info
+ *
+ * @param info Pointer to the line
+ * @param tag Matched TAG field
+ * @param sevrty Severity of parsed line Emergency etc.
+ *
+ * @retvalue int
+ *****************************************************************************/
+void report_syslog( char *info, char *tag, char *sevrty )
+{
+ EVENT_SYSLOG * psyslog = NULL;
+ EVEL_ERR_CODES evel_rc = EVEL_SUCCESS;
+ char vesevid[128];
+
+ sprintf(vesevid,"Syslog_vAfx_%s",oam_intfaddr);
+ psyslog = evel_new_syslog("Syslog_vAfx", vesevid,
+ EVEL_SOURCE_VIRTUAL_MACHINE,
+ escape_json(info),
+ tag);
+ if (psyslog != NULL)
+ {
+ evel_header_type_set((EVENT_HEADER *)psyslog, "applicationVnf");
+ evel_nfnamingcode_set((EVENT_HEADER *)psyslog, "AFX");
+ evel_nfcnamingcode_set((EVENT_HEADER *)psyslog, "AFX");
+ evel_syslog_event_source_host_set(psyslog, "Virtual host");
+ evel_syslog_facility_set(psyslog, EVEL_SYSLOG_FACILITY_LOCAL0);
+ evel_syslog_proc_set(psyslog, tag);
+ //evel_syslog_proc_id_set(psyslog, 1423);
+ evel_syslog_version_set(psyslog, 1);
+ //evel_syslog_addl_filter_set(psyslog, "Name1=Value1|Name2=Value2|Name3=Value3");
+ evel_syslog_severity_set(psyslog, sevrty);
+ //evel_syslog_sdid_set(psyslog, "ourSDID@32473");
+ //evel_syslog_s_data_set(psyslog,info);
+ evel_rc = evel_post_event((EVENT_HEADER *)psyslog);
+ if (evel_rc != EVEL_SUCCESS)
+ {
+ EVEL_ERROR(" AFX: Post failed %d (%s)", evel_rc, evel_error_string());
+ }
+ }
+ else
+ {
+ EVEL_ERROR("New Syslog failed");
+ }
+ EVEL_DEBUG("AFX: Processed full Syslog\n");
+
+}
+
+/**************************************************************************//**
+ * Parses Syslog line for exabgp messages
+ * Raises BGP Fault event for peer connection setup and teardown
+ * Sends Syslog events for matching lines
+ *
+ * @param line Pointer to line
+ *
+ * @retvalue int Returns if matching line
+ *****************************************************************************/
+int processLine(char *line)
+{
+ int n_spaces = 0, i;
+ char *pos;
+ char *p;
+ int srchcondn = 0;
+ int peer_conn = 0;
+ int peer_reset = 0;
+ char vesevid[128];
+ char sevrty[128];
+ char *line_bk = NULL;
+ int status = 1; /** VFA Status is ACTIVE **/
+
+ if ((pos=strchr(line, '\n')) != NULL)
+ *pos = '\0';
+ line_bk = strdup(line);
+
+ if( !strstr(line,"EVEL") && !strstr(line,"commonEventHeader") && strstr(line,"exabgp") )
+ {
+ if( strstr(line,"Connected to peer neighbor") ) peer_conn = 1;
+ else if( strstr(line,"peer reset") ) peer_reset = 1;
+
+ if( peer_conn || peer_reset )
+ {
+ n_spaces = 0;
+ p = strtok (line, " ");
+ /* split string and append tokens to 'res' */
+
+ while (p) {
+ bgp_res = realloc (bgp_res, sizeof (char*) * ++n_spaces);
+
+ if (bgp_res == NULL){
+ EVEL_DEBUG("Memory allocation failed");
+ exit (-1); /* memory allocation failed */
+ }
+
+ bgp_res[n_spaces-1] = p;
+
+ p = strtok (NULL, " ");
+ }
+
+ /* realloc one extra element for the last NULL */
+ bgp_res = realloc (bgp_res, sizeof (char*) * (n_spaces+1));
+ bgp_res[n_spaces] = 0;
+
+ if( n_spaces > 0 && (peer_conn || peer_reset) )
+ {
+ EVEL_DEBUG ("Exabgp %d %d %d\n", peer_conn, peer_reset, n_spaces);
+ for (i = 0; i < (n_spaces+1); ++i)
+ {
+ if( bgp_res[i] != NULL )EVEL_DEBUG ("res[%d] = %s\n", i, bgp_res[i]);
+ }
+ if( peer_conn == 1 && n_spaces >= 21 )
+ //if( !strcmp(bgp_res[21],"(out)") )
+ {
+ char buf[256];
+ EVEL_DEBUG("****************sending clear fault\n");
+ sprintf(vesevid,"Fault_vAfx_bgp_nbr_%s",oam_intfaddr);
+ sprintf(buf," %s %s %s %s %s %s %s %s %s %s %s ", bgp_res[10], bgp_res[11], bgp_res[12], bgp_res[13], bgp_res[14],bgp_res[15], bgp_res[16], bgp_res[17], bgp_res[18], bgp_res[19], bgp_res[20]);
+ report_fault("Fault_vAfx_bgp_nbr", vesevid, EVEL_SEVERITY_NORMAL, "routing", "lo:0", "Bgp neighbor up alarm","bgp session to remote router is up",bgp_res[16],bgp_res[18],bgp_res[10], status);
+ }
+ if( peer_reset == 1 && n_spaces >= 21 )
+ //if( !strcmp(bgp_res[21],"Shutdown]") )
+ { char buf[256];
+ EVEL_DEBUG("****************sending fault\n");
+ sprintf(vesevid,"Fault_vAfx_bgp_nbr_%s",oam_intfaddr);
+ sprintf(buf," %s %s %s %s %s %s %s ", bgp_res[15], bgp_res[16], bgp_res[17], bgp_res[18], bgp_res[19],bgp_res[20], bgp_res[21]);
+ report_fault("Fault_vAfx_bgp_nbr", vesevid, EVEL_SEVERITY_MAJOR,"routing","lo:0","Bgp neighbor down alarm","bgp session to remote router is down",bgp_res[9],bgp_res[4],bgp_res[7], status);
+ }
+ }
+ }
+
+ }// end exabgp
+
+
+ if( !strstr(line_bk,"EVEL") && !strstr(line,"commonEventHeader") && numWords > 0 ){
+ for (i=0;i<numWords;i++)
+ {
+ if( strstr(line_bk,searchlist[i]) != NULL &&
+ strstr(line_bk,"commonEventHeader") == NULL )
+ {
+ srchcondn = 1;
+ pos = searchlist[i];
+ break;
+ }
+ printf("srch:%s:%d:%d\n",searchlist[i],srchcondn,numWords);
+ }
+
+ if( srchcondn )
+ {
+ strcpy(sevrty,"Informational");
+ if( strcasestr(line,"Emergency") != NULL ) strcpy(sevrty,"Emergency");
+ else if( strcasestr(line_bk,"Alert") != NULL ) strcpy(sevrty,"Alert");
+ else if( strcasestr(line_bk,"Critical") != NULL ) strcpy(sevrty,"Critical");
+ else if( strcasestr(line_bk,"Error") != NULL ) strcpy(sevrty,"Error");
+ else if( strcasestr(line_bk,"Warn") != NULL ) strcpy(sevrty,"Warning");
+ else if( strcasestr(line_bk,"Notice") != NULL ) strcpy(sevrty,"Notice");
+ else if( strcasestr(line_bk,"Debug") != NULL ) strcpy(sevrty,"Debug");
+ report_syslog(line_bk,pos,sevrty);
+ }
+ }
+
+ if(!srchcondn)
+ free(line_bk);
+ return srchcondn;
+
+}
+
+
+/**************************************************************************//**
+ * function to read last n lines from the file
+ * at any point without reading the entire file
+ *****************************************************************************/
+void bgp_tail(FILE* in, int n)
+{
+ int count = 0; // To count '\n' characters
+
+ // unsigned long long pos (stores upto 2^64 – 1
+ // chars) assuming that long long int takes 8
+ // bytes
+ unsigned long long pos;
+ char str[2*BGPBUFSIZE] = {0};
+
+ // Go to End of file
+ if (fseek(in, 0, SEEK_END))
+ perror("fseek() failed");
+ else
+ {
+ // pos will contain no. of chars in
+ // input file.
+ pos = ftell(in);
+
+ // search for '\n' characters
+ while (pos>prevpos)
+ {
+ // Move 'pos' away from end of file.
+ if (!fseek(in, --pos, SEEK_SET))
+ {
+ if (fgetc(in) == '\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;
+ //printf("Printing %d lines %d -\n", n,pos);
+ while (fgets(str, sizeof(str), in))
+ {
+ //printf("%s\n", str);
+ processLine(strdup(str));
+ prevpos += strlen(str);
+ }
+ }
+ //printf("\n\n");
+}
+
+
+/**************************************************************************//**
+ * Thread function to Monitor Syslog for BGP connections
+ * Reads the filter words from AFX Filter input file
+ * Starts tailing syslog for BGP messages and filter words
+ *
+ * @param threadarg Thread arguments for startup message
+ *
+ *****************************************************************************/
+void *BgpLoggingAfxThread(void *threadarg)
+{
+ FILE* fp;
+ int i=0,j;
+ char line[64];
+ char *pos;
+ FILE *file;
+ int taskid, sum;
+ char *hello_msg;
+ struct thread_data *my_data;
+
+ my_data = (struct thread_data *) threadarg;
+ taskid = my_data->thread_id;
+ sum = my_data->sum;
+ hello_msg = my_data->message;
+ EVEL_DEBUG("Thread %d: %s Sum=%d\n", taskid, hello_msg, sum);
+
+ sleep(1);
+
+ /* Opens filter file and reads word list */
+ file = fopen(AFX_SYSLOG_FILE, "r");
+
+ while(fgets(line, sizeof line, file)!=NULL) {
+ //check to be sure reading correctly
+ //printf("%s", line);
+ if ((pos=strchr(line, '\n')) != NULL)
+ *pos = '\0';
+ remove_spaces(line);
+ //add each filename into array of programs
+ if( strlen(line) > 0 )
+ {
+ searchlist[numWords]=strdup(line);
+ //count number of programs in file
+ numWords++;
+ }
+ }
+ fclose(file);
+
+ //check to be sure going into array correctly
+ for (int j=0 ; j<numWords; j++) {
+ EVEL_DEBUG("Search %s\n", searchlist[j]);
+ }
+
+
+ // Open file in read mode
+ fp = fopen("/var/log/syslog", "r");
+ if (fp == NULL)
+ {
+ printf("Error while opening file");
+ exit(EXIT_FAILURE);
+ }
+
+ // call tail() each time
+ while(1)
+ {
+ // read last index lines from the file
+ bgp_tail(fp, 8);
+
+ // sleep for 3 seconds
+ // note difference in timestamps in logs
+ sleep(1);
+ }
+
+ /* close the file before ending program */
+ fclose(fp);
+
+ if( bgp_res != NULL ) free(bgp_res);
+
+ return 0;
+}
+
+