X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Fdiskfile.c;h=544346a66e7d307d461cf005fe1fe908a834fd46;hb=4f0b86f7a23848c16cfe82fae81e639917fcff27;hp=e11ffd83e851025750b6e47c3c8aaf16fdba2171;hpb=d5853102f67d85d8e169f9dbe973ad573306c215;p=debian%2Famanda
diff --git a/server-src/diskfile.c b/server-src/diskfile.c
index e11ffd8..544346a 100644
--- a/server-src/diskfile.c
+++ b/server-src/diskfile.c
@@ -89,6 +89,12 @@ end:
return config_errors(NULL);
}
+am_host_t *
+get_hostlist(void)
+{
+ return hostlist;
+}
+
am_host_t *
lookup_host(
const char *hostname)
@@ -198,6 +204,9 @@ add_disk(
disk = alloc(SIZEOF(disk_t));
bzero(disk, SIZEOF(disk_t));
disk->line = 0;
+ disk->allow_split = 0;
+ disk->max_warnings = 20;
+ disk->splitsize = (off_t)0;
disk->tape_splitsize = (off_t)0;
disk->split_diskbuffer = NULL;
disk->fallback_splitsize = (off_t)0;
@@ -333,6 +342,7 @@ free_disklist(
while (dl->head != NULL) {
dp = dequeue_disk(dl);
+ amfree(dp->filename);
amfree(dp->name);
amfree(dp->hostname);
amfree(dp->device);
@@ -415,6 +425,28 @@ parse_diskline(
fp = s - 1;
skip_non_whitespace(s, ch);
s[-1] = '\0';
+ if (g_str_equal(fp, "includefile")) {
+ char *include_name;
+ char *include_filename;
+ skip_whitespace(s, ch);
+ if (ch == '\0' || ch == '#') {
+ disk_parserror(filename, line_num, _("include filename name expected"));
+ return (-1);
+ }
+ fp = s - 1;
+ skip_quoted_string(s, ch);
+ s[-1] = '\0';
+ include_name = unquote_string(fp);
+ include_filename = config_dir_relative(include_name);
+ read_diskfile(include_filename, lst);
+ g_free(include_filename);
+ g_free(include_name);
+ if (config_errors(NULL) >= CFGERR_WARNINGS) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
host = lookup_host(fp);
if (host == NULL) {
hostname = stralloc(fp);
@@ -532,6 +564,7 @@ parse_diskline(
}
if (!disk) {
disk = alloc(SIZEOF(disk_t));
+ disk->filename = g_strdup(filename);
disk->line = line_num;
disk->hostname = hostname;
disk->name = diskname;
@@ -641,6 +674,7 @@ parse_diskline(
}
disk->dtype_name = dumptype_name(dtype);
+ disk->config = dtype;
disk->program = dumptype_get_program(dtype);
disk->exclude_list = duplicate_sl(dumptype_get_exclude(dtype).sl_list);
disk->exclude_file = duplicate_sl(dumptype_get_exclude(dtype).sl_file);
@@ -653,9 +687,17 @@ parse_diskline(
/* disk->frequency = dumptype_get_frequency(dtype);*/
disk->auth = dumptype_get_auth(dtype);
disk->maxdumps = dumptype_get_maxdumps(dtype);
+ disk->allow_split = dumptype_get_allow_split(dtype);
+ disk->max_warnings = dumptype_get_max_warnings(dtype);
disk->tape_splitsize = dumptype_get_tape_splitsize(dtype);
disk->split_diskbuffer = dumptype_get_split_diskbuffer(dtype);
disk->fallback_splitsize = dumptype_get_fallback_splitsize(dtype);
+ if (disk->allow_split) {
+ tapetype_t *tapetype = lookup_tapetype(getconf_str(CNF_TAPETYPE));
+ disk->splitsize = tapetype_get_part_size(tapetype);
+ } else {
+ disk->splitsize = disk->tape_splitsize;
+ }
disk->maxpromoteday = dumptype_get_maxpromoteday(dtype);
disk->bumppercent = dumptype_get_bumppercent(dtype);
disk->bumpsize = dumptype_get_bumpsize(dtype);
@@ -693,6 +735,7 @@ parse_diskline(
disk->comprate[0] = dumptype_get_comprate(dtype)[0];
disk->comprate[1] = dumptype_get_comprate(dtype)[1];
disk->data_path = dumptype_get_data_path(dtype);
+ disk->dump_limit = dumptype_get_dump_limit(dtype);
/*
* Boolean parameters with no value (Appears here as value 2) defaults
@@ -1210,19 +1253,57 @@ optionstr(
return result;
}
-
+typedef struct {
+ am_feature_t *features;
+ char *result;
+} xml_app_t;
+
+/* A GHFunc (callback for g_hash_table_foreach) */
+static void xml_property(
+ gpointer key_p,
+ gpointer value_p,
+ gpointer user_data_p)
+{
+ char *tmp;
+ property_t *property = value_p;
+ xml_app_t *xml_app = user_data_p;
+ GSList *value;
+ GString *strbuf;
+
+ strbuf = g_string_new(xml_app->result);
+
+ tmp = amxml_format_tag("name", (char *)key_p);
+ g_string_append_printf(strbuf, " \n %s\n", tmp);
+ g_free(tmp);
+
+ // TODO if client have fe_xml_property_priority
+ if (property->priority
+ && am_has_feature(xml_app->features, fe_xml_property_priority))
+ g_string_append(strbuf, " yes\n");
+
+ for (value = property->values; value != NULL; value = value->next) {
+ tmp = amxml_format_tag("value", value->data);
+ g_string_append_printf(strbuf, " %s", tmp);
+ g_free(tmp);
+ }
+ g_string_append_printf(strbuf, "\n \n");
+
+ g_free(xml_app->result);
+ xml_app->result = g_string_free(strbuf, FALSE);
+}
+
char *
xml_optionstr(
disk_t * dp,
int to_server)
{
- char *auth_opt = stralloc("");
- char *kencrypt_opt = stralloc("");
- char *compress_opt = stralloc("");
+ char *auth_opt;
+ char *kencrypt_opt;
+ char *compress_opt;
char *encrypt_opt = stralloc("");
char *decrypt_opt = stralloc("");
- char *record_opt = stralloc("");
- char *index_opt = stralloc("");
+ char *record_opt;
+ char *index_opt;
char *data_path_opt = stralloc("");
char *exclude = stralloc("");
char *exclude_file = NULL;
@@ -1246,14 +1327,16 @@ xml_optionstr(
qdpname = quote_string(dp->name);
if (am_has_feature(their_features, fe_options_auth)) {
auth_opt = vstralloc(" ", dp->auth, "\n", NULL);
+ } else {
+ auth_opt = stralloc("");
}
switch(dp->compress) {
case COMP_FAST:
- compress_opt = " FAST\n";
+ compress_opt = stralloc(" FAST\n");
break;
case COMP_BEST:
- compress_opt = " BEST\n";
+ compress_opt = stralloc(" BEST\n");
break;
case COMP_CUST:
compress_opt = vstralloc(" CUSTOM"
@@ -1263,19 +1346,20 @@ xml_optionstr(
" \n", NULL);
break;
case COMP_SERVER_FAST:
- compress_opt = " SERVER-FAST\n";
+ compress_opt = stralloc(" SERVER-FAST\n");
break;
case COMP_SERVER_BEST:
- compress_opt = " SERVER-BEST\n";
+ compress_opt = stralloc(" SERVER-BEST\n");
break;
case COMP_SERVER_CUST:
- compress_opt = " SERVER-CUSTOM\n";
compress_opt = vstralloc(" SERVER-CUSTOM"
"",
dp->srvcompprog,
"\n"
" \n", NULL);
break;
+ default:
+ compress_opt = stralloc("");
}
switch(dp->encrypt) {
@@ -1321,15 +1405,20 @@ xml_optionstr(
if(dp->index) {
index_opt = " YES\n";
+ } else {
+ index_opt = "";
}
if (dp->kencrypt) {
kencrypt_opt = " YES\n";
+ } else {
+ kencrypt_opt = "";
}
if (am_has_feature(their_features, fe_xml_data_path)) {
switch(dp->data_path) {
case DATA_PATH_AMANDA:
+ amfree(data_path_opt);
data_path_opt = stralloc(" AMANDA\n");
break;
case DATA_PATH_DIRECTTCP:
@@ -1338,6 +1427,7 @@ xml_optionstr(
char *s, *sc;
char *value, *b64value;
+ amfree(data_path_opt);
data_path_opt = stralloc(" DIRECTTCP");
if (dp->dataport_list) {
s = sc = stralloc(dp->dataport_list);
@@ -1441,6 +1531,7 @@ xml_optionstr(
amfree(qdpname);
amfree(auth_opt);
amfree(data_path_opt);
+ amfree(compress_opt);
amfree(exclude);
amfree(exclude_list);
amfree(exclude_file);
@@ -1450,11 +1541,27 @@ xml_optionstr(
amfree(exc);
amfree(decrypt_opt);
amfree(encrypt_opt);
+ amfree(script_opt);
/* result contains at least 'auth=...' */
return result;
}
+char *
+xml_dumptype_properties(
+ disk_t *dp)
+{
+ xml_app_t xml_dumptype;
+
+ xml_dumptype.result = g_strdup("");
+ xml_dumptype.features = NULL;
+ if (dp && dp->config) {
+ g_hash_table_foreach(dumptype_get_property(dp->config), xml_property,
+ &xml_dumptype);
+ }
+ return xml_dumptype.result;
+}
+
char *
xml_estimate(
estimatelist_t estimatelist,
@@ -1493,10 +1600,13 @@ xml_estimate(
char *
clean_dle_str_for_client(
- char *dle_str)
+ char *dle_str,
+ am_feature_t *their_features)
{
char *rval_dle_str;
char *hack1, *hack2;
+ char *pend, *pscript, *pproperty, *eproperty;
+ int len;
if (!dle_str)
return NULL;
@@ -1516,45 +1626,39 @@ clean_dle_str_for_client(
#undef SC
#undef SC_LEN
- return rval_dle_str;
-}
-
-typedef struct {
- am_feature_t *features;
- char *result;
-} xml_app_t;
-
-/* A GHFunc (callback for g_hash_table_foreach) */
-static void xml_property(
- gpointer key_p,
- gpointer value_p,
- gpointer user_data_p)
-{
- char *property_s = key_p;
- char *b64property;
- property_t *property = value_p;
- char *b64value_data;
- xml_app_t *xml_app = user_data_p;
- GSList *value;
-
- b64property = amxml_format_tag("name", property_s);
- vstrextend(&xml_app->result, " \n",
- " ", b64property, "\n", NULL);
- // TODO if client have fe_xml_property_priority
- if (property->priority &&
- am_has_feature(xml_app->features, fe_xml_property_priority)) {
- vstrextend(&xml_app->result, " yes\n", NULL);
- }
- for(value = property->values; value != NULL; value = value->next) {
- b64value_data = amxml_format_tag("value", value->data);
- vstrextend(&xml_app->result, " ", b64value_data, "\n", NULL);
- amfree(b64value_data);
+ if (!am_has_feature(their_features, fe_dumptype_property)) {
+#define SC "\n"
+#define SC_LEN strlen(SC)
+ /* remove all dle properties, they are before backup-program or script
+ properties */
+ hack1 = rval_dle_str;
+ pend = strstr(rval_dle_str, "");
+ pscript = strstr(rval_dle_str, "\n", NULL);
amfree(b64plugin);
amfree(xml_app.result);
+ amfree(xml_scr1);
}
return xml_scr;
}
@@ -1771,10 +1894,13 @@ match_disklist(
dp->todo = 1;
match_a_disk = 1;
prev_match = 0;
- } else { /* dp->todo == 0 */
+ } else if (dp->todo == 0) {
match_a_disk = 1;
prev_match = 0;
dp_skip = dp;
+ } else { /* dp->todo == 1 */
+ match_a_disk = 1;
+ prev_match = 0;
}
}
}
@@ -1848,6 +1974,37 @@ match_disklist(
return errstr;
}
+gboolean
+match_dumpfile(
+ dumpfile_t *file,
+ int sargc,
+ char ** sargv)
+{
+ disk_t d;
+ am_host_t h;
+ disklist_t dl;
+
+ /* rather than try to reproduce the adaptive matching logic in
+ * match_disklist, this simply creates a new, fake disklist with one
+ * element in it, and calls match_disklist directly */
+
+ bzero(&h, sizeof(h));
+ h.hostname = file->name;
+ h.disks = &d;
+
+ bzero(&d, sizeof(d));
+ d.host = &h;
+ d.hostname = file->name;
+ d.name = file->disk;
+ d.device = file->disk;
+ d.todo = 1;
+
+ dl.head = dl.tail = &d;
+
+ (void)match_disklist(&dl, sargc, sargv);
+ return d.todo;
+}
+
netif_t *
disklist_netifs(void)
{