Skip to content

Commit 72499d0

Browse files
committed
[out_oracle_log_analytics] feat: Implement IMDS authentication, chunking
- Added Oracle Instance Metadata Service (IMDS) authentication, certificate, and key retrieval - Implemented log chunking for efficient data handling and transmission - Added timezone support for accurate timestamp processing - Enhanced credential parsing and metadata extraction - Improved error handling and debug logging Signed-off-by: rghouzra <[email protected]> fixx size parameter in hash table addition Signed-off-by: reda ghouzraf <[email protected]> fix: improve error handling and cleanup Signed-off-by: rghouzra <[email protected]> replace cjson with jsmn Signed-off-by: reda ghouzraf <[email protected]> replace cjson include with jsmn Signed-off-by: reda ghouzraf <[email protected]> fix centos jobs failure Signed-off-by: rghouzra <[email protected]> update base64 encoding and improve error handling Signed-off-by: rghouzra <[email protected]> enhance openssl compatibility Signed-off-by: rghouzra <[email protected]> enhance openssl comptability Signed-off-by: rghouzra <[email protected]> improve error handling in federation handling Signed-off-by: rghouzra <[email protected]> refactor of ocid extraction logic Signed-off-by: rghouzra <[email protected]> feat: Add tests for oracle logan output plugin Signed-off-by: rghouzra <[email protected]> [out_oracle_log_analytics] update tenancy extraction in test mode Signed-off-by: rghouzra <[email protected]> [out_oracle_log_analytics] enhance test mode Signed-off-by: rghouzra <[email protected]> fix:improve error handling in test Signed-off-by: rghouzra <[email protected]> fix: enhance resource cleanup Signed-off-by: rghouzra <[email protected]> fix: add resource cleanup for leaf certificate Signed-off-by: rghouzra <[email protected]> fix: improve code formatting Signed-off-by: rghouzra <[email protected]> [out_oracle_log_analytics] refactor OCI_logan plugin code for clarity and consistency Signed-off-by: rghouzra <[email protected]> improve code formatting and line break Signed-off-by: rghouzra <[email protected]>
1 parent 964ebca commit 72499d0

File tree

8 files changed

+3767
-556
lines changed

8 files changed

+3767
-556
lines changed
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
set(src
2-
oci_logan.c
3-
oci_logan_conf.c
4-
)
2+
oci_logan.c
3+
oci_logan_conf.c
4+
oci_logan_helper.c
5+
)
56

67
FLB_PLUGIN(out_oracle_log_analytics "${src}" "")

plugins/out_oracle_log_analytics/oci_logan.c

Lines changed: 1147 additions & 351 deletions
Large diffs are not rendered by default.

plugins/out_oracle_log_analytics/oci_logan.h

Lines changed: 112 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@
7878
#define FLB_OCI_MATCH_PREFIX "oci_match_"
7979
#define FLB_OCI_MATCH_PREFIX_SIZE sizeof(FLB_OCI_MATCH_PREFIX)-1
8080

81+
#define FLB_OCI_LOG_TIMEZONE_KEY "oci_la_timezone"
82+
#define FLB_OCI_LOG_TIMEZONE_KEY_SIZE sizeof(FLB_OCI_LOG_TIMEZONE_KEY) - 1
83+
84+
#define FLB_OCI_LOG_TIMEZONE "timezone"
85+
#define FLB_OCI_LOG_TIMEZONE_SIZE sizeof(FLB_OCI_LOG_TIMEZONE) - 1
86+
8187
#ifdef FLB_HAVE_REGEX
8288
#define FLB_OCI_MATCH_REGEX_PREFIX "oci_match_regex_"
8389
#define FLB_OCI_MATCH_REGEX_PREFIX_SIZE sizeof(FLB_OCI_MATCH_REGEX_PREFIX)-1
@@ -97,7 +103,7 @@
97103
#define FLB_OCI_PARAM_INCLUDE_COLLECT_TIME "include_collect_time"
98104
#define FLB_OCI_PARAM_INCLUDE_COLLECT_TIME_SIZE sizeof(FLB_OCI_PARAM_INCLUDE_COLLECT_TIME)-1
99105

100-
#define FLB_OCI_MATCH_ID_MAX 1000 // TO avoid too large memory allocation
106+
#define FLB_OCI_MATCH_ID_MAX 1000 // TO avoid too large memory allocation
101107

102108
#define FLB_OCI_DEFAULT_COLLECT_TIME "oci_collect_time"
103109
#define FLB_OCI_DEFAULT_COLLECT_TIME_SIZE sizeof(FLB_OCI_DEFAULT_COLLECT_TIME)-1
@@ -150,13 +156,53 @@
150156
#define FLB_OCI_ERROR_CODE_TOO_MANY_REQUESTS "TooManyRequests"
151157
#define FLB_OCI_ERROR_CODE_INTERNAL_SERVER_ERROR "InternalServerError"
152158

