On Mon, Nov 05, 2012 at 03:26:36PM +0100, Petr Spacek wrote:
> Hello,
> 
>     Unload master zone if forwarders are specified.
> 
> This patch should solve master => forward zone type change.

Ack

> From 96da10ab49612442fdf7b1c1805cddc4f46d511e Mon Sep 17 00:00:00 2001
> From: Petr Spacek <pspa...@redhat.com>
> Date: Mon, 5 Nov 2012 15:12:50 +0100
> Subject: [PATCH] Unload master zone if forwarders are specified.
> 
> Signed-off-by: Petr Spacek <pspa...@redhat.com>
> ---
>  src/ldap_helper.c | 36 ++++++++++++++++++++++++------------
>  1 file changed, 24 insertions(+), 12 deletions(-)
> 
> diff --git a/src/ldap_helper.c b/src/ldap_helper.c
> index 
> 2d52bfaf894de8a5591f966b0c9197d14a1e73f7..4f004515f513ecf6459b3bddfbc5474fe3cfabd2
>  100644
> --- a/src/ldap_helper.c
> +++ b/src/ldap_helper.c
> @@ -308,7 +308,8 @@ static isc_result_t soa_serial_increment(isc_mem_t *mctx, 
> ldap_instance_t *inst,
>               dns_name_t *zone_name);
>  
>  static isc_result_t
> -ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t 
> lock);
> +ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t 
> lock,
> +               isc_boolean_t preserve_forwarding);
>  
>  /* Functions for maintaining pool of LDAP connections */
>  static isc_result_t ldap_pool_create(isc_mem_t *mctx, unsigned int 
> connections,
> @@ -620,7 +621,7 @@ destroy_ldap_instance(ldap_instance_t **ldap_instp)
>  
>               result = ldap_delete_zone2(ldap_inst,
>                                          dns_fixedname_name(&concat),
> -                                        ISC_TRUE);
> +                                        ISC_TRUE, ISC_FALSE);
>               RUNTIME_CHECK(result == ISC_R_SUCCESS);
>       }
>  
> @@ -841,7 +842,8 @@ configure_zone_ssutable(dns_zone_t *zone, const char 
> *update_str)
>  
>  /* Delete zone by dns zone name */
>  static isc_result_t
> -ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t 
> lock)
> +ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t 
> lock,
> +               isc_boolean_t preserve_forwarding)
>  {
>       isc_result_t result;
>       isc_boolean_t unlock = ISC_FALSE;
> @@ -860,10 +862,12 @@ ldap_delete_zone2(ldap_instance_t *inst, dns_name_t 
> *name, isc_boolean_t lock)
>                       unlock = ISC_TRUE;
>       }
>  
> -     /* Disable forwarding. */
> -     result = dns_fwdtable_delete(inst->view->fwdtable, name);
> -     if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
> -             log_error_r("zone '%s': failed to delete forwarders", 
> zone_name_char);
> +     if (!preserve_forwarding) {
> +             result = dns_fwdtable_delete(inst->view->fwdtable, name);
> +             if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
> +                     log_error_r("zone '%s': failed to delete forwarders",
> +                                 zone_name_char);
> +     }
>  
>       /* TODO: flush cache records belonging to deleted zone */
>       CHECK(discard_from_cache(inst->cache, name));
> @@ -911,15 +915,16 @@ cleanup:
>  
>  /* Delete zone */
>  static isc_result_t
> -ldap_delete_zone(ldap_instance_t *inst, const char *dn, isc_boolean_t lock)
> +ldap_delete_zone(ldap_instance_t *inst, const char *dn, isc_boolean_t lock,
> +              isc_boolean_t preserve_forwarding)
>  {
>       isc_result_t result;
>       dns_name_t name;
>       dns_name_init(&name, NULL);
>       
>       CHECK(dn_to_dnsname(inst->mctx, dn, &name, NULL));
>  
> -     result = ldap_delete_zone2(inst, &name, lock);
> +     result = ldap_delete_zone2(inst, &name, lock, preserve_forwarding);
>  
>  cleanup:
>       if (dns_name_dynamic(&name))
> @@ -1218,6 +1223,11 @@ ldap_parse_zoneentry(ldap_entry_t *entry, 
> ldap_instance_t *inst)
>       result = configure_zone_forwarders(entry, inst, &name);
>       if (result != ISC_R_DISABLED) {
>               if (result == ISC_R_SUCCESS) {
> +                     /* forwarding was enabled for the zone
> +                      * => zone type was changed to "forward"
> +                      * => delete "master" zone */
> +                     CHECK(ldap_delete_zone2(inst, &name, ISC_FALSE,
> +                                             ISC_TRUE));
>  #if LIBDNS_VERSION_MAJOR < 90
>                       result = dns_view_flushcache(inst->view);
>  #else
> @@ -1510,7 +1520,8 @@ next:
>               result = dns_rbtnodechain_next(&chain, NULL, NULL);
>       
>               if (delete == ISC_TRUE)
> -                     ldap_delete_zone2(ldap_inst, &aname, ISC_FALSE);
> +                     ldap_delete_zone2(ldap_inst, &aname, ISC_FALSE,
> +                                       ISC_FALSE);
>       }
>  
>  
> @@ -3253,7 +3264,8 @@ update_zone(isc_task_t *task, isc_event_t *event)
>               if (PSEARCH_MODDN(pevent->chgtype)) {
>                       if (dn_to_dnsname(inst->mctx, pevent->prevdn, 
> &prevname, NULL)
>                                       == ISC_R_SUCCESS) {
> -                             CHECK(ldap_delete_zone(inst, pevent->prevdn, 
> ISC_TRUE));
> +                             CHECK(ldap_delete_zone(inst, pevent->prevdn,
> +                                   ISC_TRUE, ISC_FALSE));
>                       } else {
>                               log_debug(5, "update_action: old zone wasn't 
> managed "
>                                               "by plugin, dn '%s'", 
> pevent->prevdn);
> @@ -3274,7 +3286,7 @@ update_zone(isc_task_t *task, isc_event_t *event)
>  
>               INSIST(NEXT(entry_zone, link) == NULL); /* no multiple zones 
> with same DN */
>       } else {
> -             CHECK(ldap_delete_zone(inst, pevent->dn, ISC_TRUE));
> +             CHECK(ldap_delete_zone(inst, pevent->dn, ISC_TRUE, ISC_FALSE));
>       }
>  
>  cleanup:
> -- 
> 1.7.11.7
> 


-- 
Adam Tkac, Red Hat, Inc.

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to