e3ffab
From aa5a5fa8349444c2817feb21dd8c6f8ba6b38fd0 Mon Sep 17 00:00:00 2001
e3ffab
From: Petr Vobornik <pvoborni@redhat.com>
e3ffab
Date: Mon, 13 Oct 2014 14:59:24 +0200
e3ffab
Subject: [PATCH] ldapupdater: set baserid to 0 for ipa-ad-trust-posix ranges
e3ffab
e3ffab
New updater plugin which sets baserid to 0 for ranges with type ipa-ad-trust-posix
e3ffab
e3ffab
https://fedorahosted.org/freeipa/ticket/4221
e3ffab
e3ffab
Reviewed-By: Tomas Babej <tbabej@redhat.com>
e3ffab
---
e3ffab
 ipaserver/install/plugins/update_idranges.py | 69 +++++++++++++++++++++++++++-
e3ffab
 1 file changed, 68 insertions(+), 1 deletion(-)
e3ffab
e3ffab
diff --git a/ipaserver/install/plugins/update_idranges.py b/ipaserver/install/plugins/update_idranges.py
e3ffab
index 9e97c9f74570484a8bae82e99a7561350163a1b1..1aa5fa7631fd35a7aaf4a23a5eee44e4e0a2e904 100644
e3ffab
--- a/ipaserver/install/plugins/update_idranges.py
e3ffab
+++ b/ipaserver/install/plugins/update_idranges.py
e3ffab
@@ -17,7 +17,7 @@
e3ffab
 # You should have received a copy of the GNU General Public License
e3ffab
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
e3ffab
 
e3ffab
-from ipaserver.install.plugins import MIDDLE
e3ffab
+from ipaserver.install.plugins import MIDDLE, LAST
e3ffab
 from ipaserver.install.plugins.baseupdate import PostUpdate
e3ffab
 from ipalib import api, errors
e3ffab
 from ipapython.dn import DN
e3ffab
@@ -111,4 +111,71 @@ class update_idrange_type(PostUpdate):
e3ffab
 
e3ffab
         return (False, False, [])
e3ffab
 
e3ffab
+
e3ffab
+class update_idrange_baserid(PostUpdate):
e3ffab
+    """
e3ffab
+    Update ipa-ad-trust-posix ranges' base RID to 0. This applies to AD trust
e3ffab
+    posix ranges prior to IPA 4.1.
e3ffab
+    """
e3ffab
+
e3ffab
+    order = LAST
e3ffab
+
e3ffab
+    def execute(self, **options):
e3ffab
+        ldap = self.obj.backend
e3ffab
+
e3ffab
+        base_dn = DN(api.env.container_ranges, api.env.basedn)
e3ffab
+        search_filter = ("(&(objectClass=ipaTrustedADDomainRange)"
e3ffab
+                         "(ipaRangeType=ipa-ad-trust-posix)"
e3ffab
+                         "(!(ipaBaseRID=0)))")
e3ffab
+        root_logger.debug(
e3ffab
+            "update_idrange_baserid: search for ipa-ad-trust-posix ID ranges "
e3ffab
+            "with ipaBaseRID != 0"
e3ffab
+        )
e3ffab
+
e3ffab
+        try:
e3ffab
+            (entries, truncated) = ldap.find_entries(
e3ffab
+                search_filter, ['ipabaserid'], base_dn,
e3ffab
+                paged_search=True, time_limit=0, size_limit=0)
e3ffab
+
e3ffab
+        except errors.NotFound:
e3ffab
+            root_logger.debug("update_idrange_baserid: no AD domain "
e3ffab
+                              "range with posix attributes found")
e3ffab
+            return (False, False, [])
e3ffab
+
e3ffab
+        except errors.ExecutionError, e:
e3ffab
+            root_logger.error("update_idrange_baserid: cannot retrieve "
e3ffab
+                              "list of affected ranges: %s", e)
e3ffab
+            return (False, False, [])
e3ffab
+
e3ffab
+        root_logger.debug("update_idrange_baserid: found %d "
e3ffab
+                          "idranges possible to update",
e3ffab
+                          len(entries))
e3ffab
+
e3ffab
+        error = False
e3ffab
+
e3ffab
+        # Set the range type
e3ffab
+        for entry in entries:
e3ffab
+            entry['ipabaserid'] = 0
e3ffab
+            try:
e3ffab
+                root_logger.info("Updating existing idrange: %s" % (entry.dn))
e3ffab
+                ldap.update_entry(entry)
e3ffab
+                root_logger.info("Done")
e3ffab
+            except (errors.EmptyModlist, errors.NotFound):
e3ffab
+                pass
e3ffab
+            except errors.ExecutionError, e:
e3ffab
+                root_logger.debug("update_idrange_type: cannot "
e3ffab
+                                  "update idrange: %s", e)
e3ffab
+                error = True
e3ffab
+
e3ffab
+        if error:
e3ffab
+            root_logger.error("update_idrange_baserid: error(s) "
e3ffab
+                              "detected during idrange baserid update")
e3ffab
+        else:
e3ffab
+            # All affected entries updated, exit the loop
e3ffab
+            root_logger.debug("update_idrange_baserid: all affected "
e3ffab
+                              "idranges updated")
e3ffab
+
e3ffab
+        return (False, False, [])
e3ffab
+
e3ffab
 api.register(update_idrange_type)
e3ffab
+api.register(update_idrange_baserid)
e3ffab
-- 
e3ffab
2.1.0
e3ffab