Skip to content

Commit

Permalink
Merge pull request #4133 from bazsi/db-parser-prefix-support
Browse files Browse the repository at this point in the history
db-parser prefix() support
  • Loading branch information
MrAnno committed Nov 17, 2022
2 parents f980cff + 1b63233 commit ac81267
Show file tree
Hide file tree
Showing 21 changed files with 215 additions and 84 deletions.
3 changes: 3 additions & 0 deletions modules/dbparser/dbparser-grammar.ym
Expand Up @@ -67,6 +67,7 @@ SyntheticMessage *last_message;
%token KW_PROGRAM_TEMPLATE
%token KW_MESSAGE_TEMPLATE
%token KW_SORT_KEY
%token KW_PREFIX

%type <num> stateful_parser_inject_mode
%type <ptr> synthetic_message
Expand Down Expand Up @@ -107,6 +108,7 @@ parser_db_opt
log_db_parser_set_program_template_ref(last_parser, $3);
}
| KW_MESSAGE_TEMPLATE '(' template_content ')' { log_parser_set_template(last_parser, $3); }
| KW_PREFIX '(' string ')' { log_db_parser_set_prefix(((LogDBParser *) last_parser), $3); free($3); };
| stateful_parser_opt
;

Expand Down Expand Up @@ -163,6 +165,7 @@ grouping_by_opt
CHECK_ERROR_WITHOUT_MESSAGE(cfg_parser_parse(&filter_expr_parser, lexer, (gpointer *) &filter_expr, NULL), @1);
grouping_by_set_trigger_condition(last_parser, filter_expr);
} ')'
| KW_PREFIX '(' string ')' { grouping_by_set_prefix(last_parser, $3); free($3); };
| stateful_parser_opt
;

Expand Down
1 change: 1 addition & 0 deletions modules/dbparser/dbparser-parser.c
Expand Up @@ -48,6 +48,7 @@ static CfgLexerKeyword dbparser_keywords[] =
{ "having", KW_HAVING },
{ "trigger", KW_TRIGGER },
{ "value", KW_VALUE },
{ "prefix", KW_PREFIX },
{ "program_template", KW_PROGRAM_TEMPLATE },
{ "message_template", KW_MESSAGE_TEMPLATE },
{ NULL }
Expand Down
42 changes: 16 additions & 26 deletions modules/dbparser/dbparser.c
Expand Up @@ -40,6 +40,7 @@ struct _LogDBParser
struct iv_timer tick;
PatternDB *db;
gchar *db_file;
gchar *prefix;
time_t db_file_last_check;
ino_t db_file_inode;
time_t db_file_mtime;
Expand Down Expand Up @@ -130,29 +131,11 @@ log_db_parser_init(LogPipe *s)
GlobalConfig *cfg = log_pipe_get_config(s);

self->db = cfg_persist_config_fetch(cfg, log_db_parser_format_persist_name(self));
if (self->db)
{
struct stat st;

if (stat(self->db_file, &st) < 0)
{
msg_error("Error stating pattern database file, no automatic reload will be performed",
evt_tag_str("file", self->db_file),
evt_tag_str("error", g_strerror(errno)),
log_pipe_location_tag(&self->super.super.super));
}
else if (self->db_file_inode != st.st_ino || self->db_file_mtime != st.st_mtime)
{
log_db_parser_reload_database(self);
self->db_file_inode = st.st_ino;
self->db_file_mtime = st.st_mtime;
}
}
else
{
self->db = pattern_db_new();
log_db_parser_reload_database(self);
}
if (!self->db)
self->db = pattern_db_new(self->prefix);

