Re: setting INTERACTIVITY back to "not set"?

Jean-Louis Martineau <[email protected]> Tue, 14 Nov 2017 12:59:42 -0500
Newsgroups gmane.comp.archivers.amanda.devel
Message-ID <[email protected]>
Nathan,

Can you try the attached patch?

Jean-Louis

On 14/11/17 01:45 AM, Nathan Stratton Treadway wrote:
> (Amanda 3.5 [with override-error.diff and amgetconf-list.diff applied])
>
> I have the global INTERACTIVITY parameter set to "inter_tty_email" in my
> amanda.conf, but I've found that sometimes I would like to set it back
> to "not set" status, either temporarily in an "-o" override (for a
> command that does not have a --no-interactivity option) or permanently
> for a specific storage (i.e. using the INTERACTIVITY parameter within
> the DEFINE STORAGE section to override the global setting).
>
> However, I'm not able to set the parameter to the "" string:
> =====
> # su backup -c 'amcheck -s TestBackup -ostorage=TestOffsite 
> -ointeractivity=""'
> argument '""': Unknown interactivity named:
> ERROR: errors processing config file
> =====
>
> So, I was wondering if it would be reasonable to add "" as a special
> case to un-set the existing interactivity parameter value (in the
> current scope)?
>
> (Some value other than "" could certainly be used instead, but "amadmin
> TestBackup config" displays:
> INTERACTIVITY ""
> when the parameter is not set, and it seems useful to have the two
> support the same value.)
>
>
> Nathan
> ----------------------------------------------------------------------------
> Nathan Stratton Treadway - [email protected] - Mid-Atlantic region
> Ray Ontko & Co. - Software consulting services - http://www.ontko.com/ 
> <http://www.ontko.com/>
> GPG Key: http://www.ontko.com/~nathanst/gpg_key.txt 
> <http://www.ontko.com/~nathanst/gpg_key.txt> 
> ID: 1023D/ECFB6239
> Key fingerprint = 6AD8 485E 20B9 5C71 231C 0C32 15F3 ADCD ECFB 6239
This message is the property of CARBONITE, INC. and may contain confidential or privileged information.
If this message has been delivered to you by mistake, then do not copy or deliver this message to anyone.  Instead, destroy it and notify me by reply e-mail
conf-unset.diff (text/x-patch, 8.6 KB)
diff --git a/common-src/conffile.c b/common-src/conffile.c
index c409e72..3e8205e 100644
--- a/common-src/conffile.c
+++ b/common-src/conffile.c
@@ -235,6 +235,8 @@ typedef enum {
     /* storage */
     CONF_VAULT,
 
+    /* internal */
+    CONF_PREFERED_IDENT,
 } tok_t;
 
 /* A keyword table entry, mapping the given keyword to the given token.
@@ -1737,6 +1739,12 @@ get_conftoken(
     int inquote = 0;
     int escape = 0;
     int sign;
+    gboolean prefered_ident = FALSE;
+
+    if (exp == CONF_PREFERED_IDENT) {
+	exp = CONF_IDENT;
+	prefered_ident = TRUE;
+    }
 
     if (token_pushed) {
 	token_pushed = 0;
@@ -2005,12 +2013,14 @@ negative_number: /* look for goto negative_number below sign is set there */
 		str = str_keyword(kwp);
 	    break;
 	}
-	conf_parserror(_("%s is expected"), str);
-	tok = exp;
-	if (tok == CONF_INT)
-	    tokenval.v.i = 0;
-	else
-	    tokenval.v.s = "";
+	if (!prefered_ident || exp != CONF_IDENT) {
+	    conf_parserror(_("%s is expected"), str);
+	    tok = exp;
+	    if (tok == CONF_INT)
+		tokenval.v.i = 0;
+	    else
+		tokenval.v.s = "";
+	}
     }
 }
 
