diff options
author | Martin Nagy <mnagy@redhat.com> | 2009-08-03 09:55:14 +0200 |
---|---|---|
committer | Martin Nagy <mnagy@redhat.com> | 2009-08-04 16:50:54 +0200 |
commit | fdd7b1de1f1a82ebfc8483fe5264717b502243a2 (patch) | |
tree | 44058fd841c7984eb0584b65fd569f6749ab40c0 /src/zone_manager.c | |
parent | 2d1ffcf060eb873a76d462725195dbac6f114c1f (diff) | |
download | ldap_driver-fdd7b1de1f1a82ebfc8483fe5264717b502243a2.tar.gz ldap_driver-fdd7b1de1f1a82ebfc8483fe5264717b502243a2.tar.xz ldap_driver-fdd7b1de1f1a82ebfc8483fe5264717b502243a2.zip |
Periodically refresh zone settings
The original intent was to add and remove zones periodically, based on
changes in the LDAP database. It seems, however, that this is not
possible with the way BIND views are working. Each view can have zones
added during the configuration phase, but not after that. Luckily, we
can at least change their SSU table without the need to reload named.
This commit also has some changes to the function interfaces and makes
the whole thing a lot simpler. Creation of the ldap instances and cache
instances is now left on the zone manager. Additionally, we now put view
and zonemgr pointers right into into the ldap instance. This makes the
API for refresh_zones_from_ldap() and create_zone() much more simpler.
Diffstat (limited to 'src/zone_manager.c')
-rw-r--r-- | src/zone_manager.c | 87 |
1 files changed, 58 insertions, 29 deletions
diff --git a/src/zone_manager.c b/src/zone_manager.c index 50f39a9..ab9e740 100644 --- a/src/zone_manager.c +++ b/src/zone_manager.c @@ -20,8 +20,11 @@ #include <isc/mem.h> #include <isc/once.h> #include <isc/result.h> +#include <isc/task.h> +#include <isc/timer.h> #include <isc/util.h> +#include <dns/dynamic_db.h> #include <dns/view.h> #include <dns/zone.h> @@ -30,6 +33,7 @@ #include "ldap_convert.h" #include "ldap_helper.h" #include "log.h" +#include "settings.h" #include "util.h" #include "zone_manager.h" @@ -38,7 +42,7 @@ struct db_instance { char *name; ldap_instance_t *ldap_inst; ldap_cache_t *ldap_cache; - dns_zonemgr_t *dns_zone_manager; + isc_timer_t *timer; LINK(db_instance_t) link; }; @@ -86,8 +90,12 @@ destroy_db_instance(db_instance_t **db_instp) db_inst = *db_instp; - destroy_ldap_instance(&db_inst->ldap_inst); - destroy_ldap_cache(&db_inst->ldap_cache); + if (db_inst->timer != NULL) + isc_timer_detach(&db_inst->timer); + if (db_inst->ldap_inst != NULL) + destroy_ldap_instance(&db_inst->ldap_inst); + if (db_inst->ldap_cache != NULL) + destroy_ldap_cache(&db_inst->ldap_cache); if (db_inst->name != NULL) isc_mem_free(db_inst->mctx, db_inst->name); @@ -96,23 +104,27 @@ destroy_db_instance(db_instance_t **db_instp) *db_instp = NULL; } +static void refresh_zones_action(isc_task_t *task, isc_event_t *event); + isc_result_t -manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_instance_t *ldap_inst, - ldap_cache_t *ldap_cache, dns_zonemgr_t *zmgr) +manager_create_db_instance(isc_mem_t *mctx, const char *name, + const char * const *argv, + dns_dyndb_arguments_t *dyndb_args) { isc_result_t result; - db_instance_t *db_inst; + db_instance_t *db_inst = NULL; + unsigned int zone_refresh; + setting_t manager_settings[] = { + { "zone_refresh", default_uint(0) }, + end_of_settings + }; REQUIRE(mctx != NULL); REQUIRE(name != NULL); - REQUIRE(ldap_inst != NULL); - REQUIRE(ldap_cache != NULL); - REQUIRE(zmgr != NULL); + REQUIRE(dyndb_args != NULL); isc_once_do(&initialize_once, initialize_manager); - db_inst = NULL; - result = find_db_instance(name, &db_inst); if (result == ISC_R_SUCCESS) { db_inst = NULL; @@ -123,20 +135,39 @@ manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_instance_t *ldap result = ISC_R_SUCCESS; } + /* Parse settings. */ + manager_settings[0].target = &zone_refresh; + CHECK(set_settings(manager_settings, argv)); + CHECKED_MEM_GET_PTR(mctx, db_inst); - CHECKED_MEM_STRDUP(mctx, name, db_inst->name); - db_inst->mctx = NULL; + ZERO_PTR(db_inst); + isc_mem_attach(mctx, &db_inst->mctx); - db_inst->ldap_inst = ldap_inst; - db_inst->ldap_cache = ldap_cache; - db_inst->dns_zone_manager = zmgr; + CHECKED_MEM_STRDUP(mctx, name, db_inst->name); + CHECK(new_ldap_instance(mctx, db_inst->name, argv, dyndb_args, &db_inst->ldap_inst)); + CHECK(new_ldap_cache(mctx, argv, &db_inst->ldap_cache)); + + refresh_zones_from_ldap(db_inst->ldap_inst, ISC_TRUE); + + /* Add a timer to periodically refresh the zones. */ + if (zone_refresh) { + isc_task_t *task; + isc_timermgr_t *timer_mgr; + isc_interval_t interval; + + task = dns_dyndb_get_task(dyndb_args); + timer_mgr = dns_dyndb_get_timermgr(dyndb_args); + isc_interval_set(&interval, zone_refresh, 0); + + CHECK(isc_timer_create(timer_mgr, isc_timertype_ticker, NULL, + &interval, task, refresh_zones_action, + db_inst, &db_inst->timer)); + } LOCK(&instance_list_lock); APPEND(instance_list, db_inst, link); UNLOCK(&instance_list_lock); - refresh_zones_from_ldap(ldap_inst, name, zmgr); - return ISC_R_SUCCESS; cleanup: @@ -146,25 +177,23 @@ cleanup: return result; } -void -manager_refresh_zones(void) +static void +refresh_zones_action(isc_task_t *task, isc_event_t *event) { - db_instance_t *db_inst; + db_instance_t *db_inst = event->ev_arg; - LOCK(&instance_list_lock); - db_inst = HEAD(instance_list); - while (db_inst != NULL) { - refresh_zones_from_ldap(db_inst->ldap_inst, db_inst->name, - db_inst->dns_zone_manager); - db_inst = NEXT(db_inst, link); - } + UNUSED(task); + LOCK(&instance_list_lock); + refresh_zones_from_ldap(db_inst->ldap_inst, ISC_FALSE); UNLOCK(&instance_list_lock); + + isc_event_free(&event); } isc_result_t manager_get_ldap_instance_and_cache(const char *name, ldap_instance_t **ldap_inst, - ldap_cache_t **ldap_cache) + ldap_cache_t **ldap_cache) { isc_result_t result; db_instance_t *db_inst; |