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) {