1 /*************************************************************************//**
3 * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 ****************************************************************************/
30 #define MAX_BUFFER_SIZE 4096
31 #define MAX_TOKENS 1000
32 #define MAX_INTERFACES 40
34 void *FaultThread(void *threadarg);
35 void *FaultThread01(void *threadarg);
36 void *FaultThread02(void *threadarg);
37 void *FaultThread03(void *threadarg);
39 typedef struct dummy_vpp_metrics_struct {
50 typedef struct linkstat {
57 unsigned long long last_epoch;
61 //vpp_metrics_struct meas_intfstat[MAX_INTERFACES];
62 //LINKSTAT meas_linkstat[MAX_INTERFACES];
64 vpp_metrics_struct fault_intfstat[MAX_INTERFACES];
65 LINKSTAT fault_linkstat[MAX_INTERFACES];
67 unsigned long long epoch_start = 0;
69 int format_val_params(KEYVALRESULT * keyValArray, int numElements, const char *replace, const char *search)
77 for (i=0; i<numElements; i++)
79 if ((sp = strstr(keyValArray[i].valStr, search)) == NULL) {
80 printf("\n String not found\n");
81 return 1; //Error search string not found
84 search_len = strlen(search);
85 replace_len = strlen(replace);
86 tail_len = strlen(sp+search_len);
87 memmove(sp+replace_len,sp+search_len,tail_len+1);
88 memcpy(sp, replace, replace_len);
89 // printf("\n Changed value for i=%d is %s", i, keyValArray[i].valStr);
91 return 0; //search and replace is successful
94 void runCommands(KEYVALRESULT * commandArray, int numCommands)
97 char buf[BUFSIZE]; /* buffer used to store VPP metrics */
98 FILE *fp; /* file descriptor to pipe cmd to shell */
101 for(i = 0; i < numCommands; i++)
103 memset(buf, 0, BUFSIZE);
105 // Open a pipe and read VPP values
106 if ((fp = popen(commandArray[i].valStr, "r")) == NULL) {
107 printf("Error opening pipe!\n");
111 while (fgets(buf, BUFSIZE, fp) != NULL);
112 // printf("\n the vpp value is %d\n", atoi(buf));
113 strcpy(commandArray[i].resultStr, buf);
116 printf("Command not found or exited with error status\n");
120 //for(i = 0; i < numCommands; i++)
121 // printf("\n commandArray[%d].resultStr is- %s\n", i, commandArray[i].resultStr);
125 void copy_vpp_metic_data(vpp_metrics_struct *intfstats, KEYVALRESULT * cmdArray, int numCmds, int linkNum)
129 // Store the current metric in the last metric
130 intfstats[linkNum].last_bytes_in = intfstats[linkNum].curr_bytes_in;
131 intfstats[linkNum].last_bytes_out = intfstats[linkNum].curr_bytes_out;
132 intfstats[linkNum].last_packets_in = intfstats[linkNum].curr_packets_in;
133 intfstats[linkNum].last_packets_out = intfstats[linkNum].curr_packets_out;
135 // Store metrics read from the vNIC in the current
136 for(i=0; i<numCmds; i++)
138 if((strcmp(cmdArray[i].keyStr, "tmp_t0BytesIn") == 0) ||
139 (strcmp(cmdArray[i].keyStr, "tmp_t1BytesIn") == 0))
140 intfstats[linkNum].curr_bytes_in = atoi(cmdArray[i].resultStr);
142 if((strcmp(cmdArray[i].keyStr, "tmp_t0BytesOut") == 0) ||
143 (strcmp(cmdArray[i].keyStr, "tmp_t1BytesOut") == 0))
144 intfstats[linkNum].curr_bytes_out = atoi(cmdArray[i].resultStr);
146 if((strcmp(cmdArray[i].keyStr, "tmp_t0PacketsIn") == 0) ||
147 (strcmp(cmdArray[i].keyStr, "tmp_t1PacketsIn") == 0))
148 intfstats[linkNum].curr_packets_in = atoi(cmdArray[i].resultStr);
150 if((strcmp(cmdArray[i].keyStr, "tmp_t0PacketsOut") == 0) ||
151 (strcmp(cmdArray[i].keyStr, "tmp_t1PacketsOut") == 0))
152 intfstats[linkNum].curr_packets_out = atoi(cmdArray[i].resultStr);
154 // printf("intfstats[%d].curr_bytes_in = %d\n", linkNum, intfstats[linkNum].curr_bytes_in);
155 // printf("intfstats[%d].curr_bytes_out = %d\n", linkNum, intfstats[linkNum].curr_bytes_out);
156 // printf("intfstats[%d].curr_packets_in = %d\n", linkNum, intfstats[linkNum].curr_packets_in);
157 // printf("intfstats[%d].curr_packets_out = %d\n", linkNum, intfstats[linkNum].curr_packets_out);
160 int get_severity(char * inStr)
164 if(strcmp(inStr, "CRITICAL") == 0)
165 result = EVEL_SEVERITY_CRITICAL;
166 else if(strcmp(inStr, "MAJOR") == 0)
167 result = EVEL_SEVERITY_MAJOR;
168 else if(strcmp(inStr, "MINOR") == 0)
169 result = EVEL_SEVERITY_MINOR;
170 else if(strcmp(inStr, "WARNING") == 0)
171 result = EVEL_SEVERITY_WARNING;
172 else if(strcmp(inStr, "NORMAL") == 0)
173 result = EVEL_SEVERITY_NORMAL;
178 int get_priority(char * inStr)
182 if(strcmp(inStr, "High") == 0)
183 result = EVEL_PRIORITY_HIGH;
184 else if(strcmp(inStr, "Medium") == 0)
185 result = EVEL_PRIORITY_MEDIUM;
186 else if(strcmp(inStr, "Normal") == 0)
187 result = EVEL_PRIORITY_NORMAL;
188 else if(strcmp(inStr, "Low") == 0)
189 result = EVEL_PRIORITY_LOW;
194 int get_source(char * inStr)
198 if(strcmp(inStr, "other") == 0)
199 result = EVEL_SOURCE_OTHER;
200 else if(strcmp(inStr, "router") == 0)
201 result = EVEL_SOURCE_ROUTER;
202 else if(strcmp(inStr, "switch") == 0)
203 result = EVEL_SOURCE_SWITCH;
204 else if(strcmp(inStr, "host") == 0)
205 result = EVEL_SOURCE_HOST;
206 else if(strcmp(inStr, "card") == 0)
207 result = EVEL_SOURCE_CARD;
208 else if(strcmp(inStr, "port") == 0)
209 result = EVEL_SOURCE_PORT;
210 else if(strcmp(inStr, "slotThreshold") == 0)
211 result = EVEL_SOURCE_SLOT_THRESHOLD;
212 else if(strcmp(inStr, "portThreshold") == 0)
213 result = EVEL_SOURCE_PORT_THRESHOLD;
214 else if(strcmp(inStr, "virtualMachine") == 0)
215 result = EVEL_SOURCE_VIRTUAL_MACHINE;
216 else if(strcmp(inStr, "virtualNetworkFunction") == 0)
217 result = EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION;
222 int get_vf_status(char * inStr)
226 if(strcmp(inStr, "Active") == 0)
227 result = EVEL_VF_STATUS_ACTIVE;
228 else if(strcmp(inStr, "Idle") == 0)
229 result = EVEL_VF_STATUS_IDLE;
230 else if(strcmp(inStr, "Preparing to terminate") == 0)
231 result = EVEL_VF_STATUS_PREP_TERMINATE;
232 else if(strcmp(inStr, "Ready to terminate") == 0)
233 result = EVEL_VF_STATUS_READY_TERMINATE;
234 else if(strcmp(inStr, "Requesting termination") == 0)
235 result = EVEL_VF_STATUS_REQ_TERMINATE;
240 int main(int argc, char** argv)
242 char* fqdn = argv[1];
243 int port = atoi(argv[2]);
247 pthread_t flt_thread;
254 port2 = atoi(argv[4]);
257 if (!((argc == 3) || (argc == 5)))
259 fprintf(stderr, "Usage: %s <FQDN>|<IP address> <port> <FQDN>|<IP address> <port> \n", argv[0]);
260 fprintf(stderr, "OR\n");
261 fprintf(stderr, "Usage: %s <FQDN>|<IP address> <port> \n", argv[0]);
265 /**************************************************************************/
267 /**************************************************************************/
268 if(evel_initialize(fqdn, /* FQDN */
270 fqdn2, /* Backup FQDN */
271 port2, /* Backup port */
272 NULL, /* optional path */
273 NULL, /* optional topic */
274 100, /* Ring Buffer size */
276 NULL, /* cert file */
282 "sample1", /* Username */
283 "sample1", /* Password */
284 "sample1", /* Username2 */
285 "sample1", /* Password2 */
286 NULL, /* Source ip */
287 NULL, /* Source ip2 */
288 EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */
292 fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n");
297 printf("\nInitialization completed\n");
300 /* Initialize and set thread detached attribute */
301 pthread_attr_init(&attr);
302 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
304 printf("Main:Creating thread \n");
305 rc = pthread_create(&flt_thread, NULL, FaultThread, &i);
308 printf("ERROR; return code from pthread_create() is %d\n", rc);
311 printf("Main:Created Fault thread \n");
313 pthread_join(flt_thread, NULL);
316 printf("Terminated\n");
320 void *FaultThread(void *mainFault)
324 pthread_t flt_thread01;
325 pthread_t flt_thread02;
326 pthread_t flt_thread03;
327 int faultInstance01 = 0;
328 int faultInstance02 = 0;
329 int faultInstance03 = 0;
333 jsmntok_t tokens[MAX_TOKENS];
334 char js[MAX_BUFFER_SIZE];
340 memset(js, 0, MAX_BUFFER_SIZE);
341 memset(ch, 0, BUFSIZE);
344 printf("Running Main Fault thread \n");
347 /* Initialize and set thread detached attribute */
348 pthread_attr_init(&attr);
349 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
351 FILE * file = fopen("flt_config.json", "r");
353 while((fgets(ch, (BUFSIZE-1), file)) !=NULL)
356 memset(ch, 0, BUFSIZE);
358 //printf("MainFaulThread::the file content is \n %s \n", js);
359 //printf("\n MainFaulThread::MMMMMMMMMMMMMMM\n");
362 numToken = jsmn_parse(&p, js, strlen(js), tokens, MAX_TOKENS);
363 //printf("count-%d\n", numToken);
365 //printToken(js,tokens, numToken);
367 printf("Main Fault Thread: Creating other fault threads\n");
369 ret = isTokenPresent(js, tokens, numToken, "tmp_faultInstance01", "tmp_indirectParameters");
372 // rc = pthread_create(&flt_thread01, NULL, FaultThread01, "tmp_faultInstance01");
373 rc = pthread_create(&flt_thread01, NULL, FaultThread01, &ret);
376 printf("Main Fault Thread::ERROR; return code from pthread_create() is %d\n", rc);
382 ret = isTokenPresent(js, tokens, numToken, "tmp_faultInstance02", "tmp_indirectParameters");
385 // rc = pthread_create(&flt_thread02, NULL, FaultThread02, "tmp_faultInstance02");
386 rc = pthread_create(&flt_thread02, NULL, FaultThread02, &ret);
389 printf("Main Fault Thread::ERROR; return code from pthread_create() is %d\n", rc);
395 ret = isTokenPresent(js, tokens, numToken, "tmp_faultInstance03", "tmp_indirectParameters");
398 rc = pthread_create(&flt_thread03, NULL, FaultThread03, &ret);
401 printf("Main Fault Thread::ERROR; return code from pthread_create() is %d\n", rc);
407 if (faultInstance01 == 1)
409 pthread_join(flt_thread01, NULL);
412 if (faultInstance02 == 1)
414 pthread_join(flt_thread02, NULL);
417 if (faultInstance03 == 1)
419 pthread_join(flt_thread03, NULL);
428 void *FaultThread01(void *faultInstanceTag)
430 EVEL_ERR_CODES evel_rc = EVEL_SUCCESS;
431 EVENT_FAULT * fault = NULL;
432 EVENT_HEADER* fault_header = NULL;
437 unsigned long long epoch_now;
440 struct timeval time_val;
441 char event_id1[10] = "fault";
442 char event_id2[15] = {0};
443 char event_id[BUFSIZE] = {0};
444 int fault_event_id = 0;
447 jsmntok_t tokens[MAX_TOKENS];
448 char js[MAX_BUFFER_SIZE];
455 char nfcCode[BUFSIZE];
456 char nfCode[BUFSIZE];
458 char reportEId[BUFSIZE];
459 char reportEName[BUFSIZE];
461 char srcName[BUFSIZE];
462 char eCategory[BUFSIZE];
463 char eventSrcTyp[BUFSIZE];
464 char specProb[BUFSIZE];
465 char alarmCondn[BUFSIZE];
466 char eventSev[BUFSIZE];
467 char vfStatus[BUFSIZE];
474 char hostname[BUFSIZE];
477 ARRAYVAL intfArray[MAX_INTERFACES];
478 KEYVALRESULT keyValResultArray[32];
479 KEYVALRESULT commandArray[32];
480 int numInitCommands = 0;
485 memset(hostname, 0, BUFSIZE);
486 gethostname(hostname, BUFSIZE);
487 printf("FAULT01::The hostname is %s\n", hostname);
490 printf("FAULT01::Running Fault thread \n");
493 memset(&intfArray[0],0,(sizeof(ARRAYVAL) * MAX_INTERFACES));
494 memset(&keyValResultArray[0],0,(sizeof(KEYVALRESULT) * 32));
496 memset(js, 0, MAX_BUFFER_SIZE);
497 memset(ch, 0, BUFSIZE);
498 memset(&fault_intfstat[0],0,(sizeof(vpp_metrics_struct)* MAX_INTERFACES));
499 memset(&fault_linkstat[0],0,(sizeof(LINKSTAT) * MAX_INTERFACES));
501 FILE * file = fopen("flt_config.json", "r");
503 while((fgets(ch, (BUFSIZE-1), file)) !=NULL)
506 memset(ch, 0, BUFSIZE);
508 // printf("FAULT01::the file content is \n %s \n", js);
511 numToken = jsmn_parse(&p, js, strlen(js), tokens, MAX_TOKENS);
512 printf("FAULT01::count-%d\n", numToken);
514 // printToken(js,tokens, numToken);
517 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance01", &flt_interval);
520 printf("FAULT01::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
524 ret = getIntToken(js, tokens, numToken, "tmp_lowWaterMark", "tmp_faultInstance01", &lowWaterMark);
527 printf("FAULT01::The parameter tmp_lowWaterMark is not defined, defaulted to 100\n");
531 ret = getArrayTokens(js, tokens, numToken, "tmp_device", "tmp_directParameters", intfArray, &linkCount);
533 printf("FAULT01::Array link count is %d\n", linkCount);
535 /* Copy the link information */
536 for(i=0;i<linkCount;i++)
538 strcpy(fault_linkstat[i].linkname, &intfArray[i]);
539 // printf("FAULT01::Link name %s\n", fault_linkstat[i].linkname);
542 //read_fault_config_file();
544 read_keyVal_params(js, tokens, numToken, "tmp_init", "tmp_faultInstance01", keyValResultArray, &numInitCommands);
546 for(i=0;i<linkCount;i++)
548 memset(&commandArray[0],0,(sizeof(KEYVALRESULT) * 32));
549 memcpy(commandArray, keyValResultArray, (sizeof(KEYVALRESULT) * 32));
550 format_val_params(commandArray, numInitCommands, fault_linkstat[i].linkname, "$tmp_device");
551 runCommands(commandArray, numInitCommands);
552 copy_vpp_metic_data(fault_intfstat, commandArray, numInitCommands, i);
555 gettimeofday(&time_val, NULL);
559 /***************************************************************************/
560 /* Collect metrics from the VNIC */
561 /***************************************************************************/
565 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance01", &flt_interval);
571 ret = getIntToken(js, tokens, numToken, "tmp_lowWaterMark", "tmp_faultInstance01", &lowWaterMark);
577 ret = getStringToken(js, tokens, numToken, "eventName", "tmp_faultInstance01", eName, BUFSIZE);
580 printf("FAULT01::Missing mandatory parameters - eventName is not there in tmp_faultInstance01. Exiting...\n");
584 ret = getStringToken(js, tokens, numToken, "eventType", "tmp_directParameters", eType, BUFSIZE);
585 ret = getStringToken(js, tokens, numToken, "nfcNamingCode", "tmp_directParameters", nfcCode, BUFSIZE);
586 ret = getStringToken(js, tokens, numToken, "nfNamingCode", "tmp_directParameters", nfCode, BUFSIZE);
587 ret = getStringToken(js, tokens, numToken, "reportingEntityId", "tmp_directParameters", reportEId, BUFSIZE);
588 ret = getStringToken(js, tokens, numToken, "sourceId", "tmp_directParameters", srcId, BUFSIZE);
589 ret = getStringToken(js, tokens, numToken, "eventCategory", "tmp_faultInstance01", eCategory, BUFSIZE);
591 ret = getStringToken(js, tokens, numToken, "eventSourceType", "tmp_faultInstance01", eventSrcTyp, BUFSIZE);
594 printf("FAULT01::Missing mandatory parameters - eventSourceType is not there in tmp_directParameters, exiting..\n");
597 srcTyp = get_source(eventSrcTyp);
600 printf("FAULT01::Fault eventSourceType value is not matching, eventSourceType-%s \n", eventSrcTyp);
604 ret = getStringToken(js, tokens, numToken, "vfStatus", "tmp_directParameters", vfStatus, BUFSIZE);
607 printf("FAULT01::Missing mandatory parameters - vfStatus is not there in tmp_directParameters, exiting..\n");
610 vfStat = get_vf_status(vfStatus);
613 printf("FAULT01::Fault vfStatus value is not matching, vfStatus-%s \n", vfStatus);
617 read_keyVal_params(js, tokens, numToken, "tmp_command", "tmp_faultInstance01", keyValResultArray, &numCommands);
619 for(i=0;i<linkCount;i++)
621 memset(&commandArray[0],0,(sizeof(KEYVALRESULT) * 32));
622 memcpy(commandArray, keyValResultArray, (sizeof(KEYVALRESULT) * 32));
623 format_val_params(commandArray, numCommands, fault_linkstat[i].linkname, "$tmp_device");
624 runCommands(commandArray, numCommands);
625 copy_vpp_metic_data(fault_intfstat, commandArray, numInitCommands, i);
628 for (int i = 0; i < linkCount; i++)
630 if(fault_intfstat[i].curr_bytes_in - fault_intfstat[i].last_bytes_in > 0) {
631 bytes_in = fault_intfstat[i].curr_bytes_in - fault_intfstat[i].last_bytes_in;
636 if(fault_intfstat[i].curr_bytes_out - fault_intfstat[i].last_bytes_out > 0) {
637 bytes_out = fault_intfstat[i].curr_bytes_out - fault_intfstat[i].last_bytes_out;
642 if(fault_intfstat[i].curr_packets_in - fault_intfstat[i].last_packets_in > 0) {
643 packets_in = fault_intfstat[i].curr_packets_in - fault_intfstat[i].last_packets_in;
648 if(fault_intfstat[i].curr_packets_out - fault_intfstat[i].last_packets_out > 0) {
649 packets_out = fault_intfstat[i].curr_packets_out - fault_intfstat[i].last_packets_out;
654 if (((bytes_in < lowWaterMark) || (bytes_out < lowWaterMark) ||
655 (packets_in < lowWaterMark) || (packets_out < lowWaterMark)) &&
656 (fault_linkstat[i].fault_raised == 0))
658 printf("\n%d - bytes in %d, ouot %d, packets in %d, out %d", i, bytes_in, bytes_out, packets_in, packets_out);
659 printf("\nFAULT01::Raising fault\n");
660 memset(event_id, 0, BUFSIZE);
661 fault_event_id = fault_event_id+1;
662 sprintf(event_id2, "%09d", fault_event_id);
663 strcat(event_id, event_id1);
664 strcat(event_id, event_id2);
666 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance01", &flt_interval);
669 printf("FAULT01::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
673 ret = getIntToken(js, tokens, numToken, "tmp_lowWaterMark", "tmp_faultInstance01", &lowWaterMark);
676 printf("FAULT01::The parameter tmp_lowWaterMark is not defined, defaulted to 100\n");
679 ret = getStringToken(js, tokens, numToken, "reportingEntityName", "tmp_directParameters", reportEName, BUFSIZE);
682 printf("FAULT01::Missing mandatory parameters - reportingEntityName is not there in tmp_directParameters\n");
683 printf("FAULT01::Defaulting reportingEntityName to hostname\n");
684 strcpy(reportEName, hostname);
686 ret = getStringToken(js, tokens, numToken, "sourceName", "tmp_directParameters", srcName, BUFSIZE);
689 printf("FAULT01::Missing mandatory parameters - sourceName is not there in tmp_directParameters\n");
690 printf("FAULT01::Defaulting sourceName to hostname\n");
691 strcpy(srcName, hostname);
694 ret = getStringToken(js, tokens, numToken, "priority", "tmp_directParameters", prio, BUFSIZE);
697 printf("FAULT01::Missing mandatory parameters - priority is not there in tmp_directParameters\nDefaulting priority to Low\n");
698 strcpy(prio, "Medium");
700 priority = get_priority(prio);
703 printf("FAULT01::Fault priority value is not matching, prioirty-%s \n", prio);
707 ret = getStringTokenV2(js, tokens, numToken, "specificProblem", "tmp_alarmSetParameters", "tmp_faultInstance01", specProb, BUFSIZE);
710 printf("FAULT01::Missing mandatory parameters - specificProblem is not there in tmp_alarmSetParameters, exiting ...\n");
713 ret = getStringTokenV2(js, tokens, numToken, "alarmCondition", "tmp_alarmSetParameters", "tmp_faultInstance01", alarmCondn, BUFSIZE);
716 printf("FAULT01::Missing mandatory parameters - alarmCondition is not there in tmp_alarmSetParameters, exiting ...\n");
719 ret = getStringTokenV2(js, tokens, numToken, "eventSeverity", "tmp_alarmSetParameters", "tmp_faultInstance01", eventSev, BUFSIZE);
722 printf("FAULT01::Missing mandatory parameters - eventSeverity is not there in tmp_alarmSetParameters\n");
723 printf("FAULT01::Defaulting eventSeverity to MAJOR\n");
724 strcpy(eventSev, "MAJOR");
726 eSev = get_severity(eventSev);
729 printf("FAULT01::Fault eventSeverity value is not matching, eventSeverity-%s \n", eventSev);
733 fault = evel_new_fault(eName, event_id, alarmCondn,
734 specProb, priority, eSev, srcTyp,vfStat);
737 fault_linkstat[i].fault_raised = 1;
739 struct timeval tv_now;
740 gettimeofday(&tv_now, NULL);
741 epoch_now = tv_now.tv_usec + 1000000 * tv_now.tv_sec;
742 fault_linkstat[i].last_epoch = epoch_now;
744 fault_header = (EVENT_HEADER *)fault;
746 evel_fault_category_set(fault, eCategory);
747 evel_fault_interface_set(fault, fault_linkstat[i].linkname);
750 evel_fault_type_set(fault, eType);
752 evel_start_epoch_set(&fault->header, epoch_now);
753 evel_last_epoch_set(&fault->header, epoch_now);
755 evel_nfcnamingcode_set(&fault->header, nfcCode);
757 evel_nfnamingcode_set(&fault->header, nfCode);
758 evel_reporting_entity_name_set(&fault->header, reportEName);
759 if(reportEId != NULL)
760 evel_reporting_entity_id_set(&fault->header, reportEId);
762 evel_source_id_set(&fault->header, srcId);
764 evel_source_name_set(&fault->header, srcName);
766 evel_rc = evel_post_event(fault_header);
768 if(evel_rc == EVEL_SUCCESS)
769 printf("FAULT01::Fault event is correctly sent to the collector!\n");
771 printf("FAULT01::Post failed %d (%s)\n", evel_rc, evel_error_string());
775 printf("FAULT01::New new fault failed (%s)\n", evel_error_string());
778 else if (((bytes_in > lowWaterMark) && (bytes_out > lowWaterMark) &&
779 (packets_in > lowWaterMark) && (packets_out > lowWaterMark)) &&
780 (fault_linkstat[i].fault_raised == 1))
782 printf("\nFAULT01:: Clearing fault\n");
783 memset(event_id, 0, BUFSIZE);
784 sprintf(event_id2, "%09d", (i+1));
785 strcat(event_id, event_id1);
786 strcat(event_id, event_id2);
788 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance01", &flt_interval);
791 printf("FAULT01::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
795 ret = getIntToken(js, tokens, numToken, "tmp_lowWaterMark", "tmp_faultInstance01", &lowWaterMark);
798 printf("FAULT01::The parameter tmp_lowWaterMark is not defined, defaulted to 100\n");
801 ret = getStringToken(js, tokens, numToken, "reportingEntityName", "tmp_directParameters", reportEName, BUFSIZE);
804 printf("FAULT01::Missing mandatory parameters - reportingEntityName is not there in tmp_directParameters\n");
805 printf("FAULT01::Defaulting reportingEntityName to hostname\n");
806 strcpy(reportEName, hostname);
808 ret = getStringToken(js, tokens, numToken, "sourceName", "tmp_directParameters", srcName, BUFSIZE);
811 printf("FAULT01::Missing mandatory parameters - sourceName is not there in tmp_directParameters\n");
812 printf("FAULT01::Defaulting sourceName to hostname\n");
813 strcpy(srcName, hostname);
816 ret = getStringToken(js, tokens, numToken, "priority", "tmp_directParameters", prio, BUFSIZE);
819 printf("FAULT01::Missing mandatory parameters - priority is not there in tmp_directParameters\nDefaulting priority to Low\n");
820 strcpy(prio, "Medium");
822 priority = get_priority(prio);
825 printf("FAULT01::Fault priority value is not matching, prioirty-%s \n", prio);
829 ret = getStringTokenV2(js, tokens, numToken, "specificProblem", "tmp_alarmClearParameters", "tmp_faultInstance01", specProb, BUFSIZE);
832 printf("FAULT01::Missing mandatory parameters - specificProblem is not there in tmp_alarmClearParameters, exiting ...\n");
836 ret = getStringTokenV2(js, tokens, numToken, "alarmCondition", "tmp_alarmClearParameters", "tmp_faultInstance01", alarmCondn, BUFSIZE);
839 printf("FAULT01::Missing mandatory parameters - alarmCondition is not there in tmp_alarmClearParameters, exiting ...\n");
843 ret = getStringTokenV2(js, tokens, numToken, "eventSeverity", "tmp_alarmClearParameters", "tmp_faultInstance01", eventSev, BUFSIZE);
846 printf("FAULT01::Missing mandatory parameters - eventSeverity is not there in tmp_alarmClearParameters\n");
847 printf("FAULT01::Defaulting eventSeverity to MAJOR\n");
848 strcpy(eventSev, "NORMAL");
850 eSev = get_severity(eventSev);
853 printf("FAULT01::Fault eventSeverity value is not matching, eventSeverity-%s \n", eventSev);
857 fault = evel_new_fault(eName, event_id, alarmCondn,
858 specProb, priority, eSev, srcTyp,vfStat);
861 fault_linkstat[i].fault_raised = 0;
863 struct timeval tv_now;
864 gettimeofday(&tv_now, NULL);
865 epoch_now = tv_now.tv_usec + 1000000 * tv_now.tv_sec;
867 fault_header = (EVENT_HEADER *)fault;
868 evel_fault_category_set(fault, eCategory);
869 evel_fault_interface_set(fault, fault_linkstat[i].linkname);
872 evel_fault_type_set(fault, eType);
874 evel_start_epoch_set(&fault->header, fault_linkstat[i].last_epoch);
875 evel_last_epoch_set(&fault->header, epoch_now);
876 fault_linkstat[i].last_epoch = 0;
879 evel_nfcnamingcode_set(&fault->header, nfcCode);
881 evel_nfnamingcode_set(&fault->header, nfCode);
882 evel_reporting_entity_name_set(&fault->header, reportEName);
883 if(reportEId != NULL)
884 evel_reporting_entity_id_set(&fault->header, reportEId);
886 evel_source_id_set(&fault->header, srcId);
888 evel_source_name_set(&fault->header, srcName);
890 evel_rc = evel_post_event(fault_header);
892 if(evel_rc == EVEL_SUCCESS)
893 printf("FAULT01::Fault event is correctly sent to the collector!\n");
895 printf("FAULT01::Post failed %d (%s)\n", evel_rc, evel_error_string());
898 printf("FAULT01::New fault failed (%s)\n", evel_error_string());
905 /***************************************************************************/
907 /***************************************************************************/
911 void *FaultThread02(void *faultInstanceTag)
913 EVEL_ERR_CODES evel_rc = EVEL_SUCCESS;
914 EVENT_FAULT * fault = NULL;
915 EVENT_HEADER* fault_header = NULL;
916 unsigned long long epoch_now;
917 unsigned long long last_epoch;
919 struct timeval time_val;
920 char event_id1[10] = "fault";
921 char event_id2[15] = {0};
922 char event_id[BUFSIZE] = {0};
923 int fault_event_id = 0;
927 jsmntok_t tokens[MAX_TOKENS];
928 char js[MAX_BUFFER_SIZE];
935 char aInterface[BUFSIZE];
936 char nfcCode[BUFSIZE];
937 char nfCode[BUFSIZE];
939 char reportEId[BUFSIZE];
940 char reportEName[BUFSIZE];
942 char srcName[BUFSIZE];
943 char eCategory[BUFSIZE];
944 char eventSrcTyp[BUFSIZE];
945 char specProb[BUFSIZE];
946 char alarmCondn[BUFSIZE];
947 char eventSev[BUFSIZE];
948 char vfStatus[BUFSIZE];
955 char hostname[BUFSIZE];
958 KEYVALRESULT keyValResultArray[32];
959 KEYVALRESULT commandArray[32];
960 int numInitCommands = 0;
962 int fault_raised = 0;
964 memset(hostname, 0, BUFSIZE);
965 gethostname(hostname, BUFSIZE);
966 printf("FAULT02::The hostname is %s\n", hostname);
969 printf("FAULT02::Running Fault thread \n");
972 memset(&keyValResultArray[0],0,(sizeof(KEYVALRESULT) * 32));
974 memset(js, 0, MAX_BUFFER_SIZE);
975 memset(ch, 0, BUFSIZE);
977 FILE * file = fopen("flt_config.json", "r");
979 while((fgets(ch, (BUFSIZE-1), file)) !=NULL)
982 memset(ch, 0, BUFSIZE);
984 // printf("FAULT02::the file content is \n %s \n", js);
987 numToken = jsmn_parse(&p, js, strlen(js), tokens, MAX_TOKENS);
988 printf("FAULT02::count-%d\n", numToken);
990 // printToken(js,tokens, numToken);
992 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance02", &flt_interval);
995 printf("FAULT02::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
1000 read_keyVal_params(js, tokens, numToken, "tmp_init", "tmp_faultInstance02", keyValResultArray, &numInitCommands);
1002 memset(&commandArray[0],0,(sizeof(KEYVALRESULT) * 32));
1003 memcpy(commandArray, keyValResultArray, (sizeof(KEYVALRESULT) * 32));
1004 runCommands(commandArray, numInitCommands);
1006 gettimeofday(&time_val, NULL);
1008 sleep(flt_interval);
1010 /***************************************************************************/
1011 /* Collect metrics from the VNIC */
1012 /***************************************************************************/
1015 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance02", &flt_interval);
1021 ret = getStringToken(js, tokens, numToken, "eventName", "tmp_faultInstance02", eName, BUFSIZE);
1024 printf("FAULT02::Missing mandatory parameters - eventName is not there in tmp_faultInstance02. Exiting...\n");
1028 ret = getStringToken(js, tokens, numToken, "eventType", "tmp_directParameters", eType, BUFSIZE);
1029 ret = getStringToken(js, tokens, numToken, "nfcNamingCode", "tmp_directParameters", nfcCode, BUFSIZE);
1030 ret = getStringToken(js, tokens, numToken, "nfNamingCode", "tmp_directParameters", nfCode, BUFSIZE);
1031 ret = getStringToken(js, tokens, numToken, "reportingEntityId", "tmp_directParameters", reportEId, BUFSIZE);
1032 ret = getStringToken(js, tokens, numToken, "sourceId", "tmp_directParameters", srcId, BUFSIZE);
1033 ret = getStringToken(js, tokens, numToken, "eventCategory", "tmp_faultInstance02", eCategory, BUFSIZE);
1034 ret = getStringToken(js, tokens, numToken, "alarmInterfaceA", "tmp_faultInstance02", aInterface, BUFSIZE);
1036 ret = getStringToken(js, tokens, numToken, "eventSourceType", "tmp_faultInstance02", eventSrcTyp, BUFSIZE);
1039 printf("FAULT02::Missing mandatory parameters - eventSourceType is not there in tmp_directParameters, exiting..\n");
1042 srcTyp = get_source(eventSrcTyp);
1045 printf("FAULT02::Fault eventSourceType value is not matching, eventSourceType-%s \n", eventSrcTyp);
1049 ret = getStringToken(js, tokens, numToken, "vfStatus", "tmp_directParameters", vfStatus, BUFSIZE);
1052 printf("FAULT02::Missing mandatory parameters - vfStatus is not there in tmp_directParameters, exiting..\n");
1055 vfStat = get_vf_status(vfStatus);
1058 printf("FAULT02::Fault vfStatus value is not matching, vfStatus-%s \n", vfStatus);
1062 read_keyVal_params(js, tokens, numToken, "tmp_command", "tmp_faultInstance02", keyValResultArray, &numCommands);
1064 memset(&commandArray[0],0,(sizeof(KEYVALRESULT) * 32));
1065 memcpy(commandArray, keyValResultArray, (sizeof(KEYVALRESULT) * 32));
1066 runCommands(commandArray, numCommands);
1068 /********************************************************************************
1069 * Put the condition to set the fault here
1070 *******************************************************************************/
1071 if ((atoi(commandArray[0].resultStr) == 1) && (fault_raised == 0))
1073 printf("\nFAULT02::Raising fault\n");
1074 memset(event_id, 0, BUFSIZE);
1075 fault_event_id = fault_event_id+1;
1076 sprintf(event_id2, "%09d", fault_event_id);
1077 strcat(event_id, event_id1);
1078 strcat(event_id, event_id2);
1080 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance02", &flt_interval);
1083 printf("FAULT02::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
1087 ret = getStringToken(js, tokens, numToken, "reportingEntityName", "tmp_directParameters", reportEName, BUFSIZE);
1090 printf("FAULT02::Missing mandatory parameters - reportingEntityName is not there in tmp_directParameters\n");
1091 printf("FAULT02::Defaulting reportingEntityName to hostname\n");
1092 strcpy(reportEName, hostname);
1094 ret = getStringToken(js, tokens, numToken, "sourceName", "tmp_directParameters", srcName, BUFSIZE);
1097 printf("FAULT02::Missing mandatory parameters - sourceName is not there in tmp_directParameters\n");
1098 printf("FAULT02::Defaulting sourceName to hostname\n");
1099 strcpy(srcName, hostname);
1102 ret = getStringToken(js, tokens, numToken, "priority", "tmp_directParameters", prio, BUFSIZE);
1105 printf("FAULT02::Missing mandatory parameters - priority is not there in tmp_directParameters\nDefaulting priority to Low\n");
1106 strcpy(prio, "Medium");
1108 priority = get_priority(prio);
1111 printf("FAULT02::Fault priority value is not matching, prioirty-%s \n", prio);
1115 ret = getStringTokenV2(js, tokens, numToken, "specificProblem", "tmp_alarmSetParameters", "tmp_faultInstance02", specProb, BUFSIZE);
1118 printf("FAULT02::Missing mandatory parameters - specificProblem is not there in tmp_alarmSetParameters, exiting ...\n");
1121 ret = getStringTokenV2(js, tokens, numToken, "alarmCondition", "tmp_alarmSetParameters", "tmp_faultInstance02", alarmCondn, BUFSIZE);
1124 printf("FAULT02::Missing mandatory parameters - alarmCondition is not there in tmp_alarmSetParameters, exiting ...\n");
1127 ret = getStringTokenV2(js, tokens, numToken, "eventSeverity", "tmp_alarmSetParameters", "tmp_faultInstance02", eventSev, BUFSIZE);
1130 printf("FAULT02::Missing mandatory parameters - eventSeverity is not there in tmp_alarmSetParameters\n");
1131 printf("FAULT02::Defaulting eventSeverity to MAJOR\n");
1132 strcpy(eventSev, "MAJOR");
1134 eSev = get_severity(eventSev);
1137 printf("FAULT02::Fault eventSeverity value is not matching, eventSeverity-%s \n", eventSev);
1141 fault = evel_new_fault(eName, event_id, alarmCondn,
1142 specProb, priority, eSev, srcTyp,vfStat);
1147 struct timeval tv_now;
1148 gettimeofday(&tv_now, NULL);
1149 epoch_now = tv_now.tv_usec + 1000000 * tv_now.tv_sec;
1150 last_epoch = epoch_now;
1152 fault_header = (EVENT_HEADER *)fault;
1154 evel_fault_category_set(fault, eCategory);
1155 if (aInterface != NULL)
1156 evel_fault_interface_set(fault, aInterface);
1159 evel_fault_type_set(fault, eType);
1161 evel_start_epoch_set(&fault->header, epoch_now);
1162 evel_last_epoch_set(&fault->header, epoch_now);
1164 evel_nfcnamingcode_set(&fault->header, nfcCode);
1166 evel_nfnamingcode_set(&fault->header, nfCode);
1167 evel_reporting_entity_name_set(&fault->header, reportEName);
1168 if(reportEId != NULL)
1169 evel_reporting_entity_id_set(&fault->header, reportEId);
1171 evel_source_id_set(&fault->header, srcId);
1173 evel_source_name_set(&fault->header, srcName);
1175 evel_rc = evel_post_event(fault_header);
1177 if(evel_rc == EVEL_SUCCESS) {
1178 printf("FAULT02::Fault event is correctly sent to the collector!\n");
1181 printf("FAULT02::Post failed %d (%s)\n", evel_rc, evel_error_string());
1185 printf("FAULT02::New new fault failed (%s)\n", evel_error_string());
1188 /********************************************************************************
1189 * Put the condition to clear the fault here
1190 *******************************************************************************/
1191 else if ((atoi(commandArray[0].resultStr) == 0) && (fault_raised == 1))
1193 printf("\nFAULT02:: Clearing fault\n");
1194 memset(event_id, 0, BUFSIZE);
1195 sprintf(event_id2, "%09d", (i+1));
1196 strcat(event_id, event_id1);
1197 strcat(event_id, event_id2);
1199 ret = getIntToken(js, tokens, numToken, "tmp_faultCheckInterval", "tmp_faultInstance02", &flt_interval);
1202 printf("FAULT02::The parameter tmp_faultCheckInterval is not defined, defaulted to 60 seconds\n");
1206 ret = getStringToken(js, tokens, numToken, "reportingEntityName", "tmp_directParameters", reportEName, BUFSIZE);
1209 printf("FAULT02::Missing mandatory parameters - reportingEntityName is not there in tmp_directParameters\n");
1210 printf("FAULT02::Defaulting reportingEntityName to hostname\n");
1211 strcpy(reportEName, hostname);
1213 ret = getStringToken(js, tokens, numToken, "sourceName", "tmp_directParameters", srcName, BUFSIZE);
1216 printf("FAULT02::Missing mandatory parameters - sourceName is not there in tmp_directParameters\n");
1217 printf("FAULT02::Defaulting sourceName to hostname\n");
1218 strcpy(srcName, hostname);
1221 ret = getStringToken(js, tokens, numToken, "priority", "tmp_directParameters", prio, BUFSIZE);
1224 printf("FAULT02::Missing mandatory parameters - priority is not there in tmp_directParameters\nDefaulting priority to Low\n");
1225 strcpy(prio, "Medium");
1227 priority = get_priority(prio);
1230 printf("FAULT02::Fault priority value is not matching, prioirty-%s \n", prio);
1234 ret = getStringTokenV2(js, tokens, numToken, "specificProblem", "tmp_alarmClearParameters", "tmp_faultInstance02", specProb, BUFSIZE);
1237 printf("FAULT02::Missing mandatory parameters - specificProblem is not there in tmp_alarmClearParameters, exiting ...\n");
1241 ret = getStringTokenV2(js, tokens, numToken, "alarmCondition", "tmp_alarmClearParameters", "tmp_faultInstance02", alarmCondn, BUFSIZE);
1244 printf("FAULT02::Missing mandatory parameters - alarmCondition is not there in tmp_alarmClearParameters, exiting ...\n");
1248 ret = getStringTokenV2(js, tokens, numToken, "eventSeverity", "tmp_alarmClearParameters", "tmp_faultInstance02", eventSev, BUFSIZE);
1251 printf("FAULT02::Missing mandatory parameters - eventSeverity is not there in tmp_alarmClearParameters\n");
1252 printf("FAULT02::Defaulting eventSeverity to MAJOR\n");
1253 strcpy(eventSev, "NORMAL");
1255 eSev = get_severity(eventSev);
1258 printf("FAULT02::Fault eventSeverity value is not matching, eventSeverity-%s \n", eventSev);
1262 fault = evel_new_fault(eName, event_id, alarmCondn,
1263 specProb, priority, eSev, srcTyp,vfStat);
1268 struct timeval tv_now;
1269 gettimeofday(&tv_now, NULL);
1270 epoch_now = tv_now.tv_usec + 1000000 * tv_now.tv_sec;
1272 fault_header = (EVENT_HEADER *)fault;
1273 evel_fault_category_set(fault, eCategory);
1274 if (aInterface != NULL)
1275 evel_fault_interface_set(fault, aInterface);
1278 evel_fault_type_set(fault, eType);
1280 evel_start_epoch_set(&fault->header, last_epoch);
1281 evel_last_epoch_set(&fault->header, epoch_now);
1285 evel_nfcnamingcode_set(&fault->header, nfcCode);
1287 evel_nfnamingcode_set(&fault->header, nfCode);
1288 evel_reporting_entity_name_set(&fault->header, reportEName);
1289 if(reportEId != NULL)
1290 evel_reporting_entity_id_set(&fault->header, reportEId);
1292 evel_source_id_set(&fault->header, srcId);
1294 evel_source_name_set(&fault->header, srcName);
1296 evel_rc = evel_post_event(fault_header);
1298 if(evel_rc == EVEL_SUCCESS) {
1299 printf("FAULT02::Fault event is correctly sent to the collector!\n");
1302 printf("FAULT02::Post failed %d (%s)\n", evel_rc, evel_error_string());
1306 printf("FAULT02::New fault failed (%s)\n", evel_error_string());
1311 sleep(flt_interval);
1314 /***************************************************************************/
1316 /***************************************************************************/
1320 void *FaultThread03(void *faultInstanceTag)
1323 printf("FAULT03::thread created\n");