From: Arran Cudbard-Bell Date: Fri, 18 Jul 2025 15:40:48 +0000 (-0600) Subject: Initialise triggers later, move trigger name into an attribute to make serialisation... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69a2cf2ad61eb7e9d2bd1584c7123733e10587fb;p=thirdparty%2Ffreeradius-server.git Initialise triggers later, move trigger name into an attribute to make serialisation easier --- diff --git a/share/dictionary/freeradius/dictionary.freeradius.internal b/share/dictionary/freeradius/dictionary.freeradius.internal index 77649441ea..e11a863411 100644 --- a/share/dictionary/freeradius/dictionary.freeradius.internal +++ b/share/dictionary/freeradius/dictionary.freeradius.internal @@ -536,8 +536,9 @@ ATTRIBUTE Radclient-CoA-Filter 2203 string # Range: 2220-2259 # Attributes used as trigger arguments # -ATTRIBUTE Connection-Pool-Server 2220 string -ATTRIBUTE Connection-Pool-Port 2221 short +ATTRIBUTE Trigger-Name 2220 string +ATTRIBUTE Connection-Pool-Server 2221 string +ATTRIBUTE Connection-Pool-Port 2222 short ATTRIBUTE Exfile-Name 2223 string ATTRIBUTE LDAP-Sync-Base-DN 2224 string diff --git a/src/lib/server/base.c b/src/lib/server/base.c index ba8c0adfac..fc45011a11 100644 --- a/src/lib/server/base.c +++ b/src/lib/server/base.c @@ -46,11 +46,6 @@ int server_init(CONF_SECTION *cs, char const *dict_dir, fr_dict_t *dict) */ if (tmpl_global_init() < 0) return -1; - /* - * Initialise the trigger rate limiting tree - */ - if (trigger_exec_init(cs) < 0) return -1; - /* * Set up dictionaries and attributes for password comparisons */ @@ -100,6 +95,15 @@ int server_init(CONF_SECTION *cs, char const *dict_dir, fr_dict_t *dict) break; } + /* + * Initialise the trigger rate limiting tree. + * + * This must be done after the modules have been bootstrapped, so that + * any xlat functions/dictionary attributes have been registered and + * before the modules actually want to use triggers or open connections. + */ + if (trigger_exec_init(cs) < 0) return -1; + /* * And then load the virtual servers. */ diff --git a/src/lib/server/trigger.c b/src/lib/server/trigger.c index e2d56eed5d..0d27514f93 100644 --- a/src/lib/server/trigger.c +++ b/src/lib/server/trigger.c @@ -29,6 +29,7 @@ RCSID("$Id$") #include #include #include +#include #include #include #include @@ -58,6 +59,20 @@ typedef struct { fr_time_t last_fired; //!< When this trigger last fired. } trigger_last_fired_t; +static fr_dict_t const *dict_freeradius; +extern fr_dict_autoload_t trigger_dict[]; +fr_dict_autoload_t trigger_dict[] = { + { .out = &dict_freeradius, .proto = "freeradius" }, + { NULL } +}; + +static fr_dict_attr_t const *attr_trigger_name; +extern fr_dict_attr_autoload_t trigger_dict_attr[]; +fr_dict_attr_autoload_t trigger_dict_attr[] = { + { .out = &attr_trigger_name, .name = "Trigger-Name", .type = FR_TYPE_STRING, .dict = &dict_freeradius }, + { NULL } +}; + xlat_arg_parser_t const trigger_xlat_args[] = { { .required = true, .single = true, .type = FR_TYPE_STRING }, XLAT_ARG_PARSER_TERMINATOR @@ -304,7 +319,8 @@ int trigger_exec(unlang_interpret_t *intp, * trigger_xlat function. */ if (args) { - fr_pair_list_t *local_args; + fr_pair_list_t *local_args; + fr_pair_t *vp; MEM(local_args = talloc_zero(request, fr_pair_list_t)); fr_pair_list_init(local_args); @@ -315,6 +331,9 @@ int trigger_exec(unlang_interpret_t *intp, return -1; } + MEM(pair_append_request(&vp, attr_trigger_name) >= 0); + fr_pair_value_strdup(vp, cf_pair_value(cp), false); + if (request_data_add(request, &trigger_cs, REQUEST_INDEX_TRIGGER_ARGS, local_args, false, false, false) < 0) goto args_error; } @@ -501,6 +520,7 @@ static int _mutex_free(pthread_mutex_t *mutex) */ static int _trigger_exec_free(UNUSED void *uctx) { + fr_dict_autofree(trigger_dict); TALLOC_FREE(trigger_last_fired_tree); TALLOC_FREE(trigger_mutex); @@ -523,7 +543,18 @@ static int _trigger_exec_free(UNUSED void *uctx) */ static int _trigger_exec_init(void *cs_arg) { - CONF_SECTION *cs = talloc_get_type_abort(cs_arg, CONF_SECTION); + CONF_SECTION *cs; + + if (unlikely(fr_dict_autoload(trigger_dict) < 0)) { + PERROR("Failed loading trigger dictionaries"); + return -1; + } + if (unlikely(fr_dict_attr_autoload(trigger_dict_attr) < 0)) { + PERROR("Failed loading trigger attributes"); + return -1; + } + + cs = talloc_get_type_abort(cs_arg, CONF_SECTION); if (!cs) { ERROR("%s - Pointer to main_config was NULL", __FUNCTION__); return -1;