log_db_parser_reload_database(self);
if (self->db)
{
pattern_db_set_emit_func(self->db, log_db_parser_emit, self);
Expand Down Expand Up @@ -246,11 +229,17 @@ log_db_parser_process(LogParser *s, LogMessage **pmsg, const LogPathOptions *pat
void
log_db_parser_set_db_file(LogDBParser *self, const gchar *db_file)
{
if (self->db_file)
g_free(self->db_file);
g_free(self->db_file);
self->db_file = g_strdup(db_file);
}

void
log_db_parser_set_prefix(LogDBParser *self, const gchar *prefix)
{
g_free(self->prefix);
self->prefix = g_strdup(prefix);
}

void
log_db_parser_set_drop_unmatched(LogDBParser *self, gboolean setting)
{
Expand All @@ -268,6 +257,7 @@ log_db_parser_clone(LogPipe *s)

cloned = (LogDBParser *) log_db_parser_new(s->cfg);
log_db_parser_set_db_file(cloned, self->db_file);
log_db_parser_set_prefix(cloned, self->prefix);
log_db_parser_set_drop_unmatched(cloned, self->drop_unmatched);
log_db_parser_set_program_template_ref(&cloned->super.super, log_template_ref(self->program_template));
log_parser_set_template(&cloned->super.super, log_template_ref(self->super.super.template));
Expand All @@ -293,8 +283,8 @@ log_db_parser_free(LogPipe *s)
if (self->db)
pattern_db_free(self->db);

if (self->db_file)
g_free(self->db_file);
g_free(self->db_file);
g_free(self->prefix);
stateful_parser_free_method(s);
}

Expand Down
1 change: 1 addition & 0 deletions modules/dbparser/dbparser.h
Expand Up @@ -34,6 +34,7 @@ typedef struct _LogDBParser LogDBParser;
void log_db_parser_set_drop_unmatched(LogDBParser *self, gboolean setting);
void log_db_parser_set_program_template_ref(LogParser *s, LogTemplate *program_template);
void log_db_parser_set_db_file(LogDBParser *self, const gchar *db_file);
void log_db_parser_set_prefix(LogDBParser *self, const gchar *prefix);
LogParser *log_db_parser_new(GlobalConfig *cfg);

void log_pattern_database_init(void);
Expand Down
13 changes: 13 additions & 0 deletions modules/dbparser/groupingby.c
Expand Up @@ -46,6 +46,7 @@ typedef struct _GroupingBy
FilterExprNode *trigger_condition_expr;
FilterExprNode *where_condition_expr;
FilterExprNode *having_condition_expr;
gchar *prefix;
} GroupingBy;

static NVHandle context_id_handle = 0;
Expand Down Expand Up @@ -129,6 +130,14 @@ grouping_by_set_synthetic_message(LogParser *s, SyntheticMessage *message)
self->synthetic_message = message;
}

void
grouping_by_set_prefix(LogParser *s, const gchar *prefix)
{
GroupingBy *self = (GroupingBy *) s;

g_free(self->prefix);
self->prefix = g_strdup(prefix);
}

