Добавлена опция коммандной строки '--hide' - имена почтовых серверов на которых не будет видна почтовая группа, в скрипты cl-groupadd и cl-groupmod в случае настроенной репликации почтовых серверов

git-svn-id: http://svn.calculate.ru/calculate2/calculate-server/trunk@1177 c91db197-33c1-4113-bf15-f8a5c547ca64
develop
asamoukin 15 years ago
parent b982d258c2
commit b72af3d35c

@ -3036,6 +3036,76 @@ for group %s in 'Replicatinon/Mail' branch ...") %str(userName) + " ...")
if not searchGroup:
self.printERROR(_("group name not found in Mail service") +" ...")
return False
if options.has_key('n') and options.has_key('e'):
self.printERROR(_("Command Line Options '-n' and '-e' are \
incompatible, use one of the options"))
return False
attrDelete = []
attrDeleteFirst = []
attrAppend = []
altMails = []
# Объект сервис репликации
servReplObj = False
if self.clVars.Get("ld_repl_mail_set") == "on":
# Объект сервис репликации
servReplObj = servRepl()
filterHosts = []
if options.has_key('hide'):
filterHosts = options['hide'].split(",")
if searchGroup[0][0][1].has_key('filtersender'):
attrDeleteFirst.append((ldap.MOD_DELETE, 'filtersender', None))
domain = self.clVars.Get('os_net_domain')
# Если необходимо добавляем домен к именам хостов
fHosts = map(lambda x: (not '.' in x and x+"."+domain) or x,
filterHosts)
for host in fHosts:
attrAppend.append((ldap.MOD_ADD, 'filtersender', host))
if options.has_key('e'):
altMails = options['e'].split(",")
email = searchGroup[0][0][1]["mail"][0]
altEmails = searchGroup[0][0][1]["mailAlternateAddress"]
# Удаляем альтернативные адреса, кроме первого
for altEmail in altEmails:
if email != altEmail:
attrDeleteFirst.append(
(ldap.MOD_DELETE, 'mailAlternateAddress',
altEmail))
i = 0
for altMail in altMails:
if "@" in altMail:
if len(altMail.split("@")) != 2:
self.printERROR(_("Incorrect alternate adresses \
option '-e'"))
return False
mail = altMail
else:
mail = "%s@%s" %(altMail,self.clVars.Get("sr_mail_host"))
if self.searchUserToMail(mail) or\
self.searchGroupToMail(mail):
self.printERROR(
_("Alternate email address %s is found in Mail service")%\
str(mail) + " ...")
return False
if i == 0:
attrAppend.append((ldap.MOD_REPLACE, 'mailAlternateAddress',
mail))
else:
attrAppend.append((ldap.MOD_ADD, 'mailAlternateAddress',
mail))
i += 1
if servReplObj:
if not altMails and filterHosts:
altMails = searchGroup[0][0][1]["mailAlternateAddress"]
if altMails:
if not servReplObj.modReplMailAlias(groupName, altMails,
filterHosts):
errorMsg = _("Can not set replication mail alias,") +\
" " + _("for name %s")%groupName + " " +\
_("(%s)"%", ".join(altMails))+ " ..."
self.printERROR(errorMsg)
return False
# Добавляем список пользователей в группу
if options.has_key('a'):
# добавляемые пользователи в группу
@ -3061,8 +3131,6 @@ for group %s in 'Replicatinon/Mail' branch ...") %str(userName) + " ...")
" " + str(groupName) + " ...")
return False
# Изменяем имя группы
attrDelete = []
attrAppend = []
modGroupName = groupName
if options.has_key('n'):
newGroupName = options['n']
@ -3102,9 +3170,7 @@ for group %s in 'Replicatinon/Mail' branch ...") %str(userName) + " ...")
oldDN = self.addDN("cn=" + groupName, self.relGroupsDN)
res = self.modifyElemDN(oldDN, newFirstDn)
# Меняем название реплицируемого алиаса
if self.clVars.Get("ld_repl_mail_set") == "on":
# Объект сервис репликации
servReplObj = servRepl()
if servReplObj:
if not servReplObj.renameReplMailAlias(groupName, newGroupName):
self.printERROR(_("Failed modify name '%s' mail alias \
in 'Replicatinon/Mail' branch ...") %groupName)
@ -3115,7 +3181,7 @@ in 'Replicatinon/Mail' branch ...") %groupName)
else:
self.printERROR(_("Can not rename group") + "...")
return False
modAttrs = attrAppend + attrDelete
modAttrs = attrDeleteFirst + attrAppend + attrDelete
# Изменяем коментарий к группе
if options.has_key('c'):
gecos = options['c']
@ -3126,10 +3192,23 @@ in 'Replicatinon/Mail' branch ...") %groupName)
if res:
if options.has_key('c'):
self.printSUCCESS(_("Modified group comment") + " ...")
if options.has_key('e'):
self.printSUCCESS(_("Modified mail alternate address") +\
" ...")
if options.has_key('hide'):
self.printSUCCESS(_("Modified hide mail hosts") +\
" ...")
return True
else:
if options.has_key('c'):
self.printSUCCESS(_("Can not modify group comment") +\
self.printERROR(_("Can not modify group comment") +\
" ...")
if options.has_key('e'):
self.printERROR(\
_("Can not modify mail alternate address") +\
" ...")
if options.has_key('hide'):
self.printERROR(_("Can not modify hide mail hosts") +\
" ...")
return False
return True
@ -3304,6 +3383,15 @@ option '-e'"))
str(mail) + " ...")
return False
modAttrs.append('mailAlternateAddress: %s' %mail)
# Фильтр почты (hostname)
fHostNames = []
if options.has_key('hide'):
fHostNames = options['hide'].split(",")
for fHostName in fHostNames:
if not "." in fHostName:
fHostName = "%s.%s" %(fHostName,
self.clVars.Get('os_net_domain'))
modAttrs.append('filtersender: %s' %fHostName)
if self.searchMailGroupToName(groupName):
self.printERROR(
_("group name %s is found in Mail service")%\
@ -3337,7 +3425,8 @@ option '-e'"))
# Записываем почтовые алиасы в ветку
# репликации Replication/Mail
if altMails and not servReplObj.addReplMailAlias(groupName,
altMails):
altMails,
fHostNames):
self.printERROR(_("Failed set mail aliases \
for user %s in 'Replicatinon/Mail' branch ...") %str(primaryMail))
return False
@ -6938,7 +7027,13 @@ class cl_ldap(shareLdap):
'helpChapter':_("Mail service options"),
'help':_("set alternate email addresses for the new mail group")
},
{'progAccess':(0,),
'longOption':"hide",
'optVal':"HIDE_HOST",
'helpChapter':_("Mail service options"),
'help':_("host names mail servers who have no access to email \
to this group (comma delimited)")
},
{'progAccess':(0,),
'shortOption':"f",
'longOption':"force",
@ -6993,6 +7088,20 @@ class cl_ldap(shareLdap):
'helpChapter':_("Common options"),
'help':_("force use NEW_GROUP name by GROUP")
},
{'progAccess':(2,),
'longOption':"hide",
'optVal':"HIDE_HOST",
'helpChapter':_("Mail service options"),
'help':_("host names mail servers who have no access to email \
to this group (comma delimited)")
},
{'progAccess':(2,),
'shortOption':"e",
'longOption':"alt-emails",
'optVal':"ALT_EMAILS",
'helpChapter':_("Mail service options"),
'help':_("set alternate email addresses for the mail group")
},
{'progAccess':(3,),
'shortOption':"b",
'longOption':"base-dir",
@ -9051,14 +9160,14 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
return True
@adminConnectLdap
def modReplMailAlias(self, userName, srcMails):
def modReplMailAlias(self, userName, srcMails, filterHosts=[]):
"""Изменяем запись в Replication/Mail
(имя пользователя, список почтовых адресов пользователя"""
rez = self.searchMailAlias(userName)
if not rez:
# Если алиас не найден создаем его
return self.addReplMailAlias(userName, srcMails)
return self.addReplMailAlias(userName, srcMails, filterHosts)
mailHost = self.clVars.Get('sr_mail_host')
if not mailHost:
hostName = self.clVars.Get('os_net_hostname')
@ -9071,17 +9180,24 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
len(x.split("@"))==2 and x.split('@')[1] != mailHost,\
filter(lambda x: "@" in x, srcMails))
if userMails:
# Внешний почтовый адрес пользователя (первый в списке)
# Внешний почтовый адрес пользователя (первый в списке)
userMail = userMails[0]
# Убираем первый адрес из списка
userMails = list(set(filter(lambda x: x != userMail,
userMails)))
attrAppend = []
attrDelete = []
attrReplace = []
email = rez[0][0][1]["mail"]
if filterHosts:
domain = self.clVars.Get('os_net_domain')
# Если необходимо добавляем домен к именам хостов
fHosts = map(lambda x: (not '.' in x and x+"."+domain) or x,
filterHosts)
for host in fHosts:
attrAppend.append((ldap.MOD_ADD, 'filtersender', host))
if rez[0][0][1].has_key('filtersender'):
attrDelete.append((ldap.MOD_DELETE, 'filtersender', None))
email = rez[0][0][1]["mail"][0]
altEmails = rez[0][0][1]["mailAlternateAddress"]
# Удаляем альтернативные адреса, кроме первого
for altEmail in altEmails:
@ -9111,7 +9227,7 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
return True
@adminConnectLdap
def addReplMailAlias(self, userName, srcMails):
def addReplMailAlias(self, userName, srcMails , filterHosts=[]):
"""Добавляем запись в Replication/Mail
(имя пользователя, список почтовых адресов пользователя"""
@ -9148,7 +9264,15 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
aliasDN = self.addDN("cn=%s"%userName,relMailDN)
for mail in userMails:
modAttrs.append((ldap.MOD_ADD, 'mailAlternateAddress',
mail))
mail))
if filterHosts:
domain = self.clVars.Get('os_net_domain')
# Если необходимо добавляем домен к именам хостов
fHosts = map(lambda x: (not '.' in x and x+"."+domain) or x,
filterHosts)
for host in fHosts:
modAttrs.append((ldap.MOD_ADD, 'filtersender',
host))
res = self.modAttrsDN(aliasDN, modAttrs)
# Если ошибка то удаляем почтовый алиас
if not res:
@ -9517,7 +9641,7 @@ use the new version. (openldap > 2.4)")%openLdapVesion)
def getGroupsMail(self):
"""Находит группы в Mail сервисе
Вывод список [(группа, [почтовые адреса группы])...)]
Вывод список [(группа, [почтовые адреса группы],[невидимые хосты])...)]
"""
# Проверим установлен ли сервис Mail
if not self.isServiceSetup("mail"):
@ -9525,13 +9649,19 @@ use the new version. (openldap > 2.4)")%openLdapVesion)
# ищем группы в ветке Mail
resSearch = self.searchLdapDN("*", self.servMailObj.relGroupsDN,
"mailAlternateAddress",
["cn","mailAlternateAddress"])
["cn","mailAlternateAddress",
"filtersender"])
if not resSearch:
return False
listGroupMail = []
for i in resSearch:
listGroupMail.append((i[0][1]["cn"][0],
i[0][1]["mailAlternateAddress"]))
if i[0][1].has_key('filtersender'):
listGroupMail.append((i[0][1]["cn"][0],
i[0][1]["mailAlternateAddress"],
i[0][1]["filtersender"]))
else:
listGroupMail.append((i[0][1]["cn"][0],
i[0][1]["mailAlternateAddress"],[]))
return listGroupMail
def setupReplServer(self, options, service):
@ -9832,18 +9962,19 @@ together with option '-r'") + " ...")
usersMail = self.getUsersMail()
# Получаем почтовые группы
groupsMail = self.getGroupsMail()
usersAndGroupsMail = reduce(lambda x, y: x+y,
map(lambda x: x or [],
[usersMail,groupsMail]),[])
# объединяет usersMail и groupsMail
usersAndGroupsMail = map(lambda x: (len(x)==2 and\
(x[0],x[1],[])) or x, reduce(lambda x, y: x+y,\
map(lambda x: x or [], [usersMail,groupsMail]),[]))
if usersAndGroupsMail:
flagError = False
for name, mails in usersAndGroupsMail:
for name, mails, hosts in usersAndGroupsMail:
if self.searchMailAlias(name):
if not self.modReplMailAlias(name, mails):
if not self.modReplMailAlias(name, mails, hosts):
flagError = True
break
else:
if not self.addReplMailAlias(name, mails):
if not self.addReplMailAlias(name, mails, hosts):
flagError = True
break
if flagError:

Loading…
Cancel
Save