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