#include "amanda.h"
#include "util.h"
#include "amxml.h"
+#include "match.h"
#include "glib.h"
#include "conffile.h"
#include "base64.h"
int has_compress;
int has_encrypt;
int has_kencrypt;
+ int has_datapath;
int has_exclude;
int has_include;
int has_index;
property_t *property_data;
proplist_t property;
script_t *script;
+ level_t *alevel;
char *encoding;
char *raw;
-
} amgxml_t;
return dle;
}
+void
+free_dle(
+ dle_t *dle)
+{
+ scriptlist_t scriptlist;
+
+ amfree(dle->disk);
+ amfree(dle->device);
+ amfree(dle->program);
+ g_slist_free(dle->estimatelist);
+ slist_free_full(dle->levellist, g_free);
+ amfree(dle->dumpdate);
+ amfree(dle->compprog);
+ amfree(dle->srv_encrypt);
+ amfree(dle->clnt_encrypt);
+ amfree(dle->srv_decrypt_opt);
+ amfree(dle->clnt_decrypt_opt);
+ amfree(dle->auth);
+ amfree(dle->application_client_name);
+ free_sl(dle->exclude_file);
+ free_sl(dle->exclude_list);
+ free_sl(dle->include_file);
+ free_sl(dle->include_list);
+ if (dle->property)
+ g_hash_table_destroy(dle->property);
+ if (dle->application_property)
+ g_hash_table_destroy(dle->application_property);
+ for(scriptlist = dle->scriptlist; scriptlist != NULL;
+ scriptlist = scriptlist->next) {
+ free_script_data((script_t *)scriptlist->data);
+ }
+ slist_free_full(dle->scriptlist, g_free);
+ slist_free_full(dle->directtcp_list, g_free);
+ amfree(dle);
+}
+
+void
+free_script_data(
+ script_t *script)
+{
+ amfree(script->plugin);
+ amfree(script->client_name);
+ if (script->property)
+ g_hash_table_destroy(script->property);
+}
+
void
init_dle(
dle_t *dle)
dle->device = NULL;
dle->program_is_application_api = 0;
dle->program = NULL;
- dle->calcsize = 0;
- dle->estimate = 0;
+ dle->estimatelist = NULL;
dle->record = 1;
dle->spindle = 0;
dle->compress = COMP_NONE;
dle->encrypt = ENCRYPT_NONE;
dle->kencrypt = 0;
- dle->level = NULL;
+ dle->levellist = NULL;
dle->dumpdate = NULL;
dle->compprog = NULL;
dle->srv_encrypt = NULL;
dle->include_list = NULL;
dle->exclude_optional = 0;
dle->include_optional = 0;
+ dle->property = NULL;
dle->application_property = NULL;
dle->scriptlist = NULL;
+ dle->data_path = DATA_PATH_AMANDA;
+ dle->directtcp_list = NULL;
+ dle->application_client_name = NULL;
dle->next = NULL;
}
data_user->has_compress = 0;
data_user->has_encrypt = 0;
data_user->has_kencrypt = 0;
+ data_user->has_datapath = 0;
data_user->has_exclude = 0;
data_user->has_include = 0;
data_user->has_index = 0;
data_user->has_optional = 0;
data_user->property_name = NULL;
data_user->property_data = NULL;
+ data_user->property =
+ g_hash_table_new_full(g_str_hash, g_str_equal, &g_free, &free_property_t);
+ data_user->script = NULL;
+ data_user->alevel = NULL;
+ data_user->encoding = NULL;
+ data_user->raw = NULL;
} else if(strcmp(element_name, "disk" ) == 0 ||
strcmp(element_name, "diskdevice" ) == 0 ||
strcmp(element_name, "calcsize" ) == 0 ||
strcmp(element_name, "compress" ) == 0 ||
strcmp(element_name, "encrypt" ) == 0 ||
strcmp(element_name, "kencrypt" ) == 0 ||
+ strcmp(element_name, "datapath" ) == 0 ||
strcmp(element_name, "exclude" ) == 0 ||
strcmp(element_name, "include" ) == 0) {
if (strcmp(last_element_name, "dle") != 0) {
(strcmp(element_name, "compress" ) == 0 && data_user->has_compress) ||
(strcmp(element_name, "encrypt" ) == 0 && data_user->has_encrypt) ||
(strcmp(element_name, "kencrypt" ) == 0 && data_user->has_kencrypt) ||
+ (strcmp(element_name, "datapath" ) == 0 && data_user->has_datapath) ||
(strcmp(element_name, "exclude" ) == 0 && data_user->has_exclude) ||
(strcmp(element_name, "include" ) == 0 && data_user->has_include)) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
if (strcmp(element_name, "index" ) == 0) data_user->has_index = 1;
if (strcmp(element_name, "compress" ) == 0) data_user->has_compress = 1;
if (strcmp(element_name, "encrypt" ) == 0) data_user->has_encrypt = 1;
- if (strcmp(element_name, "kencrypt" ) == 0) data_user->has_kencrypt = 1;
+ if (strcmp(element_name, "kencrypt" ) == 0) data_user->has_kencrypt = 1;
+ if (strcmp(element_name, "datapath" ) == 0) data_user->has_datapath = 1;
if (strcmp(element_name, "exclude" ) == 0) data_user->has_exclude = 1;
if (strcmp(element_name, "include" ) == 0) data_user->has_include = 1;
if (strcmp(element_name, "exclude") == 0 || strcmp(element_name, "include") == 0)
data_user->has_optional = 0;
+ if (strcmp(element_name, "level") == 0) {
+ data_user->alevel = g_new0(level_t, 1);
+ }
+ } else if (strcmp(element_name, "server") == 0) {
+ if (strcmp(last_element_name, "level") != 0) {
+ g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "XML: Invalid %s element", element_name);
+ return;
+ }
} else if(strcmp(element_name, "custom-compress-program") == 0) {
if (strcmp(last_element_name, "compress") != 0) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
return;
}
} else if(strcmp(element_name, "property") == 0) {
- if (strcmp(last_element_name, "backup-program") != 0 &&
- strcmp(last_element_name, "script") != 0) {
+ if (!last_element ||
+ (strcmp(last_element_name, "backup-program") != 0 &&
+ strcmp(last_element_name, "script") != 0 &&
+ strcmp(last_element_name, "dle") != 0)) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: Invalid %s element", element_name);
return;
} else {
data_user->has_backup_program = 1;
data_user->property =
- g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+ g_hash_table_new_full(g_str_hash, g_str_equal, &g_free, &free_property_t);
data_user->has_plugin = 0;
}
} else if (strcmp(element_name, "script") == 0) {
data_user->property =
- g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+ g_hash_table_new_full(g_str_hash, g_str_equal, &g_free, &free_property_t);
data_user->script = malloc(sizeof(script_t));
data_user->script->plugin = NULL;
data_user->script->execute_on = 0;
data_user->script->execute_where = ES_CLIENT;
data_user->script->property = NULL;
+ data_user->script->client_name = NULL;
data_user->script->result = NULL;
data_user->has_plugin = 0;
} else if (strcmp(element_name, "execute_on") == 0) {
} else if (strcmp(element_name, "execute_where") == 0) {
+ } else if (strcmp(element_name, "directtcp") == 0) {
+ if (strcmp(last_element_name, "datapath") != 0) {
+ g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "XML: Invalid %s element", element_name);
+ return;
+ }
+ } else if (strcmp(element_name, "client_name") == 0) {
} else {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: Invalid %s element", element_name);
data_user->property_name = NULL;
data_user->property_data = NULL;
} else if (strcmp(element_name, "dle") == 0) {
- if (dle->disk == NULL) {
- g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
- "XML: No disk provided in DLE element");
- return;
- }
if (dle->program_is_application_api &&
!dle->program) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
}
if (dle->device == NULL && dle->disk)
dle->device = stralloc(dle->disk);
+ if (dle->estimatelist == NULL)
+ dle->estimatelist = g_slist_append(dle->estimatelist, ES_CLIENT);
/* Add check of required field */
+ data_user->property = NULL;
data_user->dle = NULL;
} else if (strcmp(element_name, "backup-program") == 0) {
if (dle->program == NULL) {
return;
}
dle->application_property = data_user->property;
- data_user->property = NULL;
+ data_user->property = dle->property;
} else if (strcmp(element_name, "script") == 0) {
if (data_user->script->plugin == NULL) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
return;
}
data_user->script->property = data_user->property;
- data_user->property = NULL;
+ data_user->property = dle->property;
dle->scriptlist = g_slist_append(dle->scriptlist, data_user->script);
data_user->script = NULL;
+ } else if (strcmp(element_name, "level") == 0) {
+ dle->levellist = g_slist_append(dle->levellist, data_user->alevel);
+ data_user->alevel = NULL;
}
g_free(data_user->element_names->data);
data_user->element_names = g_slist_delete_link(data_user->element_names,
GSList *last_element2;
char *last_element2_name;
dle_t *dle = data_user->dle;
- int i;
if (!last_element) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
if (data_user->raw) {
amfree(tt);
tt = stralloc(data_user->raw);
+ } else if (strlen(tt) > 0) {
+ /* remove trailing space */
+ char *ttt = tt + strlen(tt) - 1;
+ while(*ttt == ' ') {
+ ttt--;
+ }
+ ttt++;
+ *ttt = '\0';
}
//check if it is only space
strcmp(last_element_name, "include") == 0) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: %s doesn't have text '%s'", last_element_name, tt);
+ amfree(tt);
return;
} else if(strcmp(last_element_name, "disk") == 0) {
if (dle->disk != NULL) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: multiple text in %s", last_element_name);
+ amfree(tt);
return;
}
dle->disk = tt;
if (dle->device != NULL) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: multiple text in %s", last_element_name);
+ amfree(tt);
return;
}
dle->device = tt;
} else if(strcmp(last_element_name, "calcsize") == 0) {
if (strcasecmp(tt,"yes") == 0) {
- dle->calcsize = 1;
+ dle->estimatelist = g_slist_append(dle->estimatelist,
+ GINT_TO_POINTER(ES_CALCSIZE));
}
amfree(tt);
} else if(strcmp(last_element_name, "estimate") == 0) {
- if (strcasecmp(tt,"client") == 0) {
- dle->estimate = ES_CLIENT;
- } else if (strcasecmp(tt,"calcsize") == 0) {
- dle->estimate = ES_CALCSIZE;
- dle->calcsize = 1;
- } else if (strcasecmp(tt,"server") == 0) {
- dle->estimate = ES_SERVER;
+ char *ttt = tt;
+ while (strlen(ttt) > 0) {
+ if (BSTRNCMP(ttt,"CLIENT") == 0) {
+ dle->estimatelist = g_slist_append(dle->estimatelist,
+ GINT_TO_POINTER(ES_CLIENT));
+ ttt += strlen("client");
+ } else if (BSTRNCMP(ttt,"CALCSIZE") == 0) {
+ if (!data_user->has_calcsize)
+ dle->estimatelist = g_slist_append(dle->estimatelist,
+ GINT_TO_POINTER(ES_CALCSIZE));
+ ttt += strlen("calcsize");
+ } else if (BSTRNCMP(ttt,"SERVER") == 0) {
+ dle->estimatelist = g_slist_append(dle->estimatelist,
+ GINT_TO_POINTER(ES_SERVER));
+ ttt += strlen("server");
+ } else {
+ g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "XML: bad estimate: %s", tt);
+ return;
+ }
+ while (*ttt == ' ')
+ ttt++;
}
amfree(tt);
} else if(strcmp(last_element_name, "program") == 0) {
if (dle->program != NULL) {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: multiple text in %s", last_element_name);
+ amfree(tt);
return;
}
- dle->program = tt;
if (strcmp(tt, "APPLICATION") == 0) {
dle->program_is_application_api = 1;
dle->program = NULL;
+ amfree(tt);
+ } else {
+ dle->program = tt;
}
} else if(strcmp(last_element_name, "plugin") == 0) {
last_element2 = g_slist_nth(data_user->element_names, 1);
} else {
error("priority outside of property");
}
+ amfree(tt);
} else if(strcmp(last_element_name, "value") == 0) {
last_element2 = g_slist_nth(data_user->element_names, 1);
if (!last_element2) {
}
dle->auth = tt;
} else if(strcmp(last_element_name, "level") == 0) {
- dle->level = g_slist_append(dle->level, GINT_TO_POINTER(atoi(tt)));
+ data_user->alevel->level = atoi(tt);
+ amfree(tt);
+ } else if (strcmp(last_element_name, "server") == 0) {
+ if (strcasecmp(tt,"no") == 0) {
+ data_user->alevel->server = 0;
+ } else if (strcasecmp(tt,"yes") == 0) {
+ data_user->alevel->server = 1;
+ } else {
+ g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "XML: Invalid %s (%s)", last_element_name, tt);
+ amfree(tt);
+ return;
+ }
amfree(tt);
} else if(strcmp(last_element_name, "index") == 0) {
if (strcasecmp(tt,"no") == 0) {
} else {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: Invalid %s (%s)", last_element_name, tt);
+ amfree(tt);
return;
}
+ amfree(tt);
} else if(strcmp(last_element_name, "spindle") == 0) {
dle->spindle = atoi(tt);
+ amfree(tt);
} else if(strcmp(last_element_name, "compress") == 0) {
if (strcmp(tt, "FAST") == 0) {
dle->compress = COMP_FAST;
error("XML: optional");
}
last_element2_name = last_element2->data;
- dle->clnt_encrypt = tt;
+ if (dle->encrypt == ENCRYPT_SERV_CUST)
+ dle->srv_encrypt = tt;
+ else
+ dle->clnt_encrypt = tt;
} else if(strcmp(last_element_name, "decrypt-option") == 0) {
last_element2 = g_slist_nth(data_user->element_names, 1);
if (!last_element2) {
error("XML: optional");
}
last_element2_name = last_element2->data;
- dle->clnt_decrypt_opt = tt;
+ if (dle->encrypt == ENCRYPT_SERV_CUST)
+ dle->srv_decrypt_opt = tt;
+ else
+ dle->clnt_decrypt_opt = tt;
} else if(strcmp(last_element_name, "exclude") == 0 ||
strcmp(last_element_name, "include") == 0) {
data_user->has_optional = 0;
+ amfree(tt);
} else if(strcmp(last_element_name, "file") == 0) {
last_element2 = g_slist_nth(data_user->element_names, 1);
if (!last_element2) {
error("bad list");
}
} else if(strcmp(last_element_name, "optional") == 0) {
- i = atoi(tt);
last_element2 = g_slist_nth(data_user->element_names, 1);
if (!last_element2) {
error("XML: optional");
data_user->has_optional = 1;
amfree(tt);
} else if(strcmp(last_element_name, "script") == 0) {
+ amfree(tt);
} else if(strcmp(last_element_name, "execute_on") == 0) {
char *sep;
char *tt1 = tt;
sep = strchr(tt1,',');
if (sep)
*sep = '\0';
- if (strcmp(tt1,"PRE-DLE-AMCHECK") == 0)
+ if (strcmp(tt1,"PRE-AMCHECK") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_PRE_AMCHECK;
+ else if (strcmp(tt1,"PRE-DLE-AMCHECK") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_AMCHECK;
else if (strcmp(tt1,"PRE-HOST-AMCHECK") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_AMCHECK;
+ else if (strcmp(tt1,"POST-AMCHECK") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_POST_AMCHECK;
else if (strcmp(tt1,"POST-DLE-AMCHECK") == 0)
data_user->script->execute_on |= EXECUTE_ON_POST_DLE_AMCHECK;
else if (strcmp(tt1,"POST-HOST-AMCHECK") == 0)
data_user->script->execute_on |= EXECUTE_ON_POST_HOST_AMCHECK;
+ else if (strcmp(tt1,"PRE-ESTIMATE") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_PRE_ESTIMATE;
else if (strcmp(tt1,"PRE-DLE-ESTIMATE") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_ESTIMATE;
else if (strcmp(tt1,"PRE-HOST-ESTIMATE") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_ESTIMATE;
+ else if (strcmp(tt1,"POST-ESTIMATE") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_POST_ESTIMATE;
else if (strcmp(tt1,"POST-DLE-ESTIMATE") == 0)
data_user->script->execute_on |= EXECUTE_ON_POST_DLE_ESTIMATE;
else if (strcmp(tt1,"POST-HOST-ESTIMATE") == 0)
data_user->script->execute_on |= EXECUTE_ON_POST_HOST_ESTIMATE;
+ else if (strcmp(tt1,"PRE-BACKUP") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_PRE_BACKUP;
else if (strcmp(tt1,"PRE-DLE-BACKUP") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_BACKUP;
else if (strcmp(tt1,"PRE-HOST-BACKUP") == 0)
data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_BACKUP;
+ else if (strcmp(tt1,"POST-BACKUP") == 0)
+ data_user->script->execute_on |= EXECUTE_ON_POST_BACKUP;
else if (strcmp(tt1,"POST-DLE-BACKUP") == 0)
data_user->script->execute_on |= EXECUTE_ON_POST_DLE_BACKUP;
else if (strcmp(tt1,"POST-HOST-BACKUP") == 0)
} else {
data_user->script->execute_where = ES_SERVER;
}
+ amfree(tt);
+ } else if(strcmp(last_element_name, "datapath") == 0) {
+ if (strcmp(tt, "AMANDA") == 0) {
+ dle->data_path = DATA_PATH_AMANDA;
+ } else if (strcmp(tt, "DIRECTTCP") == 0) {
+ dle->data_path = DATA_PATH_DIRECTTCP;
+ } else {
+ g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "XML: bad datapath value '%s'", tt);
+ }
+ amfree(tt);
+ } else if(strcmp(last_element_name, "directtcp") == 0) {
+ dle->directtcp_list = g_slist_append(dle->directtcp_list, tt);
+ } else if(strcmp(last_element_name, "client_name") == 0) {
+ last_element2 = g_slist_nth(data_user->element_names, 1);
+ if (!last_element2) {
+ error("Invalid client_name text");
+ }
+ last_element2_name = last_element2->data;
+ if (strcmp(last_element2_name, "backup-program") == 0) {
+ dle->application_client_name = tt;
+g_debug("set dle->application_client_name: %s", dle->application_client_name);
+ } else if (strcmp(last_element2_name, "script") == 0) {
+ data_user->script->client_name = tt;
+g_debug("set data_user->script->client_name: %s", data_user->script->client_name);
+ } else {
+ error("client_name outside of script or backup-program");
+ }
} else {
g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"XML: amtext not defined for '%s'", last_element_name);
+ amfree(tt);
return;
}
}
char *txt,
char **errmsg)
{
- amgxml_t amgxml = {NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL};
+ amgxml_t amgxml = {NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
GMarkupParser parser = {&amstart_element, &amend_element, &amtext,
NULL, NULL};
GMarkupParseFlags flags = 0;
FILE *file,
char **errmsg)
{
- amgxml_t amgxml = {NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL};
+ amgxml_t amgxml = {NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
GMarkupParser parser = {&amstart_element, &amend_element, &amtext,
NULL, NULL};
GMarkupParseFlags flags = 0;