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