summaryrefslogtreecommitdiffstats
path: root/plugins/ommongodb
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ommongodb')
-rw-r--r--plugins/ommongodb/Makefile.am8
-rw-r--r--plugins/ommongodb/README17
-rw-r--r--plugins/ommongodb/ommongodb.c176
3 files changed, 95 insertions, 106 deletions
diff --git a/plugins/ommongodb/Makefile.am b/plugins/ommongodb/Makefile.am
index 1b0e23a1..3a05c435 100644
--- a/plugins/ommongodb/Makefile.am
+++ b/plugins/ommongodb/Makefile.am
@@ -1,11 +1,7 @@
-mongodir = ./mongo-c-driver/src
pkglib_LTLIBRARIES = ommongodb.la
-
ommongodb_la_SOURCES = ommongodb.c
-ommongodb_la_SOURCES += $(mongodir)/bson.c $(mongodir)/mongo.c $(mongodir)/md5.c $(mongodir)/numbers.c
-
-ommongodb_la_CPPFLAGS = -DMONGO_HAVE_STDINT -Imongo-c-driver/src $(RSRT_CFLAGS) $(PTHREADS_CFLAGS)
+ommongodb_la_CPPFLAGS = $(RSRT_CFLAGS) $(PTHREADS_CFLAGS) $(LIBMONGO_CLIENT_CFLAGS)
ommongodb_la_LDFLAGS = -module -avoid-version
-ommongodb_la_LIBADD =
+ommongodb_la_LIBADD = $(LIBMONGO_CLIENT_LIBS)
EXTRA_DIST =
diff --git a/plugins/ommongodb/README b/plugins/ommongodb/README
index cea3f3bc..445e525c 100644
--- a/plugins/ommongodb/README
+++ b/plugins/ommongodb/README
@@ -2,6 +2,21 @@ plugin to use MongoDB as backend.
tested in ubuntu 10.04 and ubuntu 10.10
+BUILDING THIS PLUGIN
+Right now, it seems to be necessary to copy the 10gen c-driver directly under
+the ./plugins/ommongodb subdirectory. Then, you need to follow their build
+instructions on how to build the mongodb c driver:
+http://api.mongodb.org/c/current/building.html
+
+This is clumpsy, and if someone has ideas on how to improve this situation,
+please drop us a line. For obvious reasons, ./configure does not detect
+a missing mongodb c driver.
+
+In order to successfully build ommongodb, you NEED to use the v0.2 version of
+the mongo c driver. As it looks, the driver breaks API compatibility and the
+curret v0.4 driver seems to have a totally different API (at least this is
+what I currently (2012-03-08) see.
+
configuration:
in your /etc/rsyslog.conf, together with other modules:
@@ -21,3 +36,5 @@ refactor my code :-)
email Victor Pereira <victor.pereira@bigrails.com>
twitter twitter.com/vpereira
+
+part of this doc by Rainer Gerhards <rgerhards@adiscon.com>
diff --git a/plugins/ommongodb/ommongodb.c b/plugins/ommongodb/ommongodb.c
index 8e19105f..4874ddff 100644
--- a/plugins/ommongodb/ommongodb.c
+++ b/plugins/ommongodb/ommongodb.c
@@ -1,3 +1,28 @@
+/* ommongodb.c
+ * Output module for mongodb.
+ * Note: this module uses the libmongo-client library. The original 10gen
+ * mongodb C interface is crap. Obtain the library here:
+ * https://github.com/algernon/libmongo-client
+ *
+ * Copyright 2007-2012 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+ * 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
+ * -or-
+ * see COPYING.ASL20 in the source distribution
+ *
+ * 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 "config.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -6,9 +31,8 @@
#include <assert.h>
#include <signal.h>
#include <time.h>
-#include "bson.h"
-#include "mongo.h"
-#include "config.h"
+#include <mongo.h>
+
#include "rsyslog.h"
#include "conf.h"
#include "syslogd-types.h"
@@ -17,7 +41,6 @@
#include "module-template.h"
#include "errmsg.h"
#include "cfsysline.h"
-#include "mongo-c-driver/src/mongo.h"
#define countof(X) ( (size_t) ( sizeof(X)/sizeof*(X) ) )
@@ -31,20 +54,25 @@
#define MONGO_COLLECTION_NAME_SIZE 128
MODULE_TYPE_OUTPUT
+MODULE_TYPE_NOKEEP
+MODULE_CNFNAME("ommongodb")
/* internal structures
*/
DEF_OMOD_STATIC_DATA
DEFobjCurrIf(errmsg)
typedef struct _instanceData {
- mongo_connection conn[1]; /* ptr */
+ mongo_sync_connection *conn;
+ // OLD:
+#if 0
mongo_connection_options opts[1];
mongo_conn_return status;
+#endif
char db[MONGO_DB_NAME_SIZE];
char collection[MONGO_COLLECTION_NAME_SIZE];
char dbcollection[MONGO_DB_NAME_SIZE + MONGO_COLLECTION_NAME_SIZE + 1];
unsigned uLastMongoDBErrno;
- //unsigned iSrvPort; /* sample: server port */
+ unsigned iSrvPort; /* sample: server port */
} instanceData;
char db[_DB_MAXDBLEN+2];
@@ -69,8 +97,8 @@ static void closeMongoDB(instanceData *pData)
ASSERT(pData != NULL);
if(pData->conn != NULL) {
- mongo_destroy( pData->conn );
- memset(pData->conn,0x00,sizeof(mongo_connection));
+ mongo_sync_disconnect(pData->conn);
+ pData->conn = NULL;
}
}
@@ -84,29 +112,6 @@ CODESTARTdbgPrintInstInfo
/* nothing special here */
ENDdbgPrintInstInfo
-/* log a database error with descriptive message.
- * We check if we have a valid MongoDB handle. If not, we simply
- * report an error
- */
-static void reportDBError(instanceData *pData, int bSilent)
-{
- char errMsg[512];
- bson ErrObj;
-
- ASSERT(pData != NULL);
-
- /* output log message */
- errno = 0;
- if(pData->conn == NULL) {
- errmsg.LogError(0, NO_ERRCODE, "unknown DB error occured - could not obtain MongoDB handle");
- } else { /* we can ask mysql for the error description... */
- //we should handle the error. if bSilent is set then we should print as debug
- mongo_cmd_get_last_error(pData->conn, pData->db, &ErrObj);
- bson_destroy(&ErrObj);
- }
-
- return;
-}
/* The following function is responsible for initializing a
* MySQL connection.
@@ -120,95 +125,64 @@ static rsRetVal initMongoDB(instanceData *pData, int bSilent)
ASSERT(pData->conn == NULL);
//I'm trying to fallback to a default here
+#if 0
if(pData->opts->port == 0)
pData->opts->port = 27017;
if(pData->opts->host == 0x00)
strcpy(pData->opts->host,DEFAULT_SERVER);
+#endif
if(pData->dbcollection == 0x00)
strcpy(pData->dbcollection,DEFAULT_DB_COLLECTION);
- pData->status = mongo_connect(pData->conn, pData->opts );
-
- switch (pData->status) {
- case mongo_conn_success:
- fprintf(stderr, "connection succeeded\n" );
- iRet = RS_RET_OK;
- break;
- case mongo_conn_bad_arg:
- errmsg.LogError(0, RS_RET_SUSPENDED, "can not initialize MongoDB handle");
- fprintf(stderr, "bad arguments\n" );
- iRet = RS_RET_SUSPENDED;
- break;
- case mongo_conn_no_socket:
- errmsg.LogError(0, RS_RET_SUSPENDED, "can not initialize MongoDB handle");
- fprintf(stderr, "no socket\n" );
- iRet = RS_RET_SUSPENDED;
- break;
- case mongo_conn_fail:
- errmsg.LogError(0, RS_RET_SUSPENDED, "can not initialize MongoDB handle");
- fprintf(stderr, "connection failed\n" );
- iRet = RS_RET_SUSPENDED;
- break;
- case mongo_conn_not_master:
+ pData->conn = mongo_sync_connect("127.0.0.1", pData->iSrvPort, TRUE);
+ if(pData->conn == NULL) {
errmsg.LogError(0, RS_RET_SUSPENDED, "can not initialize MongoDB handle");
- fprintf(stderr, "not master\n" );
- iRet = RS_RET_SUSPENDED;
- break;
- }
+ ABORT_FINALIZE(RS_RET_SUSPENDED);
+ }
+
+finalize_it:
RETiRet;
}
//we must implement it
rsRetVal writeMongoDB(uchar *psz, instanceData *pData)
{
- char mydate[32];
- char **szParams;
- bson b[1];
- bson_buffer buf[1];
- bson_buffer_init( buf );
- bson_append_new_oid(buf, "_id" );
- memset(mydate,0x00,32);
-
-
- DEFiRet;
-
- ASSERT(psz != NULL);
- ASSERT(pData != NULL);
-
-
- /* see if we are ready to proceed */
- if(pData->conn == NULL) {
- CHKiRet(initMongoDB(pData, 0));
- }
-
-szParams = (char**)(void*) psz;
-//We can make it beter
-//if you change the fields in your template, we must update it here
-//there is any C_metaprogramming_ninja there? :-)
-if(countof(szParams) > 0)
-{
- bson_append_string( buf, "msg", szParams[0]);
- bson_append_string( buf, "facility",szParams[1]);
- bson_append_string( buf, "hostname", szParams[2] );
- bson_append_string(buf, "priority",szParams[3]);
- bson_append_int(buf,"count",countof(szParams));
- bson_from_buffer( b, buf );
- mongo_insert(pData->conn, pData->dbcollection, b );
-}
+ bson *doc;
+ char **szParams;
+ DEFiRet;
-if(b)
- bson_destroy(b);
+ /* see if we are ready to proceed */
+ if(pData->conn == NULL) {
+ CHKiRet(initMongoDB(pData, 0));
+ }
+ szParams = (char**)(void*) psz;
+ doc = bson_build(BSON_TYPE_STRING, "msg", szParams[0], -1,
+ BSON_TYPE_STRING, "facility", szParams[1], -1,
+ BSON_TYPE_STRING, "hostname", szParams[2], -1,
+ BSON_TYPE_STRING, "priority", szParams[3], -1,
+ BSON_TYPE_NONE);
+ if(doc == NULL) {
+ dbgprintf("ommongodb: error creating BSON doc\n");
+ ABORT_FINALIZE(RS_RET_ERR);
+ }
+ bson_finish(doc);
+ if(!mongo_sync_cmd_insert(pData->conn, "syslog.doc", doc, NULL)) {
+ perror ("mongo_sync_cmd_insert()");
+ dbgprintf("ommongodb: insert error\n");
+ ABORT_FINALIZE(RS_RET_ERR);
+ }
+ bson_free(doc);
- finalize_it:
+finalize_it:
if(iRet == RS_RET_OK) {
pData->uLastMongoDBErrno = 0; /* reset error for error supression */
}
- RETiRet;
+ RETiRet;
}
BEGINtryResume
@@ -236,8 +210,10 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
CHKiRet(createInstance(&pData));
+#if 0
if(getSubString(&p, pData->opts->host, MAXHOSTNAMELEN+1, ','))
strcpy(pData->opts->host,DEFAULT_SERVER);
+#endif
//we must define the max db name
if(getSubString(&p,pData->db,255,','))
@@ -251,7 +227,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
CHKiRet(cflineParseTemplateName(&p, *ppOMSR, 0, OMSR_TPL_AS_ARRAY, (uchar*) " StdMongoDBFmt"));
- pData->opts->port = (unsigned) iSrvPort; /* set configured port */
+ pData->iSrvPort = iSrvPort; /* set configured port */
sprintf(pData->dbcollection,"%s.%s",pData->db,pData->collection);
CHKiRet(initMongoDB(pData, 0));
@@ -275,6 +251,6 @@ CODESTARTmodInit
CODEmodInit_QueryRegCFSLineHdlr
CHKiRet(objUse(errmsg, CORE_COMPONENT));
INITChkCoreFeature(bCoreSupportsBatching, CORE_FEATURE_BATCHING);
- DBGPRINTF("ompgsql: module compiled with rsyslog version %s.\n", VERSION);
- DBGPRINTF("ompgsql: %susing transactional output interface.\n", bCoreSupportsBatching ? "" : "not ");
-ENDmodInit \ No newline at end of file
+ DBGPRINTF("ommongodb: module compiled with rsyslog version %s.\n", VERSION);
+ //DBGPRINTF("ommongodb: %susing transactional output interface.\n", bCoreSupportsBatching ? "" : "not ");
+ENDmodInit