/* This function is called to populate the emitted_messages array in
* msg_emitter. It only manipulates per-thread data structure so it does
Expand Down Expand Up @@ -470,6 +479,8 @@ _init(LogPipe *s)
return FALSE;
}

synthetic_message_set_prefix(self->synthetic_message, self->prefix);

_load_correlation_state(self, cfg);

iv_validate_now();
Expand Down Expand Up @@ -523,6 +534,7 @@ _clone(LogPipe *s)
grouping_by_set_trigger_condition(&cloned->super.super, filter_expr_clone(self->trigger_condition_expr));
grouping_by_set_where_condition(&cloned->super.super, filter_expr_clone(self->where_condition_expr));
grouping_by_set_having_condition(&cloned->super.super, filter_expr_clone(self->having_condition_expr));
grouping_by_set_prefix(&cloned->super.super, self->prefix);

cloned->clone_id = self->clone_id++;
return &cloned->super.super.super;
Expand All @@ -533,6 +545,7 @@ _free(LogPipe *s)
{
GroupingBy *self = (GroupingBy *) s;

g_free(self->prefix);
log_template_unref(self->key_template);
log_template_unref(self->sort_key_template);
if (self->synthetic_message)
Expand Down
1 change: 1 addition & 0 deletions modules/dbparser/groupingby.h
Expand Up @@ -34,6 +34,7 @@ void grouping_by_set_synthetic_message(LogParser *s, SyntheticMessage *message);
void grouping_by_set_trigger_condition(LogParser *s, FilterExprNode *filter_expr);
void grouping_by_set_where_condition(LogParser *s, FilterExprNode *filter_expr);
void grouping_by_set_having_condition(LogParser *s, FilterExprNode *filter_expr);
void grouping_by_set_prefix(LogParser *s, const gchar *prefix);
LogParser *grouping_by_new(GlobalConfig *cfg);
void grouping_by_global_init(void);

Expand Down
9 changes: 6 additions & 3 deletions modules/dbparser/patterndb.c
Expand Up @@ -68,6 +68,7 @@ struct _PatternDB
GHashTable *rate_limits;
PatternDBEmitFunc emit;
gpointer emit_data;
gchar *prefix;
};

static inline gpointer
Expand Down Expand Up @@ -475,7 +476,7 @@ pattern_db_reload_ruleset(PatternDB *self, GlobalConfig *cfg, const gchar *pdb_f
{
PDBRuleSet *new_ruleset;

new_ruleset = pdb_rule_set_new();
new_ruleset = pdb_rule_set_new(self->prefix);
if (!pdb_rule_set_load(new_ruleset, cfg, pdb_file, NULL))
{
pdb_rule_set_free(new_ruleset);
Expand Down Expand Up @@ -712,11 +713,12 @@ pattern_db_forget_state(PatternDB *self)
}

PatternDB *
pattern_db_new(void)
pattern_db_new(const gchar *prefix)
{
PatternDB *self = g_new0(PatternDB, 1);

self->ruleset = pdb_rule_set_new();
self->prefix = g_strdup(prefix);
self->ruleset = pdb_rule_set_new(self->prefix);
g_mutex_init(&self->ruleset_lock);
_init_state(self);
return self;
Expand All @@ -725,6 +727,7 @@ pattern_db_new(void)
void
pattern_db_free(PatternDB *self)
{
g_free(self->prefix);
log_template_unref(self->program_template);
if (self->ruleset)
pdb_rule_set_free(self->ruleset);
Expand Down
2 changes: 1 addition & 1 deletion modules/dbparser/patterndb.h
Expand Up @@ -48,7 +48,7 @@ void pattern_db_debug_ruleset(PatternDB *self, LogMessage *msg, GArray *dbg_list
void pattern_db_expire_state(PatternDB *self);
void pattern_db_forget_state(PatternDB *self);

PatternDB *pattern_db_new(void);
PatternDB *pattern_db_new(const gchar *prefix);
void pattern_db_free(PatternDB *self);

void pattern_db_global_init(void);
Expand Down
5 changes: 4 additions & 1 deletion modules/dbparser/pdb-load.c
Expand Up @@ -363,7 +363,8 @@ _populate_ruleset_radix(gpointer key, gpointer value, gpointer user_data)
gchar *pattern = key;
PDBProgram *program = (PDBProgram *) value;

r_insert_node(state->ruleset->programs, pattern, pdb_program_ref(program), NULL, program->pdb_location);
r_insert_node(state->ruleset->programs, pattern, pdb_program_ref(program),
state->ruleset->prefix, NULL, program->pdb_location);
}

static void
Expand Down Expand Up @@ -439,6 +440,7 @@ _pdbl_ruleset_end(PDBLoader *state, const gchar *element_name, GError **error)
r_insert_node(program->rules,
program_pattern->pattern,
pdb_rule_ref(program_pattern->rule),
state->ruleset->prefix,
(RNodeGetValueFunc) pdb_rule_get_name,
program_pattern->pdb_location);
pdb_program_pattern_clear(program_pattern);
Expand Down Expand Up @@ -537,6 +539,7 @@ _pdbl_rules_start(PDBLoader *state, const gchar *element_name, const gchar **att
}

state->current_message = &state->current_rule->msg;
synthetic_message_set_prefix(state->current_message, state->ruleset->prefix);
state->action_id = 0;
_push_state(state, PDBL_RULE);
}
Expand Down
15 changes: 5 additions & 10 deletions modules/dbparser/pdb-ruleset.c
Expand Up @@ -174,11 +174,11 @@ pdb_ruleset_lookup(PDBRuleSet *rule_set, PDBLookupParams *lookup, GArray *dbg_li


PDBRuleSet *
pdb_rule_set_new(void)
pdb_rule_set_new(const gchar *prefix)
{
PDBRuleSet *self = g_new0(PDBRuleSet, 1);
self->is_empty = TRUE;

self->prefix = g_strdup(prefix);
return self;
}

Expand All @@ -187,14 +187,9 @@ pdb_rule_set_free(PDBRuleSet *self)
{
if (self->programs)
r_free_node(self->programs, (GDestroyNotify) pdb_program_unref);
if (self->version)
g_free(self->version);
if (self->pub_date)
g_free(self->pub_date);
self->programs = NULL;
self->version = NULL;
self->pub_date = NULL;

g_free(self->version);
g_free(self->pub_date);
g_free(self->prefix);
g_free(self);
}

Expand Down
3 changes: 2 additions & 1 deletion modules/dbparser/pdb-ruleset.h
Expand Up @@ -34,11 +34,12 @@ typedef struct _PDBRuleSet
RNode *programs;
gchar *version;
gchar *pub_date;
gchar *prefix;
gboolean is_empty;
} PDBRuleSet;

PDBRule *pdb_ruleset_lookup(PDBRuleSet *rule_set, PDBLookupParams *lookup, GArray *dbg_list);
PDBRuleSet *pdb_rule_set_new(void);
PDBRuleSet *pdb_rule_set_new(const gchar *prefix);
void pdb_rule_set_free(PDBRuleSet *self);

void pdb_rule_set_global_init(void);
Expand Down
13 changes: 6 additions & 7 deletions modules/dbparser/pdbtool/pdbtool.c
Expand Up @@ -459,7 +459,7 @@ pdbtool_match(int argc, char *argv[])
proto_options.max_msg_size = 65536;
log_proto_server_options_init(&proto_options, configuration);

patterndb = pattern_db_new();
patterndb = pattern_db_new(NULL);
if (!pattern_db_reload_ruleset(patterndb, configuration, patterndb_file))
{
goto error;
Expand Down Expand Up @@ -773,7 +773,7 @@ pdbtool_test(int argc, char *argv[])
}
}

patterndb = pattern_db_new();
patterndb = pattern_db_new(NULL);
if (!pdb_rule_set_load(pattern_db_get_ruleset(patterndb), configuration, argv[arg_pos], &examples))
{
failed_to_load = TRUE;
Expand Down Expand Up @@ -917,7 +917,7 @@ pdbtool_dump(int argc, char *argv[])
{
PatternDB *patterndb;

patterndb = pattern_db_new();
patterndb = pattern_db_new(NULL);
if (!pattern_db_reload_ruleset(patterndb, configuration, patterndb_file))
return 1;

Expand Down Expand Up @@ -979,23 +979,22 @@ pdbtool_dictionary_walk(RNode *root, const gchar *progname)
else
{
PDBRule *rule = (PDBRule *)root->value;
LogTemplate *template;
guint tag_id;

if (!dictionary_tags && rule->msg.values)
{
for (i = 0; i < rule->msg.values->len; i++)
{
template = (LogTemplate *)g_ptr_array_index(rule->msg.values, i);
printf("%s\n", template->name);
SyntheticMessageValue *smv = synthetic_message_values_index(&rule->msg, i);
printf("%s\n", smv->name);
}
}

if (dictionary_tags && rule->msg.tags)
{
for (i = 0; i < rule->msg.tags->len; i++)
{
tag_id = g_array_index(rule->msg.tags, guint, i);
tag_id = synthetic_message_tags_index(&rule->msg, i);
printf("%s\n", log_tags_get_by_id(tag_id));
}
}
Expand Down

0 comments on commit ac81267

Please sign in to comment.