|
|
|
@ -11629,7 +11629,7 @@ class servRepl(shareLdap):
|
|
|
|
|
# Файл для определения выхода пользователя.
|
|
|
|
|
logOutFile = ".logout"
|
|
|
|
|
# Файл для управления сервером
|
|
|
|
|
envFile = ".calculate.env"
|
|
|
|
|
envFile = ".calculate/server.env"
|
|
|
|
|
# Переменные (/etc/calculate/calculate.env)
|
|
|
|
|
# которые будут сохранены при rebuild
|
|
|
|
|
restoreDefaultVar =["sr_ldap_set", "ld_repl_pw", "ld_repl_set",
|
|
|
|
@ -12494,6 +12494,8 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
flagRepl = True
|
|
|
|
|
flagLogOut = False
|
|
|
|
|
retStr = ""
|
|
|
|
|
# Сообщения о успехе
|
|
|
|
|
messages =[]
|
|
|
|
|
if not errorFlag:
|
|
|
|
|
if self.servSambaObj.searchSambaUser(login):
|
|
|
|
|
if self.isLoginUser(login):
|
|
|
|
@ -12510,10 +12512,6 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
flagLogOut = True
|
|
|
|
|
# Cоздаем объект переменные
|
|
|
|
|
self.createClVars()
|
|
|
|
|
# Пути к env файлам
|
|
|
|
|
oldEnvPath = self.clVars.Get("cl_env_path")
|
|
|
|
|
# количество путей
|
|
|
|
|
lenOldEnvPath = len(oldEnvPath)
|
|
|
|
|
# Удаляем файлы .logout
|
|
|
|
|
for dirLogOut in dirsLogOut:
|
|
|
|
|
logoutFile = os.path.join(dirLogOut, self.logOutFile)
|
|
|
|
@ -12554,22 +12552,44 @@ remove user %s in the LDAP branch 'Worked'")%str(login))
|
|
|
|
|
envFile = os.path.join(dirLogOut,
|
|
|
|
|
self.envFile)
|
|
|
|
|
if os.path.exists(envFile):
|
|
|
|
|
oldEnvPath.insert(lenOldEnvPath,
|
|
|
|
|
envFile)
|
|
|
|
|
self.clVars.Set("cl_env_path",oldEnvPath,
|
|
|
|
|
True)
|
|
|
|
|
# Заполняем переменные значениями из
|
|
|
|
|
# env файла
|
|
|
|
|
self.clVars.flIniFile()
|
|
|
|
|
oldEnvPath = oldEnvPath[:-1]
|
|
|
|
|
self.clVars.Set("cl_env_path",oldEnvPath,
|
|
|
|
|
True)
|
|
|
|
|
# обработка env
|
|
|
|
|
if not self.changeUserPassword(login,
|
|
|
|
|
errMessages):
|
|
|
|
|
errorFlag = True
|
|
|
|
|
# удаление файла
|
|
|
|
|
os.remove(envFile)
|
|
|
|
|
# Получаем переменные из env файла
|
|
|
|
|
txtConfig = cl_base.iniParser(envFile)
|
|
|
|
|
# словарь переменных из файла
|
|
|
|
|
varsDict = txtConfig.getAreaVars(["passwd",
|
|
|
|
|
"samba"])
|
|
|
|
|
error = txtConfig.getError()
|
|
|
|
|
if error:
|
|
|
|
|
errors = error.splitlines()
|
|
|
|
|
errMessages + errors
|
|
|
|
|
errorFlag = True
|
|
|
|
|
break
|
|
|
|
|
if varsDict:
|
|
|
|
|
# замена пароля пользователя
|
|
|
|
|
# Сохранение печати ошибок
|
|
|
|
|
prnErr = self.printERROR
|
|
|
|
|
prnSucces = self.printSUCCESS
|
|
|
|
|
self.printERROR = \
|
|
|
|
|
lambda x: errMessages.append(x)
|
|
|
|
|
# Переопределение печати ошибок
|
|
|
|
|
self.printSUCCESS = \
|
|
|
|
|
lambda x: messages.append(x)
|
|
|
|
|
# Переопределение печати ошибок
|
|
|
|
|
self.servUnixObj.printERROR =\
|
|
|
|
|
self.printERROR
|
|
|
|
|
self.servSambaObj.printERROR =\
|
|
|
|
|
self.printERROR
|
|
|
|
|
if not self.changeUserPassword(login,
|
|
|
|
|
varsDict,
|
|
|
|
|
envFile):
|
|
|
|
|
errorFlag = True
|
|
|
|
|
# Удаляем область изменения пароля из
|
|
|
|
|
# конфигурационного файла
|
|
|
|
|
txtConfig.delArea(["passwd", "samba"])
|
|
|
|
|
# Восстановление печати ошибок
|
|
|
|
|
self.printERROR = prnErr
|
|
|
|
|
self.printSUCCESS = prnSucces
|
|
|
|
|
if errorFlag:
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
errorFlag = True
|
|
|
|
|
errMessages.append(_("Samba user %s is not found")%str(login))
|
|
|
|
@ -12582,82 +12602,87 @@ remove user %s in the LDAP branch 'Worked'")%str(login))
|
|
|
|
|
for errMess in errMessages:
|
|
|
|
|
logObj.writeError(errMess)
|
|
|
|
|
return False
|
|
|
|
|
messages = ""
|
|
|
|
|
if flagLogOut:
|
|
|
|
|
messages += _("User %s logout")%login + " %s"%retStr
|
|
|
|
|
messages.append(_("User %s logout")%login + " %s"%retStr)
|
|
|
|
|
else:
|
|
|
|
|
messages += _("User %s login")%login
|
|
|
|
|
messages.append(_("User %s login")%login)
|
|
|
|
|
if verboseMode:
|
|
|
|
|
self.printSUCCESS(messages)
|
|
|
|
|
for mess in messages:
|
|
|
|
|
self.printSUCCESS(mess)
|
|
|
|
|
if logObj:
|
|
|
|
|
logObj.writeSuccess(messages)
|
|
|
|
|
for mess in messages:
|
|
|
|
|
logObj.writeSuccess(mess)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def changeUserPassword(self, userName, errMessages):
|
|
|
|
|
def changeUserPassword(self, userName, varsDict, confFile):
|
|
|
|
|
"""Изменение пароля пользователя при помощи конфигурационного файла
|
|
|
|
|
|
|
|
|
|
.calculate.env в домашней директории пользователя
|
|
|
|
|
"""
|
|
|
|
|
userPwdHash = self.clVars.Get("ur_unix_hash")
|
|
|
|
|
userLMHash = self.clVars.Get("ur_samba_lm_hash")
|
|
|
|
|
userNTHash = self.clVars.Get("ur_samba_nt_hash")
|
|
|
|
|
# Переопределение печати ошибок
|
|
|
|
|
self.printERROR = lambda x: errMessages.append(x)
|
|
|
|
|
self.servUnixObj.printERROR = self.printERROR
|
|
|
|
|
self.servSambaObj.printERROR = self.printERROR
|
|
|
|
|
if userPwdHash and userLMHash and userNTHash:
|
|
|
|
|
resUnix = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
resSamba = self.servSambaObj.searchSambaUser(userName)
|
|
|
|
|
if not resUnix:
|
|
|
|
|
self.printError(
|
|
|
|
|
_("User %s is not found in Unix service")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
if not resSamba:
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("Samba user %s is not found")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
# Изменение пароля пользователя Unix
|
|
|
|
|
# Изменяемые аттрибуты пользователя
|
|
|
|
|
modAttrs = []
|
|
|
|
|
if resUnix[0][0][1].has_key('userPassword'):
|
|
|
|
|
modAttrs.append((ldap.MOD_REPLACE, 'userPassword',
|
|
|
|
|
userPwdHash))
|
|
|
|
|
else:
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'userPassword',
|
|
|
|
|
userPwdHash))
|
|
|
|
|
DN = self.servUnixObj.addDN("uid="+userName,
|
|
|
|
|
self.servUnixObj.relUsersDN)
|
|
|
|
|
if not self.servUnixObj.modAttrsDN(DN, modAttrs):
|
|
|
|
|
return False
|
|
|
|
|
# Изменим время последнего измения пароля пользователя
|
|
|
|
|
if not self.servUnixObj.setShadowLastChange(userName):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Изменение пароля пользователя Samba
|
|
|
|
|
# Изменяемые аттрибуты пользователя
|
|
|
|
|
modAttrs = []
|
|
|
|
|
# Текущее время в секундах от 1970 года
|
|
|
|
|
recTime = str(int(time.time()))
|
|
|
|
|
data = [("sambaPwdLastSet",recTime),
|
|
|
|
|
("sambaLMPassword",userLMHash),
|
|
|
|
|
("sambaNTPassword",userNTHash)]
|
|
|
|
|
resSambaAttr = resSamba[0][0][1]
|
|
|
|
|
for attr, value in data:
|
|
|
|
|
if resSambaAttr.has_key(attr):
|
|
|
|
|
modAttrs.append((ldap.MOD_REPLACE, attr, value))
|
|
|
|
|
else:
|
|
|
|
|
if attr!="sambaLMPassword":
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, attr, value))
|
|
|
|
|
DN = self.servSambaObj.addDN("uid="+userName,
|
|
|
|
|
self.servSambaObj.relUsersDN)
|
|
|
|
|
if not self.servSambaObj.modAttrsDN(DN, modAttrs):
|
|
|
|
|
return False
|
|
|
|
|
varsData = ("unix_hash", "samba_lm_hash", "samba_nt_hash")
|
|
|
|
|
if not set(varsData)<=set(varsDict.keys():
|
|
|
|
|
notFoundVars = set(varsData) - set(varsDict.keys())
|
|
|
|
|
if len(notFoundVars)<len(varsData):
|
|
|
|
|
# Если какой либо ключ или ключи есть - выходим с ошибкой
|
|
|
|
|
self.printError(_("Variables (%s) is empty")\
|
|
|
|
|
%", ".join(notFoundVars) + ", "+\
|
|
|
|
|
_("file %s")%confFile)
|
|
|
|
|
return False
|
|
|
|
|
# Если нет всех ключей - выходим без ошибки
|
|
|
|
|
return True
|
|
|
|
|
userPwdHash = varsDict["unix_hash"]
|
|
|
|
|
userLMHash = varsDict["samba_lm_hash"]
|
|
|
|
|
userNTHash = varsDict["samba_nt_hash"]
|
|
|
|
|
# Поиск пользователя в Unix сервисе
|
|
|
|
|
resUnix = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
# Поиск пользователя в Samba сервисе
|
|
|
|
|
resSamba = self.servSambaObj.searchSambaUser(userName)
|
|
|
|
|
if not resUnix:
|
|
|
|
|
self.printError(
|
|
|
|
|
_("User %s is not found in Unix service")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
if not resSamba:
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("Samba user %s is not found")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
# Изменение пароля пользователя Unix
|
|
|
|
|
# Изменяемые аттрибуты пользователя
|
|
|
|
|
modAttrs = []
|
|
|
|
|
if resUnix[0][0][1].has_key('userPassword'):
|
|
|
|
|
modAttrs.append((ldap.MOD_REPLACE, 'userPassword',
|
|
|
|
|
userPwdHash))
|
|
|
|
|
else:
|
|
|
|
|
variables = ("ur_unix_hash","ur_samba_lm_hash","ur_samba_nt_hash")
|
|
|
|
|
self.printERROR(_("Profile variables: %s is empty")\
|
|
|
|
|
%filter(lambda x: self.clVars.Get(x), variables))
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'userPassword',
|
|
|
|
|
userPwdHash))
|
|
|
|
|
DN = self.servUnixObj.addDN("uid="+userName,
|
|
|
|
|
self.servUnixObj.relUsersDN)
|
|
|
|
|
if not self.servUnixObj.modAttrsDN(DN, modAttrs):
|
|
|
|
|
return False
|
|
|
|
|
# Изменим время последнего измения пароля пользователя
|
|
|
|
|
if not self.servUnixObj.setShadowLastChange(userName):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Изменение пароля пользователя Samba
|
|
|
|
|
# Изменяемые аттрибуты пользователя
|
|
|
|
|
modAttrs = []
|
|
|
|
|
# Текущее время в секундах от 1970 года
|
|
|
|
|
recTime = str(int(time.time()))
|
|
|
|
|
data = [("sambaPwdLastSet",recTime),
|
|
|
|
|
("sambaLMPassword",userLMHash),
|
|
|
|
|
("sambaNTPassword",userNTHash)]
|
|
|
|
|
resSambaAttr = resSamba[0][0][1]
|
|
|
|
|
for attr, value in data:
|
|
|
|
|
if resSambaAttr.has_key(attr):
|
|
|
|
|
modAttrs.append((ldap.MOD_REPLACE, attr, value))
|
|
|
|
|
else:
|
|
|
|
|
if attr!="sambaLMPassword":
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, attr, value))
|
|
|
|
|
DN = self.servSambaObj.addDN("uid="+userName,
|
|
|
|
|
self.servSambaObj.relUsersDN)
|
|
|
|
|
if not self.servSambaObj.modAttrsDN(DN, modAttrs):
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("Changed password of user %s")%userName)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def genReplServers(self, replServers, hostName, fullHostName):
|
|
|
|
|