[prev in list] [next in list] [prev in thread] [next in thread] 

List:       sssd-devel
Subject:    Re: [SSSD] [PATCHES] DYDNDS: update quality of input for nsupdate
From:       Pavel Reichl <preichl () redhat ! com>
Date:       2015-08-28 9:05:08
Message-ID: 55E02444.7090100 () redhat ! com
[Download RAW message or body]

On 08/14/2015 04:12 PM, Jakub Hrozek wrote:
> On Thu, Aug 13, 2015 at 05:31:07PM +0200, Pavel Reichl wrote:
> > On 08/13/2015 02:12 PM, Pavel Reichl wrote:
> > > Sorry, this time with correct patches!
> > > 
> > > 
> > > _______________________________________________
> > > sssd-devel mailing list
> > > sssd-devel@lists.fedorahosted.org
> > > https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
> > I updated the second patch - [PATCH 2/9] DYNDNS: Don't use server cmd in
> > nsupdate by default
> > 
> > I added some minor man page changes.
> > 
> > Thanks!
> > From 7d786a6a102f274a685b9e84ee7fe9cdf2872590 Mon Sep 17 00:00:00 2001
> > From: Jakub Hrozek <jhrozek@redhat.com>
> > Date: Sun, 6 Jul 2014 22:53:27 +0200
> > Subject: [PATCH 1/9] DYNDNS: Add a new option dyndns_server
> The changes you requested were done to this patch. Thanks for catching
> those.
> 
> > From 8a880df3631d08f195868d7de47e685a91533b09 Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Thu, 23 Jul 2015 04:40:03 -0400
> > Subject: [PATCH 2/9] DYNDNS: Don't use server cmd in nsupdate by default
> ACK
> 
> 
> > From c865cd09cc418f3ddda93d0e1e73c541becb7309 Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Thu, 23 Jul 2015 04:50:38 -0400
> > Subject: [PATCH 3/9] DYNDNS: remove redundant talloc_steal()
> ACK
> 
> > From 0ccb4fc0902fc29e2b452dbef4d0e6f8bb685ba4 Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Thu, 23 Jul 2015 05:30:34 -0400
> > Subject: [PATCH 4/9] DYNDNS: remove zone command
> ACK
> 
> > From 0bf7d58da64c40c52b29a3d89e2e40308898b976 Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Thu, 23 Jul 2015 09:52:47 -0400
> > Subject: [PATCH 5/9] DYNDNS: rename field of sdap_dyndns_update_state
> > 
> > Rename 'use_server_with_nsupdate' to more general name 'fallback_mode'.
> > 
> > Resolves:
> > https://fedorahosted.org/sssd/ticket/2495
> ACK

Missing [PATCH 6/9] DYNDNS: use realm and server commands only as fallback

