|
|
|
@ -171,6 +171,38 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
# DN сервисов относительно базового
|
|
|
|
|
self.ServicesDN = "ou=Services"
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def restoreDelUser(self, userName, service, srcDir, message):
|
|
|
|
|
"""Возвращаем данные удаленного пользователя"""
|
|
|
|
|
# Ищем Unix пользователя
|
|
|
|
|
searchUnixUser = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
# id пользователя
|
|
|
|
|
strUid = ""
|
|
|
|
|
if searchUnixUser:
|
|
|
|
|
strUid = searchUnixUser[0][0][1]['uidNumber'][0]
|
|
|
|
|
if strUid:
|
|
|
|
|
delBackDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_ldap_delete_user_dir"),
|
|
|
|
|
"%s-%s"%(userName,strUid),
|
|
|
|
|
service)
|
|
|
|
|
if os.path.exists(delBackDir) and os.listdir(delBackDir):
|
|
|
|
|
dialogRes = self.dialogYesNo(message)
|
|
|
|
|
if dialogRes and dialogRes == True:
|
|
|
|
|
#try:
|
|
|
|
|
self.copyDir(srcDir, delBackDir)
|
|
|
|
|
#except:
|
|
|
|
|
#self.printERROR(_("Not restore user data dir %s")\
|
|
|
|
|
#%srcDir)
|
|
|
|
|
#return False
|
|
|
|
|
self.printSUCCESS(_("Restore user data in dir %s")\
|
|
|
|
|
%srcDir)
|
|
|
|
|
return "Yes", delBackDir
|
|
|
|
|
elif dialogRes == False:
|
|
|
|
|
return "No", delBackDir
|
|
|
|
|
elif dialogRes == None:
|
|
|
|
|
return "Cansel", delBackDir
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def backupDelUser(self, userName, service, srcDir):
|
|
|
|
|
"""Сохраняем данные удаляемого пользователя"""
|
|
|
|
@ -198,21 +230,24 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
service)
|
|
|
|
|
i = 0
|
|
|
|
|
while os.path.exists(delBackDir):
|
|
|
|
|
i += 1
|
|
|
|
|
delBackDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_ldap_delete_user_dir"),
|
|
|
|
|
"%s_%s"%(userName,i),
|
|
|
|
|
service)
|
|
|
|
|
i += 1
|
|
|
|
|
#Делаем сохранение почтовой директории
|
|
|
|
|
self.copyDir(delBackDir, srcDir)
|
|
|
|
|
if os.path.exists(delBackDir):
|
|
|
|
|
self.printSUCCESS(_("Created deleted user data dir %s")\
|
|
|
|
|
%delBackDir)
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
# Cоздаем директорию хранения удаленных пользователей
|
|
|
|
|
if not os.path.exists(self.clVars.Get("soft_ldap_delete_user_dir")):
|
|
|
|
|
os.makedirs(self.clVars.Get("soft_ldap_delete_user_dir"))
|
|
|
|
|
#Делаем сохранение директории
|
|
|
|
|
try:
|
|
|
|
|
os.renames(srcDir, delBackDir)
|
|
|
|
|
except:
|
|
|
|
|
self.printERROR(_("Not created deleted user data dir %s")\
|
|
|
|
|
%delBackDir)
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("Created deleted user data dir %s")\
|
|
|
|
|
%delBackDir)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def stringIsJpeg(self, string):
|
|
|
|
|
"""Определяет является ли строка jpeg изображением"""
|
|
|
|
@ -507,6 +542,38 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def removeDir(self, rmDir):
|
|
|
|
|
"""Рекурсивное удаление директории"""
|
|
|
|
|
if not os.path.exists(rmDir):
|
|
|
|
|
self.printERROR(_("Not found remove dir %s") %rmDir)
|
|
|
|
|
return False
|
|
|
|
|
fileObj = cl_profile._file()
|
|
|
|
|
# Сканируем директорию
|
|
|
|
|
scanObjs = fileObj.scanDirs([rmDir])
|
|
|
|
|
for fileRm in scanObjs[0].files:
|
|
|
|
|
# Удаляем файлы
|
|
|
|
|
os.remove(fileRm)
|
|
|
|
|
for linkRm in scanObjs[0].links:
|
|
|
|
|
# Удаляем ссылки
|
|
|
|
|
os.unlink(linkRm)
|
|
|
|
|
scanObjs[0].dirs.sort(lambda x, y: cmp(len(y), len(x)))
|
|
|
|
|
for dirRm in scanObjs[0].dirs:
|
|
|
|
|
# Удаляем директории
|
|
|
|
|
os.rmdir(dirRm)
|
|
|
|
|
os.rmdir(rmDir)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def createUserDir(self, uid, gid, userDir):
|
|
|
|
|
"""Создание пользовательской директории для почты"""
|
|
|
|
|
if not os.path.exists(userDir):
|
|
|
|
|
os.makedirs(userDir)
|
|
|
|
|
os.chmod(userDir,0700)
|
|
|
|
|
os.chown(userDir,uid,gid)
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
self.printERROR(_("Path %s exists") %userDir)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def copyDir(self, destDir, srcDir):
|
|
|
|
|
"""Копируем директорию в другое место
|
|
|
|
|
|
|
|
|
@ -517,11 +584,10 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
os.makedirs(destDir)
|
|
|
|
|
# Файловый объект
|
|
|
|
|
fileObj = cl_profile._file()
|
|
|
|
|
# Сканируем скелетную директорию
|
|
|
|
|
# Сканируем директорию
|
|
|
|
|
scanObjs = fileObj.scanDirs([srcDir])
|
|
|
|
|
if not scanObjs:
|
|
|
|
|
return True
|
|
|
|
|
scanObjs[0].dirs.sort(lambda x, y: cmp(len(y), len(x)))
|
|
|
|
|
for dirSrc in scanObjs[0].dirs:
|
|
|
|
|
#создаем в домашней директории директории из srcDir
|
|
|
|
|
dirName = destDir + dirSrc.split(srcDir)[1]
|
|
|
|
@ -769,6 +835,8 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
termios.tcsetattr(fd, termios.TCSADRAIN, oldSet)
|
|
|
|
|
return char
|
|
|
|
|
def term(char):
|
|
|
|
|
if ord(char) == 3:
|
|
|
|
|
return None
|
|
|
|
|
if char == "Y":
|
|
|
|
|
return True
|
|
|
|
|
elif char == "n":
|
|
|
|
@ -864,6 +932,15 @@ class servUnix(shareLdap):
|
|
|
|
|
"""Cоединение с LDAP администратором Samba сервиса"""
|
|
|
|
|
return shareLdap.getLdapObjInFile(self, "unix")
|
|
|
|
|
|
|
|
|
|
def createUnixDir(self, userName, uid, gid):
|
|
|
|
|
"""Создание пользовательской директории хранения профилей"""
|
|
|
|
|
unixDir = os.path.join(self.clVars.Get("soft_ldap_unix_path"),
|
|
|
|
|
userName)
|
|
|
|
|
if self.createUserDir(uid, gid, unixDir):
|
|
|
|
|
return unixDir
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def createHomeDir(self, userName, homeDir, skelDir):
|
|
|
|
|
"""Создаем домашнюю директорию пользователя
|
|
|
|
|
|
|
|
|
@ -1385,6 +1462,14 @@ class servUnix(shareLdap):
|
|
|
|
|
self.printERROR(_("Not added jpeg photo for user") + " " +\
|
|
|
|
|
str(userName))
|
|
|
|
|
flagError = True
|
|
|
|
|
# Cоздаем директорию профиля
|
|
|
|
|
createDirProfile = False
|
|
|
|
|
if not flagError and (options.has_key('n') or int(userId) >= 1000):
|
|
|
|
|
profileDir = self.createUnixDir(userName,int(userId),int(userGid))
|
|
|
|
|
if not profileDir:
|
|
|
|
|
flagError = True
|
|
|
|
|
else:
|
|
|
|
|
createDirProfile = True
|
|
|
|
|
if flagError:
|
|
|
|
|
if options.has_key('m'):
|
|
|
|
|
self.delUserUnixServer(userName, {'r':""}, False)
|
|
|
|
@ -1401,7 +1486,11 @@ class servUnix(shareLdap):
|
|
|
|
|
" ...")
|
|
|
|
|
if options.has_key('i'):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(_("Added jpeg photo: %s")% photoFile+\
|
|
|
|
|
self.printSUCCESS(_("Added jpeg photo %s")% photoFile+\
|
|
|
|
|
" ...")
|
|
|
|
|
if createDirProfile:
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(_("Created profile dir %s") %profileDir +\
|
|
|
|
|
" ...")
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(_("Added user in Unix service") + " ...")
|
|
|
|
@ -1609,7 +1698,8 @@ service"))
|
|
|
|
|
else:
|
|
|
|
|
return maxUid+1
|
|
|
|
|
|
|
|
|
|
def delUserUnixServer(self, userName, options, printSuccess=True):
|
|
|
|
|
def delUserUnixServer(self, userName, options, printSuccess=True,
|
|
|
|
|
backup=True):
|
|
|
|
|
"""Удаляем Unix пользователя"""
|
|
|
|
|
# Ищем пользователя в Samba
|
|
|
|
|
if self.servSambaObj.searchSambaUser(userName):
|
|
|
|
@ -1636,7 +1726,14 @@ service"))
|
|
|
|
|
_("User %s is not found in Unix service") % str(userName) +\
|
|
|
|
|
" ...")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
#директория хранения настроек пользователя
|
|
|
|
|
unixDir = os.path.join(self.clVars.Get("soft_ldap_unix_path"),
|
|
|
|
|
userName)
|
|
|
|
|
# Делаем сохранение данных удаляемого пользователя
|
|
|
|
|
if backup and os.listdir(unixDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'unix', unixDir):
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
delDN = self.addDN("uid=" + userName, self.relUsersDN)
|
|
|
|
|
if not self.delDN(delDN):
|
|
|
|
|
return False
|
|
|
|
@ -2044,11 +2141,6 @@ service"))
|
|
|
|
|
_("Executing of the program will change") + " " +
|
|
|
|
|
_("the configuration files and database of LDAP service")+
|
|
|
|
|
".")
|
|
|
|
|
# если вы ранее использовали программу cl-setup то в дальнейшем
|
|
|
|
|
# можете использовать cl-backup для резервного копирования
|
|
|
|
|
self.printWARNING (
|
|
|
|
|
_("If cl-setup program was used previously") + ", " +
|
|
|
|
|
_("you may execute cl-backup program for backup services"))
|
|
|
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
|
|
|
messDialog = \
|
|
|
|
|
_("If you are ready to continue executing the program")+", "+\
|
|
|
|
@ -2203,7 +2295,9 @@ class servMail(shareLdap):
|
|
|
|
|
mailDir = os.path.join(self.clVars.Get("soft_ldap_mail_path"),
|
|
|
|
|
userName)
|
|
|
|
|
# Делаем сохранение данных удаляемого пользователя
|
|
|
|
|
if backup and os.listdir(mailDir):
|
|
|
|
|
if options.has_key('r'):
|
|
|
|
|
backup = False
|
|
|
|
|
if backup and os.path.exists(mailDir) and os.listdir(mailDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'mail', mailDir):
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем пользователя из групп
|
|
|
|
@ -2655,19 +2749,6 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def createMailDir(self, userName, uid, gid):
|
|
|
|
|
"""Создание пользовательской директории для почты"""
|
|
|
|
|
mailDir = os.path.join(self.clVars.Get("soft_ldap_mail_path"),
|
|
|
|
|
userName)
|
|
|
|
|
if not os.path.exists(mailDir):
|
|
|
|
|
os.makedirs(mailDir)
|
|
|
|
|
os.chmod(mailDir,0700)
|
|
|
|
|
os.chown(mailDir,uid,gid)
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
self.printERROR(_("Path %s exists") %mailDir)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def searchUsersInGroupMail(self, usersNames, groupName):
|
|
|
|
|
"""Ищет спиcок пользователей в группе, ищет в LDAP
|
|
|
|
|
|
|
|
|
@ -2720,6 +2801,12 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
"mailAlternateAddress")
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def createMailDir(self, userName, uid, gid):
|
|
|
|
|
"""Создание пользовательской директории для почты"""
|
|
|
|
|
mailDir = os.path.join(self.clVars.Get("soft_ldap_mail_path"),
|
|
|
|
|
userName)
|
|
|
|
|
return self.createUserDir(uid, gid, mailDir)
|
|
|
|
|
|
|
|
|
|
def addUsersGroupMail(self, users, groupName):
|
|
|
|
|
"""Добавляет пользователей из списка в Mail группу"""
|
|
|
|
|
if not self.searchMailGroupToName(groupName):
|
|
|
|
@ -2875,12 +2962,43 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
return False
|
|
|
|
|
# Востановим удаленного пользователя
|
|
|
|
|
# Почтовая директория пользователя
|
|
|
|
|
mailDir = os.path.join(self.clVars.Get("soft_ldap_mail_path"),
|
|
|
|
|
userName)
|
|
|
|
|
message = _("Restored deleted user %s data")% userName + "\n" +\
|
|
|
|
|
_("(Y - yes, n - no, ctrl+c - cansel)")
|
|
|
|
|
resRestore = self.restoreDelUser(userName, "mail", mailDir, message)
|
|
|
|
|
# Если ошибка то выходим
|
|
|
|
|
if not resRestore:
|
|
|
|
|
return False
|
|
|
|
|
# Флаг создания почтовой директории пользователя
|
|
|
|
|
createDir = True
|
|
|
|
|
if type(resRestore) == types.TupleType:
|
|
|
|
|
# Если cansel
|
|
|
|
|
if resRestore[0] == "Cansel":
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
return False
|
|
|
|
|
# Если No
|
|
|
|
|
if resRestore[0] == "No":
|
|
|
|
|
if not self.removeDir(resRestore[1]):
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
return False
|
|
|
|
|
createDir = True
|
|
|
|
|
if resRestore[0] == "Yes":
|
|
|
|
|
createDir = False
|
|
|
|
|
# Создаем почтовую директорию
|
|
|
|
|
if not self.createMailDir(userName, uid, gid):
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
return False
|
|
|
|
|
if createDir:
|
|
|
|
|
if not self.createMailDir(userName, uid, gid):
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
return False
|
|
|
|
|
# Записываем основной почтовый адрес
|
|
|
|
|
if primaryMail:
|
|
|
|
|
if not self.servUnixObj.setUserMail(userName, primaryMail):
|
|
|
|
@ -2890,6 +3008,10 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
self.printERROR(_("Failed set primary email for user %s in\
|
|
|
|
|
Unix service ...") %str(primaryMail))
|
|
|
|
|
return False
|
|
|
|
|
if type(resRestore) == types.TupleType and\
|
|
|
|
|
(resRestore[0] == "Yes" or resRestore[0] == "No")\
|
|
|
|
|
and os.path.exists(resRestore[1]):
|
|
|
|
|
self.removeDir(resRestore[1])
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.printSUCCESS(_("Added user in Unix service") + " ...")
|
|
|
|
|
self.printSUCCESS(_("Added user in Mail service") + " ...")
|
|
|
|
@ -2926,11 +3048,6 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
_("Executing of the program will change") + " " +
|
|
|
|
|
_("the configuration files of Mail service") +" ("+
|
|
|
|
|
_("programs Postfix and Dovecot") + ")." )
|
|
|
|
|
# если вы ранее использовали программу cl-setup то в дальнейшем
|
|
|
|
|
# можете использовать cl-backup для резервного копирования
|
|
|
|
|
self.printWARNING (
|
|
|
|
|
_("If cl-setup program was used previously") + ", " +
|
|
|
|
|
_("you may execute cl-backup program for backup services"))
|
|
|
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
|
|
|
messDialog = \
|
|
|
|
|
_("If you are ready to continue executing the program") + ", "+\
|
|
|
|
@ -3537,11 +3654,6 @@ class servJabber(shareLdap):
|
|
|
|
|
_("Executing of the program will change") + " " +
|
|
|
|
|
_("the configuration files of Jabber service") +" ("+
|
|
|
|
|
_("program Ejabberd") + ")." )
|
|
|
|
|
# если вы ранее использовали программу cl-setup то в дальнейшем
|
|
|
|
|
# можете использовать cl-backup для резервного копирования
|
|
|
|
|
self.printWARNING (
|
|
|
|
|
_("If cl-setup program was used previously") + ", " +
|
|
|
|
|
_("you may execute cl-backup program for backup services"))
|
|
|
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
|
|
|
messDialog = \
|
|
|
|
|
_("If you are ready to continue executing the program") + ", "+\
|
|
|
|
@ -3864,11 +3976,6 @@ user %s") %str(userName))
|
|
|
|
|
self.printWARNING (_("WARNING") + ": " +
|
|
|
|
|
_("Executing of the program will change") + " " +
|
|
|
|
|
_("the configuration files of Samba service") + ".")
|
|
|
|
|
# если вы ранее использовали программу cl-setup то в дальнейшем
|
|
|
|
|
# можете использовать cl-backup для резервного копирования
|
|
|
|
|
self.printWARNING (
|
|
|
|
|
_("If cl-setup program was used previously") + ", " +
|
|
|
|
|
_("you may execute cl-backup program for backup services"))
|
|
|
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
|
|
|
messDialog = \
|
|
|
|
|
_("If you are ready to continue executing the program")+", "+\
|
|
|
|
@ -4454,11 +4561,6 @@ class servLdap(shareLdap):
|
|
|
|
|
_("Executing of the program will change") + " " +
|
|
|
|
|
_("the configuration files and database of LDAP service")+
|
|
|
|
|
".")
|
|
|
|
|
# если вы ранее использовали программу cl-setup то в дальнейшем
|
|
|
|
|
# можете использовать cl-backup для резервного копирования
|
|
|
|
|
self.printWARNING (
|
|
|
|
|
_("If cl-setup program was used previously") + ", " +
|
|
|
|
|
_("you may execute cl-backup program for backup services"))
|
|
|
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
|
|
|
messDialog = \
|
|
|
|
|
_("If you are ready to continue executing the program")+", "+\
|
|
|
|
@ -4836,6 +4938,13 @@ class cl_ldap(shareLdap):
|
|
|
|
|
'helpChapter':_("Unix service options"),
|
|
|
|
|
'help':_("create home directory for the new user account")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(3,),
|
|
|
|
|
'shortOption':"n",
|
|
|
|
|
'longOption':"create-profile",
|
|
|
|
|
'helpChapter':_("Unix service options"),
|
|
|
|
|
'help':_("create a directory for storing new user account \
|
|
|
|
|
preferences")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(3,),
|
|
|
|
|
'shortOption':"p",
|
|
|
|
|
'longOption':"password",
|
|
|
|
@ -4930,13 +5039,13 @@ class cl_ldap(shareLdap):
|
|
|
|
|
'shortOption':"r",
|
|
|
|
|
'longOption':"remove",
|
|
|
|
|
'helpChapter':_("Unix service options"),
|
|
|
|
|
'help':_("remove home directory")
|
|
|
|
|
'help':_("not create backup deleted user data")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(4,),
|
|
|
|
|
'shortOption':"r",
|
|
|
|
|
'longOption':"remove",
|
|
|
|
|
'helpChapter':_("Mail service options"),
|
|
|
|
|
'help':_("remove user mail directory")
|
|
|
|
|
'help':_("not create backup deleted user data")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(5,),
|
|
|
|
|
'shortOption':"c",
|
|
|
|
|