diff --git a/doc/SPOE.txt b/doc/SPOE.txt index 611b228786..48cfa021f7 100644 --- a/doc/SPOE.txt +++ b/doc/SPOE.txt @@ -140,6 +140,9 @@ If no engine name is provided on the SPOE filter line, no SPOE scope must be found in the SPOE configuration file. All the file is considered to be in the same anonymous and implicit scope. +The engine name must be uniq for a proxy. If no engine name is provided on the +SPOE filter line, the SPOE agent name is unsed by default. + 2.2. "spoe-agent" section -------------------------- diff --git a/include/types/spoe.h b/include/types/spoe.h index 193c2f64b8..2d94e36ecc 100644 --- a/include/types/spoe.h +++ b/include/types/spoe.h @@ -237,6 +237,8 @@ struct spoe_agent { /* SPOE filter configuration */ struct spoe_config { + char *id; /* The SPOE engine name. If undefined in HAProxy config, + * it will be set with the SPOE agent name */ struct proxy *proxy; /* Proxy owning the filter */ struct spoe_agent *agent; /* Agent used by this filter */ struct proxy agent_fe; /* Agent frontend */ diff --git a/src/flt_spoe.c b/src/flt_spoe.c index dbc9d30755..44e67243c5 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -2745,6 +2745,7 @@ spoe_deinit(struct proxy *px, struct flt_conf *fconf) struct spoe_agent *agent = conf->agent; spoe_release_agent(agent); + free(conf->id); free(conf); } fconf->conf = NULL; @@ -2755,9 +2756,30 @@ spoe_deinit(struct proxy *px, struct flt_conf *fconf) static int spoe_check(struct proxy *px, struct flt_conf *fconf) { + struct flt_conf *f; struct spoe_config *conf = fconf->conf; struct proxy *target; + /* Check all SPOE filters for proxy to be sure all SPOE agent names + * are uniq */ + list_for_each_entry(f, &px->filter_configs, list) { + struct spoe_config *c = f->conf; + + /* This is not an SPOE filter */ + if (f->id != spoe_filter_id) + continue; + /* This is the current SPOE filter */ + if (f == fconf) + continue; + + /* Check engine Id. It should be uniq */ + if (!strcmp(conf->id, c->id)) { + Alert("Proxy %s : duplicated name for SPOE engine '%s'.\n", + px->id, conf->id); + return 1; + } + } + target = proxy_be_by_name(conf->agent->b.name); if (target == NULL) { Alert("Proxy %s : unknown backend '%s' used by SPOE agent '%s'" @@ -3707,6 +3729,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, } finish: + conf->id = strdup(engine ? engine : curagent->id); conf->agent = curagent; list_for_each_entry_safe(mp, mpback, &curmps, list) { LIST_DEL(&mp->list);