AT&T ECOMP Vendor Event Listener library  0.1
evel_syslog.c
Go to the documentation of this file.
1 /**************************************************************************/
35 #include <string.h>
36 #include <assert.h>
37 #include <stdlib.h>
38 
39 #include "evel_throttle.h"
40 
41 /**************************************************************************/
57  const char * const syslog_msg,
58  const char * const syslog_tag)
59 {
60  EVENT_SYSLOG * syslog = NULL;
61  EVEL_ENTER();
62 
63  /***************************************************************************/
64  /* Check preconditions. */
65  /***************************************************************************/
66  assert(event_source_type < EVEL_MAX_SOURCE_TYPES);
67  assert(syslog_msg != NULL);
68  assert(syslog_tag != NULL);
69 
70  /***************************************************************************/
71  /* Allocate the Syslog. */
72  /***************************************************************************/
73  syslog = malloc(sizeof(EVENT_SYSLOG));
74  if (syslog == NULL)
75  {
76  log_error_state("Out of memory");
77  goto exit_label;
78  }
79  memset(syslog, 0, sizeof(EVENT_SYSLOG));
80  EVEL_DEBUG("New Syslog is at %lp", syslog);
81 
82  /***************************************************************************/
83  /* Initialize the header & the Syslog fields. Optional string values are */
84  /* uninitialized (NULL). */
85  /***************************************************************************/
86  evel_init_header(&syslog->header);
91  syslog->syslog_msg = strdup(syslog_msg);
92  syslog->syslog_tag = strdup(syslog_tag);
100 
101 exit_label:
102  EVEL_EXIT();
103  return syslog;
104 }
105 
106 /**************************************************************************/
119  const char * const type)
120 {
121  EVEL_ENTER();
122 
123  /***************************************************************************/
124  /* Check preconditions and call evel_header_type_set. */
125  /***************************************************************************/
126  assert(syslog != NULL);
127  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
128  evel_header_type_set(&syslog->header, type);
129 
130  EVEL_EXIT();
131 }
132 
133 /**************************************************************************/
149  char * name,
150  char * value)
151 {
152  SYSLOG_ADDL_FIELD * addl_field = NULL;
153  EVEL_ENTER();
154 
155  /***************************************************************************/
156  /* Check preconditions. */
157  /***************************************************************************/
158  assert(syslog != NULL);
159  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
160  assert(name != NULL);
161  assert(value != NULL);
162 
163  EVEL_DEBUG("Adding name=%s value=%s", name, value);
164  addl_field = malloc(sizeof(SYSLOG_ADDL_FIELD));
165  assert(addl_field != NULL);
166  memset(addl_field, 0, sizeof(SYSLOG_ADDL_FIELD));
167  addl_field->name = strdup(name);
168  addl_field->value = strdup(value);
169  assert(addl_field->name != NULL);
170  assert(addl_field->value != NULL);
171 
172  dlist_push_last(&syslog->additional_fields, addl_field);
173 
174  EVEL_EXIT();
175 }
176 
177 /**************************************************************************/
190  const char * const host)
191 {
192  EVEL_ENTER();
193 
194  /***************************************************************************/
195  /* Check preconditions. */
196  /***************************************************************************/
197  assert(syslog != NULL);
198  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
199  assert(host != NULL);
200 
202  host,
203  "Event Source Host");
204  EVEL_EXIT();
205 }
206 
207 /**************************************************************************/
220  EVEL_SYSLOG_FACILITIES facility)
221 {
222  EVEL_ENTER();
223 
224  /***************************************************************************/
225  /* Check preconditions. */
226  /***************************************************************************/
227  assert(syslog != NULL);
228  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
229  assert(facility < EVEL_MAX_SYSLOG_FACILITIES);
230 
232  facility,
233  "Facility");
234  EVEL_EXIT();
235 }
236 
237 /**************************************************************************/
248 void evel_syslog_proc_set(EVENT_SYSLOG * syslog, const char * const proc)
249 {
250  EVEL_ENTER();
251 
252  /***************************************************************************/
253  /* Check preconditions. */
254  /***************************************************************************/
255  assert(syslog != NULL);
256  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
257  assert(proc != NULL);
258 
259  evel_set_option_string(&syslog->syslog_proc, proc, "Process");
260  EVEL_EXIT();
261 }
262 
263 /**************************************************************************/
274 void evel_syslog_proc_id_set(EVENT_SYSLOG * syslog, int proc_id)
275 {
276  EVEL_ENTER();
277 
278  /***************************************************************************/
279  /* Check preconditions. */
280  /***************************************************************************/
281  assert(syslog != NULL);
282  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
283  assert(proc_id > 0);
284 
286  proc_id,
287  "Process ID");
288  EVEL_EXIT();
289 }
290 
291 /**************************************************************************/
302 void evel_syslog_version_set(EVENT_SYSLOG * syslog, int version)
303 {
304  EVEL_ENTER();
305 
306  /***************************************************************************/
307  /* Check preconditions. */
308  /***************************************************************************/
309  assert(syslog != NULL);
310  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
311  assert(version >= 0);
312 
314  version,
315  "Version");
316  EVEL_EXIT();
317 }
318 
319 /**************************************************************************/
331 void evel_syslog_s_data_set(EVENT_SYSLOG * syslog, const char * const s_data)
332 {
333  EVEL_ENTER();
334 
335  /***************************************************************************/
336  /* Check preconditions. */
337  /***************************************************************************/
338  assert(syslog != NULL);
339  assert(syslog->header.event_domain == EVEL_DOMAIN_SYSLOG);
340  assert(s_data != NULL);
341 
343  s_data,
344  "Structured Data");
345  EVEL_EXIT();
346 }
347 
348 /**************************************************************************/
355  EVENT_SYSLOG * event)
356 {
357  char * event_source_type;
358  SYSLOG_ADDL_FIELD * addl_field = NULL;
359  DLIST_ITEM * addl_field_item = NULL;
360 
361  EVEL_ENTER();
362 
363  /***************************************************************************/
364  /* Check preconditions. */
365  /***************************************************************************/
366  assert(event != NULL);
367  assert(event->header.event_domain == EVEL_DOMAIN_SYSLOG);
368 
369  event_source_type = evel_source_type(event->event_source_type);
370 
371  evel_json_encode_header(jbuf, &event->header);
372  evel_json_open_named_object(jbuf, "syslogFields");
373 
374  /***************************************************************************/
375  /* Mandatory fields */
376  /***************************************************************************/
377  evel_enc_kv_string(jbuf, "eventSourceType", event_source_type);
378  evel_enc_kv_string(jbuf, "syslogMsg", event->syslog_msg);
379  evel_enc_kv_string(jbuf, "syslogTag", event->syslog_tag);
381  jbuf, "syslogFieldsVersion", event->major_version, event->minor_version);
382 
383  /***************************************************************************/
384  /* Optional fields */
385  /***************************************************************************/
386  evel_json_checkpoint(jbuf);
387  if (evel_json_open_opt_named_list(jbuf, "additionalFields"))
388  {
389  bool item_added = false;
390 
391  addl_field_item = dlist_get_first(&event->additional_fields);
392  while (addl_field_item != NULL)
393  {
394  addl_field = (SYSLOG_ADDL_FIELD *) addl_field_item->item;
395  assert(addl_field != NULL);
396 
398  "additionalFields",
399  addl_field->name))
400  {
401  evel_json_open_object(jbuf);
402  evel_enc_kv_string(jbuf, "name", addl_field->name);
403  evel_enc_kv_string(jbuf, "value", addl_field->value);
405  item_added = true;
406  }
407  addl_field_item = dlist_get_next(addl_field_item);
408  }
409  evel_json_close_list(jbuf);
410 
411  /*************************************************************************/
412  /* If we've not written anything, rewind to before we opened the list. */
413  /*************************************************************************/
414  if (!item_added)
415  {
416  evel_json_rewind(jbuf);
417  }
418  }
419 
420  evel_enc_kv_opt_string(jbuf, "eventSourceHost", &event->event_source_host);
421  evel_enc_kv_opt_int(jbuf, "syslogFacility", &event->syslog_facility);
422  evel_enc_kv_opt_string(jbuf, "syslogProc", &event->syslog_proc);
423  evel_enc_kv_opt_int(jbuf, "syslogProcId", &event->syslog_proc_id);
424  evel_enc_kv_opt_string(jbuf, "syslogSData", &event->syslog_s_data);
425  evel_enc_kv_opt_int(jbuf, "syslogVer", &event->syslog_ver);
427 
452 
453  EVEL_EXIT();
454 }
455 
456 /**************************************************************************/
465 {
466  SYSLOG_ADDL_FIELD * addl_field = NULL;
467 
468  EVEL_ENTER();
469 
470  /***************************************************************************/
471  /* Check preconditions. As an internal API we don't allow freeing NULL */
472  /* events as we do on the public API. */
473  /***************************************************************************/
474  assert(event != NULL);
475  assert(event->header.event_domain == EVEL_DOMAIN_SYSLOG);
476 
477  /***************************************************************************/
478  /* Free all internal strings then the header itself. */
479  /***************************************************************************/
480  addl_field = dlist_pop_last(&event->additional_fields);
481  while (addl_field != NULL)
482  {
483  EVEL_DEBUG("Freeing Additional Field (%s, %s)",
484  addl_field->name,
485  addl_field->value);
486  free(addl_field->name);
487  free(addl_field->value);
488  free(addl_field);
489  addl_field = dlist_pop_last(&event->additional_fields);
490  }
491 
493  free(event->syslog_msg);
496  free(event->syslog_tag);
497  evel_free_header(&event->header);
498 
499  EVEL_EXIT();
500 }
void evel_init_option_int(EVEL_OPTION_INT *const option)
Initialize an EVEL_OPTION_INT to a not-set state.
Definition: evel_option.c:151
void evel_set_option_string(EVEL_OPTION_STRING *const option, const char *const value, const char *const description)
Set the value of an EVEL_OPTION_STRING.
Definition: evel_option.c:94
#define EVEL_DEBUG(FMT,...)
Definition: evel.h:3621
DLIST_ITEM * dlist_get_first(DLIST *list)
Definition: double_list.c:162
void evel_set_option_int(EVEL_OPTION_INT *const option, const int value, const char *const description)
Set the value of an EVEL_OPTION_INT.
Definition: evel_option.c:195
EVEL_OPTION_STRING syslog_s_data
Definition: evel.h:1016
void evel_syslog_proc_id_set(EVENT_SYSLOG *syslog, int proc_id)
Set the Process ID property of the Syslog.
Definition: evel_syslog.c:274
EVEL_SOURCE_TYPES event_source_type
The type of equipment represented by this VNF.
Definition: evel.c:58
EVEL_OPTION_INT syslog_ver
Definition: evel.h:1017
void dlist_initialize(DLIST *list)
List initialization.
Definition: double_list.c:55
DLIST additional_fields
Definition: evel.h:1011
void * item
Definition: double_list.h:47
EVEL_THROTTLE_SPEC * throttle_spec
#define EVEL_EXIT()
Definition: evel.h:3631
EVEL_OPTION_INT syslog_facility
Definition: evel.h:1013
EVENT_SYSLOG * evel_new_syslog(EVEL_SOURCE_TYPES event_source_type, const char *const syslog_msg, const char *const syslog_tag)
Create a new Syslog event.
Definition: evel_syslog.c:56
void evel_json_close_list(EVEL_JSON_BUFFER *jbuf)
Add the closing bracket of a list to a JSON buffer.
void evel_init_option_string(EVEL_OPTION_STRING *const option)
Initialize an EVEL_OPTION_STRING to a not-set state.
Definition: evel_option.c:72
#define EVEL_ENTER()
Definition: evel.h:3626
void evel_syslog_addl_field_add(EVENT_SYSLOG *syslog, char *name, char *value)
Add an additional value name/value pair to the Syslog.
Definition: evel_syslog.c:148
EVEL_OPTION_STRING syslog_proc
Definition: evel.h:1014
char * syslog_tag
Definition: evel.h:1006
int minor_version
Definition: evel.h:999
void evel_syslog_facility_set(EVENT_SYSLOG *syslog, EVEL_SYSLOG_FACILITIES facility)
Set the Facility property of the Syslog.
Definition: evel_syslog.c:219
void evel_syslog_version_set(EVENT_SYSLOG *syslog, int version)
Set the Version property of the Syslog.
Definition: evel_syslog.c:302
Syslog.
Definition: evel.h:993
char * evel_source_type(const EVEL_SOURCE_TYPES source_type)
Map an EVEL_SOURCE_TYPES enum value to the equivalent string.
Definition: evel_strings.c:305
Syslog Additional Field.
Definition: evel.h:1025
void evel_enc_kv_string(EVEL_JSON_BUFFER *jbuf, const char *const key, const char *const value)
Encode a string key and string value to a EVEL_JSON_BUFFER.
void evel_json_close_object(EVEL_JSON_BUFFER *jbuf)
Add the closing bracket of an object to a JSON buffer.
void evel_free_syslog(EVENT_SYSLOG *event)
Free a Syslog.
Definition: evel_syslog.c:464
#define EVEL_SYSLOG_MINOR_VERSION
Definition: evel.h:987
EVEL_SOURCE_TYPES
Fault source types.
Definition: evel.h:174
void evel_json_open_named_object(EVEL_JSON_BUFFER *jbuf, const char *const key)
Add the opening bracket of an object to a JSON buffer.
void evel_json_open_object(EVEL_JSON_BUFFER *jbuf)
Add the opening bracket of an object to a JSON buffer.
EVEL_SYSLOG_FACILITIES
Syslog facilities.
Definition: evel.h:259
char * syslog_msg
Definition: evel.h:1005
void evel_json_checkpoint(EVEL_JSON_BUFFER *jbuf)
Add a checkpoint - a stake in the ground to which we can rewind.
EVEL_EVENT_DOMAINS event_domain
Definition: evel.h:420
void evel_syslog_event_source_host_set(EVENT_SYSLOG *syslog, const char *const host)
Set the Event Source Host property of the Syslog.
Definition: evel_syslog.c:189
EVEL_OPTION_INT syslog_proc_id
Definition: evel.h:1015
void evel_json_encode_header(EVEL_JSON_BUFFER *jbuf, EVENT_HEADER *event)
Encode the event as a JSON event object according to AT&T&#39;s schema.
Definition: evel_event.c:291
EVENT_HEADER header
Definition: evel.h:997
void evel_free_header(EVENT_HEADER *const event)
Free an event header.
Definition: evel_event.c:349
void evel_syslog_type_set(EVENT_SYSLOG *syslog, const char *const type)
Set the Event Type property of the Syslog.
Definition: evel_syslog.c:118
void * dlist_pop_last(DLIST *list)
Definition: double_list.c:73
void dlist_push_last(DLIST *list, void *item)
Definition: double_list.c:132
bool evel_json_open_opt_named_list(EVEL_JSON_BUFFER *jbuf, const char *const key)
Add the key and opening bracket of an optional named list to a JSON buffer.
void log_error_state(char *format,...)
Definition: evel_logging.c:98
#define EVEL_CT_ASSERT(X)
Compile-time assertion.
Definition: evel_internal.h:62
A State Change event.
Definition: evel.h:140
void evel_free_option_string(EVEL_OPTION_STRING *const option)
Free the underlying resources of an EVEL_OPTION_STRING.
Definition: evel_option.c:48
void evel_syslog_s_data_set(EVENT_SYSLOG *syslog, const char *const s_data)
Set the Structured Data property of the Syslog.
Definition: evel_syslog.c:331
bool evel_enc_kv_opt_string(EVEL_JSON_BUFFER *jbuf, const char *const key, const EVEL_OPTION_STRING *const option)
Encode a string key and string value to a EVEL_JSON_BUFFER.
DLIST_ITEM * dlist_get_next(DLIST_ITEM *item)
Definition: double_list.c:172
bool evel_enc_kv_opt_int(EVEL_JSON_BUFFER *jbuf, const char *const key, const EVEL_OPTION_INT *const option)
Encode a string key and integer value to a EVEL_JSON_BUFFER.
void evel_json_rewind(EVEL_JSON_BUFFER *jbuf)
Rewind to the latest checkoint.
void evel_header_type_set(EVENT_HEADER *const header, const char *const type)
Set the Event Type property of the event header.
Definition: evel_event.c:164
EVEL throttle definitions.
int major_version
Definition: evel.h:998
void evel_enc_version(EVEL_JSON_BUFFER *jbuf, const char *const key, const int major_version, const int minor_version)
Encode a key and version.
void evel_init_header(EVENT_HEADER *const header)
Initialize a newly created event header.
Definition: evel_event.c:112
bool evel_throttle_suppress_nv_pair(EVEL_THROTTLE_SPEC *throttle_spec, const char *const field_name, const char *const name)
Determine whether a name-value pair should be allowed (not suppressed).
void evel_syslog_proc_set(EVENT_SYSLOG *syslog, const char *const proc)
Set the Process property of the Syslog.
Definition: evel_syslog.c:248
#define EVEL_SYSLOG_MAJOR_VERSION
Definition: evel.h:986
void evel_json_encode_syslog(EVEL_JSON_BUFFER *jbuf, EVENT_SYSLOG *event)
Encode the Syslog in JSON according to AT&T&#39;s schema for the event type.
Definition: evel_syslog.c:354
EVEL_OPTION_STRING event_source_host
Definition: evel.h:1012
EVEL_SOURCE_TYPES event_source_type
Definition: evel.h:1004