> 
> > From 748d3e0f584a2469cdb7333a579a924a54c0b7dc Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Fri, 24 Jul 2015 08:24:48 -0400
> > Subject: [PATCH 7/9] DYNDNS: remove code duplication
> ACK
> 
> > From ee8d4ef5bdc0b843a8a069bbda58507b4bc9b390 Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Fri, 24 Jul 2015 10:41:42 -0400
> > Subject: [PATCH 8/9] TESTS: UT for sss_iface_addr_list_as_str_list()
> ACK
> 
> > From d49e79e45579b65ed482364be853292343abed9e Mon Sep 17 00:00:00 2001
> > From: Pavel Reichl <preichl@redhat.com>
> > Date: Fri, 24 Jul 2015 13:25:56 -0400
> > Subject: [PATCH 9/9] DYNDNS: improve nsupdate_msg_add_fwd()
> > 
> > Update nsupdate_msg_add_fwd() to group commands by address family
> > processed IP address belongs to.
> > 
> > It's better to group removing old A addresses and adding new A
> > addresses in a single transaction. Same goes for AAAA addresses.
> > 
> > Separate transaction for A and AAAA addresses updates are important
> > because server might block updates for one of these families and thus
> > the update even for the non-blocked address family would unnecessarily
> > fail.
> > 
> > For more details please see:
> > https://fedorahosted.org/sssd/wiki/DesignDocs/DDNSMessagesUpdate
> > 
> > Resolves:
> > https://fedorahosted.org/sssd/ticket/2495
> Nack, the test doesn't work:
> ./dyndns-tests
> [==========] Running 15 test(s).
> [ RUN      ] dyndns_test_get_ifaddr
> [       OK ] dyndns_test_get_ifaddr
> [ RUN      ] dyndns_test_get_multi_ifaddr
> [       OK ] dyndns_test_get_multi_ifaddr
> [ RUN      ] dyndns_test_get_ifaddr_enoent
> [       OK ] dyndns_test_get_ifaddr_enoent
> [ RUN      ] dyndns_test_addr_list_as_str_list
> [       OK ] dyndns_test_addr_list_as_str_list
> [ RUN      ] dyndns_test_ok
> ldb: unable to dlopen /usr/lib64/ldb/modules/ldb/memberof.la : \
> /usr/lib64/ldb/modules/ldb/memberof.la: invalid ELF header [       OK ] \
> dyndns_test_ok [ RUN      ] dyndns_test_error
> (Fri Aug 14 16:09:41:326570 2015) [sssd] [child_sig_handler] (0x0020): child [6436] \
> failed with status [1]. [       OK ] dyndns_test_error
> [ RUN      ] dyndns_test_timeout
> (Fri Aug 14 16:09:43:329799 2015) [sssd] [nsupdate_child_timeout] (0x0020): Timeout \
> reached for dynamic DNS update (Fri Aug 14 16:09:43:330390 2015) [sssd] \
> [child_sig_handler] (0x0020): child [6437] was terminated by signal [9]. [       OK \
> ] dyndns_test_timeout [ RUN      ] dyndns_test_interval
> [       OK ] dyndns_test_interval
> [ RUN      ] dyndns_test_dualstack
> [       OK ] dyndns_test_dualstack
> [ RUN      ] dyndns_test_dualstack_multiple_addresses
> [       OK ] dyndns_test_dualstack_multiple_addresses
> [ RUN      ] dyndns_test_dualstack_no_iface
> [       OK ] dyndns_test_dualstack_no_iface
> [ RUN      ] dyndns_test_create_fwd_msg
> Could not run the test - check test fixtures
> [  ERROR   ] dyndns_test_create_fwd_msg
> [ RUN      ] dyndns_test_create_fwd_msg_mult
> Could not run the test - check test fixtures
> [  ERROR   ] dyndns_test_create_fwd_msg_mult
> [ RUN      ] dyndns_test_create_fwd_msg_A
> Could not run the test - check test fixtures
> [  ERROR   ] dyndns_test_create_fwd_msg_A
> [ RUN      ] dyndns_test_create_fwd_msg_AAAA
> Could not run the test - check test fixtures
> [  ERROR   ] dyndns_test_create_fwd_msg_AAAA
> [==========] 15 test(s) run.
> [  PASSED  ] 11 test(s).
> 
> But I'm going to push the acked patches..
> _______________________________________________
> sssd-devel mailing list
> sssd-devel@lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Test failed because of missing patch  [PATCH 6/9] DYNDNS: use realm and 
server commands only as fallback

I must have skipped it while respinning the patch set, sorry.

I attached this missing patch and test that was failing because of it.


["0001-DYNDNS-use-realm-and-server-commands-only-as-fallbac.patch" (text/x-patch)]

From fb9e2b5f83c28c12c3744a83925a25bd68d08aa5 Mon Sep 17 00:00:00 2001
From: Pavel Reichl <preichl@redhat.com>
Date: Thu, 23 Jul 2015 10:51:50 -0400
Subject: [PATCH 1/2] DYNDNS: use realm and server commands only as fallback

Resolves:
https://fedorahosted.org/sssd/ticket/2195
---
 src/providers/ad/ad_dyndns.c     |  9 ---------
 src/providers/dp_dyndns.c        | 23 ++++++++++++++++++-----
 src/providers/ipa/ipa_dyndns.c   |  7 -------
 src/providers/ldap/sdap_dyndns.c | 37 ++++++++++++++++++++-----------------
 src/providers/ldap/sdap_dyndns.h |  1 -
 5 files changed, 38 insertions(+), 39 deletions(-)

