[asterisk-commits] gtjoseph: branch 13 r430295 - in /branches/13: include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jan 7 10:55:35 CST 2015


Author: gtjoseph
Date: Wed Jan  7 10:55:14 2015
New Revision: 430295

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430295
Log:
config: Add option to NOT preserve effective context when changing a template

Let's say you have a template T with variable VAR1 = ON and you have a
context C(T) that doesn't specify VAR1.  If you read C, the effective value
of VAR1 is ON.  Now you change T VAR1 to OFF and call
ast_config_text_file_save.  The current behavior is that the file gets
re-written with T/VAR1=OFF but C/VAR1=ON is added.  Personally, I think this
is a bug. It's preserving the effective state of C even though I didn't
specify C/VAR1 in th first place.  I believe the behavior should be that if
I didn't specify C/VAR1 originally, then the effective value of C/VAR1 should
continue to follow the inherited state.  Now, if I DID explicitly specify
C/VAR1, the it should be preserved even if the template changes.

Even though I think the existing behavior is a bug, it's been that way forever
so I'm not changing it.  Instead, I've created ast_config_text_file_save2()
that takes a bitmask of flags, one of which is to preserve the effective context
(the current behavior).  The original ast_config_text_file_save calls *2 with
the preserve flag.  If you want the new behavior, call *2 directly without a
flag.

I've also updated Manager UpdateConfig with a new parameter
'PreserveEffectiveContext' whose default is 'yes'.  If you want the new behavior
with UpdateConfig, set 'PreserveEffectiveContext: no'.

Tested-by: George Joseph

Review: https://reviewboard.asterisk.org/r/4297/


Modified:
    branches/13/include/asterisk/config.h
    branches/13/main/config.c
    branches/13/main/manager.c

Modified: branches/13/include/asterisk/config.h
URL: http://svnview.digium.com/svn/asterisk/branches/13/include/asterisk/config.h?view=diff&rev=430295&r1=430294&r2=430295
==============================================================================
--- branches/13/include/asterisk/config.h (original)
+++ branches/13/include/asterisk/config.h Wed Jan  7 10:55:14 2015
@@ -45,6 +45,14 @@
 	CONFIG_FLAG_NOCACHE       = (1 << 2),
 	/*! Don't attempt to load from realtime (typically called from a realtime driver dependency) */
 	CONFIG_FLAG_NOREALTIME    = (1 << 3),
+};
+
+/*! Flags for ast_config_text_file_save2()
+ */
+enum config_save_flags {
+	CONFIG_SAVE_FLAG_NONE = (0),
+	/*! Insure a context doesn't effectively change if a template changes (pre 13.2 behavior) */
+	CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT = (1 << 0),
 };
 
 #define	CONFIG_STATUS_FILEMISSING	(void *)0
@@ -86,7 +94,8 @@
 
 	int lineno;
 	int object;		/*!< 0 for variable, 1 for object */
-	int blanklines; 	/*!< Number of blanklines following entry */
+	int blanklines;		/*!< Number of blanklines following entry */
+	int inherited;		/*!< 1 for inherited from template or other base */
 	struct ast_comment *precomments;
 	struct ast_comment *sameline;
 	struct ast_comment *trailing; /*!< the last object in the list will get assigned any trailing comments when EOF is hit */
@@ -907,6 +916,28 @@
 int ast_variable_update(struct ast_category *category, const char *variable,
 						const char *value, const char *match, unsigned int object);
 
+/*!
+ * \brief Save a config text file
+ * \since 13.2.0
+ *
+ * \param filename Filename
+ * \param cfg ast_config
+ * \param generator generator
+ * \param flags List of config_save_flags
+ *
+ * \return 0 on success or -1 on failure.
+ */
+int ast_config_text_file_save2(const char *filename, const struct ast_config *cfg, const char *generator, uint32_t flags);
+
+/*!
+ * \brief Save a config text file preserving the pre 13.2 behavior
+ *
+ * \param filename Filename
+ * \param cfg ast_config
+ * \param generator generator
+ *
+ * \return 0 on success or -1 on failure.
+ */
 int ast_config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator);
 int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator) __attribute__((deprecated));
 