159+
/* for imds request*/
160+
#define ORACLE_IMDS_HOST "169.254.169.254"
161+
#define ORACLE_IMDS_BASE_URL "/opc/v2"
162+
#define ORACLE_IMDS_REGION_PATH "/instance/region"
163+
#define ORACLE_IMDS_LEAF_CERT_PATH "/identity/cert.pem"
164+
#define ORACLE_IMDS_LEAF_KEY_PATH "/identity/key.pem"
165+
#define ORACLE_IMDS_INTERMEDIATE_CERT_PATH "/identity/intermediate.pem"
166+
#define ORACLE_AUTH_HEADER "Authorization: Bearer Oracle"
167+
#define ORACLE_IMDS_TOKEN_PATH "/opc/v2/instancePrincipal/token"
168+
169+
170+
#define COUNT_OF_REGION (sizeof(region_mappings) / sizeof(region_mappings[0]) - 1)
171+
172+
/* for chunking */
173+
#define MAX_PAYLOAD_SIZE_BYTES (3800000) // 3.8 mb
174+
153175
#include <fluent-bit/flb_upstream.h>
154176
#include <fluent-bit/flb_sds.h>
155177
#include <fluent-bit/flb_record_accessor.h>
156178
#include <fluent-bit/flb_hash_table.h>
179+
#include <fluent-bit/flb_output_plugin.h>
180+
#include <fluent-bit/flb_upstream.h>
181+
#include <fluent-bit/flb_upstream_conn.h>
182+
#include <fluent-bit/flb_http_client.h>
183+
#include <fluent-bit/flb_log_event_decoder.h>
184+
#include <fluent-bit/flb_hash_table.h>
185+
#include <fluent-bit/flb_pack.h>
186+
#include <fluent-bit/flb_crypto.h>
187+
#include <fluent-bit/flb_base64.h>
188+
#include <fluent-bit/flb_hash.h>
189+
#include <fluent-bit/flb_sds.h>
157190
#include <monkey/mk_core/mk_list.h>
158-
159-
struct metadata_obj {
191+
#include <fluent-bit/flb_jsmn.h>
192+
#include <openssl/evp.h>
193+
#include <openssl/pem.h>
194+
#include <openssl/bio.h>
195+
#include <openssl/buffer.h>
196+
#include <openssl/opensslv.h>
197+
#include <openssl/err.h>
198+
#include <openssl/x509v3.h>
199+
#include <openssl/x509.h>
200+
#include <openssl/rsa.h>
201+
#include <msgpack.h>
202+
#include <string.h>
203+
204+
struct metadata_obj
205+
{
160206
flb_sds_t key;
161207
flb_sds_t val;
162208
struct mk_list _head;
@@ -165,23 +211,65 @@ struct metadata_obj {
165211

166212
struct flb_oci_error_response
167213
{
168-
flb_sds_t code;
169-
flb_sds_t message;
214+
flb_sds_t code;
215+
flb_sds_t message;
216+
};
217+
218+
struct flb_oracle_imds
219+
{
220+
flb_sds_t region;
221+
flb_sds_t leaf_cert;
222+
flb_sds_t leaf_key;
223+
flb_sds_t intermediate_cert;
224+
flb_sds_t tenancy_ocid;
225+
flb_sds_t fingerprint;
226+
flb_sds_t session_pubkey;
227+
flb_sds_t session_privkey;
228+
struct flb_upstream *upstream;
229+
struct flb_output_instance *ins;
170230
};
171231

172-
struct flb_oci_logan {
232+
struct oci_security_token
233+
{
234+
flb_sds_t token;
235+
time_t expires_at;
236+
flb_sds_t session_privkey;
237+
};
238+
239+
typedef struct
240+
{
241+
const char *region;
242+
const char *realm;
243+
} region_realm_mapping_t;
244+
245+
typedef struct
246+
{
247+
const char *short_name;
248+
const char *long_name;
249+
} region_mapping_t;
250+
251+
typedef struct
252+
{
253+
const char *realm_code;
254+
const char *domain_suffix;
255+
} realm_mapping_t;
256+
257+
struct flb_oci_logan
258+
{
173259
flb_sds_t namespace;
174260
flb_sds_t config_file_location;
175261
flb_sds_t profile_name;
176262
int oci_config_in_record;
177263
flb_sds_t uri;
178264

265+
char *domain_suffix;
179266
struct flb_upstream *u;
180267
flb_sds_t proxy;
181268
char *proxy_host;
182269
int proxy_port;
183270

184271
// oci_la_* configs
272+
185273
flb_sds_t oci_la_entity_id;
186274

187275
flb_sds_t oci_la_entity_type;
@@ -194,22 +282,37 @@ struct flb_oci_logan {
194282

195283
flb_sds_t oci_la_log_set_id;
196284

285+
flb_sds_t oci_la_timezone;
286+
197287
struct mk_list *oci_la_global_metadata;
198288
struct mk_list global_metadata_fields;
199289
struct mk_list *oci_la_metadata;
200290
struct mk_list log_event_metadata_fields;
201291

202-
// config_file
292+
// config_file
203293
flb_sds_t user;
204294
flb_sds_t region;
205295
flb_sds_t tenancy;
206296
flb_sds_t key_fingerprint;
207297
flb_sds_t key_file;
208298
/* For OCI signing */
209-
flb_sds_t key_id; // tenancy/user/key_fingerprint
299+
flb_sds_t key_id; // tenancy/user/key_fingerprint
210300
flb_sds_t private_key;
211-
212301
struct flb_output_instance *ins;
213302

303+
// instance prinicipal auth
304+
struct flb_oracle_imds imds;
305+
EVP_PKEY *session_key_pair;
306+
struct oci_security_token security_token;
307+
char *auth_type;
308+
309+
// dump payload
310+
char *payload_files_location;
311+
bool dump_payload_file;
214312
};
313+
314+
int is_valid_timezone(const char *log_timezone);
315+
const char *get_domain_suffix_for_realm(const char *realm);
316+
const char *determine_realm_from_region(const char *region);
317+
const char *long_region_name(char *short_region_name);
215318
#endif

0 commit comments

Comments
 (0)