From: Libor Peltan Date: Wed, 18 Jun 2025 10:41:09 +0000 (+0200) Subject: external validation: dump files follow zonefile templating and storage path X-Git-Tag: v3.5.0~38^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92f99d689701a86e2c4021bcb80ca17c77c41c7f;p=thirdparty%2Fknot-dns.git external validation: dump files follow zonefile templating and storage path --- diff --git a/src/knot/conf/conf.c b/src/knot/conf/conf.c index bd52e397ec..720c704c9a 100644 --- a/src/knot/conf/conf.c +++ b/src/knot/conf/conf.c @@ -1072,13 +1072,15 @@ static int str_label( return str_zone(label, buff, buff_len); } -static char* get_filename( +char *conf_get_filename_txn( conf_t *conf, knot_db_txn_t *txn, const knot_dname_t *zone, const char *name) { - assert(name); + if (name == NULL) { + return NULL; + } const char *end = name + strlen(name); char out[1024] = ""; @@ -1189,7 +1191,7 @@ char* conf_zonefile_txn( file = "%s.zone"; } - return get_filename(conf, txn, zone, file); + return conf_get_filename_txn(conf, txn, zone, file); } char* conf_db_txn( diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h index a253ba171b..1de23c6f79 100644 --- a/src/knot/conf/conf.h +++ b/src/knot/conf/conf.h @@ -664,6 +664,30 @@ void conf_free_mod_id( conf_mod_id_t *mod_id ); +/*! + * Get the absolute path in zonefile-like manner for given name/template. + * + * \param[in] conf Configuration. + * \param[in] txn Configuration DB transaction. + * \param[in] zone Zone name. + * \param[in] name File name or template (like %s.zonediff). + * + * \return Absolute zone file path string pointer. + */ +char *conf_get_filename_txn( + conf_t *conf, + knot_db_txn_t *txn, + const knot_dname_t *zone, + const char *name +); +static inline char* conf_get_filename( + conf_t *conf, + const knot_dname_t *zone, + const char *name) +{ + return conf_get_filename_txn(conf, &conf->read_txn, zone, name); +} + /*! * Gets the absolute zone file path. * diff --git a/src/knot/conf/schema.c b/src/knot/conf/schema.c index 7d5e52502f..5e80ab4375 100644 --- a/src/knot/conf/schema.c +++ b/src/knot/conf/schema.c @@ -458,9 +458,9 @@ static const yp_item_t desc_policy[] = { static const yp_item_t desc_external[] = { { C_ID, YP_TSTR, YP_VNONE, CONF_IO_FREF }, { C_TIMEOUT, YP_TINT, YP_VINT = { 0, UINT32_MAX, 300, YP_STIME } }, - { C_DUMP_NEW, YP_TSTR, YP_VSTR = { "" } }, - { C_DUMP_REM, YP_TSTR, YP_VSTR = { "" } }, - { C_DUMP_ADD, YP_TSTR, YP_VSTR = { "" } }, + { C_DUMP_NEW, YP_TSTR, YP_VNONE }, + { C_DUMP_REM, YP_TSTR, YP_VNONE }, + { C_DUMP_ADD, YP_TSTR, YP_VNONE }, { NULL } }; diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c index 5479932b4e..6d314f2574 100644 --- a/src/knot/updates/zone-update.c +++ b/src/knot/updates/zone-update.c @@ -961,23 +961,31 @@ int zone_update_external(conf_t *conf, zone_update_t *update, conf_val_t *ev_id) { /* First: dump zone/diff files as/if configured. */ conf_val_t val = conf_id_get(conf, C_EXTERNAL, C_DUMP_NEW, ev_id); - const char *f_new = conf_str(&val); + char *f_new = conf_get_filename(conf, update->zone->name, conf_str(&val)); val = conf_id_get(conf, C_EXTERNAL, C_DUMP_REM, ev_id); - const char *f_rem = conf_str(&val); + char *f_rem = conf_get_filename(conf, update->zone->name, conf_str(&val)); val = conf_id_get(conf, C_EXTERNAL, C_DUMP_ADD, ev_id); - const char *f_add = conf_str(&val); + char *f_add = conf_get_filename(conf, update->zone->name, conf_str(&val)); int ret = KNOT_EOK; - if (*f_new != '\0' && ret == KNOT_EOK) { + if (f_new != NULL && ret == KNOT_EOK) { ret = zonefile_write(f_new, update->new_cont, NULL); } - if (*f_rem != '\0' && ret == KNOT_EOK) { + if (f_rem != NULL && ret == KNOT_EOK) { ret = dump_changeset_part(update, false, f_rem, "w"); } - if (*f_add != '\0' && ret == KNOT_EOK) { + if (f_add != NULL && ret == KNOT_EOK) { const char *mode = (strcmp(f_rem, f_add) == 0) ? "a" : "w"; ret = dump_changeset_part(update, true, f_add, mode); } + free(f_new); + free(f_rem); + free(f_add); + if (ret != KNOT_EOK) { + log_zone_error(update->zone->name, + "failed to dump new zone version or zone diff for external validation (%s)", + knot_strerror(ret)); + } /* Second: wait on semaphore on user's interaction. */ pthread_mutex_lock(&update->zone->cu_lock); diff --git a/tests/knot/test_conf.c b/tests/knot/test_conf.c index ad1ae653bc..b5d0c3af4a 100644 --- a/tests/knot/test_conf.c +++ b/tests/knot/test_conf.c @@ -20,7 +20,7 @@ static void check_name(const char *zone, const char *name, const char *ref) { knot_dname_t *z = knot_dname_from_str_alloc(zone); - char *file = get_filename(conf(), NULL, z, name); + char *file = conf_get_filename_txn(conf(), NULL, z, name); ok(file != NULL, "Get zonefile path for %s", zone); if (file != NULL) { ok(strcmp(file, ref) == 0, "Zonefile path compare %s", name); @@ -34,7 +34,7 @@ static void check_name_err(const char *zone, const char *name) { knot_dname_t *z = knot_dname_from_str_alloc(zone); - char *filename = get_filename(conf(), NULL, z, name); + char *filename = conf_get_filename_txn(conf(), NULL, z, name); ok(filename == NULL, "Invalid name %s", name); free(filename);