diff options
Diffstat (limited to 'src/fluent-bit/plugins/out_syslog/syslog.c')
-rw-r--r-- | src/fluent-bit/plugins/out_syslog/syslog.c | 1170 |
1 files changed, 0 insertions, 1170 deletions
diff --git a/src/fluent-bit/plugins/out_syslog/syslog.c b/src/fluent-bit/plugins/out_syslog/syslog.c deleted file mode 100644 index a33351354..000000000 --- a/src/fluent-bit/plugins/out_syslog/syslog.c +++ /dev/null @@ -1,1170 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - -/* Fluent Bit - * ========== - * Copyright (C) 2015-2022 The Fluent Bit Authors - * - * 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 <fluent-bit/flb_output_plugin.h> -#include <fluent-bit/flb_time.h> -#include <fluent-bit/flb_network.h> -#include <fluent-bit/flb_utils.h> -#include <fluent-bit/flb_kv.h> -#include <fluent-bit/flb_pack.h> -#include <fluent-bit/flb_sds.h> -#include <fluent-bit/flb_log_event_decoder.h> - -#include "syslog_conf.h" - -#ifndef MSG_DONTWAIT - #define MSG_DONTWAIT 0 -#endif - -#ifndef MSG_NOSIGNAL - #define MSG_NOSIGNAL 0 -#endif - -#define RFC5424_MAXSIZE 2048 -#define RFC3164_MAXSIZE 1024 - -struct syslog_msg { - int severity; - int facility; - flb_sds_t hostname; - flb_sds_t appname; - flb_sds_t procid; - flb_sds_t msgid; - flb_sds_t sd; - flb_sds_t message; -}; - -static const char *rfc3164_mon[] = {"Jan", "Feb", "Mar", "Apr", - "May", "Jun", "Jul", "Aug", - "Sep", "Oct", "Nov", "Dec"}; - -static struct { - char *name; - int len; - int value; -} syslog_severity[] = { - { "emerg", 5, 0 }, - { "alert", 5, 1 }, - { "crit", 4, 2 }, - { "err", 3, 3 }, - { "warning", 7, 4 }, - { "notice", 6, 5 }, - { "info", 4, 6 }, - { "debug", 5, 7 }, - { NULL, 0,-1 } -}; - -static struct { - char *name; - int len; - int value; -} syslog_facility[] = { - { "kern", 4, 0 }, - { "user", 4, 1 }, - { "mail", 4, 2 }, - { "daemon", 6, 3 }, - { "auth", 4, 4 }, - { "syslog", 6, 5 }, - { "lpr", 3, 6 }, - { "news", 4, 7 }, - { "uucp", 4, 8 }, - { "cron", 4, 9 }, - { "authpriv", 8, 10 }, - { "ftp", 3, 11 }, - { "ntp", 3, 12 }, - { "security", 8, 13 }, - { "console", 7, 14 }, - { "local0", 6, 16 }, - { "local1", 6, 17 }, - { "local2", 6, 18 }, - { "local3", 6, 19 }, - { "local4", 6, 20 }, - { "local5", 6, 21 }, - { "local6", 6, 22 }, - { "local7", 6, 23 }, - { NULL, 0,-1 }, -}; - -/* '"', '\' ']' */ -static char rfc5424_sp_value[256] = { - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0,'"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\',']', 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, - 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0 -}; - -/* '=', ' ', ']', '"' */ -static char rfc5424_sp_name[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static flb_sds_t syslog_rfc5424(flb_sds_t *s, struct flb_time *tms, - struct syslog_msg *msg) -{ - struct tm tm; - flb_sds_t tmp; - uint8_t prival; - - prival = (msg->facility << 3) + msg->severity; - - if (gmtime_r(&(tms->tm.tv_sec), &tm) == NULL) { - return NULL; - } - - tmp = flb_sds_printf(s, "<%i>%i %d-%02d-%02dT%02d:%02d:%02d.%06"PRIu64"Z ", - prival, 1, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec, - (uint64_t) tms->tm.tv_nsec/1000); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->hostname) { - int len = flb_sds_len(msg->hostname); - tmp = flb_sds_cat(*s, msg->hostname, len > 255 ? 255 : len); - if (!tmp) { - return NULL; - } - *s = tmp; - } - else { - tmp = flb_sds_cat(*s, "-" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - tmp = flb_sds_cat(*s, " ", 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->appname) { - int len = flb_sds_len(msg->appname); - tmp = flb_sds_cat(*s, msg->appname, len > 48 ? 48 : len); - if (!tmp) { - return NULL; - } - *s = tmp; - } - else { - tmp = flb_sds_cat(*s, "-" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - tmp = flb_sds_cat(*s, " ", 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->procid) { - int len = flb_sds_len(msg->procid); - tmp = flb_sds_cat(*s, msg->procid, len > 128 ? 128 : len); - if (!tmp) { - return NULL; - } - *s = tmp; - } - else { - tmp = flb_sds_cat(*s, "-" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - tmp = flb_sds_cat(*s, " ", 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->msgid) { - int len = flb_sds_len(msg->msgid); - tmp = flb_sds_cat(*s, msg->msgid, len > 32 ? 32 : len); - if (!tmp) { - return NULL; - } - *s = tmp; - } - else { - tmp = flb_sds_cat(*s, "-" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - tmp = flb_sds_cat(*s, " ", 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->sd) { - tmp = flb_sds_cat(*s, msg->sd, flb_sds_len(msg->sd)); - if (!tmp) { - return NULL; - } - *s = tmp; - } - else { - tmp = flb_sds_cat(*s, "-" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - if (msg->message) { - int len = flb_sds_len(msg->message); - tmp = flb_sds_cat(*s, " \xef\xbb\xbf", 4); - if (!tmp) { - return NULL; - } - *s = tmp; - tmp = flb_sds_cat(*s, msg->message, len); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - return *s; -} - -static flb_sds_t syslog_rfc3164 (flb_sds_t *s, struct flb_time *tms, - struct syslog_msg *msg) -{ - struct tm tm; - flb_sds_t tmp; - uint8_t prival; - - prival = (msg->facility << 3) + msg->severity; - - if (gmtime_r(&(tms->tm.tv_sec), &tm) == NULL) { - return NULL; - } - - tmp = flb_sds_printf(s, "<%i>%s %2d %02d:%02d:%02d ", prival, - rfc3164_mon[tm.tm_mon], tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - if (!tmp) { - return NULL; - } - *s = tmp; - - if (msg->hostname) { - tmp = flb_sds_cat(*s, msg->hostname, flb_sds_len(msg->hostname)); - if (!tmp) { - return NULL; - } - *s = tmp; - tmp = flb_sds_cat(*s, " ", 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - if (msg->appname) { - tmp = flb_sds_cat(*s, msg->appname, flb_sds_len(msg->appname)); - if (!tmp) { - return NULL; - } - *s = tmp; - if (msg->procid) { - tmp = flb_sds_cat(*s, "[" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - tmp = flb_sds_cat(*s, msg->procid, flb_sds_len(msg->procid)); - if (!tmp) { - return NULL; - } - *s = tmp; - tmp = flb_sds_cat(*s, "]" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - tmp = flb_sds_cat(*s, ": " , 2); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - if (msg->message) { - tmp = flb_sds_cat(*s, msg->message, flb_sds_len(msg->message)); - if (!tmp) { - return NULL; - } - *s = tmp; - } - - return *s; -} - -static flb_sds_t msgpack_to_sd(struct flb_syslog *ctx, - flb_sds_t *s, const char *sd, int sd_len, - msgpack_object *o) -{ - flb_sds_t tmp; - int i; - int loop; - int n, start_len, end_len; - - if (*s == NULL) { - *s = flb_sds_create_size(512); - if (*s == NULL) { - return NULL; - } - } - - tmp = flb_sds_cat(*s, "[" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - start_len = flb_sds_len(*s); - if (ctx->allow_longer_sd_id != FLB_TRUE && sd_len > 32) { - /* - * RFC5424 defines - * SD-NAME = 1*32PRINTUSASCII - * ; except '=', SP, ']', %d34 (") - * - * https://www.rfc-editor.org/rfc/rfc5424#section-6 - */ - sd_len = 32; - } - tmp = flb_sds_cat(*s, sd, sd_len); - if (!tmp) { - return NULL; - } - *s = tmp; - - end_len = flb_sds_len(*s); - for(n=start_len; n < end_len; n++) { - if (!rfc5424_sp_name[(unsigned char)(*s)[n]]) { - (*s)[n] = '_'; - } - } - - loop = o->via.map.size; - if (loop != 0) { - msgpack_object_kv *p = o->via.map.ptr; - for (i = 0; i < loop; i++) { - char temp[48] = {0}; - const char *key = NULL; - int key_len = 0; - const char *val = NULL; - int val_len = 0; - - msgpack_object *k = &p[i].key; - msgpack_object *v = &p[i].val; - - if (k->type != MSGPACK_OBJECT_BIN && k->type != MSGPACK_OBJECT_STR) { - continue; - } - - if (k->type == MSGPACK_OBJECT_STR) { - key = k->via.str.ptr; - key_len = k->via.str.size; - } - else { - key = k->via.bin.ptr; - key_len = k->via.bin.size; - } - - if (v->type == MSGPACK_OBJECT_BOOLEAN) { - val = v->via.boolean ? "true" : "false"; - val_len = v->via.boolean ? 4 : 5; - } - else if (v->type == MSGPACK_OBJECT_POSITIVE_INTEGER) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%" PRIu64, v->via.u64); - } - else if (v->type == MSGPACK_OBJECT_NEGATIVE_INTEGER) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%" PRId64, v->via.i64); - } - else if (v->type == MSGPACK_OBJECT_FLOAT) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%f", v->via.f64); - } - else if (v->type == MSGPACK_OBJECT_STR) { - /* String value */ - val = v->via.str.ptr; - val_len = v->via.str.size; - } - else if (v->type == MSGPACK_OBJECT_BIN) { - /* Bin value */ - val = v->via.bin.ptr; - val_len = v->via.bin.size; - } - - if (!val || !key) { - continue; - } - - tmp = flb_sds_cat(*s, " " , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - - start_len = flb_sds_len(*s); - if (ctx->allow_longer_sd_id != FLB_TRUE && key_len > 32 ) { - /* - * RFC5424 defines - * PARAM-NAME = SD-NAME - * SD-NAME = 1*32PRINTUSASCII - * ; except '=', SP, ']', %d34 (") - * - * https://www.rfc-editor.org/rfc/rfc5424#section-6 - */ - key_len = 32; - } - tmp = flb_sds_cat(*s, key, key_len); - if (!tmp) { - return NULL; - } - *s = tmp; - - end_len = flb_sds_len(*s); - for(n=start_len; n < end_len; n++) { - if (!rfc5424_sp_name[(unsigned char)(*s)[n]]) { - (*s)[n] = '_'; - } - } - - tmp = flb_sds_cat(*s, "=\"" , 2); - if (!tmp) { - return NULL; - } - *s = tmp; - - tmp = flb_sds_cat_esc(*s, val , val_len, - rfc5424_sp_value, sizeof(rfc5424_sp_value)); - if (!tmp) { - return NULL; - } - *s = tmp; - - tmp = flb_sds_cat(*s, "\"" , 1); - if (!tmp) { - return NULL; - } - *s = tmp; - } - } - - tmp = flb_sds_cat(*s, "]" , 1); - if (!tmp) return NULL; - *s = tmp; - - return *s; -} - -static int msgpack_to_syslog(struct flb_syslog *ctx, msgpack_object *o, - struct syslog_msg *msg) -{ - int i; - int loop; - struct mk_list *head; - struct flb_config_map_val *mv; - - if (o == NULL) { - return -1; - } - - loop = o->via.map.size; - if (loop != 0) { - msgpack_object_kv *p = o->via.map.ptr; - - for (i = 0; i < loop; i++) { - char temp[48] = {0}; - const char *key = NULL; - int key_len = 0; - const char *val = NULL; - int val_len = 0; - - msgpack_object *k = &p[i].key; - msgpack_object *v = &p[i].val; - - if (k->type != MSGPACK_OBJECT_BIN && k->type != MSGPACK_OBJECT_STR){ - continue; - } - - if (k->type == MSGPACK_OBJECT_STR) { - key = k->via.str.ptr; - key_len = k->via.str.size; - } - else { - key = k->via.bin.ptr; - key_len = k->via.bin.size; - } - - if (v->type == MSGPACK_OBJECT_MAP) { - if (ctx->sd_keys) { - flb_config_map_foreach(head, mv, ctx->sd_keys) { - if ((key_len == flb_sds_len(mv->val.str)) && - strncmp(key, mv->val.str, flb_sds_len(mv->val.str)) == 0) { - msgpack_to_sd(ctx, &(msg->sd), key, key_len, v); - break; - } - } - } - continue; - } - - if (v->type == MSGPACK_OBJECT_BOOLEAN) { - val = v->via.boolean ? "true" : "false"; - val_len = v->via.boolean ? 4 : 5; - } - else if (v->type == MSGPACK_OBJECT_POSITIVE_INTEGER) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%" PRIu64, v->via.u64); - } - else if (v->type == MSGPACK_OBJECT_NEGATIVE_INTEGER) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%" PRId64, v->via.i64); - } - else if (v->type == MSGPACK_OBJECT_FLOAT) { - val = temp; - val_len = snprintf(temp, sizeof(temp) - 1, - "%f", v->via.f64); - } - else if (v->type == MSGPACK_OBJECT_STR) { - /* String value */ - val = v->via.str.ptr; - val_len = v->via.str.size; - } - else if (v->type == MSGPACK_OBJECT_BIN) { - /* Bin value */ - val = v->via.bin.ptr; - val_len = v->via.bin.size; - } - - if (!val || !key) { - continue; - } - - if ((ctx->severity_key != NULL) && - flb_sds_cmp(ctx->severity_key, key, key_len) == 0) { - if (msg->severity == -1) { - if ((val_len == 1) && (val[0] >= '0' && val[0] <= '7')) { - msg->severity = val[0]-'0'; - } - else { - int i; - for (i=0; syslog_severity[i].name != NULL; i++) { - if ((syslog_severity[i].len == val_len) && - (!strncasecmp(syslog_severity[i].name, val, val_len))) { - msg->severity = syslog_severity[i].value; - } - } - if (!syslog_severity[i].name) { - flb_plg_warn(ctx->ins, "invalid severity: '%.*s'", - val_len, val); - } - } - } - } - else if ((ctx->facility_key != NULL) && - flb_sds_cmp(ctx->facility_key, key, key_len) == 0) { - if (msg->facility == -1) { - if ((val_len == 1) && (val[0] >= '0' && val[0] <= '9')) { - msg->facility = val[0]-'0'; - } - else if ((val_len == 2) && - (val[0] >= '0' && val[0] <= '2') && - (val[1] >= '0' && val[1] <= '9')) { - msg->facility = (val[0]-'0')*10; - msg->facility += (val[1]-'0'); - if (!((msg->facility >= 0) && (msg->facility <=23))) { - flb_plg_warn(ctx->ins, "invalid facility: '%.*s'", - val_len, val); - msg->facility= -1; - } - } - else { - int i; - for (i=0; syslog_facility[i].name != NULL; i++) { - if ((syslog_facility[i].len == val_len) && - (!strncasecmp(syslog_facility[i].name, val, val_len))) { - msg->facility = syslog_facility[i].value; - } - } - if (!syslog_facility[i].name) { - flb_plg_warn(ctx->ins, "invalid facility: '%.*s'", - val_len, val); - } - } - } - } - else if ((ctx->hostname_key != NULL) && - flb_sds_cmp(ctx->hostname_key, key, key_len) == 0) { - if (!msg->hostname) { - msg->hostname = flb_sds_create_len(val, val_len); - } - } - else if ((ctx->appname_key != NULL) && - flb_sds_cmp(ctx->appname_key, key, key_len) == 0) { - if (!msg->appname) { - msg->appname = flb_sds_create_len(val, val_len); - } - } - else if ((ctx->procid_key != NULL) && - flb_sds_cmp(ctx->procid_key, key, key_len) == 0) { - if (!msg->procid) { - msg->procid = flb_sds_create_len(val, val_len); - } - } - else if ((ctx->msgid_key != NULL) && - flb_sds_cmp(ctx->msgid_key, key, key_len) == 0) { - if (!msg->msgid) { - msg->msgid = flb_sds_create_len(val, val_len); - } - } - else if ((ctx->message_key != NULL) && - flb_sds_cmp(ctx->message_key, key, key_len) == 0) { - if (!msg->message) { - msg->message = flb_sds_create_len(val, val_len); - } - } - } - } - - return 0; -} - -static flb_sds_t syslog_format(struct flb_syslog *ctx, msgpack_object *o, - flb_sds_t *s, struct flb_time *tm) -{ - struct syslog_msg msg; - flb_sds_t tmp; - flb_sds_t ret_sds; - int ret; - - msg.severity = -1; - msg.facility = -1; - msg.hostname = NULL; - msg.appname = NULL; - msg.procid = NULL; - msg.msgid = NULL; - msg.sd = NULL; - msg.message = NULL; - - ret = msgpack_to_syslog(ctx, o, &msg); - if (!ret) { - if (msg.severity < 0) { - msg.severity = ctx->severity_preset; - } - if (msg.facility < 0) { - msg.facility = ctx->facility_preset; - } - if (msg.hostname == NULL && ctx->hostname_preset) { - msg.hostname = flb_sds_create(ctx->hostname_preset); - } - if (msg.appname == NULL && ctx->appname_preset) { - msg.appname = flb_sds_create(ctx->appname_preset); - } - if (msg.procid == NULL && ctx->procid_preset) { - msg.procid = flb_sds_create(ctx->procid_preset); - } - if (msg.msgid == NULL && ctx->msgid_preset) { - msg.msgid = flb_sds_create(ctx->msgid_preset); - } - - if (ctx->parsed_format == FLB_SYSLOG_RFC3164) { - tmp = syslog_rfc3164(s, tm, &msg); - } - else { - tmp = syslog_rfc5424(s, tm, &msg); - } - - if (!tmp) { - ret_sds = NULL; - goto clean; - } - *s = tmp; - - if (flb_sds_len(*s) > ctx->maxsize) { - flb_sds_len_set(*s, ctx->maxsize); - } - - if (ctx->parsed_mode != FLB_SYSLOG_UDP) { - tmp = flb_sds_cat(*s, "\n", 1); - if (!tmp) { - ret_sds = NULL; - goto clean; - } - *s = tmp; - } - } - else { - ret_sds = NULL; - goto clean; - } - - ret_sds = *s; -clean: - flb_sds_destroy(msg.hostname); - flb_sds_destroy(msg.appname); - flb_sds_destroy(msg.procid); - flb_sds_destroy(msg.msgid); - flb_sds_destroy(msg.sd); - flb_sds_destroy(msg.message); - - return ret_sds; -} - -static void cb_syslog_flush(struct flb_event_chunk *event_chunk, - struct flb_output_flush *out_flush, - struct flb_input_instance *i_ins, - void *out_context, - struct flb_config *config) -{ - struct flb_syslog *ctx = out_context; - flb_sds_t s; - flb_sds_t tmp; - size_t bytes_sent; - msgpack_object map; - struct flb_connection *u_conn = NULL; - int ret; - struct flb_log_event_decoder log_decoder; - struct flb_log_event log_event; - - if (ctx->parsed_mode != FLB_SYSLOG_UDP) { - u_conn = flb_upstream_conn_get(ctx->u); - if (!u_conn) { - flb_plg_error(ctx->ins, "no upstream connections available"); - FLB_OUTPUT_RETURN(FLB_RETRY); - } - } - - s = flb_sds_create_size(ctx->maxsize); - if (s == NULL) { - FLB_OUTPUT_RETURN(FLB_ERROR); - } - - ret = flb_log_event_decoder_init(&log_decoder, - (char *) event_chunk->data, - event_chunk->size); - - if (ret != FLB_EVENT_DECODER_SUCCESS) { - flb_plg_error(ctx->ins, - "Log event decoder initialization error : %d", ret); - - flb_sds_destroy(s); - - FLB_OUTPUT_RETURN(FLB_RETRY); - } - - while ((ret = flb_log_event_decoder_next( - &log_decoder, - &log_event)) == FLB_EVENT_DECODER_SUCCESS) { - map = *log_event.body; - - flb_sds_len_set(s, 0); - - tmp = syslog_format(ctx, &map, &s, &log_event.timestamp); - if (tmp != NULL) { - s = tmp; - if (ctx->parsed_mode == FLB_SYSLOG_UDP) { - ret = send(ctx->fd, s, flb_sds_len(s), MSG_DONTWAIT | MSG_NOSIGNAL); - if (ret == -1) { - flb_log_event_decoder_destroy(&log_decoder); - flb_sds_destroy(s); - - FLB_OUTPUT_RETURN(FLB_RETRY); - } - } - else { - ret = flb_io_net_write(u_conn, - s, flb_sds_len(s), &bytes_sent); - if (ret == -1) { - flb_errno(); - flb_log_event_decoder_destroy(&log_decoder); - flb_upstream_conn_release(u_conn); - flb_sds_destroy(s); - - FLB_OUTPUT_RETURN(FLB_RETRY); - } - } - } - else { - flb_plg_error(ctx->ins, "error formating message"); - } - } - - flb_sds_destroy(s); - flb_log_event_decoder_destroy(&log_decoder); - - if (ctx->parsed_mode != FLB_SYSLOG_UDP) { - flb_upstream_conn_release(u_conn); - } - - FLB_OUTPUT_RETURN(FLB_OK); -} - -static int cb_syslog_init(struct flb_output_instance *ins, struct flb_config *config, - void *data) -{ - int io_flags; - struct flb_syslog *ctx = NULL; - - /* Set default network configuration */ - flb_output_net_default("127.0.0.1", 514, ins); - - /* Create config context */ - ctx = flb_syslog_config_create(ins, config); - if (ctx == NULL) { - flb_plg_error(ins, "error configuring plugin"); - return -1; - } - - if (ctx->maxsize < 0) { - if (ctx->parsed_format == FLB_SYSLOG_RFC3164) { - ctx->maxsize = RFC3164_MAXSIZE; - } - else { - ctx->maxsize = RFC5424_MAXSIZE; - } - } - - ctx->fd = -1; - if (ctx->parsed_mode == FLB_SYSLOG_UDP) { - ctx->fd = flb_net_udp_connect(ins->host.name, ins->host.port, - ins->net_setup.source_address); - if (ctx->fd < 0) { - flb_syslog_config_destroy(ctx); - return -1; - } - } - else { - - /* use TLS ? */ - if (ins->use_tls == FLB_TRUE) { - io_flags = FLB_IO_TLS; - } - else { - io_flags = FLB_IO_TCP; - } - - if (ins->host.ipv6 == FLB_TRUE) { - io_flags |= FLB_IO_IPV6; - } - - ctx->u = flb_upstream_create(config, ins->host.name, ins->host.port, - io_flags, ins->tls); - if (!(ctx->u)) { - flb_syslog_config_destroy(ctx); - return -1; - } - flb_output_upstream_set(ctx->u, ins); - } - - /* Set the plugin context */ - flb_output_set_context(ins, ctx); - - flb_plg_info(ctx->ins, "setup done for %s:%i (TLS=%s)", - ins->host.name, ins->host.port, - ins->use_tls ? "on" : "off"); - return 0; -} - -static int cb_syslog_exit(void *data, struct flb_config *config) -{ - struct flb_syslog *ctx = data; - - if (ctx == NULL) { - return 0; - } - - if (ctx->u) { - flb_upstream_destroy(ctx->u); - } - - if (ctx->fd > 0) { - close(ctx->fd); - } - - flb_syslog_config_destroy(ctx); - - return 0; -} - - -/* for testing */ -static int cb_syslog_format_test(struct flb_config *config, - struct flb_input_instance *ins, - void *plugin_context, - void *flush_ctx, - int event_type, - const char *tag, int tag_len, - const void *data, size_t bytes, - void **out_data, size_t *out_size) -{ - struct flb_syslog *ctx = plugin_context; - flb_sds_t tmp; - flb_sds_t s; - msgpack_object map; - struct flb_log_event_decoder log_decoder; - struct flb_log_event log_event; - int ret; - - s = flb_sds_create_size(ctx->maxsize); - if (s == NULL) { - flb_error("flb_sds_create_size failed"); - return -1; - } - - ret = flb_log_event_decoder_init(&log_decoder, (char *) data, bytes); - - if (ret != FLB_EVENT_DECODER_SUCCESS) { - flb_plg_error(ctx->ins, - "Log event decoder initialization error : %d", ret); - - flb_sds_destroy(s); - - return -1; - } - - flb_log_event_decoder_next(&log_decoder, &log_event); - ret = flb_log_event_decoder_get_last_result(&log_decoder); - if (ret != FLB_EVENT_DECODER_SUCCESS) { - flb_error("msgpack_unpack_next failed"); - - flb_log_event_decoder_destroy(&log_decoder); - - return -1; - } - - map = *log_event.body; - flb_sds_len_set(s, 0); - tmp = syslog_format(ctx, &map, &s, &log_event.timestamp); - - flb_log_event_decoder_destroy(&log_decoder); - - if (tmp == NULL) { - flb_error("syslog_fromat returns NULL"); - return -1; - } - - *out_data = tmp; - *out_size = flb_sds_len(tmp); - - return 0; -} - -/* Configuration properties map */ -static struct flb_config_map config_map[] = { - { - FLB_CONFIG_MAP_STR, "mode", "udp", - 0, FLB_TRUE, offsetof(struct flb_syslog, mode), - "Set the desired transport type, the available options are tcp and udp. If you need to " - "use a TLS secure channel, choose 'tcp' mode here and enable the 'tls' option separately." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_format", "rfc5424", - 0, FLB_TRUE, offsetof(struct flb_syslog, format), - "Specify the Syslog protocol format to use, the available options are rfc3164 " - "and rfc5424." - }, - - { - FLB_CONFIG_MAP_SIZE, "syslog_maxsize", "0", - 0, FLB_TRUE, offsetof(struct flb_syslog, maxsize), - "Set the maximum size allowed per message. The value must be only integers " - "representing the number of bytes allowed. If no value is provided, the " - "default size is set depending of the protocol version specified by " - "syslog_format , rfc3164 sets max size to 1024 bytes, while rfc5424 sets " - "the size to 2048 bytes." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_severity_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, severity_key), - "Specify the name of the key from the original record that contains the Syslog " - "severity number. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_INT, "syslog_severity_preset", "6", - 0, FLB_TRUE, offsetof(struct flb_syslog, severity_preset), - "Specify the preset severity number. It must be 0-7. " - " This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_facility_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, facility_key), - "Specify the name of the key from the original record that contains the Syslog " - "facility number. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_INT, "syslog_facility_preset", "1", - 0, FLB_TRUE, offsetof(struct flb_syslog, facility_preset), - "Specify the preset facility number. It must be 0-23. " - " This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_hostname_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, hostname_key), - "Specify the key name from the original record that contains the hostname that " - "generated the message. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_hostname_preset", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, hostname_preset), - "Specify the preset hostname. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_appname_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, appname_key), - "Specify the key name from the original record that contains the application " - "name that generated the message. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_appname_preset", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, appname_preset), - "Specify the preset appname. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_procid_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, procid_key), - "Specify the key name from the original record that contains the Process ID " - "that generated the message. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_procid_preset", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, procid_preset), - "Specify the preset procid. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_msgid_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, msgid_key), - "Specify the key name from the original record that contains the Message ID " - "associated to the message. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_msgid_preset", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, msgid_preset), - "Specify the preset msgid. This configuration is optional." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_sd_key", NULL, - FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_syslog, sd_keys), - "Specify the key name from the original record that contains the " - "Structured Data (SD) content. If set, the value of the key must be a map." - "This option can be set multiple times." - }, - - { - FLB_CONFIG_MAP_STR, "syslog_message_key", NULL, - 0, FLB_TRUE, offsetof(struct flb_syslog, message_key), - "Specify the key name that contains the message to deliver. Note that if " - "this property is mandatory, otherwise the message will be empty." - }, - - { - FLB_CONFIG_MAP_BOOL, "allow_longer_sd_id", "false", - 0, FLB_TRUE, offsetof(struct flb_syslog, allow_longer_sd_id), - "If true, Fluent-bit allows SD-ID that is longer than 32 characters. " - "Such long SD-ID violates RFC 5424." - }, - - /* EOF */ - {0} -}; - -/* Plugin reference */ -struct flb_output_plugin out_syslog_plugin = { - .name = "syslog", - .description = "Syslog", - .cb_init = cb_syslog_init, - .cb_pre_run = NULL, - .cb_flush = cb_syslog_flush, - .cb_exit = cb_syslog_exit, - - /* Configuration */ - .config_map = config_map, - - /* for testing */ - .test_formatter.callback = cb_syslog_format_test, - - /* Plugin flags */ - .flags = FLB_OUTPUT_NET | FLB_IO_OPT_TLS, -}; |