static void _test_legacy_error(void) { afmongodb_dd_set_safe_mode(mongodb, FALSE); afmongodb_dd_set_uri(mongodb, "mongodb://127.0.0.1:27017/syslog"); _expect_error_in_log("uri_safe_mode", "Error: either specify a MongoDB URI " "(and optional collection) or only legacy options;"); afmongodb_dd_set_host(mongodb, "?"); _expect_error_in_log("host_invalid", "Cannot parse MongoDB URI; uri="); afmongodb_dd_set_host(mongodb, ""); _expect_error_in_log("host_none", "Cannot parse the primary host; primary=\'\'"); afmongodb_dd_set_host(mongodb, "localhost,127.0.0.1"); _expect_error_in_log("host_multi", "Multiple hosts found in MongoDB URI; uri="); GList *servers = g_list_append(NULL, g_strdup("localhost,127.0.0.1")); afmongodb_dd_set_servers(mongodb, servers); _expect_error_in_log("servers_multi", "Multiple hosts found in MongoDB URI; uri="); servers = g_list_append(NULL, g_strdup("")); afmongodb_dd_set_servers(mongodb, servers); _expect_error_in_log("servers_none", "Cannot parse MongoDB URI; uri="); afmongodb_dd_set_password(mongodb, "password"); _expect_error_in_log("missing_user", "Neither the username, nor the password can be empty;"); afmongodb_dd_set_user(mongodb, "user"); _expect_error_in_log("missing_password", "Neither the username, nor the password can be empty;"); }
LogDriver * afmongodb_dd_new(void) { MongoDBDestDriver *self = g_new0(MongoDBDestDriver, 1); mongo_util_oid_init (0); log_dest_driver_init_instance(&self->super); self->super.super.super.init = afmongodb_dd_init; self->super.super.super.deinit = afmongodb_dd_deinit; self->super.super.super.queue = afmongodb_dd_queue; self->super.super.super.free_fn = afmongodb_dd_free; afmongodb_dd_set_servers((LogDriver *)self, g_list_append (NULL, g_strdup ("127.0.0.1:27017"))); afmongodb_dd_set_database((LogDriver *)self, "syslog"); afmongodb_dd_set_collection((LogDriver *)self, "messages"); afmongodb_dd_set_safe_mode((LogDriver *)self, FALSE); init_sequence_number(&self->seq_num); self->writer_thread_wakeup_cond = g_cond_new(); self->suspend_mutex = g_mutex_new(); self->queue_mutex = g_mutex_new(); return (LogDriver *)self; }
static gboolean afmongodb_dd_init(LogPipe *s) { MongoDBDestDriver *self = (MongoDBDestDriver *)s; GlobalConfig *cfg = log_pipe_get_config(s); ValuePairsTransformSet *vpts; if (!log_dest_driver_init_method(s)) return FALSE; log_template_options_init(&self->template_options, cfg); /* Always replace a leading dot with an underscore. */ vpts = value_pairs_transform_set_new(".*"); value_pairs_transform_set_add_func(vpts, value_pairs_new_transform_replace_prefix(".", "_")); value_pairs_add_transforms(self->vp, vpts); if (self->port != MONGO_CONN_LOCAL) { if (self->address) { gchar *srv = g_strdup_printf ("%s:%d", self->address, (self->port) ? self->port : 27017); self->servers = g_list_prepend (self->servers, srv); g_free (self->address); } if (!self->servers) afmongodb_dd_set_servers((LogDriver *)self, g_list_append (NULL, g_strdup ("127.0.0.1:27017"))); self->address = NULL; self->port = 27017; if (!mongo_util_parse_addr(g_list_nth_data(self->servers, 0), &self->address, &self->port)) { msg_error("Cannot parse the primary host", evt_tag_str("primary", g_list_nth_data(self->servers, 0)), NULL); return FALSE; } } if (self->port == MONGO_CONN_LOCAL) msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), NULL); else msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_int("port", self->port), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), NULL); return log_threaded_dest_driver_start(s); }
static void _test_legacy_correct(void) { GList *servers = g_list_append(NULL, g_strdup("127.0.0.2:27018")); servers = g_list_append(servers, g_strdup("localhost:1234")); afmongodb_dd_set_servers(mongodb, servers); _expect_uri_in_log("servers_multi", "127.0.0.2:27018,localhost:1234/syslog" SAFEOPTS, "syslog", "messages"); servers = g_list_append(NULL, g_strdup("127.0.0.2")); afmongodb_dd_set_servers(mongodb, servers); _expect_uri_in_log("servers_single", "127.0.0.2:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_host(mongodb, "localhost"); _expect_uri_in_log("host", "localhost:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_host(mongodb, "localhost"); afmongodb_dd_set_port(mongodb, 1234); _expect_uri_in_log("host_port", "localhost:1234/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_port(mongodb, 27017); _expect_uri_in_log("port_default", "127.0.0.1:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_port(mongodb, 1234); _expect_uri_in_log("port", "127.0.0.1:1234/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_path(mongodb, "/tmp/mongo.sock"); _expect_uri_in_log("path", "/tmp/mongo.sock" SAFEOPTS, "tmp/mongo.sock", "messages"); afmongodb_dd_set_database(mongodb, "syslog-ng"); _expect_uri_in_log("database", "127.0.0.1:27017/syslog-ng" SAFEOPTS, "syslog-ng", "messages"); afmongodb_dd_set_safe_mode(mongodb, TRUE); _expect_uri_in_log("safe_mode_true", "127.0.0.1:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_safe_mode(mongodb, FALSE); _expect_uri_in_log("safe_mode_false", "127.0.0.1:27017/syslog" UNSAFEOPTS, "syslog", "messages"); afmongodb_dd_set_user(mongodb, "user"); afmongodb_dd_set_password(mongodb, "password"); _expect_uri_in_log("user_password", "user:[email protected]:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_collection(mongodb, "messages2"); afmongodb_dd_set_safe_mode(mongodb, FALSE); _expect_uri_in_log("collection_safe_mode", "127.0.0.1:27017/syslog" UNSAFEOPTS, "syslog", "messages2"); afmongodb_dd_set_user(mongodb, ""); afmongodb_dd_set_password(mongodb, "password"); _expect_uri_in_log("empty_user", ":[email protected]:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_user(mongodb, "user"); afmongodb_dd_set_password(mongodb, ""); _expect_uri_in_log("empty_password", "user:@127.0.0.1:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_user(mongodb, ""); afmongodb_dd_set_password(mongodb, ""); _expect_uri_in_log("empty_user_password", ":@127.0.0.1:27017/syslog" SAFEOPTS, "syslog", "messages"); afmongodb_dd_set_user(mongodb, "127.0.0.1:27017/syslog?dont-care="); afmongodb_dd_set_password(mongodb, ""); _expect_uri_in_log("hijacked_user", "127.0.0.1:27017/syslog?dont-care=:@127.0.0.1:27017/syslog" SAFEOPTS, "syslog", "messages"); }
static gboolean afmongodb_dd_init(LogPipe *s) { MongoDBDestDriver *self = (MongoDBDestDriver *)s; GlobalConfig *cfg = log_pipe_get_config(s); ValuePairsTransformSet *vpts; if (!log_dest_driver_init_method(s)) return FALSE; if (cfg) self->time_reopen = cfg->time_reopen; if (!self->vp) { self->vp = value_pairs_new(); value_pairs_add_scope(self->vp, "selected-macros"); value_pairs_add_scope(self->vp, "nv-pairs"); } /* Always replace a leading dot with an underscore. */ vpts = value_pairs_transform_set_new(".*"); value_pairs_transform_set_add_func(vpts, value_pairs_new_transform_replace(".", "_")); value_pairs_add_transforms(self->vp, vpts); if (self->port != MONGO_CONN_LOCAL) { if (self->address) { gchar *srv = g_strdup_printf ("%s:%d", self->address, (self->port) ? self->port : 27017); self->servers = g_list_prepend (self->servers, srv); g_free (self->address); } if (!self->servers) afmongodb_dd_set_servers((LogDriver *)self, g_list_append (NULL, g_strdup ("127.0.0.1:27017"))); self->address = NULL; self->port = 27017; if (!mongo_util_parse_addr(g_list_nth_data(self->servers, 0), &self->address, &self->port)) { msg_error("Cannot parse the primary host", evt_tag_str("primary", g_list_nth_data(self->servers, 0)), NULL); return FALSE; } } if (self->port == MONGO_CONN_LOCAL) msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), NULL); else msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_int("port", self->port), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), NULL); self->queue = log_dest_driver_acquire_queue(&self->super, afmongodb_dd_format_persist_name(self)); stats_lock(); stats_register_counter(0, SCS_MONGODB | SCS_DESTINATION, self->super.super.id, afmongodb_dd_format_stats_instance(self), SC_TYPE_STORED, &self->stored_messages); stats_register_counter(0, SCS_MONGODB | SCS_DESTINATION, self->super.super.id, afmongodb_dd_format_stats_instance(self), SC_TYPE_DROPPED, &self->dropped_messages); stats_unlock(); log_queue_set_counters(self->queue, self->stored_messages, self->dropped_messages); afmongodb_dd_start_thread(self); return TRUE; }
static gboolean afmongodb_dd_init(LogPipe *s) { MongoDBDestDriver *self = (MongoDBDestDriver *)s; GlobalConfig *cfg = log_pipe_get_config(s); if (!log_dest_driver_init_method(s)) return FALSE; log_template_options_init(&self->template_options, cfg); if (!afmongodb_dd_check_auth_options(self)) return FALSE; afmongodb_dd_init_value_pairs_dot_to_underscore_transformation(self); if (self->port != MONGO_CONN_LOCAL) { if (self->address) { gchar *srv = g_strdup_printf ("%s:%d", self->address, (self->port) ? self->port : 27017); self->servers = g_list_prepend (self->servers, srv); g_free (self->address); } if (self->servers) { GList *l; for (l=self->servers; l; l = g_list_next(l)) { gchar *host = NULL; gint port = 27017; if (!mongo_util_parse_addr(l->data, &host, &port)) { msg_warning("Cannot parse MongoDB server address, ignoring", evt_tag_str("address", l->data), evt_tag_str("driver", self->super.super.super.id), NULL); continue; } mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, host, port); msg_verbose("Added MongoDB server seed", evt_tag_str("host", host), evt_tag_int("port", port), evt_tag_str("driver", self->super.super.super.id), NULL); g_free(host); } } else { afmongodb_dd_set_servers((LogDriver *)self, g_list_append (NULL, g_strdup ("127.0.0.1:27017"))); mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, "127.0.0.1", 27017); } self->address = NULL; self->port = 27017; if (!mongo_util_parse_addr(g_list_nth_data(self->servers, 0), &self->address, &self->port)) { msg_error("Cannot parse the primary host", evt_tag_str("primary", g_list_nth_data(self->servers, 0)), evt_tag_str("driver", self->super.super.super.id), NULL); return FALSE; } } else { mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, self->address, self->port); } if (self->port == MONGO_CONN_LOCAL) msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), evt_tag_str("driver", self->super.super.super.id), NULL); else msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_int("port", self->port), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), evt_tag_str("driver", self->super.super.super.id), NULL); return log_threaded_dest_driver_start(s); }