/* -*- 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 #include #include #include #include #include #include #include /* Create a new Upstream Node context */ struct flb_upstream_node *flb_upstream_node_create(flb_sds_t name, flb_sds_t host, flb_sds_t port, int tls, int tls_verify, int tls_debug, const char *tls_vhost, const char *tls_ca_path, const char *tls_ca_file, const char *tls_crt_file, const char *tls_key_file, const char *tls_key_passwd, struct flb_hash_table *ht, struct flb_config *config) { int i_port; int io_flags; char tmp[255]; struct flb_upstream_node *node; if (!host || !port) { return NULL; } /* port */ i_port = atoi(port); /* Allocate node context */ node = flb_calloc(1, sizeof(struct flb_upstream_node)); if (!node) { flb_errno(); return NULL; } /* Set node name */ if (!name) { /* compose a name using given host and port */ snprintf(tmp, sizeof(tmp) - 1, "%s:%s", host, port); node->name = flb_sds_create(tmp); } else { node->name = name; } /* host */ node->host = host; if (!node->host) { flb_upstream_node_destroy(node); return NULL; } /* port */ node->port = port; if (!node->port) { flb_upstream_node_destroy(node); return NULL; } #ifdef FLB_HAVE_TLS /* tls: ca path */ node->tls_ca_path = flb_sds_create(tls_ca_path); if (!node->tls_ca_path) { flb_upstream_node_destroy(node); return NULL; } /* tls: ca file */ node->tls_ca_file = flb_sds_create(tls_ca_file); if (!node->tls_ca_file) { flb_upstream_node_destroy(node); return NULL; } /* tls: crt file */ node->tls_crt_file = flb_sds_create(tls_crt_file); if (!node->tls_crt_file) { flb_upstream_node_destroy(node); return NULL; } /* tls: key file */ node->tls_key_file = flb_sds_create(tls_key_file); if (!node->tls_key_file) { flb_upstream_node_destroy(node); return NULL; } /* tls: key passwd */ node->tls_key_passwd = flb_sds_create(tls_key_passwd); if (!node->tls_key_passwd) { flb_upstream_node_destroy(node); return NULL; } #endif /* hash table */ node->ht = ht; #ifdef FLB_HAVE_TLS /* TLS setup */ if (tls == FLB_TRUE) { node->tls = flb_tls_create(FLB_TLS_CLIENT_MODE, tls_verify, tls_debug, tls_vhost, tls_ca_path, tls_ca_file, tls_crt_file, tls_key_file, tls_key_passwd); if (!node->tls) { flb_error("[upstream_node] error initializing TLS context " "on node '%s'", name); flb_upstream_node_destroy(node); return NULL; } node->tls_enabled = FLB_TRUE; } #endif /* Upstream flags */ if (tls == FLB_TRUE) { io_flags = FLB_IO_TLS; } else { io_flags = FLB_IO_TCP; } /* upstream context */ node->u = flb_upstream_create(config, node->host, i_port, io_flags, node->tls); if (!node->u) { flb_error("[upstream_node] error creating upstream context " "for node '%s'", name); flb_upstream_node_destroy(node); return NULL; } return node; } const char *flb_upstream_node_get_property(const char *prop, struct flb_upstream_node *node) { int ret; int len; void *value; size_t size; len = strlen(prop); ret = flb_hash_table_get(node->ht, prop, len, &value, &size); if (ret == -1) { return NULL; } return (char *) value; } void flb_upstream_node_destroy(struct flb_upstream_node *node) { flb_sds_destroy(node->name); flb_sds_destroy(node->host); flb_sds_destroy(node->port); flb_hash_table_destroy(node->ht); if (node->u) { flb_upstream_destroy(node->u); } #ifdef FLB_HAVE_TLS flb_sds_destroy(node->tls_ca_path); flb_sds_destroy(node->tls_ca_file); flb_sds_destroy(node->tls_crt_file); flb_sds_destroy(node->tls_key_file); flb_sds_destroy(node->tls_key_passwd); if (node->tls) { flb_tls_destroy(node->tls); } #endif /* note: node link must be handled by the caller before this call */ flb_free(node); }