|
|
|
@ -72,13 +72,13 @@ class iniLdapParser(cl_base.iniParser):
|
|
|
|
|
"""Класс для работы c ini-файлом ldap"""
|
|
|
|
|
def __init__(self):
|
|
|
|
|
# название ini файла
|
|
|
|
|
nameIniFile = "/etc/calculate2/calculate.ldap"
|
|
|
|
|
cl_base.iniParser.__init__(self,nameIniFile)
|
|
|
|
|
self.nameIniFile = "/etc/calculate/calculate.ldap"
|
|
|
|
|
cl_base.iniParser.__init__(self, self.nameIniFile)
|
|
|
|
|
# права создаваемого ini-файла
|
|
|
|
|
self.setMode(0600)
|
|
|
|
|
self.pathIniFile = os.path.split(nameIniFile)[0]
|
|
|
|
|
if not os.path.exists(self.pathIniFile):
|
|
|
|
|
os.makedirs(self.pathIniFile)
|
|
|
|
|
pathIniFile = os.path.split(self.nameIniFile)[0]
|
|
|
|
|
if not os.path.exists(pathIniFile):
|
|
|
|
|
os.makedirs(pathIniFile)
|
|
|
|
|
|
|
|
|
|
class addLdif(LDIFParser):
|
|
|
|
|
"""Класс необходимый для добавления записей в LDAP"""
|
|
|
|
@ -171,22 +171,69 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
# DN сервисов относительно базового
|
|
|
|
|
self.ServicesDN = "ou=Services"
|
|
|
|
|
|
|
|
|
|
def restorePathDelUser(self, userName, destDir, relDir, message):
|
|
|
|
|
"""Восстанавливает директорию удаленного пользователя"""
|
|
|
|
|
removeDir = False
|
|
|
|
|
flagError = False
|
|
|
|
|
resRestore = self.restoreDelUser(userName, relDir,
|
|
|
|
|
destDir, message)
|
|
|
|
|
# Если ошибка то выходим
|
|
|
|
|
if not resRestore:
|
|
|
|
|
flagError = True
|
|
|
|
|
# Флаг создания директории профиля пользователя
|
|
|
|
|
createDir = destDir
|
|
|
|
|
term = ""
|
|
|
|
|
if resRestore == True:
|
|
|
|
|
term = message
|
|
|
|
|
if not flagError and type(resRestore) == types.TupleType:
|
|
|
|
|
# Если cansel
|
|
|
|
|
if resRestore[0] == "Cansel":
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
flagError = True
|
|
|
|
|
term = None
|
|
|
|
|
# Если No
|
|
|
|
|
elif resRestore[0] == "No":
|
|
|
|
|
if not self.removeDir(resRestore[1]):
|
|
|
|
|
flagError = True
|
|
|
|
|
if not flagError:
|
|
|
|
|
removeDir = resRestore[1]
|
|
|
|
|
term = False
|
|
|
|
|
elif resRestore[0] == "Yes":
|
|
|
|
|
createDir = False
|
|
|
|
|
removeDir = resRestore[1]
|
|
|
|
|
term = True
|
|
|
|
|
if flagError or term == "":
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return (term, createDir, removeDir)
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def restoreDelUser(self, userName, service, srcDir, message):
|
|
|
|
|
def restoreDelUser(self,userName,service,srcDir,message,unixObj=False):
|
|
|
|
|
"""Возвращаем данные удаленного пользователя"""
|
|
|
|
|
# Ищем Unix пользователя
|
|
|
|
|
searchUnixUser = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
if unixObj:
|
|
|
|
|
servUnixObj = unixObj
|
|
|
|
|
else:
|
|
|
|
|
servUnixObj = self.servUnixObj
|
|
|
|
|
searchUnixUser = servUnixObj.searchUnixUser(userName)
|
|
|
|
|
# id пользователя
|
|
|
|
|
strUid = ""
|
|
|
|
|
if searchUnixUser:
|
|
|
|
|
strUid = searchUnixUser[0][0][1]['uidNumber'][0]
|
|
|
|
|
else:
|
|
|
|
|
resPasswd = servUnixObj.searchPasswdUser(userName)
|
|
|
|
|
if resPasswd:
|
|
|
|
|
strUid = resPasswd.split(":")[2]
|
|
|
|
|
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 strUid and os.path.exists(delBackDir) and os.listdir(delBackDir):
|
|
|
|
|
if message == None or type(message) == types.BooleanType:
|
|
|
|
|
dialogRes = message
|
|
|
|
|
else:
|
|
|
|
|
dialogRes = self.dialogYesNo(message)
|
|
|
|
|
if dialogRes and dialogRes == True:
|
|
|
|
|
#try:
|
|
|
|
|
self.copyDir(srcDir, delBackDir)
|
|
|
|
@ -204,10 +251,14 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def backupDelUser(self, userName, service, srcDir):
|
|
|
|
|
def backupDelUser(self, userName, service, srcDir, unixObj=False):
|
|
|
|
|
"""Сохраняем данные удаляемого пользователя"""
|
|
|
|
|
# Ищем Unix пользователя
|
|
|
|
|
searchUnixUser = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
if unixObj:
|
|
|
|
|
servUnixObj = unixObj
|
|
|
|
|
else:
|
|
|
|
|
servUnixObj = self.servUnixObj
|
|
|
|
|
searchUnixUser = servUnixObj.searchUnixUser(userName)
|
|
|
|
|
# id пользователя
|
|
|
|
|
strUid = ""
|
|
|
|
|
if searchUnixUser:
|
|
|
|
@ -240,7 +291,7 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
os.makedirs(self.clVars.Get("soft_ldap_delete_user_dir"))
|
|
|
|
|
#Делаем сохранение директории
|
|
|
|
|
try:
|
|
|
|
|
os.renames(srcDir, delBackDir)
|
|
|
|
|
self.copyDir(delBackDir,srcDir)
|
|
|
|
|
except:
|
|
|
|
|
self.printERROR(_("Not created deleted user data dir %s")\
|
|
|
|
|
%delBackDir)
|
|
|
|
@ -390,7 +441,7 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
for process in listProcess:
|
|
|
|
|
if "erlang" in process:
|
|
|
|
|
killPid.append(process.split(" ")[0])
|
|
|
|
|
if killPid:
|
|
|
|
|
if killPid and " ".join(killPid).strip():
|
|
|
|
|
textLine = self.execProg("kill %s" %" ".join(killPid))
|
|
|
|
|
if not (textLine == None):
|
|
|
|
|
self.printERROR(_("Can not 'kill %s'")\
|
|
|
|
@ -563,6 +614,19 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon):
|
|
|
|
|
os.rmdir(rmDir)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def removeEmptyDir(self, rmDir):
|
|
|
|
|
"""Удаление пустых директорий"""
|
|
|
|
|
if not os.path.exists(rmDir):
|
|
|
|
|
self.printERROR(_("Not found remove dir %s") %rmDir)
|
|
|
|
|
return False
|
|
|
|
|
rDir = rmDir
|
|
|
|
|
while os.listdir(rDir) == []:
|
|
|
|
|
os.rmdir(rDir)
|
|
|
|
|
rDir = os.path.split(rDir)[0]
|
|
|
|
|
if rDir == "/":
|
|
|
|
|
break
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def createUserDir(self, uid, gid, userDir):
|
|
|
|
|
"""Создание пользовательской директории для почты"""
|
|
|
|
|
if not os.path.exists(userDir):
|
|
|
|
@ -932,15 +996,6 @@ 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):
|
|
|
|
|
"""Создаем домашнюю директорию пользователя
|
|
|
|
|
|
|
|
|
@ -989,13 +1044,6 @@ class servUnix(shareLdap):
|
|
|
|
|
os.chown(homeDir, uid,gid)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def removeHomeDir(self, homeDir):
|
|
|
|
|
"""Удаление домашней директории пользователя"""
|
|
|
|
|
if os.path.exists(homeDir):
|
|
|
|
|
self.execProg("rm -rf %s" %homeDir)
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def searchPasswdUser(self, userName):
|
|
|
|
|
"""Ищет пользователей в /etc/passwd"""
|
|
|
|
|
filePasswd = "/etc/passwd"
|
|
|
|
@ -1445,11 +1493,43 @@ class servUnix(shareLdap):
|
|
|
|
|
if self.ldapObj.getError():
|
|
|
|
|
print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
|
|
|
|
|
flagError = True
|
|
|
|
|
message = _("Restored deleted user %s")% userName + "\n" +\
|
|
|
|
|
_("(Y - yes, n - no, ctrl+c - cansel)")
|
|
|
|
|
removeHomeBack = False
|
|
|
|
|
if not flagError:
|
|
|
|
|
# Востановим удаленного пользователя
|
|
|
|
|
resRestoreHm = self.restoreDelUser(userName, "unix/home",
|
|
|
|
|
homeDir, message, self)
|
|
|
|
|
# Если ошибка то выходим
|
|
|
|
|
if not resRestoreHm:
|
|
|
|
|
flagError = True
|
|
|
|
|
# Флаг создания домашней директории пользователя на сервере
|
|
|
|
|
createDirHome = True
|
|
|
|
|
if not flagError and type(resRestoreHm) == types.TupleType:
|
|
|
|
|
# Если cansel
|
|
|
|
|
if resRestoreHm[0] == "Cansel":
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
flagError = True
|
|
|
|
|
# Если No
|
|
|
|
|
if resRestoreHm[0] == "No":
|
|
|
|
|
if not self.removeDir(resRestoreHm[1]):
|
|
|
|
|
flagError = True
|
|
|
|
|
if not flagError:
|
|
|
|
|
createDirHome = True
|
|
|
|
|
removeHomeBack = resRestoreHm[1]
|
|
|
|
|
if resRestoreHm[0] == "Yes":
|
|
|
|
|
createDirHome = False
|
|
|
|
|
removeHomeBack = resRestoreHm[1]
|
|
|
|
|
# Удаляем бекап домашней директории на сервере (удаленного польз..)
|
|
|
|
|
if not flagError and removeHomeBack and\
|
|
|
|
|
os.path.exists(removeHomeBack):
|
|
|
|
|
self.removeDir(removeHomeBack)
|
|
|
|
|
self.removeEmptyDir(os.path.split(removeHomeBack)[0])
|
|
|
|
|
# Изменим время последнего измения пароля пользователя
|
|
|
|
|
if not flagError and not self.setShadowLastChange(userName):
|
|
|
|
|
flagError = True
|
|
|
|
|
# Добавим домашнюю директорию
|
|
|
|
|
if not flagError and options.has_key('m'):
|
|
|
|
|
if not flagError and createDirHome and options.has_key('m'):
|
|
|
|
|
if not os.path.exists(homeDir):
|
|
|
|
|
if not self.createHomeDir(userName, homeDir, skelDir):
|
|
|
|
|
self.printERROR (_("ERROR") + ": " +\
|
|
|
|
@ -1462,37 +1542,19 @@ 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)
|
|
|
|
|
else:
|
|
|
|
|
self.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.delUserUnixServer(userName, {}, False, False)
|
|
|
|
|
self.printERROR (_("Can not added user")+ " " + str(userName))
|
|
|
|
|
return False
|
|
|
|
|
if flagAdd.has_key('group'):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
if printSuccess:
|
|
|
|
|
if flagAdd.has_key('group'):
|
|
|
|
|
self.printSUCCESS(_("Added group in Unix service") + " ...")
|
|
|
|
|
if options.has_key('m'):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
if createDirHome and options.has_key('m'):
|
|
|
|
|
self.printSUCCESS(_("Created home dir %s")% homeDir+\
|
|
|
|
|
" ...")
|
|
|
|
|
if options.has_key('i'):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
if options.has_key('i'):
|
|
|
|
|
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") + " ...")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
@ -1726,18 +1788,21 @@ 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
|
|
|
|
|
if options.has_key('r'):
|
|
|
|
|
backup = False
|
|
|
|
|
homeDir = False
|
|
|
|
|
if resLdap[0][0][1].has_key('homeDirectory'):
|
|
|
|
|
#Домашняя директория пользователя
|
|
|
|
|
homeDir = resLdap[0][0][1]['homeDirectory'][0]
|
|
|
|
|
if backup and os.path.exists(homeDir) and os.listdir(homeDir):
|
|
|
|
|
# Делаем сохранение домашней директории
|
|
|
|
|
if not self.backupDelUser(userName, 'unix/home',
|
|
|
|
|
homeDir, self):
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
delDN = self.addDN("uid=" + userName, self.relUsersDN)
|
|
|
|
|
if not self.delDN(delDN):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Удаляем пользователя из групп
|
|
|
|
|
if not self.delUserInGroup(userName):
|
|
|
|
|
return False
|
|
|
|
@ -1746,7 +1811,7 @@ service"))
|
|
|
|
|
else:
|
|
|
|
|
resPasswd = self.searchPasswdUser(userName)
|
|
|
|
|
if resPasswd:
|
|
|
|
|
gid = resPasswd.split(":")[2]
|
|
|
|
|
gid = resPasswd.split(":")[3]
|
|
|
|
|
#Находим основную группу пользователя
|
|
|
|
|
resGroup = False
|
|
|
|
|
if gid:
|
|
|
|
@ -1757,14 +1822,11 @@ service"))
|
|
|
|
|
groupName = resGroup[0][0][1]['cn'][0]
|
|
|
|
|
if not self.delGroupUnixServer(groupName, {}, False):
|
|
|
|
|
return False
|
|
|
|
|
if options.has_key('r') and\
|
|
|
|
|
resLdap[0][0][1].has_key('homeDirectory'):
|
|
|
|
|
#Домашняя директория пользователя
|
|
|
|
|
homeDir = resLdap[0][0][1]['homeDirectory'][0]
|
|
|
|
|
if self.removeHomeDir(homeDir):
|
|
|
|
|
# Удаляем домашнюю директорию
|
|
|
|
|
if homeDir and os.path.exists(homeDir) and self.removeDir(homeDir):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(
|
|
|
|
|
_("Home directory %s is removed")% str(homeDir) +\
|
|
|
|
|
" ...")
|
|
|
|
|
_("Home directory %s is removed")% str(homeDir) + " ...")
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(_("User %s is deleted")%userName + " ...")
|
|
|
|
|
return True
|
|
|
|
@ -2294,9 +2356,9 @@ class servMail(shareLdap):
|
|
|
|
|
#почтовая директория пользователя
|
|
|
|
|
mailDir = os.path.join(self.clVars.Get("soft_ldap_mail_path"),
|
|
|
|
|
userName)
|
|
|
|
|
# Делаем сохранение данных удаляемого пользователя
|
|
|
|
|
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
|
|
|
|
@ -2308,7 +2370,7 @@ class servMail(shareLdap):
|
|
|
|
|
if not self.delDN(delDN):
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем почтовую папку
|
|
|
|
|
if self.servUnixObj.removeHomeDir(mailDir):
|
|
|
|
|
if self.removeDir(mailDir):
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(\
|
|
|
|
|
_("Mail user directory %s is removed")% str(mailDir) +\
|
|
|
|
@ -2842,6 +2904,19 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
return self.modAttrsDN(groupDN, modAttrs)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def delUserInMailAndUnix(self, userName, flagDelUnixUser):
|
|
|
|
|
"""Удаляет пользователя без бекапа
|
|
|
|
|
|
|
|
|
|
Удаляет из Mail и если установлен флаг из Unix
|
|
|
|
|
"""
|
|
|
|
|
if not self.delUserMailServer(userName, {}, False,False):
|
|
|
|
|
return False
|
|
|
|
|
if flagDelUnixUser:
|
|
|
|
|
if not self.servUnixObj.delUserUnixServer(userName, {}, False,
|
|
|
|
|
False):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def addUserMailServer(self, userName, options):
|
|
|
|
|
"""Добавляет почтового пользователя в LDAP-сервер"""
|
|
|
|
@ -2929,7 +3004,7 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
self.printERROR(_("ERROR") + ": " +\
|
|
|
|
|
_("create crypto password"))
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False, False)
|
|
|
|
|
return False
|
|
|
|
|
self.clVars.Set("soft_ldap_user_pw_hash",userPwdHash)
|
|
|
|
|
ldifFile = self.ldifFileUser
|
|
|
|
@ -2937,7 +3012,7 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
if not userRawLdif:
|
|
|
|
|
print self.getError()
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False, False)
|
|
|
|
|
return False
|
|
|
|
|
userLdif = userRawLdif.rstrip() + "\n" + "\n".join(modAttrs)
|
|
|
|
|
if not self.ldapObj.getError():
|
|
|
|
@ -2948,7 +3023,7 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
if self.ldapObj.getError():
|
|
|
|
|
print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False, False)
|
|
|
|
|
return False
|
|
|
|
|
if resUnix:
|
|
|
|
|
uid = int(resUnix[0][0][1]['uidNumber'][0])
|
|
|
|
@ -2958,9 +3033,7 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
gid = int(resPwd.split(":")[3])
|
|
|
|
|
else:
|
|
|
|
|
self.printERROR(_("user are not found"))
|
|
|
|
|
self.delUserMailServer(userName, {}, False, False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.delUserInMailAndUnix(userName, flagCreateUnixUser)
|
|
|
|
|
return False
|
|
|
|
|
# Востановим удаленного пользователя
|
|
|
|
|
# Почтовая директория пользователя
|
|
|
|
@ -2978,16 +3051,12 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
# Если cansel
|
|
|
|
|
if resRestore[0] == "Cansel":
|
|
|
|
|
# Удаляем пользователя
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.delUserInMailAndUnix(userName, flagCreateUnixUser)
|
|
|
|
|
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)
|
|
|
|
|
self.delUserInMailAndUnix(userName, flagCreateUnixUser)
|
|
|
|
|
return False
|
|
|
|
|
createDir = True
|
|
|
|
|
if resRestore[0] == "Yes":
|
|
|
|
@ -2995,23 +3064,20 @@ in Unix service ...") %str(primaryMail))
|
|
|
|
|
# Создаем почтовую директорию
|
|
|
|
|
if createDir:
|
|
|
|
|
if not self.createMailDir(userName, uid, gid):
|
|
|
|
|
self.delUserMailServer(userName, {}, False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.delUserInMailAndUnix(userName, flagCreateUnixUser)
|
|
|
|
|
return False
|
|
|
|
|
# Записываем основной почтовый адрес
|
|
|
|
|
if primaryMail:
|
|
|
|
|
if not self.servUnixObj.setUserMail(userName, primaryMail):
|
|
|
|
|
self.delUserMailServer(userName, {}, False, False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
self.printERROR(_("Failed set primary email for user %s in\
|
|
|
|
|
Unix service ...") %str(primaryMail))
|
|
|
|
|
self.delUserInMailAndUnix(userName, flagCreateUnixUser)
|
|
|
|
|
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])
|
|
|
|
|
self.removeEmptyDir(os.path.split(resRestore[1])[0])
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.printSUCCESS(_("Added user in Unix service") + " ...")
|
|
|
|
|
self.printSUCCESS(_("Added user in Mail service") + " ...")
|
|
|
|
@ -3793,38 +3859,38 @@ class servSamba(shareLdap):
|
|
|
|
|
_("Samba user %s is not found in Samba service") %\
|
|
|
|
|
str(delUser))
|
|
|
|
|
return False
|
|
|
|
|
# Делаем сохранение данных удаляемого пользователя
|
|
|
|
|
if backup:
|
|
|
|
|
userProfDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_ldap_samba_profile_path"),
|
|
|
|
|
winProfDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_winprofile_path"),
|
|
|
|
|
userName)
|
|
|
|
|
userHomeDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_ldap_samba_home_path"),
|
|
|
|
|
linProfDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_linprofile_path"),
|
|
|
|
|
userName)
|
|
|
|
|
userNetlogonDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_ldap_samba_netlogon_path"),
|
|
|
|
|
userHomeDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_home_path"),
|
|
|
|
|
userName)
|
|
|
|
|
if os.path.exists(userProfDir) and os.listdir(userProfDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'samba/profile',
|
|
|
|
|
userProfDir):
|
|
|
|
|
userNetlogonDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_winlogon_path"),
|
|
|
|
|
userName)
|
|
|
|
|
if options.has_key('r'):
|
|
|
|
|
backup = False
|
|
|
|
|
# Делаем сохранение данных удаляемого пользователя
|
|
|
|
|
if backup:
|
|
|
|
|
if os.path.exists(winProfDir) and os.listdir(winProfDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'samba/winprofile',
|
|
|
|
|
winProfDir):
|
|
|
|
|
return False
|
|
|
|
|
if os.path.exists(linProfDir) and os.listdir(linProfDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'samba/linprofile',
|
|
|
|
|
linProfDir):
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printWARNING(_("Samba profile directory not found for \
|
|
|
|
|
user %s") %str(userName))
|
|
|
|
|
if os.path.exists(userHomeDir)and os.listdir(userHomeDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'samba/home',
|
|
|
|
|
userHomeDir):
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printWARNING(_("Samba home directory not found for \
|
|
|
|
|
user %s") %str(userName))
|
|
|
|
|
if os.path.exists(userNetlogonDir) and os.listdir(userNetlogonDir):
|
|
|
|
|
if not self.backupDelUser(userName, 'samba/netlogon',
|
|
|
|
|
userProfDir):
|
|
|
|
|
winProfDir):
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printWARNING(_("Samba netlogon directory not found for \
|
|
|
|
|
user %s") %str(userName))
|
|
|
|
|
textLine = self.execProg("smbpasswd -x %s" %(delUser), False, False)
|
|
|
|
|
flagError = False
|
|
|
|
|
if textLine:
|
|
|
|
@ -3842,12 +3908,25 @@ user %s") %str(userName))
|
|
|
|
|
_("Can not delete Samba user") + " " + str(delUser) + " ...")
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printSUCCESS(_("Deleted Samba user %s") % str(delUser) +
|
|
|
|
|
# Удаляем win профиль
|
|
|
|
|
if os.path.exists(winProfDir):
|
|
|
|
|
self.removeDir(winProfDir)
|
|
|
|
|
# Удаляем lin профиль
|
|
|
|
|
if os.path.exists(linProfDir):
|
|
|
|
|
self.removeDir(linProfDir)
|
|
|
|
|
# Удаляем домашнюю директорию
|
|
|
|
|
if os.path.exists(userHomeDir):
|
|
|
|
|
self.removeDir(userHomeDir)
|
|
|
|
|
# Удаляем netlogon
|
|
|
|
|
if os.path.exists(userNetlogonDir):
|
|
|
|
|
self.removeDir(userNetlogonDir)
|
|
|
|
|
if printSuccess:
|
|
|
|
|
self.printSUCCESS(_("Deleted Samba user %s") % str(delUser) +\
|
|
|
|
|
" ...")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def addUserSambaServer(self, userName, options, pwDialog=False):
|
|
|
|
|
def addUserSambaServer(self,userName,options,pwDialog=False):
|
|
|
|
|
"""Добавляет LDAP пользователя в LDAP-сервер"""
|
|
|
|
|
# Добавление машины samba
|
|
|
|
|
if options.has_key('w'):
|
|
|
|
@ -3876,6 +3955,7 @@ user %s") %str(userName))
|
|
|
|
|
userPwd = self.getUserPassword(options, "p", "P", pwDialog)
|
|
|
|
|
if userPwd == False:
|
|
|
|
|
return False
|
|
|
|
|
flagCreateUnixUser = False
|
|
|
|
|
if not resSearch:
|
|
|
|
|
# Добавим пользователя LDAP
|
|
|
|
|
optUnix = {}
|
|
|
|
@ -3887,22 +3967,138 @@ user %s") %str(userName))
|
|
|
|
|
optUnix['c'] = options['c']
|
|
|
|
|
# Cделаем пользователя видимым
|
|
|
|
|
optUnix['v'] = ""
|
|
|
|
|
# Cоздадим директорию профиля
|
|
|
|
|
optUnix['n'] = ""
|
|
|
|
|
if not self.servUnixObj.addUserUnixServer(userName, optUnix,
|
|
|
|
|
False):
|
|
|
|
|
return False
|
|
|
|
|
flagCreateUnixUser = True
|
|
|
|
|
if userPwd:
|
|
|
|
|
textLine = self.execProg("smbpasswd -a -s %s" %(userName),
|
|
|
|
|
"%s\n%s\n" %(userPwd,userPwd))
|
|
|
|
|
else:
|
|
|
|
|
textLine = self.execProg("smbpasswd -a -n %s" %(userName))
|
|
|
|
|
if "Added" in str(textLine):
|
|
|
|
|
if not resSearch:
|
|
|
|
|
flagError = False
|
|
|
|
|
winProfDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_winprofile_path"),
|
|
|
|
|
userName)
|
|
|
|
|
linProfDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_linprofile_path"),
|
|
|
|
|
userName)
|
|
|
|
|
userHomeDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_home_path"),
|
|
|
|
|
userName)
|
|
|
|
|
userNetlogonDir =\
|
|
|
|
|
os.path.join(self.clVars.Get("soft_samba_winlogon_path"),
|
|
|
|
|
userName)
|
|
|
|
|
removeProfileBack = False
|
|
|
|
|
message = _("Restored deleted user %s")% userName + "\n" +\
|
|
|
|
|
_("(Y - yes, n - no, ctrl+c - cansel)")
|
|
|
|
|
|
|
|
|
|
resWinProf = self.restorePathDelUser(userName, winProfDir,
|
|
|
|
|
"samba/winprofile", message)
|
|
|
|
|
removeProfileBack = False
|
|
|
|
|
if not resWinProf:
|
|
|
|
|
flagError = True
|
|
|
|
|
createDirWinProfile = False
|
|
|
|
|
else:
|
|
|
|
|
term, createDirWinProfile, removeProfileBack = resWinProf
|
|
|
|
|
|
|
|
|
|
removeHomeBack = False
|
|
|
|
|
if not flagError:
|
|
|
|
|
resHome = self.restorePathDelUser(userName, userHomeDir,
|
|
|
|
|
"samba/home", term)
|
|
|
|
|
if not resHome:
|
|
|
|
|
flagError = True
|
|
|
|
|
createDirLogon = False
|
|
|
|
|
else:
|
|
|
|
|
term, createDirHome, removeHomeBack = resHome
|
|
|
|
|
|
|
|
|
|
removeLogonBack = False
|
|
|
|
|
if not flagError:
|
|
|
|
|
resLogon = self.restorePathDelUser(userName, userNetlogonDir,
|
|
|
|
|
"samba/netlogon", term)
|
|
|
|
|
if not resLogon:
|
|
|
|
|
flagError = True
|
|
|
|
|
createDirHome = False
|
|
|
|
|
else:
|
|
|
|
|
term, createDirLogon, removeLogonBack = resLogon
|
|
|
|
|
|
|
|
|
|
removeLinProfileBack = False
|
|
|
|
|
if not flagError:
|
|
|
|
|
resLinProf = self.restorePathDelUser(userName, linProfDir,
|
|
|
|
|
"samba/linprofile", term)
|
|
|
|
|
if not resLinProf:
|
|
|
|
|
flagError = True
|
|
|
|
|
createDirLinProfile = False
|
|
|
|
|
else:
|
|
|
|
|
term,createDirLinProfile,removeLinProfileBack = resLinProf
|
|
|
|
|
# Cоздадим нужные директории
|
|
|
|
|
if not flagError:
|
|
|
|
|
resSearchUnix = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
resPasswd = False
|
|
|
|
|
if resSearchUnix:
|
|
|
|
|
uid = int(resSearchUnix[0][0][1]['uidNumber'][0])
|
|
|
|
|
gid = int(resSearchUnix[0][0][1]['gidNumber'][0])
|
|
|
|
|
else:
|
|
|
|
|
resPasswd = self.servUnixObj.searchPasswdUser(userName)
|
|
|
|
|
if resPasswd:
|
|
|
|
|
uid = int(resPasswd.split(":")[2])
|
|
|
|
|
gid = int(resPasswd.split(":")[3])
|
|
|
|
|
if (resPasswd or resSearchUnix) and\
|
|
|
|
|
(options.has_key('n') or int(uid) >=1000):
|
|
|
|
|
# Cоздаем домашнюю директорию
|
|
|
|
|
if createDirHome:
|
|
|
|
|
if not self.createUserDir(uid, gid, createDirHome):
|
|
|
|
|
flagError = True
|
|
|
|
|
# Cоздаем директорию netlogon
|
|
|
|
|
if not flagError and createDirLogon:
|
|
|
|
|
if not self.createUserDir(uid, gid, createDirLogon):
|
|
|
|
|
flagError = True
|
|
|
|
|
# Cоздаем директорию профиля win
|
|
|
|
|
if not flagError and createDirWinProfile:
|
|
|
|
|
if not self.createUserDir(uid,gid,createDirWinProfile):
|
|
|
|
|
flagError = True
|
|
|
|
|
# Создаем директорию профиля lin
|
|
|
|
|
if not flagError and createDirLinProfile:
|
|
|
|
|
if not self.createUserDir(uid,gid,createDirLinProfile):
|
|
|
|
|
flagError = True
|
|
|
|
|
if not flagError:
|
|
|
|
|
# Удаляем директорию бекапа профиля win
|
|
|
|
|
if removeProfileBack and\
|
|
|
|
|
os.path.exists(removeProfileBack):
|
|
|
|
|
self.removeDir(removeProfileBack)
|
|
|
|
|
self.removeEmptyDir(os.path.split(removeProfileBack)[0])
|
|
|
|
|
# Удаляем директорию бекапа профиля lin
|
|
|
|
|
if removeLinProfileBack and\
|
|
|
|
|
os.path.exists(removeLinProfileBack):
|
|
|
|
|
self.removeDir(removeLinProfileBack)
|
|
|
|
|
self.removeEmptyDir(os.path.split(removeLinProfileBack)[0])
|
|
|
|
|
# Удаляем бекап домашней директории
|
|
|
|
|
if removeHomeBack and\
|
|
|
|
|
os.path.exists(removeHomeBack):
|
|
|
|
|
self.removeDir(removeHomeBack)
|
|
|
|
|
self.removeEmptyDir(os.path.split(removeHomeBack)[0])
|
|
|
|
|
# Удалим директорию logon пользователя
|
|
|
|
|
if removeLogonBack and\
|
|
|
|
|
os.path.exists(removeLogonBack):
|
|
|
|
|
self.removeDir(removeLogonBack)
|
|
|
|
|
self.removeEmptyDir(os.path.split(removeLogonBack)[0])
|
|
|
|
|
if flagError:
|
|
|
|
|
self.delUserSambaServer(userName,{},False,False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {},
|
|
|
|
|
False, False)
|
|
|
|
|
self.printERROR(_("Can not add user") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.printSUCCESS(_("Added user in Unix service") + " ...")
|
|
|
|
|
self.printSUCCESS(_("Added user in Samba service") +" ...")
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
if not resSearch:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False)
|
|
|
|
|
if flagCreateUnixUser:
|
|
|
|
|
self.servUnixObj.delUserUnixServer(userName, {}, False, False)
|
|
|
|
|
self.printERROR(_("Can not add user") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -3997,17 +4193,6 @@ user %s") %str(userName))
|
|
|
|
|
# останавливаем сервис Samba
|
|
|
|
|
if not self.stopServices(["samba"]):
|
|
|
|
|
return False
|
|
|
|
|
# Установим права 777 на директории
|
|
|
|
|
dirs = [self.clVars.Get("soft_ldap_samba_profile_path"),
|
|
|
|
|
self.clVars.Get("soft_ldap_samba_share_path")]
|
|
|
|
|
for mDir in dirs:
|
|
|
|
|
if os.path.exists(mDir):
|
|
|
|
|
fd = os.open(mDir, os.O_RDONLY)
|
|
|
|
|
fst = os.fstat(fd)
|
|
|
|
|
mode = stat.S_IMODE(fst.st_mode)
|
|
|
|
|
os.close(fd)
|
|
|
|
|
if not mode == 0777:
|
|
|
|
|
os.chmod(mDir, 0777)
|
|
|
|
|
# Имя устанавливаемого сервиса
|
|
|
|
|
self.clVars.Set("soft_ldap_setup_name","samba")
|
|
|
|
|
self.clVars.Write("soft_samba_setup","no")
|
|
|
|
@ -4288,8 +4473,16 @@ class servLdap(shareLdap):
|
|
|
|
|
if "ldap" in servInstalled:
|
|
|
|
|
# Получаем путь к ini директории
|
|
|
|
|
ldapParser = iniLdapParser()
|
|
|
|
|
iniPath = ldapParser.pathIniFile
|
|
|
|
|
scanPrivDirs.append(iniPath)
|
|
|
|
|
#iniPath = ldapParser.pathIniFile
|
|
|
|
|
#scanPrivDirs.append(iniPath)
|
|
|
|
|
dirDelUsers = self.clVars.Get("soft_ldap_delete_user_dir")
|
|
|
|
|
if os.path.exists(dirDelUsers):
|
|
|
|
|
scanPrivDirs.append(dirDelUsers)
|
|
|
|
|
# Добавляем calulate.ldap
|
|
|
|
|
allArchFiles.append(ldapParser.nameIniFile)
|
|
|
|
|
# Добавляем calculate.env
|
|
|
|
|
iniFile = "/" + self.clVars.Get("sys_calculate_ini")
|
|
|
|
|
allArchFiles.append(iniFile)
|
|
|
|
|
if "samba" in servInstalled:
|
|
|
|
|
scanPrivDirs.append(self.sambaPrivate)
|
|
|
|
|
if "mail" in servInstalled:
|
|
|
|
@ -4587,7 +4780,8 @@ class servLdap(shareLdap):
|
|
|
|
|
if os.path.exists(iniFile):
|
|
|
|
|
os.remove(iniFile)
|
|
|
|
|
# Получим путь к ldap файлу
|
|
|
|
|
ldapFile = iniFile.replace(".ini",".ldap")
|
|
|
|
|
ldapParser = iniLdapParser()
|
|
|
|
|
ldapFile = ldapParser.nameIniFile
|
|
|
|
|
# Удаляем ldap файл
|
|
|
|
|
if os.path.exists(ldapFile):
|
|
|
|
|
os.remove(ldapFile)
|
|
|
|
@ -4626,7 +4820,6 @@ class servLdap(shareLdap):
|
|
|
|
|
if not self.restartLdapServer():
|
|
|
|
|
return False
|
|
|
|
|
# Записываем данные администратора сервера
|
|
|
|
|
ldapParser = iniLdapParser()
|
|
|
|
|
ldapParser.setVar("admin",
|
|
|
|
|
{"DN":self.clVars.Get("soft_ldap_admin"),
|
|
|
|
|
"PASS":self.clVars.Get("soft_ldap_adminpw")})
|
|
|
|
@ -4970,6 +5163,13 @@ preferences")
|
|
|
|
|
'helpChapter':_("Mail service options"),
|
|
|
|
|
'help':_("create unix user account and mail user account")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(3,),
|
|
|
|
|
'shortOption':"n",
|
|
|
|
|
'longOption':"create-profile",
|
|
|
|
|
'helpChapter':_("Samba service options"),
|
|
|
|
|
'help':_("create a directory for storing new user account \
|
|
|
|
|
preferences")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(3,),
|
|
|
|
|
'shortOption':"p",
|
|
|
|
|
'longOption':"password",
|
|
|
|
@ -5041,6 +5241,12 @@ preferences")
|
|
|
|
|
'helpChapter':_("Unix service options"),
|
|
|
|
|
'help':_("not create backup deleted user data")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(4,),
|
|
|
|
|
'shortOption':"r",
|
|
|
|
|
'longOption':"remove",
|
|
|
|
|
'helpChapter':_("Samba service options"),
|
|
|
|
|
'help':_("not create backup deleted user data")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(4,),
|
|
|
|
|
'shortOption':"r",
|
|
|
|
|
'longOption':"remove",
|
|
|
|
|