|
|
|
@ -53,7 +53,7 @@ class _shareData(color_print):
|
|
|
|
|
elif self.getFileAccess(perm="READ"):
|
|
|
|
|
self.data = self.getDataInFile(fileName=self.fileName,
|
|
|
|
|
lenData=self.lenData)
|
|
|
|
|
return self.data
|
|
|
|
|
return self.data
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -82,12 +82,19 @@ class _shareData(color_print):
|
|
|
|
|
for index, listDataOld in enumerate(self.data):
|
|
|
|
|
if name == listDataOld[0]:
|
|
|
|
|
flagFound = True
|
|
|
|
|
self.data[index] = listData
|
|
|
|
|
if not self.equally(listData, self.data[index]):
|
|
|
|
|
self.data[index] = listData
|
|
|
|
|
if flagFound:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def equally(self, listDataA, listDataB):
|
|
|
|
|
if set(listDataA) == set(listDataB):
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def get(self, name):
|
|
|
|
|
if self.getData() is False:
|
|
|
|
|
return False
|
|
|
|
@ -141,6 +148,77 @@ class group(_shareData):
|
|
|
|
|
self.data.append(groupList)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def replace(self, name, listData):
|
|
|
|
|
if self.getData() is False:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
delEmpty = lambda y: filter(lambda x: x.strip(), y)
|
|
|
|
|
flagFound = False
|
|
|
|
|
for index, listDataOld in enumerate(self.data):
|
|
|
|
|
if name == listDataOld[0]:
|
|
|
|
|
flagFound = True
|
|
|
|
|
if not self.equally(listData, self.data[index]):
|
|
|
|
|
listDataWork = listData[:]
|
|
|
|
|
listDataWork[1] = self.data[index][1]
|
|
|
|
|
# Constant gid
|
|
|
|
|
listDataWork[2] = self.data[index][2]
|
|
|
|
|
# Join user list
|
|
|
|
|
userList = delEmpty(self.data[index][3].split(',') +\
|
|
|
|
|
listDataWork[3].split(','))
|
|
|
|
|
# unique list
|
|
|
|
|
userList = reduce(lambda x,y:\
|
|
|
|
|
(y in x and x) or x +[y],
|
|
|
|
|
userList,[])
|
|
|
|
|
listDataWork[3] = ','.join(userList)
|
|
|
|
|
self.data[index] = listDataWork
|
|
|
|
|
if flagFound:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def equally(self, listDataA, listDataB):
|
|
|
|
|
getData = lambda x: x[:1] + x[3:]
|
|
|
|
|
return _shareData.equally(self, getData(listDataA),
|
|
|
|
|
getData(listDataB))
|
|
|
|
|
|
|
|
|
|
def getSecondUserGroups(self, userName):
|
|
|
|
|
"""get all second user groups"""
|
|
|
|
|
if self.getData() is False:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
userGroups = []
|
|
|
|
|
for group, x, gid, userList in self.data:
|
|
|
|
|
usersInGroup = userList.split(",")
|
|
|
|
|
if userName in usersInGroup:
|
|
|
|
|
userGroups.append(group)
|
|
|
|
|
return userGroups
|
|
|
|
|
|
|
|
|
|
def getUsersInGroup(self, name):
|
|
|
|
|
if self.getData() is False:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
dataGroup = map(lambda x: x[3].split(","),
|
|
|
|
|
filter(lambda x: x[0]==name, self.data))
|
|
|
|
|
if dataGroup:
|
|
|
|
|
return dataGroup[0]
|
|
|
|
|
else:
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
def deleteUserInGroups(self, userName, groups):
|
|
|
|
|
if self.getData() is False:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
data = []
|
|
|
|
|
for dataList in self.data:
|
|
|
|
|
groupName, x, gid, userList = dataList
|
|
|
|
|
if groupName in groups:
|
|
|
|
|
usersList = ",".join(filter(lambda x: x!=userName,
|
|
|
|
|
userList.split(",")))
|
|
|
|
|
dataList[3] = usersList
|
|
|
|
|
data.append(dataList)
|
|
|
|
|
self.data = data
|
|
|
|
|
return self.data
|
|
|
|
|
|
|
|
|
|
class shadow(_shareData):
|
|
|
|
|
'''Class for working with the file /etc/shadow'''
|
|
|
|
|
fileName = "/etc/shadow"
|
|
|
|
@ -167,6 +245,10 @@ class shadow(_shareData):
|
|
|
|
|
self.data.append(shadowList)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def equally(self, listDataA, listDataB):
|
|
|
|
|
getData = lambda x: x[:1] + x[2:]
|
|
|
|
|
return _shareData.equally(self, getData(listDataA),
|
|
|
|
|
getData(listDataB))
|
|
|
|
|
|
|
|
|
|
class _shareCache():
|
|
|
|
|
|
|
|
|
@ -186,7 +268,7 @@ class _shareCache():
|
|
|
|
|
return False
|
|
|
|
|
if self.getFileAccess(perm="WRITE"):
|
|
|
|
|
modeFile = 0600
|
|
|
|
|
if getModeFile(self.fileName, mode=="mode") != modeFile:
|
|
|
|
|
if getModeFile(self.fileName, mode="mode") != modeFile:
|
|
|
|
|
os.chmod(self.fileName, modeFile)
|
|
|
|
|
buff = "\n".join(map(lambda x: ":".join(x), self.data)) + "\n"
|
|
|
|
|
FD = open(self.fileName, "w+")
|
|
|
|
@ -216,9 +298,21 @@ class cachePasswd(_shareCache, passwd):
|
|
|
|
|
class cacheGroup(_shareCache, group):
|
|
|
|
|
fileName = "/var/lib/calculate/calculate-client/cache/group"
|
|
|
|
|
|
|
|
|
|
def replace(self, name, listData):
|
|
|
|
|
return _shareData.replace(self, name, listData)
|
|
|
|
|
|
|
|
|
|
def equally(self, listDataA, listDataB):
|
|
|
|
|
return _shareData.equally(self, listDataA, listDataB)
|
|
|
|
|
|
|
|
|
|
class cacheShadow(_shareCache, shadow):
|
|
|
|
|
fileName = "/var/lib/calculate/calculate-client/cache/shadow"
|
|
|
|
|
|
|
|
|
|
class cacheCreateGroup(cacheGroup):
|
|
|
|
|
fileName = "/var/lib/calculate/calculate-client/cache/create_group"
|
|
|
|
|
|
|
|
|
|
class cacheCreatePasswd(cachePasswd):
|
|
|
|
|
fileName = "/var/lib/calculate/calculate-client/cache/create_passwd"
|
|
|
|
|
|
|
|
|
|
class userCache(color_print):
|
|
|
|
|
ldapObj = ldapUser()
|
|
|
|
|
|
|
|
|
@ -228,24 +322,7 @@ class userCache(color_print):
|
|
|
|
|
if not ldapData:
|
|
|
|
|
self.printERROR(_("Can not found user %s in LDAP")%userName)
|
|
|
|
|
return False
|
|
|
|
|
passwdObj = passwd()
|
|
|
|
|
userData = passwdObj.get(userName)
|
|
|
|
|
if userData is False:
|
|
|
|
|
return False
|
|
|
|
|
elif userData:
|
|
|
|
|
self.printWARNING(_("User %s found in /etc/passwd")%userName)
|
|
|
|
|
self.printWARNING(\
|
|
|
|
|
_("User Account will not be recorded in the cache"))
|
|
|
|
|
return True
|
|
|
|
|
groupName = ldapData['group']
|
|
|
|
|
groupObj = group()
|
|
|
|
|
# is cached group?
|
|
|
|
|
flagCacheGroup = True
|
|
|
|
|
groupData = groupObj.get(groupName)
|
|
|
|
|
if groupData is False:
|
|
|
|
|
return False
|
|
|
|
|
elif groupData:
|
|
|
|
|
flagCacheGroup = False
|
|
|
|
|
groupName = ldapData['group']
|
|
|
|
|
# Add user
|
|
|
|
|
cachePasswdObj = cachePasswd()
|
|
|
|
|
if not cachePasswdObj.add(userName, ldapData['uid'], ldapData['gid'],
|
|
|
|
@ -255,13 +332,31 @@ class userCache(color_print):
|
|
|
|
|
return False
|
|
|
|
|
if not cachePasswdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
# Add group
|
|
|
|
|
if flagCacheGroup:
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
if not cacheGroupObj.add(groupName,ldapData['gid']):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
# Add primary group
|
|
|
|
|
if not cacheGroupObj.add(groupName,ldapData['gid']):
|
|
|
|
|
return False
|
|
|
|
|
# Add second groups
|
|
|
|
|
secondGroupsData = ldapData['groups']
|
|
|
|
|
cacheSecondUserGroups = cacheGroupObj.getSecondUserGroups(userName)
|
|
|
|
|
deleteSecondGroups = cacheSecondUserGroups
|
|
|
|
|
if secondGroupsData:
|
|
|
|
|
allUsersSecondGroups = []
|
|
|
|
|
for groupName, gid in secondGroupsData:
|
|
|
|
|
usersInGroup = cacheGroupObj.getUsersInGroup(groupName)
|
|
|
|
|
if usersInGroup is False:
|
|
|
|
|
return False
|
|
|
|
|
if not userName in usersInGroup:
|
|
|
|
|
usersInGroup.append(userName)
|
|
|
|
|
if not cacheGroupObj.add(groupName, gid, usersInGroup):
|
|
|
|
|
return False
|
|
|
|
|
allUsersSecondGroups.append(groupName)
|
|
|
|
|
deleteSecondGroups = list(set(cacheSecondUserGroups) -\
|
|
|
|
|
set(allUsersSecondGroups))
|
|
|
|
|
if not cacheGroupObj.deleteUserInGroups(userName, deleteSecondGroups):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
# Add shadow user
|
|
|
|
|
cacheShadowObj = cacheShadow()
|
|
|
|
|
if not cacheShadowObj.add(userName, pwdHash,
|
|
|
|
@ -274,6 +369,40 @@ class userCache(color_print):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def delUserFromCacheCreate(self, userName):
|
|
|
|
|
'''Delete LDAP user from createCache'''
|
|
|
|
|
cacheCreatePasswdObj = cacheCreatePasswd()
|
|
|
|
|
cacheUserData = cacheCreatePasswdObj.get(userName)
|
|
|
|
|
if cacheUserData is False:
|
|
|
|
|
return False
|
|
|
|
|
if not cacheUserData:
|
|
|
|
|
return True
|
|
|
|
|
gid = cacheUserData[3]
|
|
|
|
|
cacheCreateGroupObj = cacheCreateGroup()
|
|
|
|
|
cacheSecondGroups = cacheCreateGroupObj.getSecondUserGroups(userName)
|
|
|
|
|
if cacheSecondGroups is False:
|
|
|
|
|
return False
|
|
|
|
|
# delete user in second groups
|
|
|
|
|
if not cacheCreateGroupObj.deleteUserInGroups(userName,
|
|
|
|
|
cacheSecondGroups):
|
|
|
|
|
return False
|
|
|
|
|
# delete user
|
|
|
|
|
if not cacheCreatePasswdObj.delete(userName):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheCreatePasswdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
#delete groups
|
|
|
|
|
usersGids = map(lambda x: x[3], cacheCreatePasswdObj.data)
|
|
|
|
|
deleteGroups = map(lambda x: x[0],
|
|
|
|
|
filter(lambda x: not x[2] in usersGids and not x[3],
|
|
|
|
|
cacheCreateGroupObj.data))
|
|
|
|
|
for delGroupName in deleteGroups:
|
|
|
|
|
if not cacheCreateGroupObj.delete(delGroupName):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheCreateGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def delUserFromCache(self, userName):
|
|
|
|
|
'''Delete LDAP user from cache'''
|
|
|
|
|
cachePasswdObj = cachePasswd()
|
|
|
|
@ -283,42 +412,43 @@ class userCache(color_print):
|
|
|
|
|
if not cacheUserData:
|
|
|
|
|
return True
|
|
|
|
|
gid = cacheUserData[3]
|
|
|
|
|
flagDeleteGroup = len(filter(lambda x:x[3]==gid,cachePasswdObj.data))==1
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheSecondGroups = cacheGroupObj.getSecondUserGroups(userName)
|
|
|
|
|
if cacheSecondGroups is False:
|
|
|
|
|
return False
|
|
|
|
|
# delete user in second groups
|
|
|
|
|
if not cacheGroupObj.deleteUserInGroups(userName, cacheSecondGroups):
|
|
|
|
|
return False
|
|
|
|
|
# delete user
|
|
|
|
|
if not cachePasswdObj.delete(userName):
|
|
|
|
|
return False
|
|
|
|
|
if not cachePasswdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
#delete groups
|
|
|
|
|
usersGids = map(lambda x: x[3], cachePasswdObj.data)
|
|
|
|
|
deleteGroups = map(lambda x: x[0],
|
|
|
|
|
filter(lambda x: not x[2] in usersGids and not x[3],
|
|
|
|
|
cacheGroupObj.data))
|
|
|
|
|
for delGroupName in deleteGroups:
|
|
|
|
|
if not cacheGroupObj.delete(delGroupName):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
# delete shadow user
|
|
|
|
|
cacheShadowObj = cacheShadow()
|
|
|
|
|
if not cacheShadowObj.delete(userName):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheShadowObj.save():
|
|
|
|
|
return False
|
|
|
|
|
# delete group
|
|
|
|
|
if flagDeleteGroup:
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheListGroupData = cacheGroupObj.getData()
|
|
|
|
|
if cacheListGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
cacheGroupData = map(lambda x: x[0], filter(lambda x: x[2]==gid,
|
|
|
|
|
cacheListGroupData))
|
|
|
|
|
# delete group
|
|
|
|
|
if cacheGroupData:
|
|
|
|
|
groupName = cacheGroupData[0]
|
|
|
|
|
if not cacheGroupObj.delete(groupName):
|
|
|
|
|
return False
|
|
|
|
|
if not cacheGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def delUserFromSystem(self, userName):
|
|
|
|
|
'''Delete LDAP user from system files ( passwd, group, shadow )'''
|
|
|
|
|
cachePasswdObj = cachePasswd()
|
|
|
|
|
cacheUserData = cachePasswdObj.get(userName)
|
|
|
|
|
if cacheUserData is False:
|
|
|
|
|
cacheCreatePasswdObj = cacheCreatePasswd()
|
|
|
|
|
cacheCreateUserData = cacheCreatePasswdObj.get(userName)
|
|
|
|
|
if cacheCreateUserData is False:
|
|
|
|
|
return False
|
|
|
|
|
if not cacheUserData:
|
|
|
|
|
if not cacheCreateUserData:
|
|
|
|
|
return True
|
|
|
|
|
passwdObj = passwd()
|
|
|
|
|
userData = passwdObj.get(userName)
|
|
|
|
@ -331,24 +461,29 @@ class userCache(color_print):
|
|
|
|
|
return False
|
|
|
|
|
if not passwdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
gid = userData[3]
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheListGroupData = cacheGroupObj.getData()
|
|
|
|
|
if cacheListGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
cacheGroupData = map(lambda x: x[0], filter(lambda x: x[2]==gid,
|
|
|
|
|
cacheListGroupData))
|
|
|
|
|
# delete group
|
|
|
|
|
if cacheGroupData:
|
|
|
|
|
groupName = cacheGroupData[0]
|
|
|
|
|
groupObj = group()
|
|
|
|
|
groupData = groupObj.get(groupName)
|
|
|
|
|
if groupData is False:
|
|
|
|
|
return False
|
|
|
|
|
if not groupObj.delete(groupName):
|
|
|
|
|
return False
|
|
|
|
|
if not groupObj.save():
|
|
|
|
|
# delete user group
|
|
|
|
|
groupObj = group()
|
|
|
|
|
listGroupData = groupObj.getData()
|
|
|
|
|
if listGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
cacheCreateGroupObj = cacheCreateGroup()
|
|
|
|
|
secondUsersGroups = groupObj.getSecondUserGroups(userName)
|
|
|
|
|
usersGids = map(lambda x: x[3], passwdObj.data)
|
|
|
|
|
listGroupDataWork = []
|
|
|
|
|
for index, groupData in enumerate(listGroupData):
|
|
|
|
|
groupName, x, gid, listUsers = groupData
|
|
|
|
|
listUsers = filter(lambda x: x.strip(), listUsers.split(','))
|
|
|
|
|
listUsers = ",".join(filter(lambda x: x!=userName, listUsers))
|
|
|
|
|
cacheCreateGroupData = cacheCreateGroupObj.get(groupName)
|
|
|
|
|
if cacheCreateGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
if groupName in cacheCreateGroupData:
|
|
|
|
|
if not gid in usersGids and not listUsers:
|
|
|
|
|
continue
|
|
|
|
|
listGroupDataWork.append([groupName, x, gid, listUsers])
|
|
|
|
|
groupObj.data = listGroupDataWork
|
|
|
|
|
if not groupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
# delete user shadow
|
|
|
|
|
shadowObj = shadow()
|
|
|
|
|
shadowData = shadowObj.get(userName)
|
|
|
|
@ -360,6 +495,8 @@ class userCache(color_print):
|
|
|
|
|
return False
|
|
|
|
|
if not shadowObj.save():
|
|
|
|
|
return False
|
|
|
|
|
if not self.delUserFromCacheCreate(userName):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def isConnectToLdap(self):
|
|
|
|
@ -376,41 +513,13 @@ class userCache(color_print):
|
|
|
|
|
|
|
|
|
|
def deleteCacheUsersFromSystem(self):
|
|
|
|
|
'''Delete cache users from system'''
|
|
|
|
|
cachePasswdObj = cachePasswd()
|
|
|
|
|
cacheListPasswdData = cachePasswdObj.getData()
|
|
|
|
|
if cacheListPasswdData is False:
|
|
|
|
|
cacheCreatePasswdObj = cacheCreatePasswd()
|
|
|
|
|
cacheCreateListPasswdData = cacheCreatePasswdObj.getData()
|
|
|
|
|
if cacheCreateListPasswdData is False:
|
|
|
|
|
return False
|
|
|
|
|
delUsersPasswd = map(lambda x: x[0], cacheListPasswdData)
|
|
|
|
|
passwdObj = passwd()
|
|
|
|
|
delUsersPasswd = map(lambda x: x[0], cacheCreateListPasswdData)
|
|
|
|
|
for delUser in delUsersPasswd:
|
|
|
|
|
if not passwdObj.delete(delUser):
|
|
|
|
|
return False
|
|
|
|
|
if delUsersPasswd:
|
|
|
|
|
if not passwdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
cacheShadowObj = cacheShadow()
|
|
|
|
|
cacheListShadowData = cacheShadowObj.getData()
|
|
|
|
|
if cacheListShadowData is False:
|
|
|
|
|
return False
|
|
|
|
|
delUsersShadow = map(lambda x: x[0], cacheListShadowData)
|
|
|
|
|
shadowObj = shadow()
|
|
|
|
|
for delUser in delUsersShadow:
|
|
|
|
|
if not shadowObj.delete(delUser):
|
|
|
|
|
return False
|
|
|
|
|
if delUsersShadow:
|
|
|
|
|
if not shadowObj.save():
|
|
|
|
|
return False
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheListGroupData = cacheGroupObj.getData()
|
|
|
|
|
if cacheListGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
delGroups = map(lambda x: x[0], cacheListGroupData)
|
|
|
|
|
groupObj = group()
|
|
|
|
|
for delGroup in delGroups:
|
|
|
|
|
if not groupObj.delete(delGroup):
|
|
|
|
|
return False
|
|
|
|
|
if delGroups:
|
|
|
|
|
if not groupObj.save():
|
|
|
|
|
if not self.delUserFromSystem(delUser):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
@ -422,16 +531,51 @@ class userCache(color_print):
|
|
|
|
|
return False
|
|
|
|
|
# Add cache passwd users to system
|
|
|
|
|
passwdObj = passwd()
|
|
|
|
|
cacheCreatePasswdObj = cacheCreatePasswd()
|
|
|
|
|
cacheListCreatePasswdData = cacheCreatePasswdObj.getData()
|
|
|
|
|
if cacheListPasswdData is False:
|
|
|
|
|
return False
|
|
|
|
|
# remove deleted users
|
|
|
|
|
cacheUsers = map(lambda x: x[0], cacheListPasswdData)
|
|
|
|
|
createUsers = map(lambda x: x[0], cacheListCreatePasswdData)
|
|
|
|
|
deletedUsers = list(set(createUsers) - set(cacheUsers))
|
|
|
|
|
for delUser in deletedUsers:
|
|
|
|
|
if not self.delUserFromSystem(delUser):
|
|
|
|
|
return False
|
|
|
|
|
if not self.delUserFromCache(delUser):
|
|
|
|
|
return False
|
|
|
|
|
addUsers = []
|
|
|
|
|
addUsersGid = []
|
|
|
|
|
notAddUsers = []
|
|
|
|
|
for cachePasswdData in cacheListPasswdData:
|
|
|
|
|
userName, x, uid, gid, gecos, directory, shell = cachePasswdData
|
|
|
|
|
if not passwdObj.add(userName, uid, gid,
|
|
|
|
|
gecos=gecos,
|
|
|
|
|
directory=directory,
|
|
|
|
|
shell=shell):
|
|
|
|
|
retPasswd = passwdObj.get(userName)
|
|
|
|
|
if retPasswd is False:
|
|
|
|
|
return False
|
|
|
|
|
if not retPasswd:
|
|
|
|
|
if not cacheCreatePasswdObj.add(userName, uid, gid,
|
|
|
|
|
gecos=gecos,
|
|
|
|
|
directory=directory,
|
|
|
|
|
shell=shell):
|
|
|
|
|
return False
|
|
|
|
|
retCacheCreate = cacheCreatePasswdObj.get(userName)
|
|
|
|
|
if retCacheCreate is False:
|
|
|
|
|
return False
|
|
|
|
|
if cacheListPasswdData:
|
|
|
|
|
if retCacheCreate:
|
|
|
|
|
if not passwdObj.add(userName, uid, gid,
|
|
|
|
|
gecos=gecos,
|
|
|
|
|
directory=directory,
|
|
|
|
|
shell=shell):
|
|
|
|
|
return False
|
|
|
|
|
addUsers.append(userName)
|
|
|
|
|
addUsersGid.append(gid)
|
|
|
|
|
else:
|
|
|
|
|
notAddUsers.append(userName)
|
|
|
|
|
if passwdObj.data:
|
|
|
|
|
if not passwdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
if not cacheCreatePasswdObj.save():
|
|
|
|
|
return False
|
|
|
|
|
cacheShadowObj = cacheShadow()
|
|
|
|
|
cacheListShadowData = cacheShadowObj.getData()
|
|
|
|
|
if cacheListShadowData is False:
|
|
|
|
@ -441,28 +585,43 @@ class userCache(color_print):
|
|
|
|
|
for cacheShadowData in cacheListShadowData:
|
|
|
|
|
userName, pwdHash, shadowLastChange, shadowMin, shadowMax,\
|
|
|
|
|
shadowWarning, x,x,x = cacheShadowData
|
|
|
|
|
if not shadowObj.add(userName, pwdHash,
|
|
|
|
|
if userName in addUsers:
|
|
|
|
|
if not shadowObj.add(userName, pwdHash,
|
|
|
|
|
shadowLastChange=shadowLastChange,
|
|
|
|
|
shadowMin=shadowMin,
|
|
|
|
|
shadowMax=shadowMax,
|
|
|
|
|
shadowWarning=shadowWarning):
|
|
|
|
|
return False
|
|
|
|
|
if cacheListShadowData:
|
|
|
|
|
return False
|
|
|
|
|
if shadowObj.data:
|
|
|
|
|
if not shadowObj.save():
|
|
|
|
|
return False
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheListGroupData = cacheGroupObj.getData()
|
|
|
|
|
if cacheListGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
cacheCreateGroupObj = cacheCreateGroup()
|
|
|
|
|
# Add cache group users to system
|
|
|
|
|
groupObj = group()
|
|
|
|
|
setAddUsers = set(addUsers)
|
|
|
|
|
for cacheGroupData in cacheListGroupData:
|
|
|
|
|
groupName, x, gid, x = cacheGroupData
|
|
|
|
|
if not groupObj.add(groupName, gid):
|
|
|
|
|
groupName, x, gid, listUsers = cacheGroupData
|
|
|
|
|
retGroup = groupObj.get(groupName)
|
|
|
|
|
if retGroup is False:
|
|
|
|
|
return False
|
|
|
|
|
if cacheListGroupData:
|
|
|
|
|
listUsers = filter(lambda x: x.strip(), listUsers.split(','))
|
|
|
|
|
if setAddUsers & set(listUsers) or gid in addUsersGid:
|
|
|
|
|
listUsers = filter(lambda x: not x in notAddUsers, listUsers)
|
|
|
|
|
if not retGroup:
|
|
|
|
|
if not cacheCreateGroupObj.add(groupName, gid, listUsers):
|
|
|
|
|
return False
|
|
|
|
|
if not groupObj.add(groupName, gid, listUsers):
|
|
|
|
|
return False
|
|
|
|
|
if groupObj.data:
|
|
|
|
|
if not groupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
if cacheCreateGroupObj.data:
|
|
|
|
|
if not cacheCreateGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def syncCacheToLdap(self):
|
|
|
|
@ -504,11 +663,16 @@ class userCache(color_print):
|
|
|
|
|
continue
|
|
|
|
|
x,x, shadowLastChange, shadowMin, shadowMax, shadowWarning,\
|
|
|
|
|
x,x,x = cacheShadowData
|
|
|
|
|
groups = cacheGroupObj.getSecondUserGroups(userName)
|
|
|
|
|
gidsGroups = map(lambda x: x[2],
|
|
|
|
|
filter(lambda x : x[0] in groups,
|
|
|
|
|
cacheGroupObj.data))
|
|
|
|
|
userShadowDict = {'uid': uid,
|
|
|
|
|
'gid': gid,
|
|
|
|
|
'fullName': gecos,
|
|
|
|
|
'home': directory,
|
|
|
|
|
'group': groupName,
|
|
|
|
|
'groups': (groups,gidsGroups),
|
|
|
|
|
'loginShell':shell,
|
|
|
|
|
'shadowLastChange':shadowLastChange,
|
|
|
|
|
'shadowMin':shadowMin,
|
|
|
|
@ -516,9 +680,16 @@ class userCache(color_print):
|
|
|
|
|
'shadowWarning':shadowWarning}
|
|
|
|
|
flagDeleteUser = False
|
|
|
|
|
for attr, value in userShadowDict.items():
|
|
|
|
|
if ldapData[attr] != value:
|
|
|
|
|
flagDeleteUser = True
|
|
|
|
|
break
|
|
|
|
|
if attr == "groups":
|
|
|
|
|
for index, val in enumerate(value):
|
|
|
|
|
if set(map(lambda x: x[index],
|
|
|
|
|
ldapData[attr])) != set(val):
|
|
|
|
|
flagDeleteUser = True
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
if ldapData[attr] != value:
|
|
|
|
|
flagDeleteUser = True
|
|
|
|
|
break
|
|
|
|
|
if flagDeleteUser:
|
|
|
|
|
deletedCacheUsers.append(userName)
|
|
|
|
|
continue
|
|
|
|
@ -526,34 +697,12 @@ class userCache(color_print):
|
|
|
|
|
for delUserName in deletedCacheUsers:
|
|
|
|
|
if not self.delUserFromCache(delUserName):
|
|
|
|
|
return False
|
|
|
|
|
# sync groups
|
|
|
|
|
cachePasswdObj = cachePasswd()
|
|
|
|
|
cacheListPasswdData = cachePasswdObj.getData()
|
|
|
|
|
if cacheListPasswdData is False:
|
|
|
|
|
return False
|
|
|
|
|
if not cacheListPasswdData:
|
|
|
|
|
return True
|
|
|
|
|
cacheGroupObj = cacheGroup()
|
|
|
|
|
cacheListGroupData = cacheGroupObj.getData()
|
|
|
|
|
if cacheListGroupData is False:
|
|
|
|
|
return False
|
|
|
|
|
deletedCacheGroups = []
|
|
|
|
|
for cacheGroupData in cacheListGroupData:
|
|
|
|
|
groupName, x , gid, x = cacheGroupData
|
|
|
|
|
if not filter(lambda x: x[3]==gid, cacheListPasswdData):
|
|
|
|
|
deletedCacheGroups.append(groupName)
|
|
|
|
|
# Delete groups
|
|
|
|
|
for delGroupName in deletedCacheGroups:
|
|
|
|
|
if not cacheGroupObj.delete(cacheGroupObj):
|
|
|
|
|
return False
|
|
|
|
|
if deletedCacheGroups:
|
|
|
|
|
if not cacheGroupObj.save():
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def clearCache(self):
|
|
|
|
|
'''Clear cache files'''
|
|
|
|
|
cacheObjs = (cachePasswd(), cacheShadow(), cacheGroup())
|
|
|
|
|
cacheObjs = (cachePasswd(), cacheShadow(), cacheGroup(),
|
|
|
|
|
cacheCreateGroup(), cacheCreateUser())
|
|
|
|
|
for cacheObj in cacheObjs:
|
|
|
|
|
if not cacheObj.save():
|
|
|
|
|
return False
|
|
|
|
|