From: Daniel Salzman Date: Thu, 18 Dec 2025 14:34:15 +0000 (+0100) Subject: dbus: emit zone_not_updated signal if zone-updated is enabled X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=134221508117a445ca8ef1778c5b294e0030076f;p=thirdparty%2Fknot-dns.git dbus: emit zone_not_updated signal if zone-updated is enabled --- diff --git a/doc/reference.rst b/doc/reference.rst index ab233f6bfe..24a81efc9e 100644 --- a/doc/reference.rst +++ b/doc/reference.rst @@ -635,8 +635,12 @@ Possible values: - ``started`` – Emitted when the server is started and all configured zones (including catalog zones and their members) are loaded or successfully bootstrapped. - ``stopped`` – Emitted when the server shutdown sequence is initiated. -- ``zone-updated`` – The signal ``zone_updated`` is emitted when a zone has been updated. - Parameters: **zone** name and zone SOA **serial**. +- ``zone-updated`` – Two signals may be emitted: + + - ``zone_updated`` – Emitted when a zone has been successfully updated. + Parameters: **zone** name and zone SOA **serial**. + - ``zone_not_updated`` – Emitted when a zone has not been successfully updated. + Parameters: **zone** name. - ``external-verify`` – The signal ``external_verify`` is emitted when a zone is awaiting external validation before applying changes. Parameters: **zone** name and new zone SOA **serial**. diff --git a/samples/dbus_client.pl b/samples/dbus_client.pl index 5548330a69..c8169a5137 100755 --- a/samples/dbus_client.pl +++ b/samples/dbus_client.pl @@ -42,6 +42,12 @@ $knotd_interface->connect_to_signal('zone_updated', sub print "Updated zone=$zone to serial=$serial\n"; }); +$knotd_interface->connect_to_signal('zone_not_updated', sub +{ + my ($zone) = @_; + print "Not updated zone=$zone\n"; +}); + $knotd_interface->connect_to_signal('external_verify', sub { my ($zone, $serial) = @_; diff --git a/samples/dbus_client.py b/samples/dbus_client.py index c30e9de34f..29b599c4cb 100755 --- a/samples/dbus_client.py +++ b/samples/dbus_client.py @@ -23,6 +23,10 @@ def sig_updated(sender, path, interface, signal, args): (zone, serial) = args print("Updated zone=%s to serial=%d" % (zone, serial)) +def sig_not_updated(sender, path, interface, signal, args): + (zone) = args + print("Not updated zone=%s" % (zone)) + def sig_external(sender, path, interface, signal, args): (zone, serial) = args print("Awaiting external validation for zone=%s serial=%u" % (zone, serial)) @@ -89,6 +93,7 @@ if __name__ == '__main__': connect_to_signal("started", sig_started) connect_to_signal("stopped", sig_stopped) connect_to_signal("zone_updated", sig_updated) + connect_to_signal("zone_not_updated", sig_not_updated) connect_to_signal("external_verify", sig_external) connect_to_signal("keys_updated", sig_keys_upd) connect_to_signal("zone_ksk_submission", sig_submission) diff --git a/samples/dbus_client.sh b/samples/dbus_client.sh index 1b78afeacd..62c0bde0fc 100755 --- a/samples/dbus_client.sh +++ b/samples/dbus_client.sh @@ -16,6 +16,9 @@ cb() { zone_updated) echo "Updated zone=${2} to serial=${3}" ;; + zone_not_updated) + echo "Not updated zone=${2}" + ;; external_verify) echo "Awaiting external validation for zone=${2} serial=${3}" ;; diff --git a/src/knot/common/dbus.c b/src/knot/common/dbus.c index 58f856812a..6e830cfea6 100644 --- a/src/knot/common/dbus.c +++ b/src/knot/common/dbus.c @@ -180,14 +180,18 @@ void dbus_emit_running(bool up) #endif // ENABLE_DBUS } -void dbus_emit_zone_updated(const knot_dname_t *zone_name, uint32_t serial) +void dbus_emit_zone_updated(const knot_dname_t *zone_name, bool success, uint32_t serial) { #if ENABLE_DBUS knot_dname_txt_storage_t buff; char *zone_str = knot_dname_to_str(buff, zone_name, sizeof(buff)); if (zone_str != NULL) { - emit_event(KNOT_BUS_EVENT_ZONE_UPD, "su", VALUE_OF(zone_str), - VALUE_OF(serial)); + if (success) { + emit_event(KNOT_BUS_EVENT_ZONE_UPD, "su", VALUE_OF(zone_str), + VALUE_OF(serial)); + } else { + emit_event(KNOT_BUS_EVENT_ZONE_NOT_UPD, "s", VALUE_OF(zone_str)); + } } #endif // ENABLE_DBUS } diff --git a/src/knot/common/dbus.h b/src/knot/common/dbus.h index abc2f2fa01..62c9e916bc 100644 --- a/src/knot/common/dbus.h +++ b/src/knot/common/dbus.h @@ -17,6 +17,7 @@ #define KNOT_BUS_EVENT_STARTED "started" #define KNOT_BUS_EVENT_STOPPED "stopped" #define KNOT_BUS_EVENT_ZONE_UPD "zone_updated" +#define KNOT_BUS_EVENT_ZONE_NOT_UPD "zone_not_updated" #define KNOT_BUS_EVENT_EXTERNAL "external_verify" #define KNOT_BUS_EVENT_ZONE_KEYS_UPD "keys_updated" #define KNOT_BUS_EVENT_ZONE_KSK_SUBM "zone_ksk_submission" @@ -46,9 +47,10 @@ void dbus_emit_running(bool up); * \brief Emit event signal for updated zones. * * \param zone_name Zone name. + * \param success Successful update indication (if false, serial isn't used). * \param serial Current zone SOA serial. */ -void dbus_emit_zone_updated(const knot_dname_t *zone_name, uint32_t serial); +void dbus_emit_zone_updated(const knot_dname_t *zone_name, bool success, uint32_t serial); /*! * \brief Emit event signal that external verify shall take place. diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c index a3176b14e2..1e2b8ab2dc 100644 --- a/src/knot/updates/zone-update.c +++ b/src/knot/updates/zone-update.c @@ -1255,7 +1255,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) } if (conf->cache.srv_dbus_event & DBUS_EVENT_ZONE_UPDATED) { - dbus_emit_zone_updated(update->zone->name, + dbus_emit_zone_updated(update->zone->name, true, zone_contents_serial(update->zone->contents)); } @@ -1264,6 +1264,10 @@ int zone_update_commit(conf_t *conf, zone_update_t *update) return KNOT_EOK; error: ATOMIC_ADD(update->zone->server->stats.zone_update_error, 1); + if (conf->cache.srv_dbus_event & DBUS_EVENT_ZONE_UPDATED) { + dbus_emit_zone_updated(update->zone->name, false, 0); + } + return ret; }