2
* Copyright (c) 2002-2009 BalaBit IT Ltd, Budapest, Hungary
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 2 as published
6
* by the Free Software Foundation.
8
* Note that this permission is granted for only version 2 of the GPL.
10
* As an additional exemption you are allowed to compile & link against the
11
* OpenSSL libraries as published by the OpenSSL project. See the file
12
* COPYING for details.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
#include "logrewrite.h"
27
#include "templates.h"
28
#include "logmatcher.h"
34
log_rewrite_init(LogRewrite *self)
36
self->value_handle = LM_V_MESSAGE;
40
log_rewrite_free(LogRewrite *self)
46
typedef struct _LogRewriteSubst LogRewriteSubst;
48
struct _LogRewriteSubst
52
LogTemplate *replacement;
56
log_rewrite_subst_process(LogRewrite *s, LogMessage *msg)
58
LogRewriteSubst *self = (LogRewriteSubst *) s;
64
gssize new_length = -1;
66
value = log_msg_get_value(msg, self->super.value_handle, &length);
68
new_value = log_matcher_replace(self->matcher, msg, self->super.value_handle, value, length, self->replacement, &new_length);
71
log_msg_set_value(msg, self->super.value_handle, new_value, new_length);
77
log_rewrite_subst_free(LogRewrite *s)
79
LogRewriteSubst *self = (LogRewriteSubst *) s;
81
log_matcher_free(self->matcher);
82
log_template_unref(self->replacement);
86
log_rewrite_subst_new(const gchar *replacement)
88
LogRewriteSubst *self = g_new0(LogRewriteSubst, 1);
90
log_rewrite_init(&self->super);
92
self->super.free_fn = log_rewrite_subst_free;
93
self->super.process = log_rewrite_subst_process;
95
self->replacement = log_template_new(NULL, replacement);
100
log_rewrite_set_regexp(LogRewrite *s, const gchar *regexp)
102
LogRewriteSubst *self = (LogRewriteSubst*)s;
104
self->matcher = log_matcher_posix_re_new();
106
return log_matcher_compile(self->matcher, regexp);
110
log_rewrite_set_flags(LogRewrite *s, gint flags)
112
LogRewriteSubst *self = (LogRewriteSubst*)s;
115
self->matcher = log_matcher_posix_re_new();
117
log_matcher_set_flags(self->matcher, flags);
120
typedef struct _LogRewriteSet LogRewriteSet;
122
struct _LogRewriteSet
125
LogTemplate *value_template;
129
log_rewrite_set_process(LogRewrite *s, LogMessage *msg)
131
LogRewriteSet *self = (LogRewriteSet *) s;
134
result = g_string_sized_new(64);
135
log_template_format(self->value_template, msg, 0, TS_FMT_BSD, NULL, 0, 0, result);
137
log_msg_set_value(msg, self->super.value_handle, result->str, result->len);
138
g_string_free(result, TRUE);
142
log_rewrite_set_free(LogRewrite *s)
144
LogRewriteSet *self = (LogRewriteSet *) s;
146
log_template_unref(self->value_template);
150
log_rewrite_set_new(const gchar *new_value)
152
LogRewriteSet *self = g_new0(LogRewriteSet, 1);
154
log_rewrite_init(&self->super);
155
self->super.free_fn = log_rewrite_set_free;
156
self->super.process = log_rewrite_set_process;
158
self->value_template = log_template_new(NULL, new_value);
164
log_rewrite_set_matcher(LogRewrite *s, LogMatcher *matcher)
167
LogRewriteSubst *self = (LogRewriteSubst*)s;
170
flags = self->matcher->flags;
171
log_matcher_free(self->matcher);
173
self->matcher = matcher;
175
log_rewrite_set_flags(s, flags);
178
typedef struct _LogRewriteRule
180
LogProcessRule super;
181
GList *rewrite_list; /* LogRewrite* */;
185
log_rewrite_rule_call_item(gpointer item, gpointer user_data)
187
LogRewrite *r = (LogRewrite *) item;
188
LogMessage *msg = (LogMessage *) user_data;
193
if (G_UNLIKELY(debug_flag))
195
value = log_msg_get_value(msg, r->value_handle, &length);
196
msg_debug("Rewrite expression evaluation result",
197
evt_tag_str("value", log_msg_get_value_name(r->value_handle, NULL)),
198
evt_tag_printf("new_value", "%.*s", (gint) length, value),
205
log_rewrite_rule_process(LogProcessRule *s, LogMessage *msg)
207
LogRewriteRule *self = (LogRewriteRule *) s;
209
g_list_foreach(self->rewrite_list, log_rewrite_rule_call_item, msg);
216
log_rewrite_rule_free(LogProcessRule *s)
218
LogRewriteRule *self = (LogRewriteRule *) s;
220
/* free each item in the list*/
221
g_list_foreach(self->rewrite_list, (GFunc)log_rewrite_free,NULL);
224
g_list_free(self->rewrite_list);
225
self->rewrite_list = NULL;
229
* LogRewriteRule, a configuration block encapsulating a LogRewrite instance.
232
log_rewrite_rule_new(const gchar *name, GList *rule_list)
234
LogRewriteRule *self = g_new0(LogRewriteRule, 1);
236
log_process_rule_init(&self->super, name);
237
self->super.free_fn = log_rewrite_rule_free;
238
self->super.process = log_rewrite_rule_process;
239
self->rewrite_list = rule_list;