diff --git a/src/providers/ad/ad_dyndns.c b/src/providers/ad/ad_dyndns.c
index 5f8638128b966f0981c85a44e50e3201c73d561e..a4d38c442a69ff0440e459da32d8852bda314484 100644
--- a/src/providers/ad/ad_dyndns.c
+++ b/src/providers/ad/ad_dyndns.c
@@ -159,7 +159,6 @@ static void ad_dyndns_nsupdate_done(struct tevent_req *req)
 
 struct ad_dyndns_update_state {
     struct ad_options *ad_ctx;
-    const char *servername;
 };
 
 static void ad_dyndns_sdap_update_done(struct tevent_req *subreq);
@@ -217,13 +216,6 @@ ad_dyndns_update_send(struct ad_options *ctx)
         goto done;
     }
 
-    state->servername = talloc_strdup(state, lud->lud_host);
-    ldap_free_urldesc(lud);
-    if (!state->servername) {
-        ret = ENOMEM;
-        goto done;
-    }
-
     subreq = sdap_dyndns_update_send(state, sdap_ctx->be->ev,
                                      sdap_ctx->be,
                                      ctx->dyndns_ctx->opts,
@@ -235,7 +227,6 @@ ad_dyndns_update_send(struct ad_options *ctx)
                                                        AD_HOSTNAME),
                                      dp_opt_get_string(ctx->basic,
                                                        AD_KRB5_REALM),
-                                     state->servername,
                                      dp_opt_get_int(ctx->dyndns_ctx->opts,
                                                     DP_OPT_DYNDNS_TTL),
                                      false);
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
index 0577743cb2daca9c0e86b5beb6bf059ee7b5783f..c1836837d00ed995c0f1942ca2a86f0d9d2ba27b 100644
--- a/src/providers/dp_dyndns.c
+++ b/src/providers/dp_dyndns.c
@@ -372,6 +372,23 @@ nsupdate_msg_add_ptr(char *update_msg, struct sss_iface_addr *addresses,
     return update_msg;
 }
 
+#ifdef HAVE_NSUPDATE_REALM
+static char *
+nsupdate_msg_add_realm_cmd(TALLOC_CTX *mem_ctx, const char *realm)
+{
+    if (realm != NULL) {
+        return talloc_asprintf(mem_ctx, "realm %s\n", realm);
+    }
+    return talloc_asprintf(mem_ctx, "\n");
+}
+#else
+static char *
+nsupdate_msg_add_realm_cmd(TALLOC_CTX *mem_ctx, const char *realm)
+{
+    return talloc_asprintf(mem_ctx, "\n");
+}
+#endif
+
 static char *
 nsupdate_msg_create_common(TALLOC_CTX *mem_ctx, const char *realm,
                            const char *servername)
@@ -383,11 +400,7 @@ nsupdate_msg_create_common(TALLOC_CTX *mem_ctx, const char *realm,
     tmp_ctx = talloc_new(NULL);
     if (tmp_ctx == NULL) return NULL;
 
-#ifdef HAVE_NSUPDATE_REALM
-    realm_directive = talloc_asprintf(tmp_ctx, "realm %s\n", realm);
-#else
-    realm_directive = talloc_asprintf(tmp_ctx, "\n");
-#endif
+    realm_directive = nsupdate_msg_add_realm_cmd(tmp_ctx, realm);
     if (!realm_directive) {
         goto fail;
     }
diff --git a/src/providers/ipa/ipa_dyndns.c b/src/providers/ipa/ipa_dyndns.c
index e7026eb275798f0ed21fb8490295b6e6d419d8ee..1a7014718366ce3c898eef24eabd6903101dc92e 100644
--- a/src/providers/ipa/ipa_dyndns.c
+++ b/src/providers/ipa/ipa_dyndns.c
@@ -153,7 +153,6 @@ ipa_dyndns_update_send(struct ipa_options *ctx)
     struct ipa_dyndns_update_state *state;
     struct tevent_req *req, *subreq;
     struct sdap_id_ctx *sdap_ctx = ctx->id_ctx->sdap_id_ctx;
-    const char *servername;
 
     DEBUG(SSSDBG_TRACE_FUNC, "Performing update\n");
 
@@ -179,11 +178,6 @@ ipa_dyndns_update_send(struct ipa_options *ctx)
         ret = EIO;
         goto done;
     }
