From 0a26e92fb2a4dd9704a0578f90241997e2aed269 Mon Sep 17 00:00:00 2001 From: Pavel Reichl Date: Jul 24 2015 07:30:41 +0000 Subject: DYNDNS: special value '*' for dyndns_iface option Option dyndns_iface has now special value '*' which implies that IPs from add interfaces should be sent during DDNS update. --- diff --git a/src/man/sssd-ad.5.xml b/src/man/sssd-ad.5.xml index ff43ea3..3cbc105 100644 --- a/src/man/sssd-ad.5.xml +++ b/src/man/sssd-ad.5.xml @@ -756,10 +756,12 @@ ad_gpo_map_deny = +my_pam_service Optional. Applicable only when dyndns_update is true. Choose the interface or a list of interfaces whose IP addresses should be used for dynamic DNS - updates. + updates. Special value * implies that + IPs from all interfaces should be used. - Default: Use the IP address of the AD LDAP connection + Default: Use the IP addresses of the interface which + is used for AD LDAP connection Example: dyndns_iface = em1, vnet1, vnet2 diff --git a/src/man/sssd-ipa.5.xml b/src/man/sssd-ipa.5.xml index d450c2f..2e98599 100644 --- a/src/man/sssd-ipa.5.xml +++ b/src/man/sssd-ipa.5.xml @@ -168,10 +168,8 @@ Optional. Applicable only when dyndns_update is true. Choose the interface or a list of interfaces whose IP addresses should be used for dynamic DNS - updates. - - - NOTE: This option currently supports multiple interfaces. + updates. Special value * implies that + IPs from all interfaces should be used. NOTE: While it is still possible to use the old @@ -180,7 +178,8 @@ in their config file. - Default: Use the IP address of the IPA LDAP connection + Default: Use the IP addresses of the interface which + is used for IPA LDAP connection Example: dyndns_iface = em1, vnet1, vnet2 diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c index 7656284..03389ac 100644 --- a/src/providers/dp_dyndns.c +++ b/src/providers/dp_dyndns.c @@ -42,6 +42,9 @@ #define DYNDNS_TIMEOUT 15 #endif /* DYNDNS_TIMEOUT */ +/* MASK represents special value for matching all interfaces */ +#define MASK "*" + struct sss_iface_addr { struct sss_iface_addr *next; struct sss_iface_addr *prev; @@ -171,6 +174,16 @@ ok_for_dns(struct sockaddr *sa) return true; } +static bool supported_address_family(sa_family_t sa_family) +{ + return sa_family == AF_INET || sa_family == AF_INET6; +} + +static bool matching_name(const char *ifname, const char *ifname2) +{ + return (strcmp(MASK, ifname) == 0) || (strcasecmp(ifname, ifname2) == 0); +} + /* Collect IP addresses associated with an interface */ errno_t sss_iface_addr_list_get(TALLOC_CTX *mem_ctx, const char *ifname, @@ -200,10 +213,9 @@ sss_iface_addr_list_get(TALLOC_CTX *mem_ctx, const char *ifname, if (!ifa->ifa_addr) continue; /* Add IP addresses to the list */ - if ((ifa->ifa_addr->sa_family == AF_INET || - ifa->ifa_addr->sa_family == AF_INET6) && - strcasecmp(ifa->ifa_name, ifname) == 0 && - ok_for_dns(ifa->ifa_addr)) { + if (supported_address_family(ifa->ifa_addr->sa_family) + && matching_name(ifname, ifa->ifa_name) + && ok_for_dns(ifa->ifa_addr)) { /* Add this address to the IP address list */ address = talloc_zero(mem_ctx, struct sss_iface_addr);