Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions modules/geoip2/geoip-parser-grammar.ym
Original file line number Diff line number Diff line change
Expand Up @@ -59,34 +59,39 @@ start
: LL_CONTEXT_PARSER parser_expr_maxminddb { YYACCEPT; }
;

parser_geoip_opts
: parser_geoip_opt parser_geoip_opts
|
;

parser_expr_maxminddb
: KW_GEOIP2 '('
{
last_parser = *instance = (LogParser *) maxminddb_parser_new(configuration);
}
string
optional_direct_template
parser_geoip_opts
')' { $$ = last_parser; }
;

optional_direct_template
: string
{
LogTemplate *template;
GError *error = NULL;

template = cfg_tree_check_inline_template(&configuration->tree, $4, &error);
CHECK_ERROR_GERROR(template != NULL, @4, error, "Error compiling template");
template = cfg_tree_check_inline_template(&configuration->tree, $1, &error);
CHECK_ERROR_GERROR(template != NULL, @1, error, "Error compiling template");
log_parser_set_template(last_parser, template);
free($1);
}
parser_geoip_opts
')' { $$ = last_parser; free($4); }
|
;

parser_geoip_opts
: parser_geoip_opt parser_geoip_opts
|
;

parser_geoip_opt
: KW_PREFIX '(' string ')'
{ geoip_parser_set_prefix(last_parser, $3); free($3); }
| KW_DATABASE '(' path_check ')'
{ geoip_parser_set_database_path(last_parser, $3); free($3); }
: KW_PREFIX '(' string ')' { geoip_parser_set_prefix(last_parser, $3); free($3); }
| KW_DATABASE '(' path_check ')' { geoip_parser_set_database_path(last_parser, $3); free($3); }
| parser_opt
;

/* INCLUDE_RULES */
Expand Down
6 changes: 6 additions & 0 deletions modules/geoip2/geoip-parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ maxminddb_parser_init(LogPipe *s)
{
GeoIPParser *self = (GeoIPParser *) s;

if (!self->super.template)
{
msg_error("geoip2(): template is a mandatory parameter", log_pipe_location_tag(s));
return FALSE;
}

if (!self->database_path)
self->database_path = mmdb_default_database();

Expand Down
43 changes: 27 additions & 16 deletions modules/geoip2/tests/test_geoip_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,22 @@ teardown(void)
}

static LogMessage *
parse_geoip_into_log_message_no_check(const gchar *input)
parse_geoip_into_log_message_no_check(const gchar *template_format)
{
LogMessage *msg;
LogPathOptions path_options = LOG_PATH_OPTIONS_INIT;
LogParser *cloned_parser;
gboolean success;

cloned_parser = (LogParser *) log_pipe_clone(&geoip_parser->super);

LogTemplate *template = log_template_new(NULL, NULL);
log_template_compile(template, template_format, NULL);
log_parser_set_template(cloned_parser, template);

log_pipe_init(&cloned_parser->super);
msg = log_msg_new_empty();
log_msg_set_value(msg, LM_V_MESSAGE, input, -1);

success = log_parser_process_message(cloned_parser, &msg, &path_options);
if (!success)
{
Expand All @@ -75,43 +80,49 @@ parse_geoip_into_log_message_no_check(const gchar *input)
}

static LogMessage *
parse_geoip_into_log_message(const gchar *input)
parse_geoip_into_log_message(const gchar *template_format)
{
LogMessage *msg;

msg = parse_geoip_into_log_message_no_check(input);
cr_assert_not_null(msg, "expected geoip-parser success and it returned failure, input=%s", input);
msg = parse_geoip_into_log_message_no_check(template_format);
cr_assert_not_null(msg, "expected geoip-parser success and it returned failure, template_format=%s", template_format);
return msg;
}

Test(geoip2, test_basics)
Test(geoip2, template_is_mandatory)
{
LogMessage *msg;
LogParser *geoip2_parser = maxminddb_parser_new(configuration);

msg = parse_geoip_into_log_message("2.125.160.216");
assert_log_message_value(msg, log_msg_get_value_handle(".geoip2.country.iso_code"), "GB");
log_msg_unref(msg);
cr_assert_not(log_pipe_init(&geoip2_parser->super));

log_pipe_unref(&geoip2_parser->super);
}

Test(geoip2, set_prefix)
{
LogMessage *msg;

geoip_parser_set_prefix(geoip_parser, ".prefix.");
msg = parse_geoip_into_log_message("2.125.160.216");
assert_log_message_value(msg, log_msg_get_value_handle(".prefix.country.iso_code"), "GB");
log_msg_unref(msg);
}

Test(geoip2, empty_prefix)
{
LogMessage *msg;

geoip_parser_set_prefix(geoip_parser, "");
msg = parse_geoip_into_log_message("2.125.160.216");
assert_log_message_value(msg, log_msg_get_value_handle(".country.iso_code"), "GB");
log_msg_unref(msg);
}

Test(geoip2, test_using_template_to_parse_input)
Test(geoip2, test_basic)
{
LogMessage *msg;
LogTemplate *template;

template = log_template_new(NULL, NULL);
log_template_compile(template, "2.125.160.216", NULL);
log_parser_set_template(geoip_parser, template);
msg = parse_geoip_into_log_message("8.8.8.8");
msg = parse_geoip_into_log_message("2.125.160.216");
assert_log_message_value(msg, log_msg_get_value_handle(".geoip2.country.iso_code"), "GB");

assert_log_message_value(msg, log_msg_get_value_handle(".geoip2.location.latitude"), "51.750000");
Expand Down