@@ -4149,11 +4159,15 @@ read_storage_identlist(
     free_val_t(val);
     ckseen(&val->seen);
     val->v.identlist = NULL;
-    get_conftoken(CONF_IDENT);
+    get_conftoken(CONF_PREFERED_IDENT);
     while (tok == CONF_STRING || tok == CONF_IDENT) {
-	val->v.identlist = g_slist_append(val->v.identlist,
-					  g_strdup(tokenval.v.s));
-	get_conftoken(CONF_ANY);
+	if (strlen(tokenval.v.s) == 0) {
+	    free_val_t(val);
+	} else {
+	    val->v.identlist = g_slist_append(val->v.identlist,
+					      g_strdup(tokenval.v.s));
+	}
+	get_conftoken(CONF_PREFERED_IDENT);
     }
     if (tok != CONF_NL && tok != CONF_END) {
 	conf_parserror(_("string expected"));
@@ -4167,6 +4181,8 @@ read_dump_selection(
     val_t *val)
 {
     dump_selection_t *ds = g_new0(dump_selection_t, 1);
+    dump_selection_list_t dsl;
+    gboolean found = FALSE;
     ds->tag = NULL;
     ds->tag_type = TAG_ALL;
     ds->level = LEVEL_ALL;
@@ -4201,8 +4217,31 @@ read_dump_selection(
     } else {
 	conf_parserror(_("ALL, FULL or INCR expected"));
     }
-    get_conftoken(CONF_NL);
-    val->v.dump_selection = g_slist_append(val->v.dump_selection, ds);
+    get_conftoken(CONF_ANY);
+    if (tok != CONF_NL && tok != CONF_END) {
+	conf_parserror(_("string expected"));
+	unget_conftoken();
+    }
+
+    //replace if already exists
+    for (dsl = val->v.dump_selection ; dsl != NULL ; dsl = dsl->next) {
+	dump_selection_t *ds1 = dsl->data;
+	if (ds->tag_type == ds1->tag_type) {
+	    if (ds->tag_type != TAG_NAME || g_str_equal(ds->tag, ds1->tag)) {
+		ds1->level = ds->level;
+		found = TRUE;
+	    }
+	}
+    }
+    if (!found) {
+	val->v.dump_selection = g_slist_append(val->v.dump_selection, ds);
+	if (ds->tag_type == TAG_NAME && strlen(ds->tag) == 0) {
+	    free_val_t(val);
+	}
+    } else {
+	g_free(ds->tag);
+	g_free(ds);
+    }
 }
 
 static void
@@ -4741,6 +4780,7 @@ read_dapplication(
 {
     application_t *application;
 
+    amfree(val->v.s);
     get_conftoken(CONF_ANY);
     if (tok == CONF_LBRACE) {
 	current_line_num -= 1;
@@ -4749,18 +4789,20 @@ read_dapplication(
 						 anonymous_value(),NULL)),
 				       NULL, NULL, NULL);
 	current_line_num -= 1;
+	val->v.s = g_strdup(application->name);
     } else if (tok == CONF_STRING) {
 	application = lookup_application(tokenval.v.s);
-	if (application == NULL) {
-	    conf_parserror(_("Unknown application named: %s"), tokenval.v.s);
-	    return;
+	if (strlen(tokenval.v.s) != 0) {
+	    if (application == NULL) {
+		conf_parserror(_("Unknown application named: %s"), tokenval.v.s);
+		return;
+	    }
+	    val->v.s = g_strdup(application->name);
 	}
     } else {
 	conf_parserror(_("application name expected: %d %d"), tok, CONF_STRING);
 	return;
     }
-    amfree(val->v.s);
-    val->v.s = g_strdup(application->name);
     ckseen(&val->seen);
 }
 
@@ -4771,6 +4813,7 @@ read_dinteractivity(
 {
     interactivity_t *interactivity;
 
+    amfree(val->v.s);
     get_conftoken(CONF_ANY);
     if (tok == CONF_LBRACE) {
 	current_line_num -= 1;
@@ -4778,18 +4821,20 @@ read_dinteractivity(
 						anonymous_value(),NULL)),
 					NULL, NULL, NULL);
 	current_line_num -= 1;
+	val->v.s = g_strdup(interactivity->name);
     } else if (tok == CONF_STRING) {
-	interactivity = lookup_interactivity(tokenval.v.s);
-	if (interactivity == NULL) {
-	    conf_parserror(_("Unknown interactivity named: %s"), tokenval.v.s);
-	    return;
+	if (strlen(tokenval.v.s) != 0) {
+	    interactivity = lookup_interactivity(tokenval.v.s);
+	    if (interactivity == NULL) {
+		conf_parserror(_("Unknown interactivity named: %s"), tokenval.v.s);
+		return;
+	    }
+	    val->v.s = g_strdup(interactivity->name);
 	}
     } else {
 	conf_parserror(_("interactivity name expected: %d %d"), tok, CONF_STRING);
 	return;
     }
-    amfree(val->v.s);
-    val->v.s = g_strdup(interactivity->name);
     ckseen(&val->seen);
 }
 
@@ -4800,6 +4845,7 @@ read_dtaperscan(
 {
     taperscan_t *taperscan;
 
+    amfree(val->v.s);
     get_conftoken(CONF_ANY);
     if (tok == CONF_LBRACE) {
 	current_line_num -= 1;
@@ -4807,18 +4853,20 @@ read_dtaperscan(
 					   anonymous_value(),NULL)),
 				   NULL, NULL, NULL);
 	current_line_num -= 1;
+	val->v.s = g_strdup(taperscan->name);
     } else if (tok == CONF_STRING) {
-	taperscan = lookup_taperscan(tokenval.v.s);
-	if (taperscan == NULL) {
-	    conf_parserror(_("Unknown taperscan named: %s"), tokenval.v.s);
-	    return;
+	if (strlen(tokenval.v.s) != 0) {
+	    taperscan = lookup_taperscan(tokenval.v.s);
+	    if (taperscan == NULL) {
+		conf_parserror(_("Unknown taperscan named: %s"), tokenval.v.s);
+		return;
+	    }
+	    val->v.s = g_strdup(taperscan->name);
 	}
     } else {
 	conf_parserror(_("taperscan name expected: %d %d"), tok, CONF_STRING);
 	return;
     }
-    amfree(val->v.s);
-    val->v.s = g_strdup(taperscan->name);
     ckseen(&val->seen);
 }
 
@@ -4829,6 +4877,8 @@ read_dpolicy(
 {
     policy_s *policy;
 
+    amfree(val->v.s);
+    amfree(val->v.s);
     get_conftoken(CONF_ANY);
     if (tok == CONF_LBRACE) {
 	current_line_num -= 1;
@@ -4836,18 +4886,20 @@ read_dpolicy(
 					   anonymous_value(),NULL)),
 				   NULL, NULL, NULL);
 	current_line_num -= 1;
+	val->v.s = g_strdup(policy->name);
     } else if (tok == CONF_STRING) {
-	policy = lookup_policy(tokenval.v.s);
-	if (policy == NULL) {
-	    conf_parserror(_("Unknown policy named: %s"), tokenval.v.s);
-	    return;
+	if (strlen(tokenval.v.s) != 0) {
+	    policy = lookup_policy(tokenval.v.s);
+	    if (policy == NULL) {
+		conf_parserror(_("Unknown policy named: %s"), tokenval.v.s);
+		return;
+	    }
+	    val->v.s = g_strdup(policy->name);
 	}
     } else {
 	conf_parserror(_("policy name expected: %d %d"), tok, CONF_STRING);
 	return;
     }
-    amfree(val->v.s);
-    val->v.s = g_strdup(policy->name);
     ckseen(&val->seen);
 }
 
@@ -4899,13 +4951,18 @@ read_dpp_script(
 			g_strdup(pp_script->name), &compare_pp_script_order);
     } else if (tok == CONF_STRING || tok == CONF_IDENT) {
 	while (tok == CONF_STRING || tok == CONF_IDENT) {
-	    pp_script = lookup_pp_script(tokenval.v.s);
-	    if (pp_script == NULL) {
-		conf_parserror(_("Unknown pp_script named: %s"), tokenval.v.s);
-		return;
-	    }
-    	    val->v.identlist = g_slist_insert_sorted(val->v.identlist,
+	    if (strlen(tokenval.v.s) == 0) {
+		slist_free_full(val->v.identlist, g_free);
+		val->v.identlist = NULL;
+	    } else {
+		pp_script = lookup_pp_script(tokenval.v.s);
+		if (pp_script == NULL) {
+		    conf_parserror(_("Unknown pp_script named: %s"), tokenval.v.s);
+		    return;
+		}
+		val->v.identlist = g_slist_insert_sorted(val->v.identlist,
 			 g_strdup(pp_script->name), &compare_pp_script_order);
+	    }
 	    get_conftoken(CONF_ANY);
 	}
 	unget_conftoken();
@@ -5159,12 +5216,25 @@ read_vault_list(
     while (tok == CONF_STRING || tok == CONF_IDENT) {
 	char *storage = g_strdup(tokenval.v.s);
 	int   days    = get_int(CONF_UNIT_NONE);
+	vault_list_t vl;
+	gboolean found = FALSE;
 
-	vault_el_t *vault = g_new(vault_el_t, 1);
-	nb_vault++;
-	vault->storage = storage;
-	vault->days = days;
-	val->v.vault_list = g_slist_append(val->v.vault_list, vault);
+	// Check if the vault is already in the list (Will  only update days)
+	for (vl = val->v.vault_list ; vl != NULL ; vl = vl->next) {
+	    vault_el_t *v = vl->data;
+	    if (g_str_equal(storage, v->storage)) {
+		v->days = days;
+		found = TRUE;
+		nb_vault++;
+	    }
+	}
+	if (!found) {
+	    vault_el_t *vault = g_new(vault_el_t, 1);
+	    nb_vault++;
+	    vault->storage = storage;
+	    vault->days = days;
+	    val->v.vault_list = g_slist_append(val->v.vault_list, vault);
+	}
 	if (tok != CONF_NL && tok != CONF_END) {
 	    get_conftoken(CONF_ANY);
 	}