]> Frank Brehm's Git Trees - pixelpark/admin-tools.git/commitdiff
Start handling of numeric user Ids
authorFrank Brehm <frank.brehm@pixelpark.com>
Mon, 20 Mar 2017 14:27:40 +0000 (15:27 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Mon, 20 Mar 2017 14:27:40 +0000 (15:27 +0100)
pp_lib/ldap_app.py
pp_lib/mk_home_app.py

index 4f96e9b7e1a25a8a40072d22b237613320a5ec50..47b7c0cf98865f98dea1aa9d16f81312d38d57d4 100644 (file)
@@ -24,7 +24,7 @@ import six
 import ldap3
 
 # ldap3 classes and objects
-from ldap3 import Server, ServerPool, Connection, Reader
+from ldap3 import Server, ServerPool, Connection, Reader, ObjectDef
 # ldap3 constants
 from ldap3 import IP_V4_PREFERRED, ROUND_ROBIN, AUTO_BIND_NONE, ALL_ATTRIBUTES
 from ldap3 import SUBTREE
@@ -42,7 +42,7 @@ from .merge import merge_structure
 
 from .cfg_app import PpCfgAppError, PpConfigApplication
 
-__version__ = '0.4.1'
+__version__ = '0.4.3'
 LOG = logging.getLogger(__name__)
 
 
@@ -295,6 +295,40 @@ class PpLdapApplication(PpConfigApplication):
         cursor.search()
         return cursor.entries
 
+    # -------------------------------------------------------------------------
+    def ldap_search_object(self, obj_def, object_dn, base=None):
+
+        if base is None:
+            base = self.ldap_base_dn
+
+        cursor = Reader(
+            self.ldap_connection,
+            object_def=obj_def, base=base)
+
+        if self.verbose > 1:
+            LOG.debug("LDAP-Reader:\n{}".format(cursor))
+
+        cursor.search_object(entry_dn=object_dn)
+        return cursor.entries
+
+    # -------------------------------------------------------------------------
+    def get_numeric_uid(self, dn, base=None):
+
+        person = ObjectDef(['posixAccount', 'shadowAccount'])
+        person += ["uid", "uidNumber", "gidNumber"]
+
+        entries = self.ldap_search_object(person, dn)
+        LOG.debug("Found {} LDAP entries.".format(len(entries)))
+
+        if not entries:
+            LOG.error("No LDAP entry found for DN {!r}.".format(dn))
+            return None
+
+        entry = entries[0]
+
+        uid = entry['uidNumber'][0]
+        return uid
+
     # -------------------------------------------------------------------------
     def post_run(self):
         """
index a3a8c6181df948f6c14d16597af6d008603d63c4..ea8779a9df5f27b4103d57413f57c7bb04056631 100644 (file)
@@ -40,7 +40,7 @@ from .merge import merge_structure
 
 from .ldap_app import PpLdapAppError, PpLdapApplication
 
-__version__ = '0.3.6'
+__version__ = '0.4.1'
 LOG = logging.getLogger(__name__)
 
 
@@ -63,6 +63,7 @@ class PpMkHomeApp(PpLdapApplication):
     default_home_root = os.sep + 'home'
     # /etc/skel
     default_skel_dir = os.sep + os.path.join('etc', 'skel')
+    default_dn_counter = 'uid=uidNumber,ou=ldapTool,ou=Applications,o=Pixelpark,o=isp'
 
     # -------------------------------------------------------------------------
     def __init__(self, appname=None, version=__version__):
@@ -75,6 +76,7 @@ class PpMkHomeApp(PpLdapApplication):
         self.user_entries = []
         self.home_root_real = os.path.join(self.chroot_homedir, self.home_root_rel)
         self.skel_dir = self.default_skel_dir
+        self.dn_counter = self.default_dn_counter
 
         description = textwrap.dedent('''\
             Home Directory and UIDNumber generation - this script will search for
@@ -251,6 +253,40 @@ class PpMkHomeApp(PpLdapApplication):
 
         LOG.info("Checking UID's for new Users ...")
 
+        uid_counter = self.get_numeric_uid(self.dn_counter)
+        LOG.debug("Current UID counter: {}".format(uid_counter))
+
+        el_printed = False
+
+        i = 0
+        for entry in self.user_entries:
+
+            cur_uid = entry['uidNumber'][0]
+            user_name = entry['uid'][0]
+
+            if cur_uid == self.initial_uid:
+
+                i += 1
+                new_uid = uid_counter + 1
+                LOG.info("Setting numeric UID of user {n!r} to {u}...".format(
+                    n=user_name, u=new_uid))
+
+                uid_counter = self.get_numeric_uid(self.dn_counter)
+
+        if self.verbose:
+            print('')
+        if i:
+            if i > 1:
+                LOG.debug("Total {} numeric user Ids set.".format(i))
+            else:
+                LOG.debug("Total one numeric user Id set.")
+        else:
+            LOG.debug("No numeric user Ids set.")
+
+
+        if self.verbose:
+            print('')
+
     # -------------------------------------------------------------------------
     def check_home_dirs(self):