Teach the AMQP destination to catch template syntax errors at config time, by adding an output error variable and a return value to afamqp_dd_set_routing_key() and afamqp_dd_set_body(), and checking the return value of log_template_compile(), and propagating error messages upwards. Signed-off-by: Gergely Nagy <algernon@balabit.hu> --- modules/afamqp/afamqp-grammar.ym | 22 ++++++++++++++++++---- modules/afamqp/afamqp.c | 14 +++++++------- modules/afamqp/afamqp.h | 8 ++++---- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/modules/afamqp/afamqp-grammar.ym b/modules/afamqp/afamqp-grammar.ym index a336d5d..0adf6bb 100644 --- a/modules/afamqp/afamqp-grammar.ym +++ b/modules/afamqp/afamqp-grammar.ym @@ -1,7 +1,7 @@ /* * Copyright (c) 2012 Nagy, Attila <bra@fsn.hu> - * Copyright (c) 2012 BalaBit IT Ltd, Budapest, Hungary - * Copyright (c) 2012 Gergely Nagy <algernon@balabit.hu> + * Copyright (c) 2012-2013 BalaBit IT Ltd, Budapest, Hungary + * Copyright (c) 2012-2013 Gergely Nagy <algernon@balabit.hu> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -80,8 +80,22 @@ afamqp_option | KW_EXCHANGE '(' string ')' { afamqp_dd_set_exchange(last_driver, $3); free($3); } | KW_EXCHANGE_DECLARE '(' yesno ')' { afamqp_dd_set_exchange_declare(last_driver, $3); } | KW_EXCHANGE_TYPE '(' string ')' { afamqp_dd_set_exchange_type(last_driver, $3); free($3); } - | KW_ROUTING_KEY '(' string ')' { afamqp_dd_set_routing_key(last_driver, $3); free($3); } - | KW_BODY '(' string ')' { afamqp_dd_set_body(last_driver, $3); free($3); } + | KW_ROUTING_KEY '(' string ')' + { + GError *error; + + CHECK_ERROR(afamqp_dd_set_routing_key(last_driver, $3, &error), @3, + "Error compiling template; %s", error->message); + free($3); + } + | KW_BODY '(' string ')' + { + GError *error; + + CHECK_ERROR(afamqp_dd_set_body(last_driver, $3, &error), @3, + "Error compiling template; %s", error->message); + free($3); + } | KW_PERSISTENT '(' yesno ')' { afamqp_dd_set_persistent(last_driver, $3); } | KW_USERNAME '(' string ')' { afamqp_dd_set_user(last_driver, $3); free($3); } | KW_PASSWORD '(' string ')' { afamqp_dd_set_password(last_driver, $3); free($3); } diff --git a/modules/afamqp/afamqp.c b/modules/afamqp/afamqp.c index 9a6c07d..315335c 100644 --- a/modules/afamqp/afamqp.c +++ b/modules/afamqp/afamqp.c @@ -156,22 +156,22 @@ afamqp_dd_set_exchange_type(LogDriver *d, const gchar *exchange_type) self->exchange_type = g_strdup(exchange_type); } -void -afamqp_dd_set_routing_key(LogDriver *d, const gchar *routing_key) +gboolean +afamqp_dd_set_routing_key(LogDriver *d, const gchar *routing_key, GError **error) { AMQPDestDriver *self = (AMQPDestDriver *) d; - log_template_compile(self->routing_key_template, routing_key, NULL); + return log_template_compile(self->routing_key_template, routing_key, error); } -void -afamqp_dd_set_body(LogDriver *d, const gchar *body) +gboolean +afamqp_dd_set_body(LogDriver *d, const gchar *body, GError **error) { AMQPDestDriver *self = (AMQPDestDriver *) d; if (!self->body_template) self->body_template = log_template_new(configuration, NULL); - log_template_compile(self->body_template, body, NULL); + return log_template_compile(self->body_template, body, error); } void @@ -698,7 +698,7 @@ afamqp_dd_new(void) afamqp_dd_set_port((LogDriver *) self, 5672); afamqp_dd_set_exchange((LogDriver *) self, "syslog"); afamqp_dd_set_exchange_type((LogDriver *) self, "fanout"); - afamqp_dd_set_routing_key((LogDriver *) self, ""); + afamqp_dd_set_routing_key((LogDriver *) self, "", NULL); afamqp_dd_set_persistent((LogDriver *) self, TRUE); afamqp_dd_set_exchange_declare((LogDriver *) self, FALSE); diff --git a/modules/afamqp/afamqp.h b/modules/afamqp/afamqp.h index 1247a25..5876231 100644 --- a/modules/afamqp/afamqp.h +++ b/modules/afamqp/afamqp.h @@ -1,7 +1,7 @@ /* * Copyright (c) 2012 Nagy, Attila <bra@fsn.hu> - * Copyright (c) 2012 BalaBit IT Ltd, Budapest, Hungary - * Copyright (c) 2012 Gergely Nagy <algernon@balabit.hu> + * Copyright (c) 2012-2013 BalaBit IT Ltd, Budapest, Hungary + * Copyright (c) 2012-2013 Gergely Nagy <algernon@balabit.hu> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -36,8 +36,8 @@ void afamqp_dd_set_exchange(LogDriver *d, const gchar *database); void afamqp_dd_set_exchange_declare(LogDriver *d, gboolean declare); void afamqp_dd_set_exchange_type(LogDriver *d, const gchar *exchange_type); void afamqp_dd_set_vhost(LogDriver *d, const gchar *vhost); -void afamqp_dd_set_routing_key(LogDriver *d, const gchar *routing_key); -void afamqp_dd_set_body(LogDriver *d, const gchar *body); +gboolean afamqp_dd_set_routing_key(LogDriver *d, const gchar *routing_key, GError **error); +gboolean afamqp_dd_set_body(LogDriver *d, const gchar *body, GError **error); void afamqp_dd_set_persistent(LogDriver *d, gboolean persistent); void afamqp_dd_set_user(LogDriver *d, const gchar *user); void afamqp_dd_set_password(LogDriver *d, const gchar *password); -- 1.7.10.4