Добавлены методы для вывода информации о пользователе и группе для всех сервисов

git-svn-id: http://svn.calculate.ru/calculate2/calculate-server/trunk@1270 c91db197-33c1-4113-bf15-f8a5c547ca64
develop
asamoukin 15 years ago
parent 678c658d1d
commit ef3773692e

@ -136,6 +136,7 @@ class report():
сначала строки будет вставлено char[1:] в конце строки char[:-1]
"""
lineUnicode = cl_utils._toUNICODE(line)
prevPos = 0
convLine = char[1:]
lenLenCols = len(lenCols)
@ -145,9 +146,9 @@ class report():
insertChar = char[:-1]
else:
insertChar = char
convLine += line[prevPos:pos] + insertChar
convLine += lineUnicode[prevPos:pos] + insertChar
prevPos = pos + 1
return convLine
return convLine.encode("UTF-8")
def adminConnectLdap(fun):
@ -8197,13 +8198,27 @@ the password will be changed only for Samba account")
},
{'progAccess':(14,),
'shortOption':"u",
'longOption':"users",
'helpChapter':_("Common options"),
'help':_("information about users")
},
{'progAccess':(14,),
{'progAccess':(14,),
'shortOption':"U",
'optVal':"LOGIN",
'helpChapter':_("Common options"),
'help':_("information about user")
},
{'progAccess':(14,),
'shortOption':"g",
'longOption':"groups",
'helpChapter':_("Common options"),
'help':_("information about groups")
},
{'progAccess':(14,),
'shortOption':"G",
'optVal':"GROUP",
'helpChapter':_("Common options"),
'help':_("information about group")
},
{'progAccess':(14,),
'longOption':"full",
@ -10484,6 +10499,28 @@ class cl_info(cl_utils2.cl_smartcon):
def getInfoServer(self, options, service):
"""Выводит на печать информацию"""
strService = service.capitalize()
if service == "ftp":
strService = service.upper()
# Информация о пользователе
if options.has_key("U"):
userName = options["U"]
data = self.getUser(userName, service)
if not data:
return False
headerList, dataList = data
title=_("Information about user %s") %userName + " " +\
_("for service %s") %strService
# Информация о группе
if options.has_key("G"):
groupName = options["G"]
data = self.getGroup(groupName, service)
if not data:
return False
headerList, dataList = data
title=_("Information about group %s") %groupName + " " +\
_("for service %s") %strService
# Информация о пользователях
if options.has_key("u"):
fields = "short"
if options.has_key("full"):
@ -10492,16 +10529,20 @@ class cl_info(cl_utils2.cl_smartcon):
if not data:
return False
headerList, dataList = data
title=_("All users in LDAP for service %s")%service.capitalize()
title=_("All users in LDAP for service %s")%strService
# Информация о группах
elif options.has_key("g"):
data = self.getAllGroups(service)
fields = "short"
if options.has_key("full"):
fields = "full"
data = self.getAllGroups(fields, service)
if not data:
return False
headerList, dataList = data
title=_("All groups in LDAP for service %s")%service.capitalize()
title=_("All groups in LDAP for service %s")%strService
if options.has_key("u") or options.has_key("g"):
if options.has_key("U") or options.has_key("G") or\
options.has_key("u") or options.has_key("g"):
repObj = report(title, headerList, dataList)
repObj.printReport()
#print users
@ -10519,7 +10560,7 @@ with another option."))
return False
def getQueryLDAP(self, service, branch, searchAttr, searchStr,
retrAttrs=None):
retrAttrs=None, returnClVars=False):
"""Выдает данные из LDAP"""
branchData = {'users':'relUsersDN',
'groups':'relGroupsDN',
@ -10544,20 +10585,160 @@ with another option."))
return False
searchRes = servObj.searchLdapDN(searchStr, getattr(servObj, relAttr),
searchAttr, retrAttrs)
if returnClVars:
return (servObj.clVars, searchRes)
return searchRes
def getAllGroups(self, service):
def getGroup(self, groupName, service):
"""Информация о группе"""
searchAttr = "cn"
searchStr = groupName
data, delData = self.genDataGroups(service)
if not data:
self.printERROR(_("Incorrect service %s") %service.capitalize())
return False
headers = ["ATTR","VALUE"]
attributes = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
retClVars=False
searchRes = self.getQueryLDAP(service, "groups", searchAttr,
searchStr, retrAttrs)
if not searchRes:
return (headers , [])
if service == "jabber":
servObj = servJabber()
resMemberSearch = servObj.searchUsersToGroup(groupName)
if resMemberSearch:
memberUid = []
for dataGroup in resMemberSearch:
memberUid.append(dataGroup[0][1]['uid'][0])
for i in searchRes:
i[0][1]['memberUid'] = memberUid
data.append(("MEMBER_UID","memberUid"))
attributes = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
data = []
lenRetrAttrs = len(retrAttrs)
for info in searchRes:
for i in range(lenRetrAttrs):
attr = retrAttrs[i]
attrName = attributes[i]
if attr in info[0][1]:
ldapValue = info[0][1][attr]
# Изменяем значения аттрибутов для вывода на печать
ldapValue[0] = self.modGroupAttr(attr, ldapValue[0], service)
flagFirst = False
for value in ldapValue:
if not flagFirst:
data.append((attrName, value))
flagFirst = True
else:
data.append(("", value))
else:
data.append((attrName, "N"))
return (headers, data)
def getUser(self, userName, service):
"""Информация о пользователе"""
searchAttr = "uid"
searchStr = userName
data, delData = self.genDataUsers(service)
if not data:
self.printERROR(_("Incorrect service %s") %service.capitalize())
return False
headers = ["ATTR","VALUE"]
attributes = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
retClVars=False
if service in ["mail", "samba"]:
retClVars=True
searchRes = self.getQueryLDAP(service, "users", searchAttr,
searchStr, retrAttrs, retClVars)
if not searchRes:
return (headers , [])
if service in ["mail", "samba"]:
clVars, searchRes = searchRes
if not searchRes:
return (headers , [])
# Добавляем директорию хранения писем для сервиса mail
if service == "mail":
for i in searchRes:
i[0][1]['homeDirectory'] = [os.path.join(\
clVars.Get("sr_mail_path"),i[0][1]['uid'][0])]
data.append(("HOME","homeDirectory"))
if service == "samba":
for i in searchRes:
i[0][1]['winProfPath'] = [os.path.join(\
clVars.Get("sr_samba_winprof_path"),
i[0][1]['uid'][0])]
i[0][1]['linProfPath'] = [os.path.join(\
clVars.Get("sr_samba_linprof_path"),
i[0][1]['uid'][0])]
i[0][1]['homePath'] = [os.path.join(\
clVars.Get("sr_samba_home_path"),
i[0][1]['uid'][0])]
i[0][1]['winLogonPath'] = [os.path.join(\
clVars.Get("sr_samba_winlogon_path"),
i[0][1]['uid'][0])]
i[0][1]['sharePath'] = [os.path.join(\
clVars.Get("sr_samba_share_path"),
i[0][1]['uid'][0])]
data.append(("WIN_PROF","winProfPath"))
data.append(("LIN_PROF","linProfPath"))
data.append(("HOME","homePath"))
data.append(("WIN_LOGON","winLogonPath"))
data.append(("SHARE","sharePath"))
attributes = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
data = []
lenRetrAttrs = len(retrAttrs)
for info in searchRes:
for i in range(lenRetrAttrs):
attr = retrAttrs[i]
attrName = attributes[i]
if attr in info[0][1]:
ldapValue = info[0][1][attr]
# Изменяем значения аттрибутов для вывода на печать
ldapValue[0] = self.modUserAttr(attr, ldapValue[0], service)
flagFirst = False
for value in ldapValue:
if not flagFirst:
data.append((attrName, value))
flagFirst = True
else:
data.append(("", value))
if (service == "unix" and attr == "gidNumber") or\
(service == "mail" and attr == "mailAlternateAddress"):
memberGroups = self._getUserMemberGroups(userName,
service)
attrApp = "GROUPS"
if service == "unix":
memberGroups.insert(0,value)
elif service == "mail":
attrApp = "GROUP_MAIL"
flagFirst = False
for value in memberGroups:
if not flagFirst:
data.append((attrApp, value))
flagFirst = True
else:
data.append(("", value))
else:
data.append((attrName, "N"))
return (headers, data)
def getAllGroups(self, fields, service):
"""Выдает список всех групп и пользователей"""
searchAttr = "cn"
searchStr = "*"
if service == "unix":
data = [("GROUP","cn"),
("NAME","description"),
("GID","gidNumber"),
("MEMBER","memberUid")]
else:
self.printERROR(_("Incorrect service %s") %service.capitalize())
data, delData = self.genDataGroups(service, fields)
if not data:
self.printWARNING(_("Service %s has no groups")\
%service.capitalize())
return False
if fields == "short":
data = filter(lambda x: not x[0] in delData, data)
headers = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
groups = []
@ -10580,10 +10761,33 @@ with another option."))
groups.append(listAttr)
return (headers, groups)
def getAllUsers(self, fields, service):
"""Выдает список login-ов всех пользователей сервиса"""
searchAttr = "uid"
searchStr = "*"
def genDataGroups(self, service, fields='full'):
"""Формирует поля нужные для вывода информации о группе"""
data = []
delData = []
if service == "unix":
data = [("GROUP","cn"),
("NAME","description"),
("GID","gidNumber"),
("MEMBER_UID","memberUid")]
if fields == "short":
delData = ["MEMBER_UID"]
elif service == "mail":
data = [("GROUP","cn"),
("NAME","description"),
("MAIL","mail"),
("ALT_MAIL","mailAlternateAddress"),
("MEMBER_UID","rfc822member")]
if fields == "short":
delData = ["MAIL", "MEMBER_UID"]
elif service == "jabber":
data = [("GROUP","cn"),
("COMMENT","description")]
return (data, delData)
def genDataUsers(self, service, fields='full'):
"""Формирует поля нужные для вывода информации о пользователе"""
data = []
delData = []
if service == "unix":
data = [("LOGIN","uid"),
@ -10603,7 +10807,7 @@ with another option."))
data = [("LOGIN","uid"),
("NAME","displayName"),
("LOCK","accountStatus"),
("PWD",""),
("PWD","sambaNTPassword"),
("DATE_PWD","sambaPwdLastSet")]
elif service == "mail":
data = [("LOGIN","uid"),
@ -10618,10 +10822,11 @@ with another option."))
data = [("LOGIN","uid"),
("NAME","cn"),
("LOCK","initials"),
("GROUP","departmentNumber"),
("PWD","userPassword"),
("JID","mail")]
if fields == "short":
delData = ["LOCK", "PWD"]
delData = ["LOCK", "GROUP", "PWD"]
elif service == "ftp":
data = [("LOGIN","uid"),
("NAME","cn"),
@ -10631,7 +10836,14 @@ with another option."))
("PWD","userPassword")]
if fields == "short":
delData = ["UID", "PWD", "GROUP"]
else:
return (data, delData)
def getAllUsers(self, fields, service):
"""Выдает список login-ов всех пользователей сервиса"""
searchAttr = "uid"
searchStr = "*"
data, delData = self.genDataUsers(service, fields)
if not data:
self.printERROR(_("Incorrect service %s") %service.capitalize())
return False
if fields == "short":
@ -10640,58 +10852,35 @@ with another option."))
retrAttrs = map(lambda x: x[1], data)
loginsUsers = []
retClVars=False
if service == "mail":
retClVars=True
searchRes = self.getQueryLDAP(service, "users", searchAttr,
searchStr, retrAttrs)
searchStr, retrAttrs, retClVars)
if not searchRes:
return (headers , [])
if service == "mail":
clVars, searchRes = searchRes
if not searchRes:
return (headers , [])
# Добавляем директорию хранения писем для сервиса mail
for i in searchRes:
i[0][1]['homeDirectory'] = [os.path.join(\
clVars.Get("sr_mail_path"),i[0][1]['uid'][0])]
data.append(("HOME","homeDirectory"))
delData.append("HOME")
if fields == "short":
data = filter(lambda x: not x[0] in delData, data)
headers = map(lambda x: x[0], data)
retrAttrs = map(lambda x: x[1], data)
for info in searchRes:
listAttr = []
for attr in retrAttrs:
if attr in info[0][1]:
ldapValue = info[0][1][attr]
# Конвертируем время в текстовый формат
if attr == "shadowLastChange" or\
attr == "sambaPwdLastSet":
ldapValue[0] = self. _convDatatoStr(ldapValue[0])
# Находим имя группы
if attr == "gidNumber" and service in ("unix", "ftp"):
ldapValue[0] = self._getUserGroupName(ldapValue[0],
"unix")
# Ставим Y в случае выставленного флага
if attr == "initials":
if ldapValue[0] == "No":
ldapValue[0] = "Y"
else:
ldapValue[0] = "N"
if attr == "accountStatus":
if ldapValue[0] == "passive":
ldapValue[0] = "Y"
else:
ldapValue[0] = "N"
if attr == "shadowExpire":
if ldapValue[0] == "1":
ldapValue[0] = "Y"
else:
ldapValue[0] = "N"
if attr == "sambaAcctFlags":
if ldapValue[0] == "[DU ]":
ldapValue[0] = "Y"
else:
ldapValue[0] = "N"
if attr == "userPassword":
if ldapValue[0] == "crypt{xxx}":
ldapValue[0] = "N"
else:
ldapValue[0] = "Y"
if attr == "shadowFlag":
if ldapValue[0] == "1":
ldapValue[0] = "Y"
else:
ldapValue[0] = "N"
if attr == "sambaNTPassword":
ldapValue[0] = "Y"
#Если несколько значений то разделяем их запятыми
# Изменяем значения аттрибутов для вывода на печать
ldapValue[0] = self.modUserAttr(attr, ldapValue[0], service)
# Если несколько значений то разделяем их запятыми
value = reduce(lambda x,y: ",".join([x,y])[0] == "," and\
",".join([x,y])[1:] or ",".join([x,y])[1:]\
and ",".join([x,y]) , ldapValue, "")
@ -10701,6 +10890,64 @@ with another option."))
loginsUsers.append(listAttr)
return (headers, loginsUsers)
def modGroupAttr(self, attr, value, service):
"""Модифицирует аттрибуты группы для вывода на печать"""
retValue = value
# Заменяем mail на имя пользователя
if service == "mail" and attr == "rfc822member":
servObj = servMail()
searchUser = servObj.searchUserToMail(value)
if searchUser:
retValue = searchUser[0][0][1]['uid'][0]
else:
retValue = "Not found"
return retValue
def modUserAttr(self, attr, value, service):
"""Модифицирует аттрибуты пользователя для вывода на печать"""
# Конвертируем время в текстовый формат
retValue = value
if attr == "shadowLastChange" or\
attr == "sambaPwdLastSet":
retValue = self._convDatatoStr(value)
# Находим имя группы
elif attr == "gidNumber" and service in ("unix", "ftp"):
retValue = self._getUserGroupName(value, "unix")
# Ставим Y в случае выставленного флага
elif attr == "initials":
if value == "No":
retValue = "Y"
else:
retValue = "N"
elif attr == "accountStatus":
if value == "passive":
retValue = "Y"
else:
retValue = "N"
elif attr == "shadowExpire":
if value == "1":
retValue = "Y"
else:
retValue = "N"
elif attr == "sambaAcctFlags":
if value == "[DU ]":
retValue = "Y"
else:
retValue = "N"
elif attr == "userPassword":
if value == "crypt{xxx}":
retValue = "N"
else:
retValue = "Y"
elif attr == "shadowFlag":
if value == "1":
retValue = "Y"
else:
retValue = "N"
elif attr == "sambaNTPassword":
retValue = "Y"
return retValue
def _convDatatoStr(self, dataDays):
"""Конвертирует количество дней или секунд с 1970, в строку даты"""
if dataDays:
@ -10734,6 +10981,31 @@ with another option."))
return groupName
return userGid
def _getUserMemberGroups(self, userName, service):
"""Находит имена групп в которые входит пользователь"""
try:
exec ("servObj=serv%s()" %service.capitalize())
except:
self.printERROR(\
_("ERROR: _getUserGroupsNames incorrect service=%s")%service)
return False
memberGroups = []
userInGroups = []
if service == "unix":
userInGroups = servObj.searchUnixMemberGid(userName)
if service == "mail":
resSearch = servObj.searchMailMember(userName)
if not resSearch:
return []
userMail, userInGroups = resSearch
for group in userInGroups:
mailGroup = group[0][1]['mail']
altMailGroup = group[0][1]['mailAlternateAddress']
listMail = mailGroup + altMailGroup
for mail in listMail:
if not mail in memberGroups:
memberGroups.append(mail)
return memberGroups
class tsOpt(cl_base.opt):
"""Класс для обработки параметров и вывода help

Loading…
Cancel
Save