https://www.mediawiki.org/wiki/Special:Code/MediaWiki/115488

Revision: 115488
Author:   laner
Date:     2012-06-07 15:21:06 +0000 (Thu, 07 Jun 2012)
Log Message:
-----------
Making the logging more sane and speed improvements when using manage-exports.

Modified Paths:
--------------
    trunk/tools/subversion/user-management/homedirectorymanager.py
    trunk/tools/subversion/user-management/manage-exports

Modified: trunk/tools/subversion/user-management/homedirectorymanager.py
===================================================================
--- trunk/tools/subversion/user-management/homedirectorymanager.py      
2012-06-07 13:36:57 UTC (rev 115487)
+++ trunk/tools/subversion/user-management/homedirectorymanager.py      
2012-06-07 15:21:06 UTC (rev 115488)
@@ -32,7 +32,7 @@
 
                # Add to this array if we add directories that don't have
                # LDAP accounts associated with them
-               self.excludedFromModification = ['lost+found', 'SAVE', 
'svn-private', 'autofs_check']
+               self.excludedFromModification = ['lost+found', 'SAVE', 
'svn-private', 'autofs_check', 'wikipedia']
 
                # Limit home directory management to the specified group
                self.group = None
@@ -48,10 +48,25 @@
 
                self.dryRun = False
 
+               self.updates = {'create': [], 'chgrp': [], 'chown': [], 
'rename': [], 'delete': [], 'key': []}
+
+               self.UsersData = None
+
+               self.GroupData = None
+
                if (os.path.exists('/usr/sbin/nscd')):
                        os.system('nscd -i passwd')
                        os.system('nscd -i group')
 
