-static void sysevent_dispatch_notification(const char *message,
-#if HAVE_YAJL_V2
- yajl_val *node,
-#endif
- long long unsigned int timestamp) {
- char *buf = NULL;
- notification_t n = {NOTIF_OKAY, cdtime(), "", "", "sysevent",
- "", "", "", NULL};
-
-#if HAVE_YAJL_V2
- if (node != NULL) {
- // If we have a parsed-JSON node to work with, use that
-
- // msg
- const char *msg_path[] = {rsyslog_keys[2], (const char *)0};
- yajl_val msg_v = yajl_tree_get(*node, msg_path, yajl_t_string);
-
- char msg[listen_buffer_size];
-
- if (msg_v != NULL) {
- memset(msg, '\0', listen_buffer_size);
- snprintf(msg, listen_buffer_size, "%s%c", YAJL_GET_STRING(msg_v), '\0');
- }
-
- // severity
- const char *severity_path[] = {"@fields", rsyslog_field_keys[1],
- (const char *)0};
- yajl_val severity_v = yajl_tree_get(*node, severity_path, yajl_t_string);
-
- char severity[listen_buffer_size];
-
- if (severity_v != NULL) {
- memset(severity, '\0', listen_buffer_size);
- snprintf(severity, listen_buffer_size, "%s%c",
- YAJL_GET_STRING(severity_v), '\0');
- }
-
- // sev_num
- const char *sev_num_str_path[] = {"@fields", rsyslog_field_keys[2],
- (const char *)0};
- yajl_val sev_num_str_v =
- yajl_tree_get(*node, sev_num_str_path, yajl_t_string);
-
- char sev_num_str[listen_buffer_size];
- int sev_num = -1;
-
- if (sev_num_str_v != NULL) {
- memset(sev_num_str, '\0', listen_buffer_size);
- snprintf(sev_num_str, listen_buffer_size, "%s%c",
- YAJL_GET_STRING(sev_num_str_v), '\0');
-
- sev_num = atoi(sev_num_str);
-
- if (sev_num < 4)
- n.severity = NOTIF_FAILURE;
- }
-
- // process
- const char *process_path[] = {"@fields", rsyslog_field_keys[3],
- (const char *)0};
- yajl_val process_v = yajl_tree_get(*node, process_path, yajl_t_string);
-
- char process[listen_buffer_size];
-
- if (process_v != NULL) {
- memset(process, '\0', listen_buffer_size);
- snprintf(process, listen_buffer_size, "%s%c", YAJL_GET_STRING(process_v),
- '\0');
- }
-
- // hostname
- const char *hostname_path[] = {rsyslog_keys[1], (const char *)0};
- yajl_val hostname_v = yajl_tree_get(*node, hostname_path, yajl_t_string);
-
- char hostname_str[listen_buffer_size];
-
- if (hostname_v != NULL) {
- memset(hostname_str, '\0', listen_buffer_size);
- snprintf(hostname_str, listen_buffer_size, "%s%c",
- YAJL_GET_STRING(hostname_v), '\0');
- }
-
- gen_message_payload(
- (msg_v != NULL ? msg : NULL), (severity_v != NULL ? severity : NULL),
- (sev_num_str_v != NULL ? sev_num : -1),
- (process_v != NULL ? process : NULL),
- (hostname_v != NULL ? hostname_str : hostname_g), timestamp, &buf);
- } else {
- // Data was not sent in JSON format, so just treat the whole log entry
- // as the message (and we'll be unable to acquire certain data, so the
- // payload
- // generated below will be less informative)
-
- gen_message_payload(message, NULL, -1, NULL, hostname_g, timestamp, &buf);
- }
-#else
- gen_message_payload(message, NULL, -1, NULL, hostname_g, timestamp, &buf);
-#endif
-
- sstrncpy(n.host, hostname_g, sizeof(n.host));
- sstrncpy(n.type, "gauge", sizeof(n.type));
-
- notification_meta_t *m = calloc(1, sizeof(*m));
-
- if (m == NULL) {
- sfree(buf);
- ERROR("sysevent plugin: unable to allocate metadata: %s", STRERRNO);
- return;
- }
-
- sstrncpy(m->name, "ves", sizeof(m->name));
- m->nm_value.nm_string = sstrdup(buf);
- m->type = NM_TYPE_STRING;
- n.meta = m;
-
- DEBUG("sysevent plugin: notification message: %s",
- n.meta->nm_value.nm_string);
-
- DEBUG("sysevent plugin: dispatching message");
-
- plugin_dispatch_notification(&n);
- plugin_notification_meta_free(n.meta);
-
- // strdup'd in gen_message_payload
- if (buf != NULL)
- sfree(buf);
-}
-