[asterisk-bugs] [JIRA] (ASTERISK-28951) Inconsistent behaviour queues.conf when there is (not) a [general] section

Asterisk Team (JIRA) noreply at issues.asterisk.org
Wed Sep 9 11:04:45 CDT 2020


     [ https://issues.asterisk.org/jira/browse/ASTERISK-28951?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Asterisk Team updated ASTERISK-28951:
-------------------------------------

    Target Release Version/s: 18.0.0

> Inconsistent behaviour queues.conf when there is (not) a [general] section
> --------------------------------------------------------------------------
>
>                 Key: ASTERISK-28951
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-28951
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: Applications/app_queue
>    Affects Versions: 13.34.0
>            Reporter: Walter Doekes
>            Assignee: Walter Doekes
>            Severity: Trivial
>      Target Release: 18.0.0
>
>
> app_queue suggests these "defaults" at the top of the file:
> {code}
> /*! \brief queues.conf [general] option */
> static int autofill_default = 1;
> /*! \brief queues.conf [general] option */
> static int montype_default = 0;
> /*! \brief queues.conf [general] option */
> static int shared_lastcall = 1;
> {code}
> The queue reload code contains this:
> {code}
> /*! Set the global queue parameters as defined in the "general" section of queues.conf */
> static void queue_set_global_params(struct ast_config *cfg)
> {
> ...
>         autofill_default = 0;
>         if ((general_val = ast_variable_retrieve(cfg, "general", "autofill"))) {
>                 autofill_default = ast_true(general_val);
> ...
>         shared_lastcall = 0;
>         if ((general_val = ast_variable_retrieve(cfg, "general", "shared_lastcall"))) {
>                 shared_lastcall = ast_true(general_val);
> {code}
> And that code is ran here:
> {code}
> static int reload_queues(int reload, struct ast_flags *mask, const char *queuename)
> ...
>         if (!(cfg = ast_config_load("queues.conf", config_flags))) {
> ...
>         while ((cat = ast_category_browse(cfg, cat)) ) {
>                 if (!strcasecmp(cat, "general") && queue_reload) {
>                         queue_set_global_params(cfg);
>                         continue;
> {code}
> That means:
> - if there is a queues.conf
> - it has a {{\[general]}} section (or _had_ a such a section)
> - the autofill_default default is 0, and the shared_lastcall default is 0
> If there is NO {{\[general]}} section:
> - the autofill_default default is 1, and the shared_lastcall default is 1
> That's confusing, and also, it disagrees with the sample cfg:
> {noformat}
> ;    in most cases, you will want to enable this behavior. If you
> ;    do not specify or comment out this option, it will default to yes.
> ;
> ;autofill = no
> ...
> ; The default value is no.
> ;
> ;shared_lastcall=no
> {noformat}
> That last one was changed here:
> {noformat}
> commit 4b50e3f1ee84ae29da6d9eb3cfd9896a49d2394b
> Author: Mark Michelson <mmichelson at digium.com>
> Date:   Mon Aug 27 17:52:16 2012 +0000
>     Fix incorrectly documented option in queues.conf
>     
>     sharedlastcall defaults to "no" not "yes"
> {noformat}
> But the autofill_default was not. And they still differ depending on the existence of the general section.
> Suggested fix:
> {noformat}
> diff --git a/apps/app_queue.c b/apps/app_queue.c
> index 3a572efc2d..1e786fc39f 100644
> --- a/apps/app_queue.c
> +++ b/apps/app_queue.c
> @@ -1363,34 +1363,34 @@ static char *app_ql = "QueueLog" ;
>  static const char * const pm_family = "Queue/PersistentMembers";
>  
>  /*! \brief queues.conf [general] option */
> -static int queue_persistent_members = 0;
> +static int queue_persistent_members;
>  
> -/*! \brief queues.conf per-queue weight option */
> -static int use_weight = 0;
> +/*! \brief Records that one or more queues use weight */
> +static int use_weight;
>  
>  /*! \brief queues.conf [general] option */
> -static int autofill_default = 1;
> +static int autofill_default;
>  
>  /*! \brief queues.conf [general] option */
> -static int montype_default = 0;
> +static int montype_default;
>  
>  /*! \brief queues.conf [general] option */
> -static int shared_lastcall = 1;
> +static int shared_lastcall;
>  
>  /*! \brief queuesrules.conf [general] option */
> -static int realtime_rules = 0;
> +static int realtime_rules;
>  
>  /*! \brief Subscription to device state change messages */
>  static struct stasis_subscription *device_state_sub;
>  
>  /*! \brief queues.conf [general] option */
> -static int update_cdr = 0;
> +static int update_cdr;
>  
>  /*! \brief queues.conf [general] option */
> -static int negative_penalty_invalid = 0;
> +static int negative_penalty_invalid;
>  
>  /*! \brief queues.conf [general] option */
> -static int log_membername_as_agent = 0;
> +static int log_membername_as_agent;
>  
>  /*! \brief name of the ringinuse field in the realtime database */
>  static char *realtime_ringinuse_field;
> @@ -8722,14 +8722,19 @@ static struct ast_custom_function queuememberpenalty_function = {
>  	.write = queue_function_memberpenalty_write,
>  };
>  
> +/*! Reset the global queue rules parameters even if there is no "general" section of queuerules.conf */
> +static void queue_rules_reset_global_params()
> +{
> +	realtime_rules = 0;
> +}
> +
>  /*! Set the global queue rules parameters as defined in the "general" section of queuerules.conf */
>  static void queue_rules_set_global_params(struct ast_config *cfg)
>  {
> -        const char *general_val = NULL;
> -        realtime_rules = 0;
> -        if ((general_val = ast_variable_retrieve(cfg, "general", "realtime_rules"))) {
> -                realtime_rules = ast_true(general_val);
> -        }
> +	const char *general_val = NULL;
> +	if ((general_val = ast_variable_retrieve(cfg, "general", "realtime_rules"))) {
> +		realtime_rules = ast_true(general_val);
> +	}
>  }
>  
>  /*! \brief Reload the rules defined in queuerules.conf
> @@ -8764,6 +8769,7 @@ static int reload_queue_rules(int reload)
>  			ast_free(pr_iter);
>  		ast_free(rl_iter);
>  	}
> +	queue_rules_reset_global_params();
>  	while ((rulecat = ast_category_browse(cfg, rulecat))) {
>  		if (!strcasecmp(rulecat, "general")) {
>  			queue_rules_set_global_params(cfg);
> @@ -8795,36 +8801,41 @@ static int reload_queue_rules(int reload)
>  	return AST_MODULE_LOAD_SUCCESS;
>  }
>  
> +/*! Always set the global queue defaults, even if there is no "general" section in queues.conf */
> +static void queue_reset_global_params()
> +{
> +	queue_persistent_members = 0;
> +	autofill_default = 0;
> +	montype_default = 0;
> +	update_cdr = 0;
> +	shared_lastcall = 0;
> +	negative_penalty_invalid = 0;
> +	log_membername_as_agent = 0;
> +}
> +
>  /*! Set the global queue parameters as defined in the "general" section of queues.conf */
>  static void queue_set_global_params(struct ast_config *cfg)
>  {
>  	const char *general_val = NULL;
> -	queue_persistent_members = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "persistentmembers"))) {
>  		queue_persistent_members = ast_true(general_val);
>  	}
> -	autofill_default = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "autofill"))) {
>  		autofill_default = ast_true(general_val);
>  	}
> -	montype_default = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "monitor-type"))) {
>  		if (!strcasecmp(general_val, "mixmonitor"))
>  			montype_default = 1;
>  	}
> -	update_cdr = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "updatecdr"))) {
>  		update_cdr = ast_true(general_val);
>  	}
> -	shared_lastcall = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "shared_lastcall"))) {
>  		shared_lastcall = ast_true(general_val);
>  	}
> -	negative_penalty_invalid = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "negative_penalty_invalid"))) {
>  		negative_penalty_invalid = ast_true(general_val);
>  	}
> -	log_membername_as_agent = 0;
>  	if ((general_val = ast_variable_retrieve(cfg, "general", "log_membername_as_agent"))) {
>  		log_membername_as_agent = ast_true(general_val);
>  	}
> @@ -9128,6 +9139,7 @@ static int reload_queues(int reload, struct ast_flags *mask, const char *queuena
>  
>  	/* Chug through config file. */
>  	cat = NULL;
> +	queue_reset_global_params();
>  	while ((cat = ast_category_browse(cfg, cat)) ) {
>  		if (!strcasecmp(cat, "general") && queue_reload) {
>  			queue_set_global_params(cfg);
> diff --git a/configs/samples/queues.conf.sample b/configs/samples/queues.conf.sample
> index 5c8a80ffee..f1694929fb 100644
> --- a/configs/samples/queues.conf.sample
> +++ b/configs/samples/queues.conf.sample
> @@ -23,7 +23,7 @@ persistentmembers = yes
>  ;    no more available members or no more waiting callers. This is
>  ;    probably more along the lines of how a queue should work and
>  ;    in most cases, you will want to enable this behavior. If you
> -;    do not specify or comment out this option, it will default to yes.
> +;    do not specify or comment out this option, it will default to no.
>  ;
>  ;autofill = no
>  ;
> {noformat}
> Unfortunately, this change will change things for the current users who don't have a {{\[general]}} section.
> So, suggested target for this change?
> - master only?
> - 13 and up, adding an appropriate notice in CHANGES?



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list