Modified: branches/13/main/config.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/main/config.c?view=diff&rev=430295&r1=430294&r2=430295
==============================================================================
--- branches/13/main/config.c (original)
+++ branches/13/main/config.c Wed Jan  7 10:55:14 2015
@@ -1250,8 +1250,11 @@
 	strcpy(x->name, base->name);
 	x->inst = base;
 	AST_LIST_INSERT_TAIL(&new->template_instances, x, next);
-	for (var = base->root; var; var = var->next)
-		ast_variable_append(new, variable_clone(var));
+	for (var = base->root; var; var = var->next) {
+		struct ast_variable *cloned = variable_clone(var);
+		cloned->inherited = 1;
+		ast_variable_append(new, cloned);
+	}
 }
 
 struct ast_config *ast_config_new(void)
@@ -2358,10 +2361,15 @@
 
 int config_text_file_save(const char *configfile, const struct ast_config *cfg, const char *generator)
 {
-	return ast_config_text_file_save(configfile, cfg, generator);
+	return ast_config_text_file_save2(configfile, cfg, generator, CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT);
 }
 
 int ast_config_text_file_save(const char *configfile, const struct ast_config *cfg, const char *generator)
+{
+	return ast_config_text_file_save2(configfile, cfg, generator, CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT);
+}
+
+int ast_config_text_file_save2(const char *configfile, const struct ast_config *cfg, const char *generator, uint32_t flags)
 {
 	FILE *f;
 	char fn[PATH_MAX];
@@ -2522,13 +2530,27 @@
 				AST_LIST_TRAVERSE(&cat->template_instances, x, next) {
 					struct ast_variable *v;
 					for (v = x->inst->root; v; v = v->next) {
-						if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) {
-							found = 1;
-							break;
+
+						if (flags & CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT) {
+							if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) {
+								found = 1;
+								break;
+							}
+						} else {
+							if (var->inherited) {
+								found = 1;
+								break;
+							} else {
+								if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) {
+									found = 1;
+									break;
+								}
+							}
 						}
 					}
-					if (found)
+					if (found) {
 						break;
+					}
 				}
 				if (found) {
 					var = var->next;

Modified: branches/13/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/main/manager.c?view=diff&rev=430295&r1=430294&r2=430295
==============================================================================
--- branches/13/main/manager.c (original)
+++ branches/13/main/manager.c Wed Jan  7 10:55:14 2015
@@ -411,6 +411,9 @@
 			</parameter>
 			<parameter name="Reload">
 				<para>Whether or not a reload should take place (or name of specific module).</para>
+			</parameter>
+			<parameter name="PreserveEffectiveContext">
+				<para>Whether the effective category contents should be preserved on template change. Default is true (pre 13.2 behavior).</para>
 			</parameter>
 			<parameter name="Action-000000">
 				<para>Action to take.</para>
@@ -3767,6 +3770,8 @@
 	const char *dfn = astman_get_header(m, "DstFilename");
 	int res;
 	const char *rld = astman_get_header(m, "Reload");
+	int preserve_effective_context = CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT;
+	const char *preserve_effective_context_string = astman_get_header(m, "PreserveEffectiveContext");
 	struct ast_flags config_flags = { CONFIG_FLAG_WITHCOMMENTS | CONFIG_FLAG_NOCACHE };
 	enum error_type result;
 
@@ -3784,7 +3789,10 @@
 	result = handle_updates(s, m, cfg, dfn);
 	if (!result) {
 		ast_include_rename(cfg, sfn, dfn); /* change the include references from dfn to sfn, so things match up */
-		res = ast_config_text_file_save(dfn, cfg, "Manager");
+		if (!ast_strlen_zero(preserve_effective_context_string) && !ast_true(preserve_effective_context_string)) {
+			preserve_effective_context = CONFIG_SAVE_FLAG_NONE;
+		}
+		res = ast_config_text_file_save2(dfn, cfg, "Manager", preserve_effective_context);
 		ast_config_destroy(cfg);
 		if (res) {
 			astman_send_error(s, m, "Save of config failed");




More information about the asterisk-commits mailing list