Addition of user and source to all filter

Bug fix in timestamp for topfilter
This commit is contained in:
Mark Riddoch
2014-06-19 14:02:41 +01:00
parent 11a85971f1
commit 058d553973
6 changed files with 52 additions and 8 deletions

Binary file not shown.

Binary file not shown.

View File

@ -31,6 +31,7 @@
* Date Who Description * Date Who Description
* 03/06/2014 Mark Riddoch Initial implementation * 03/06/2014 Mark Riddoch Initial implementation
* 11/06/2014 Mark Riddoch Addition of source and match parameters * 11/06/2014 Mark Riddoch Addition of source and match parameters
* 19/06/2014 Mark Riddoch Addition of user parameter
* *
*/ */
#include <stdio.h> #include <stdio.h>
@ -54,7 +55,7 @@ MODULE_INFO info = {
"A simple query logging filter" "A simple query logging filter"
}; };
static char *version_str = "V1.1.0"; static char *version_str = "V1.1.1";
/* /*
* The filter entry points * The filter entry points
@ -92,6 +93,7 @@ typedef struct {
int sessions; /* The count of sessions */ int sessions; /* The count of sessions */
char *filebase; /* The filemane base */ char *filebase; /* The filemane base */
char *source; /* The source of the client connection */ char *source; /* The source of the client connection */
char *userName; /* The user name to filter on */
char *match; /* Optional text to match against */ char *match; /* Optional text to match against */
regex_t re; /* Compiled regex text */ regex_t re; /* Compiled regex text */
char *nomatch; /* Optional text to match against for exclusion */ char *nomatch; /* Optional text to match against for exclusion */
@ -168,6 +170,7 @@ int i;
else else
my_instance->filebase = strdup("qla"); my_instance->filebase = strdup("qla");
my_instance->source = NULL; my_instance->source = NULL;
my_instance->userName = NULL;
my_instance->match = NULL; my_instance->match = NULL;
my_instance->nomatch = NULL; my_instance->nomatch = NULL;
if (params) if (params)
@ -184,6 +187,8 @@ int i;
} }
else if (!strcmp(params[i]->name, "source")) else if (!strcmp(params[i]->name, "source"))
my_instance->source = strdup(params[i]->value); my_instance->source = strdup(params[i]->value);
else if (!strcmp(params[i]->name, "user"))
my_instance->userName = strdup(params[i]->value);
else if (!strcmp(params[i]->name, "filebase")) else if (!strcmp(params[i]->name, "filebase"))
{ {
if (my_instance->filebase) if (my_instance->filebase)
@ -247,7 +252,7 @@ newSession(FILTER *instance, SESSION *session)
{ {
QLA_INSTANCE *my_instance = (QLA_INSTANCE *)instance; QLA_INSTANCE *my_instance = (QLA_INSTANCE *)instance;
QLA_SESSION *my_session; QLA_SESSION *my_session;
char *remote; char *remote, *userName;
if ((my_session = calloc(1, sizeof(QLA_SESSION))) != NULL) if ((my_session = calloc(1, sizeof(QLA_SESSION))) != NULL)
{ {
@ -265,6 +270,13 @@ char *remote;
if (strcmp(remote, my_instance->source)) if (strcmp(remote, my_instance->source))
my_session->active = 0; my_session->active = 0;
} }
if (session && session->client && session->client->user)
userName = session->client->user;
else
userName = NULL;
if (my_instance->userName && strcmp(userName,
my_instance->userName))
my_session->active = 0;
sprintf(my_session->filename, "%s.%d", my_instance->filebase, sprintf(my_session->filename, "%s.%d", my_instance->filebase,
my_instance->sessions); my_instance->sessions);
my_instance->sessions++; my_instance->sessions++;

View File

@ -33,6 +33,12 @@ extern int lm_enabled_logfiles_bitmask;
* Two parameters should be defined in the filter configuration * Two parameters should be defined in the filter configuration
* match=<regular expression> * match=<regular expression>
* replace=<replacement text> * replace=<replacement text>
* Two optional parameters
* source=<source address to limit filter>
* user=<username to limit filter>
*
* Date Who Description
* 19/06/2014 Mark Riddoch Addition of source and user parameters
*/ */
MODULE_INFO info = { MODULE_INFO info = {
@ -42,7 +48,7 @@ MODULE_INFO info = {
"A query rewrite filter that uses regular expressions to rewite queries" "A query rewrite filter that uses regular expressions to rewite queries"
}; };
static char *version_str = "V1.0.0"; static char *version_str = "V1.1.0";
static FILTER *createInstance(char **options, FILTER_PARAMETER **params); static FILTER *createInstance(char **options, FILTER_PARAMETER **params);
static void *newSession(FILTER *instance, SESSION *session); static void *newSession(FILTER *instance, SESSION *session);
@ -70,6 +76,8 @@ static FILTER_OBJECT MyObject = {
* Instance structure * Instance structure
*/ */
typedef struct { typedef struct {
char *source; /* Source address to restrict matches */
char *user; /* User name to restrict matches */
char *match; /* Regular expression to match */ char *match; /* Regular expression to match */
char *replace; /* Replacement text */ char *replace; /* Replacement text */
regex_t re; /* Compiled regex text */ regex_t re; /* Compiled regex text */
@ -79,9 +87,10 @@ typedef struct {
* The session structure for this regex filter * The session structure for this regex filter
*/ */
typedef struct { typedef struct {
DOWNSTREAM down; DOWNSTREAM down; /* The downstream filter */
int no_change; int no_change; /* No. of unchanged requests */
int replacements; int replacements; /* No. of changed requests */
int active; /* Is filter active */
} REGEX_SESSION; } REGEX_SESSION;
/** /**
@ -143,6 +152,10 @@ int i, cflags = REG_ICASE;
my_instance->match = strdup(params[i]->value); my_instance->match = strdup(params[i]->value);
else if (!strcmp(params[i]->name, "replace")) else if (!strcmp(params[i]->name, "replace"))
my_instance->replace = strdup(params[i]->value); my_instance->replace = strdup(params[i]->value);
else if (!strcmp(params[i]->name, "source"))
my_instance->source = strdup(params[i]->value);
else if (!strcmp(params[i]->name, "user"))
my_instance->user = strdup(params[i]->value);
else if (!filter_standard_parameter(params[i]->name)) else if (!filter_standard_parameter(params[i]->name))
{ {
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
@ -203,12 +216,28 @@ int i, cflags = REG_ICASE;
static void * static void *
newSession(FILTER *instance, SESSION *session) newSession(FILTER *instance, SESSION *session)
{ {
REGEX_INSTANCE *my_instance = (REGEX_INSTANCE *)instance;
REGEX_SESSION *my_session; REGEX_SESSION *my_session;
char *remote;
if ((my_session = calloc(1, sizeof(REGEX_SESSION))) != NULL) if ((my_session = calloc(1, sizeof(REGEX_SESSION))) != NULL)
{ {
my_session->no_change = 0; my_session->no_change = 0;
my_session->replacements = 0; my_session->replacements = 0;
my_session->active = 1;
if (my_instance->source
&& (remote = session_get_remote(session)) != NULL)
{
if (strcmp(remote, my_instance->source))
my_session->active = 0;
}
if (my_instance->user
&& session && session->client && session->client->user
&& strcmp(session->client->user,
my_instance->user))
{
my_session->active = 0;
}
} }
return my_session; return my_session;

View File

@ -27,6 +27,9 @@
* A single option may be passed to the filter, this is the name of the * A single option may be passed to the filter, this is the name of the
* file to which the queries are logged. A serial number is appended to this * file to which the queries are logged. A serial number is appended to this
* name in order that each session logs to a different file. * name in order that each session logs to a different file.
*
* Date Who Description
* 18/06/2014 Mark Riddoch Addition of source and user filters
*/ */
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
@ -49,7 +52,7 @@ MODULE_INFO info = {
"A top N query logging filter" "A top N query logging filter"
}; };
static char *version_str = "V1.0.0"; static char *version_str = "V1.0.1";
/* /*
* The filter entry points * The filter entry points
@ -357,7 +360,7 @@ FILE *fp;
} }
fprintf(fp, "-----------+-----------------------------------------------------------------\n"); fprintf(fp, "-----------+-----------------------------------------------------------------\n");
fprintf(fp, "\n\nSession started %s", fprintf(fp, "\n\nSession started %s",
asctime(localtime(&my_session->connect))); asctime(localtime(&my_session->connect.tv_sec)));
if (my_session->clientHost) if (my_session->clientHost)
fprintf(fp, "Connection from %s\n", fprintf(fp, "Connection from %s\n",
my_session->clientHost); my_session->clientHost);