+       def get_updates(self):
+               return self.updates
+
+       def setUsersData(self,UsersData):
+               self.UsersData = UsersData
+
+       def setGroupData(self,GroupData):
+               self.GroupData = GroupData
+
        def run(self):
                parser = OptionParser(conflict_handler="resolve")
                parser.set_usage("homedirectorymanager.py [options]\n\nexample: 
homedirectorymanager.py --dry-run")
@@ -89,11 +104,21 @@
                # w00t We're in!
                try:
                        # get all user's uids
-                       UsersData = ldapSupportLib.getUsers(ds, '*')
-                       self.logDebug("Pulled the user information")
+                       if self.UsersData:
+                               UsersData = self.UsersData
+                       else:
+                               UsersData = ldapSupportLib.getUsers(ds, '*')
+                               self.logDebug("Pulled the user information")
                        if self.group:
-                               GroupData = ds.search_s("ou=groups," + 
base,ldap.SCOPE_SUBTREE,"(&(objectclass=posixGroup)(cn=" + self.group + "))")
-                               groupdns = GroupData[0][1]['member']
+                               if self.GroupData:
+                                       GroupData = self.GroupData
+                               else:
+                                       GroupData = ds.search_s("ou=groups," + 
base,ldap.SCOPE_SUBTREE,"(&(objectclass=posixGroup)(cn=" + self.group + "))")
+                                       GroupData = GroupData[0]
+                               try:
+                                       groupdns = GroupData[1]['member']
+                               except KeyError:
+                                       groupdns = []
 
                        # We are going to use a dictionary (associative array) 
as a hash bucket (keys pointing to dictionaries)
                        # for the AllUsers data structure.
@@ -161,6 +186,7 @@
                        if os.path.exists(self.basedir + user):
                                continue
 
+                       self.updates['create'].append(user)
                        self.log( "Creating a home directory for %s at %s%s" % 
(user, self.basedir, user) )
                        self.mkdir(self.basedir + user, 0700)
                        self.mkdir(self.basedir + user + '/.ssh', 0700)
@@ -234,10 +260,12 @@
                                                self.deleteUser(userdir)
 
        def renameUser(self, olduserdir, newuserdir):
+               self.updates['rename'].append(olduserdir)
                self.rename(self.basedir + olduserdir, self.basedir + 
newuserdir)
 
        def deleteUser(self, userdir):
                # User has been deleted, move user's home directory to SAVE
+               self.updates['delete'].append(userdir)
                if os.path.isdir(self.savedir + userdir):
                        self.log( userdir + " exists at both " + self.basedir + 
userdir + " and " + self.savedir + userdir )
                else:
@@ -255,6 +283,7 @@
                                continue
 
                        newGid = users[userdir]["gidNumber"]
+                       self.updates['chgrp'].append(userdir)
                        self.log( "Changing group ownership of %s%s to %s; was 
set to %s" % (self.basedir, userdir, newGid, gid) )
 
                        # Python doesn't have a recursive chown, so we have to 
walk the directory
@@ -279,6 +308,7 @@
                                continue
 
                        newUid = users[userdir]["uidNumber"]
+                       self.updates['chown'].append(userdir)
                        self.log( "Changing ownership of %s%s to %s; was set to 
%s" % (self.basedir, userdir, newUid, uid) )
                        # Python doesn't have a recursive chown, so we have to 
walk the directory
                        # and change everything manually
@@ -306,7 +336,8 @@
                                # has been manually mucking with the keys, 
either way
                                # let's overwrite them
                                self.writeKeys(userdir, 
users[userdir]['sshPublicKey'])
-                               self.log( "Updating keys for %s" % (userdir) )
+                               self.updates['key'].append(userdir)
+                               self.log( "Updating keys for %s at %s" % 
(userdir,self.basedir + userdir) )
                                os.utime(self.basedir + userdir + 
"/.ssh/authorized_keys", (atime, time.mktime(d_ldap_mtime.timetuple())))
 
        def log(self, logstring):
@@ -319,6 +350,21 @@
                        else:
                                print log
 
+       def log_project(self, user, update_type, project_list):
+               self.updates = {'create': [], 'chgrp': [], 'chown': [], 
'rename': [], 'delete': [], 'keys': []} 
+               if update_type == 'create':
+                       self.log("Created a home directory for %s in 
project(s): %s" % (user, ','.join(project_list)))
+               if update_type == 'key':
+                       self.log("User %s may have been modified in LDAP or 
locally, updating key in project(s): %s" % (user, ','.join(project_list)))
+               if update_type == 'delete':
+                       self.log("Deleting home directory for %s in project(s): 
%s" % (user, ','.join(project_list)))
+               if update_type == 'chown':
+                       self.log("User %s has a new uid, changing ownership in 
project(s): %s" % (user, ','.join(project_list)))
+               if update_type == 'chgrp':
+                       self.log("User %s has a new gid, changing ownership in 
project(s): %s" % (user, ','.join(project_list)))
+               if update_type == 'rename':
+                       self.log("User %s has been renamed, moving home 
directory in project(s): %s" % (user, ','.join(project_list)))
+
        def logDebug(self, logstring):
                if self.loglevel >= DEBUG:
                        log = datetime.datetime.now().strftime("%m/%d/%Y - 
%H:%M:%S - ") + "(Debug) " + logstring + "\n" 

Modified: trunk/tools/subversion/user-management/manage-exports
===================================================================
--- trunk/tools/subversion/user-management/manage-exports       2012-06-07 
13:36:57 UTC (rev 115487)
+++ trunk/tools/subversion/user-management/manage-exports       2012-06-07 
15:21:06 UTC (rev 115488)
@@ -42,24 +42,36 @@
                # w00t We're in!
                try:
                        projectdata = ds.search_s("ou=projects," + 
base,ldap.SCOPE_SUBTREE,"(&(cn=*)(owner=*))")
+                       usersdata = ldapSupportLib.getUsers(ds, '*')
                        projects = []
                        if not projectdata:
                                raise ldap.NO_SUCH_OBJECT()
-                       hdm = homedirectorymanager.HomeDirectoryManager()
+                       user_updates = {}
                        for project in projectdata:
+                               hdm = 
homedirectorymanager.HomeDirectoryManager()
+                               hdm.setDebugLevel("NONE")
+                               hdm.setUsersData(usersdata)
+                               hdm.setGroupData(project)
+                               if options.logfile:
+                                       hdm.logfile = options.logfile
                                project_name = project[1]["cn"][0]
                                if not os.path.exists(self.basedir + 
project_name):
                                        self.log( "Creating a project directory 
for %s" % (project_name) )
                                        os.mkdir(self.basedir + project_name, 
0755)
                                        os.mkdir(self.basedir + project_name + 
'/autofs_check', 0755)
                                        os.mkdir(self.basedir + project_name + 
'/SAVE', 0755)
-                               if options.logfile:
-                                       hdm.logfile = options.logfile
-                               if options.loglevel:
-                                       hdm.setDebugLevel(options.loglevel)
                                hdm.basedir = self.basedir + project_name + "/"
                                hdm.group = 'project-' + project_name
                                hdm.run()
+                               updates = hdm.get_updates()
+                               for update_type,user_list in updates.items():
+                                       for user in user_list:
+                                               if user in user_updates.keys() 
and update_type in user_updates[user].keys():
+                                                       
user_updates[user][update_type].append(project_name)
+                                               elif user in 
user_updates.keys():
+                                                       user_updates[user] = 
{update_type: [project_name]}
+                                               else:
+                                                       user_updates = 
{user:{update_type: [project_name]}}
                                hostdata = ds.search_s("ou=hosts," + 
base,ldap.SCOPE_SUBTREE,"(puppetvar=instanceproject=" + project_name + ")")
                                hosts = []
                                for host in hostdata:
@@ -67,6 +79,14 @@
                                        hosts.append(host_ip + 
"(rw,no_root_squash,no_subtree_check)")
                                if hosts:
                                        projects.append(self.basedir + 
project_name + " " + " ".join(hosts) + "\n")
+                       hdm = homedirectorymanager.HomeDirectoryManager()
+                       if options.logfile:
+                               hdm.logfile = options.logfile
+                       if options.loglevel:
+                               hdm.loglevel = options.loglevel
+                       for user,user_update in user_updates.items():
+                               for update_type,project_list in 
user_update.items():
+                                       
hdm.log_project(user,update_type,project_list)
                        exports = open('/etc/exports', 'w')
                        exports.writelines(projects)
                        exports.close()


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to