-    servername = ctx->service->sdap->uri + 7;
-    if (servername[0] == '\0') {
-        ret = EIO;
-        goto done;
-    }
 
     subreq = sdap_dyndns_update_send(state, sdap_ctx->be->ev,
                                      sdap_ctx->be,
@@ -196,7 +190,6 @@ ipa_dyndns_update_send(struct ipa_options *ctx)
                                                        IPA_HOSTNAME),
                                      dp_opt_get_string(ctx->basic,
                                                        IPA_KRB5_REALM),
-                                     servername,
                                      dp_opt_get_int(ctx->dyndns_ctx->opts,
                                                     DP_OPT_DYNDNS_TTL),
                                      true);
diff --git a/src/providers/ldap/sdap_dyndns.c b/src/providers/ldap/sdap_dyndns.c
index 2a179fd1b5e88bdf2442657ff6fa1dcc55417467..8a8940c60334c71b50a92dcc2eb740a9ea5fc486 100644
--- a/src/providers/ldap/sdap_dyndns.c
+++ b/src/providers/ldap/sdap_dyndns.c
@@ -81,7 +81,6 @@ sdap_dyndns_update_send(TALLOC_CTX *mem_ctx,
                         const char *ifname,
                         const char *hostname,
                         const char *realm,
-                        const char *servername,
                         const int ttl,
                         bool check_diff)
 {
@@ -99,7 +98,7 @@ sdap_dyndns_update_send(TALLOC_CTX *mem_ctx,
     state->update_ptr = dp_opt_get_bool(opts, DP_OPT_DYNDNS_UPDATE_PTR);
     state->hostname = hostname;
     state->realm = realm;
-    state->servername = servername;
+    state->servername = NULL;
     state->fallback_mode = false;
     state->ttl = ttl;
     state->be_res = be_ctx->be_res;
@@ -311,18 +310,20 @@ sdap_dyndns_update_step(struct tevent_req *req)
     errno_t ret;
     struct sdap_dyndns_update_state *state;
     const char *servername;
+    const char *realm;
     struct tevent_req *subreq;
 
     state = tevent_req_data(req, struct sdap_dyndns_update_state);
 
     servername = NULL;
-    if (state->fallback_mode == true &&
-        state->servername) {
+    realm = NULL;
+    if (state->fallback_mode) {
         servername = state->servername;
+        realm = state->realm;
     }
 
-    ret = be_nsupdate_create_fwd_msg(state, state->realm,
-                                     servername, state->hostname,
+    ret = be_nsupdate_create_fwd_msg(state, realm, servername,
+                                     state->hostname,
                                      state->ttl, state->remove_af,
                                      state->addresses,
                                      &state->update_msg);
@@ -359,11 +360,12 @@ sdap_dyndns_update_done(struct tevent_req *subreq)
     talloc_zfree(subreq);
     if (ret != EOK) {
         /* If the update didn't succeed, we can retry using the server name */
-        if (state->fallback_mode == false && state->servername &&
-            WIFEXITED(child_status) && WEXITSTATUS(child_status) != 0) {
+        if (state->fallback_mode == false
+                && WIFEXITED(child_status)
+                && WEXITSTATUS(child_status) != 0) {
             state->fallback_mode = true;
             DEBUG(SSSDBG_MINOR_FAILURE,
-                   "nsupdate failed, retrying with server name\n");
+                  "nsupdate failed, retrying.\n");
             ret = sdap_dyndns_update_step(req);
             if (ret == EOK) {
                 return;
@@ -395,18 +397,19 @@ sdap_dyndns_update_ptr_step(struct tevent_req *req)
     errno_t ret;
     struct sdap_dyndns_update_state *state;
     const char *servername;
+    const char *realm;
     struct tevent_req *subreq;
 
     state = tevent_req_data(req, struct sdap_dyndns_update_state);
 
     servername = NULL;
-    if (state->fallback_mode == true &&
-        state->servername) {
+    realm = NULL;
+    if (state->fallback_mode == true) {
         servername = state->servername;
+        realm = state->realm;
     }
 
-    ret = be_nsupdate_create_ptr_msg(state, state->realm,
-                                     servername, state->hostname,
+    ret = be_nsupdate_create_ptr_msg(state, realm, servername, state->hostname,
                                      state->ttl, state->remove_af,
                                      state->addresses, state->dns_addrlist,
                                      &state->update_msg);
@@ -443,11 +446,11 @@ sdap_dyndns_update_ptr_done(struct tevent_req *subreq)
     talloc_zfree(subreq);
     if (ret != EOK) {
         /* If the update didn't succeed, we can retry using the server name */
-        if (state->fallback_mode == false && state->servername &&
-            WIFEXITED(child_status) && WEXITSTATUS(child_status) != 0) {
+        if (state->fallback_mode == false
+                && WIFEXITED(child_status)
+                && WEXITSTATUS(child_status) != 0) {
             state->fallback_mode = true;
-            DEBUG(SSSDBG_MINOR_FAILURE,
-                   "nsupdate failed, retrying with server name\n");
+            DEBUG(SSSDBG_MINOR_FAILURE, "nsupdate failed, retrying\n");
             ret = sdap_dyndns_update_ptr_step(req);
             if (ret == EOK) {
                 return;
diff --git a/src/providers/ldap/sdap_dyndns.h b/src/providers/ldap/sdap_dyndns.h
index a9481b7941be6af0f172afce5f4d54f57ef85e48..fda4530b61cfcfcf98207638efd4de70498d90dc 100644
--- a/src/providers/ldap/sdap_dyndns.h
+++ b/src/providers/ldap/sdap_dyndns.h
@@ -40,7 +40,6 @@ sdap_dyndns_update_send(TALLOC_CTX *mem_ctx,
                         const char *ifname,
                         const char *hostname,
                         const char *realm,
-                        const char *servername,
                         const int ttl,
                         bool check_diff);
 
-- 
2.4.3


["0002-DYNDNS-improve-nsupdate_msg_add_fwd.patch" (text/x-patch)]

From 58427349f31b4bca0ac5bd67d1e939b6742b592a Mon Sep 17 00:00:00 2001
From: Pavel Reichl <preichl@redhat.com>
Date: Fri, 24 Jul 2015 13:25:56 -0400
Subject: [PATCH 2/2] DYNDNS: improve nsupdate_msg_add_fwd()

Update nsupdate_msg_add_fwd() to group commands by address family
processed IP address belongs to.

It's better to group removing old A addresses and adding new A
addresses in a single transaction. Same goes for AAAA addresses.

Separate transaction for A and AAAA addresses updates are important
because server might block updates for one of these families and thus
the update even for the non-blocked address family would unnecessarily
fail.

For more details please see:
https://fedorahosted.org/sssd/wiki/DesignDocs/DDNSMessagesUpdate

Resolves:
https://fedorahosted.org/sssd/ticket/2495
---
 src/providers/dp_dyndns.c      |  56 ++++++---
 src/tests/cmocka/test_dyndns.c | 280 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 316 insertions(+), 20 deletions(-)

diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
index c1836837d00ed995c0f1942ca2a86f0d9d2ba27b..74575b95359cf87b6f46f5b4418a7a41d59b8cb9 100644
--- a/src/providers/dp_dyndns.c
+++ b/src/providers/dp_dyndns.c
@@ -253,40 +253,62 @@ nsupdate_msg_add_fwd(char *update_msg, struct sss_iface_addr *addresses,
     char ip_addr[INET6_ADDRSTRLEN];
     errno_t ret;
 
+    /* A addresses first */
     /* Remove existing entries as needed */
     if (remove_af & DYNDNS_REMOVE_A) {
         update_msg = talloc_asprintf_append(update_msg,
-                                            "update delete %s. in A\nsend\n",
+                                            "update delete %s. in A\n",
                                             hostname);
         if (update_msg == NULL) {
             return NULL;
         }
     }
+    DLIST_FOR_EACH(new_record, addresses) {
+        if (new_record->addr->ss_family == AF_INET) {
+            ret = addr_to_str(new_record->addr, ip_addr, INET6_ADDRSTRLEN);
+            if (ret != EOK) {
+                DEBUG(SSSDBG_MINOR_FAILURE, "addr_to_str failed: %d:[%s],\n",
+                      ret, sss_strerror(ret));
+                return NULL;
+            }
+
+            /* Format the record update */
+            update_msg = talloc_asprintf_append(update_msg,
+                                                "update add %s. %d in %s %s\n",
+                                                hostname, ttl, "A", ip_addr);
+            if (update_msg == NULL) {
+                return NULL;
+            }
+        }
+    }
+    update_msg = talloc_asprintf_append(update_msg, "send\n");
+
+    /* AAAA addresses first */
+    /* Remove existing entries as needed */
     if (remove_af & DYNDNS_REMOVE_AAAA) {
         update_msg = talloc_asprintf_append(update_msg,
-                                            "update delete %s. in AAAA\nsend\n",
+                                            "update delete %s. in AAAA\n",
                                             hostname);
         if (update_msg == NULL) {
             return NULL;
         }
     }
-
     DLIST_FOR_EACH(new_record, addresses) {
-        ret = addr_to_str(new_record->addr, ip_addr, INET6_ADDRSTRLEN);
-        if (ret != EOK) {
-            DEBUG(SSSDBG_MINOR_FAILURE, "addr_to_str failed: %d:[%s],\n",
-                  ret, sss_strerror(ret));
-            return NULL;
-        }
+        if (new_record->addr->ss_family == AF_INET6) {
+            ret = addr_to_str(new_record->addr, ip_addr, INET6_ADDRSTRLEN);
+            if (ret != EOK) {
+                DEBUG(SSSDBG_MINOR_FAILURE, "addr_to_str failed: %d:[%s],\n",
+                      ret, sss_strerror(ret));
+                return NULL;
+            }
 
-        /* Format the record update */
-        update_msg = talloc_asprintf_append(update_msg,
-                "update add %s. %d in %s %s\n",
-                hostname, ttl,
-                new_record->addr->ss_family == AF_INET ? "A" : "AAAA",
-                ip_addr);
-        if (update_msg == NULL) {
-            return NULL;
+            /* Format the record update */
+            update_msg = talloc_asprintf_append(update_msg,
+                                                "update add %s. %d in %s %s\n",
+                                                hostname, ttl, "AAAA", ip_addr);
+            if (update_msg == NULL) {
+                return NULL;
+            }
         }
     }
 
diff --git a/src/tests/cmocka/test_dyndns.c b/src/tests/cmocka/test_dyndns.c
index 691378ee6edc5b0238adc8404ea0a433ae3cf907..e0a8ba76c7bb9590205511b16de0463b3900faa7 100644
--- a/src/tests/cmocka/test_dyndns.c
+++ b/src/tests/cmocka/test_dyndns.c
@@ -328,6 +328,266 @@ void dyndns_test_addr_list_as_str_list(void **state)
     assert_true(check_leaks_pop(dyndns_test_ctx) == true);
 }
 
+void dyndns_test_create_fwd_msg(void **state)
+{
+    errno_t ret;
+    char *msg;
+    struct sss_iface_addr *addrlist;
+    int i;
+
+    check_leaks_push(dyndns_test_ctx);
+
+    /* getifaddrs is called twice in sss_get_dualstack_addresses() */
+    for (i = 0; i < 2; i++) {
+        will_return_getifaddrs("eth0", "192.168.0.2", AF_INET);
+        will_return_getifaddrs("eth1", "192.168.0.1", AF_INET);
+        will_return_getifaddrs("eth0", "2001:cdba::555", AF_INET6);
+        will_return_getifaddrs("eth1", "2001:cdba::444", AF_INET6);
+        will_return_getifaddrs(NULL, NULL, 0); /* sentinel */
+    }
+
+    struct sockaddr_in sin;
+    memset(&sin, 0, sizeof (sin));
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = inet_addr ("192.168.0.2");
+    ret = sss_get_dualstack_addresses(dyndns_test_ctx,
+                                      (struct sockaddr *) &sin,
+                                      &addrlist);
+    assert_int_equal(ret, EOK);
+
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    /* fallback case realm and server */
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, "North", "Winterfell",
+                                     "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "server Winterfell\n"
+                        "realm North\n"
+                        "update delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    /* just realm */
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, "North", NULL,
+                                     "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "realm North\n"
+                        "update delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    /* just server */
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, "Winterfell",
+                                     "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "server Winterfell\n"
+                        "\n"
+                        "update delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    /* remove just A */
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_A,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    /* remove just AAAA */
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    talloc_free(addrlist);
+    assert_true(check_leaks_pop(dyndns_test_ctx) == true);
+}
+
+void dyndns_test_create_fwd_msg_mult(void **state)
+{
+    errno_t ret;
+    char *msg;
+    struct sss_iface_addr *addrlist;
+    int i;
+
+    check_leaks_push(dyndns_test_ctx);
+
+    /* getifaddrs is called twice in sss_get_dualstack_addresses() */
+    for (i = 0; i < 2; i++) {
+        will_return_getifaddrs("eth0", "192.168.0.2", AF_INET);
+        will_return_getifaddrs("eth0", "192.168.0.1", AF_INET);
+        will_return_getifaddrs("eth0", "2001:cdba::555", AF_INET6);
+        will_return_getifaddrs("eth0", "2001:cdba::444", AF_INET6);
+        will_return_getifaddrs(NULL, NULL, 0); /* sentinel */
+    }
+
+    struct sockaddr_in sin;
+    memset(&sin, 0, sizeof (sin));
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = inet_addr ("192.168.0.2");
+    ret = sss_get_dualstack_addresses(dyndns_test_ctx,
+                                      (struct sockaddr *) &sin,
+                                      &addrlist);
+    assert_int_equal(ret, EOK);
+
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.1\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::444\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    talloc_free(addrlist);
+    assert_true(check_leaks_pop(dyndns_test_ctx) == true);
+}
+
+void dyndns_test_create_fwd_msg_A(void **state)
+{
+    errno_t ret;
+    char *msg;
+    struct sss_iface_addr *addrlist;
+    int i;
+
+    check_leaks_push(dyndns_test_ctx);
+
+    /* getifaddrs is called twice in sss_get_dualstack_addresses() */
+    for (i = 0; i < 2; i++) {
+        will_return_getifaddrs("eth0", "192.168.0.2", AF_INET);
+        will_return_getifaddrs("eth0", "192.168.0.1", AF_INET);
+        will_return_getifaddrs(NULL, NULL, 0); /* sentinel */
+    }
+
+    struct sockaddr_in sin;
+    memset(&sin, 0, sizeof (sin));
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = inet_addr ("192.168.0.2");
+    ret = sss_get_dualstack_addresses(dyndns_test_ctx,
+                                      (struct sockaddr *) &sin,
+                                      &addrlist);
+    assert_int_equal(ret, EOK);
+
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate delete bran_stark. in A\n"
+                        "update add bran_stark. 1234 in A 192.168.0.1\n"
+                        "update add bran_stark. 1234 in A 192.168.0.2\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    talloc_free(addrlist);
+    assert_true(check_leaks_pop(dyndns_test_ctx) == true);
+}
+
+void dyndns_test_create_fwd_msg_AAAA(void **state)
+{
+    errno_t ret;
+    char *msg;
+    struct sss_iface_addr *addrlist;
+    int i;
+
+    check_leaks_push(dyndns_test_ctx);
+
+    /* getifaddrs is called twice in sss_get_dualstack_addresses() */
+    for (i = 0; i < 2; i++) {
+        will_return_getifaddrs("eth0", "2001:cdba::555", AF_INET6);
+        will_return_getifaddrs("eth0", "2001:cdba::444", AF_INET6);
+        will_return_getifaddrs(NULL, NULL, 0); /* sentinel */
+    }
+
+    struct sockaddr_in6 sin;
+    memset(&sin, 0, sizeof (sin));
+    sin.sin6_family = AF_INET6;
+    ret = inet_pton(AF_INET6, "2001:cdba::555", &sin.sin6_addr.s6_addr);
+    assert_int_equal(ret, 1);
+    ret = sss_get_dualstack_addresses(dyndns_test_ctx,
+                                      (struct sockaddr *) &sin,
+                                      &addrlist);
+    assert_int_equal(ret, EOK);
+
+    ret = be_nsupdate_create_fwd_msg(dyndns_test_ctx, NULL, NULL, "bran_stark",
+                                     1234, DYNDNS_REMOVE_A | DYNDNS_REMOVE_AAAA,
+                                     addrlist, &msg);
+    assert_int_equal(ret, EOK);
+
+    assert_string_equal(msg,
+                        "\nupdate delete bran_stark. in A\n"
+                        "send\n"
+                        "update delete bran_stark. in AAAA\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::444\n"
+                        "update add bran_stark. 1234 in AAAA 2001:cdba::555\n"
+                        "send\n");
+    talloc_zfree(msg);
+
+    talloc_free(addrlist);
+    assert_true(check_leaks_pop(dyndns_test_ctx) == true);
+}
+
 void dyndns_test_dualstack(void **state)
 {
     errno_t ret;
@@ -348,7 +608,7 @@ void dyndns_test_dualstack(void **state)
     }
 
     struct sockaddr_in sin;
-    memset (&sin, 0, sizeof (sin));
+    memset(&sin, 0, sizeof (sin));
     sin.sin_family = AF_INET;
     sin.sin_addr.s_addr = inet_addr ("192.168.0.2");
     ret = sss_get_dualstack_addresses(dyndns_test_ctx,
@@ -409,7 +669,7 @@ void dyndns_test_dualstack_multiple_addresses(void **state)
     }
 
     struct sockaddr_in sin;
-    memset (&sin, 0, sizeof (sin));
+    memset(&sin, 0, sizeof (sin));
     sin.sin_family = AF_INET;
     sin.sin_addr.s_addr = inet_addr ("192.168.0.2");
     ret = sss_get_dualstack_addresses(dyndns_test_ctx,
@@ -484,7 +744,7 @@ void dyndns_test_dualstack_no_iface(void **state)
     will_return_getifaddrs(NULL, NULL, 0); /* sentinel */
 
     struct sockaddr_in sin;
-    memset (&sin, 0, sizeof (sin));
+    memset(&sin, 0, sizeof (sin));
     sin.sin_family = AF_INET;
     sin.sin_addr.s_addr = inet_addr ("192.168.0.3");
     ret = sss_get_dualstack_addresses(dyndns_test_ctx,
@@ -739,6 +999,20 @@ int main(int argc, const char *argv[])
         cmocka_unit_test_setup_teardown(dyndns_test_dualstack_no_iface,
                                         dyndns_test_simple_setup,
                                         dyndns_test_teardown),
+
+        /* Messages for nsupdate */
+        cmocka_unit_test_setup_teardown(dyndns_test_create_fwd_msg,
+                                        dyndns_test_setup,
+                                        dyndns_test_teardown),
+        cmocka_unit_test_setup_teardown(dyndns_test_create_fwd_msg_mult,
+                                        dyndns_test_setup,
+                                        dyndns_test_teardown),
+        cmocka_unit_test_setup_teardown(dyndns_test_create_fwd_msg_A,
+                                        dyndns_test_setup,
+                                        dyndns_test_teardown),
+        cmocka_unit_test_setup_teardown(dyndns_test_create_fwd_msg_AAAA,
+                                        dyndns_test_setup,
+                                        dyndns_test_teardown),
     };
 
     /* Set debug level to invalid value so we can deside if -d 0 was used. */
-- 
2.4.3


[Attachment #5 (text/plain)]

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic