From: Nick Porter Date: Mon, 14 Nov 2022 17:56:41 +0000 (+0000) Subject: Add trigger calls to ldap_sync when syncs start and stop X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67777e5a10fbb9abf72786737bf70f1f20cfa88f;p=thirdparty%2Ffreeradius-server.git Add trigger calls to ldap_sync when syncs start and stop --- diff --git a/share/dictionary/freeradius/dictionary.freeradius.internal b/share/dictionary/freeradius/dictionary.freeradius.internal index a63e55ec405..e0fca3d2f15 100644 --- a/share/dictionary/freeradius/dictionary.freeradius.internal +++ b/share/dictionary/freeradius/dictionary.freeradius.internal @@ -546,6 +546,7 @@ ATTRIBUTE Request-Authenticator 2201 octets ATTRIBUTE Connection-Pool-Server 2220 string ATTRIBUTE Connection-Pool-Port 2221 short ATTRIBUTE Exfile-Name 2223 string +ATTRIBUTE LDAP-Sync-Base-DN 2224 string # # Range: 2261-2299 diff --git a/src/listen/ldap_sync/active_directory.c b/src/listen/ldap_sync/active_directory.c index 460c29ffde3..8dd55e93076 100644 --- a/src/listen/ldap_sync/active_directory.c +++ b/src/listen/ldap_sync/active_directory.c @@ -142,6 +142,8 @@ int active_directory_sync_state_init(fr_ldap_connection_t *conn, size_t sync_no, DEBUG3("Sync created with base dn \"%s\", filter \"%s\", msgid %i", sync->config->base_dn, sync->config->filter, sync->msgid); + trigger_exec(unlang_interpret_get_thread_default(), config->cs, "ldap_sync.start", true, &sync->trigger_args); + return 0; } /** Handle a LDAP_RES_SEARCH_ENTRY (SearchResultEntry) response diff --git a/src/listen/ldap_sync/persistent_search.c b/src/listen/ldap_sync/persistent_search.c index 288b550b306..5e1b1460367 100644 --- a/src/listen/ldap_sync/persistent_search.c +++ b/src/listen/ldap_sync/persistent_search.c @@ -130,6 +130,8 @@ int persistent_sync_state_init(fr_ldap_connection_t *conn, size_t sync_no, proto DEBUG3("Sync created with base dn \"%s\", filter \"%s\", msgid %i", sync->config->base_dn, sync->config->filter, sync->msgid); + trigger_exec(unlang_interpret_get_thread_default(), config->cs, "ldap_sync.start", true, &sync->trigger_args); + /* * Register event to store cookies at a regular interval * Whilst persistent search LDAP servers don't provide cookies as such diff --git a/src/listen/ldap_sync/proto_ldap_sync_ldap.c b/src/listen/ldap_sync/proto_ldap_sync_ldap.c index 4ef75edbbe7..51a60b3ae56 100644 --- a/src/listen/ldap_sync/proto_ldap_sync_ldap.c +++ b/src/listen/ldap_sync/proto_ldap_sync_ldap.c @@ -25,6 +25,7 @@ USES_APPLE_DEPRECATED_API #define LOG_PREFIX "proto_ldap_sync_ldap" +#include #include #include #include @@ -148,6 +149,8 @@ static int sync_state_free(sync_state_t *sync) DEBUG3("Abandoning sync base dn \"%s\", filter \"%s\"", sync->config->base_dn, sync->config->filter); + trigger_exec(NULL, sync->config->cs, "ldap_sync.stop", true, &sync->trigger_args); + if (!sync->conn->handle) return 0; /* Handled already closed? */ /* @@ -169,7 +172,9 @@ static int sync_state_free(sync_state_t *sync) sync_state_t *sync_state_alloc(TALLOC_CTX *ctx, fr_ldap_connection_t *conn, proto_ldap_sync_t const *inst, size_t sync_no, sync_config_t const *config) { - sync_state_t *sync; + sync_state_t *sync; + fr_dict_attr_t const *da; + fr_pair_t *vp; MEM(sync = talloc_zero(ctx, sync_state_t)); sync->conn = conn; @@ -180,6 +185,16 @@ sync_state_t *sync_state_alloc(TALLOC_CTX *ctx, fr_ldap_connection_t *conn, prot fr_dlist_talloc_init(&sync->pending, sync_packet_ctx_t, entry); + /* + * Create arguments to pass to triggers + */ + fr_pair_list_init(&sync->trigger_args); + da = fr_dict_attr_child_by_num(fr_dict_root(fr_dict_internal()), FR_LDAP_SYNC_BASE_DN); + fr_assert_msg(da, "Incomplete internal dictionary: Missing definition for \"LDAP-Sync-Base-DN\""); + + fr_pair_list_append_by_da_len(sync, vp, &sync->trigger_args, da, config->base_dn, + talloc_array_length(config->base_dn) - 1, false); + /* * If the connection is freed, all the sync state is also freed */ diff --git a/src/listen/ldap_sync/proto_ldap_sync_ldap.h b/src/listen/ldap_sync/proto_ldap_sync_ldap.h index 8a430d0208a..578aba42057 100644 --- a/src/listen/ldap_sync/proto_ldap_sync_ldap.h +++ b/src/listen/ldap_sync/proto_ldap_sync_ldap.h @@ -71,6 +71,8 @@ struct sync_state_s { fr_event_timer_t const *cookie_ev; //!< Timer event for sending cookies. fr_event_timer_t const *retry_ev; //!< Timer event for retrying failed changes. + + fr_pair_list_t trigger_args; //!< Arguments to make available in triggers. }; typedef struct sync_state_s sync_state_t; diff --git a/src/listen/ldap_sync/rfc4533.c b/src/listen/ldap_sync/rfc4533.c index b0a22bb635e..0936494040d 100644 --- a/src/listen/ldap_sync/rfc4533.c +++ b/src/listen/ldap_sync/rfc4533.c @@ -146,6 +146,8 @@ int rfc4533_sync_init(fr_ldap_connection_t *conn, size_t sync_no, proto_ldap_syn DEBUG3("Sync created with base dn \"%s\", filter \"%s\", msgid %i", sync->config->base_dn, sync->config->filter, sync->msgid); + trigger_exec(unlang_interpret_get_thread_default(), config->cs, "ldap_sync.start", true, &sync->trigger_args); + /* * Register event to store cookies at a regular interval */