]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add trigger calls to ldap_sync when syncs start and stop
authorNick Porter <nick@portercomputing.co.uk>
Mon, 14 Nov 2022 17:56:41 +0000 (17:56 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Tue, 29 Nov 2022 12:25:17 +0000 (12:25 +0000)
share/dictionary/freeradius/dictionary.freeradius.internal
src/listen/ldap_sync/active_directory.c
src/listen/ldap_sync/persistent_search.c
src/listen/ldap_sync/proto_ldap_sync_ldap.c
src/listen/ldap_sync/proto_ldap_sync_ldap.h
src/listen/ldap_sync/rfc4533.c

index a63e55ec4050bf8cbd9f04c6435ec1b293053168..e0fca3d2f158646d0d9cafb3058f68e5c12d1ced 100644 (file)
@@ -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
index 460c29ffde3a832181dbc00a081705eaea686699..8dd55e930763b629757028ab3862a0335b64c21a 100644 (file)
@@ -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
index 288b550b306149d71de1bbd318daacd5c0e09c2d..5e1b1460367f216d5d508f0c7b817498be8b1716 100644 (file)
@@ -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
index 4ef75edbbe7b70579c251c13644a9a69c3e47a46..51a60b3ae560c2f61dacfeff0ce68c1c7a3895bb 100644 (file)
@@ -25,6 +25,7 @@ USES_APPLE_DEPRECATED_API
 
 #define LOG_PREFIX "proto_ldap_sync_ldap"
 
+#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
 #include <freeradius-devel/internal/internal.h>
 #include <freeradius-devel/server/protocol.h>
 #include <freeradius-devel/server/request.h>
@@ -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
         */
index 8a430d0208a82cca3cfa581d963aec6caf40b338..578aba42057337f627a9c908ca6872a760b6d570 100644 (file)
@@ -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;
index b0a22bb635e7a6492a1414ea4d7466acc86fd436..0936494040d3e4749af9dbc59ee4c6e3b6fc2d82 100644 (file)
@@ -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
         */