|
|
|
@ -45,7 +45,7 @@ from xml import xpath
|
|
|
|
|
# Для 32 битного целого (генерация серийного номера DNS зоны)
|
|
|
|
|
import ctypes
|
|
|
|
|
|
|
|
|
|
Version = "calculate-server 2.1.18"
|
|
|
|
|
Version = "calculate-server 2.1.20"
|
|
|
|
|
|
|
|
|
|
tr = cl_base.lang()
|
|
|
|
|
tr.setLanguage(sys.modules[__name__])
|
|
|
|
@ -312,7 +312,7 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon, prnServ):
|
|
|
|
|
# Сервисы и демоны
|
|
|
|
|
servicesDaemons = {"ldap":["slapd"],
|
|
|
|
|
"unix":["slapd"],
|
|
|
|
|
"samba":["samba"],
|
|
|
|
|
"samba":["samba", "calculate-profile"],
|
|
|
|
|
"mail":["postfix","dovecot"],
|
|
|
|
|
"mail_relay":["postfix"],
|
|
|
|
|
"jabber":["ejabberd"],
|
|
|
|
@ -1035,6 +1035,7 @@ in a sambaDomainName',
|
|
|
|
|
"dovecot":("dovecot","master.pid"),
|
|
|
|
|
"proftpd":("","proftpd.pid"),
|
|
|
|
|
"squid":("","squid.pid"),
|
|
|
|
|
"calculate-profile":("","calculate-profile.pid"),
|
|
|
|
|
"sortmilter":("","sortmilter.pid")}
|
|
|
|
|
baselayoutDir = "/var/lib/init.d/daemons"
|
|
|
|
|
if not flagBaselayoutDir:
|
|
|
|
@ -1045,7 +1046,7 @@ in a sambaDomainName',
|
|
|
|
|
addDirDict["samba"] = (baselayoutDir,"samba")
|
|
|
|
|
addDirDict["named"] = (baselayoutDir,"named")
|
|
|
|
|
addDirDict["dhcpd"] = (baselayoutDir,"dhcpd")
|
|
|
|
|
elif daemon in ["ejabberd", "samba", "named", "dhcpd"]:
|
|
|
|
|
elif daemon in ["ejabberd", "samba", "named", "dhcpd", "calculate-profile"]:
|
|
|
|
|
if not os.system("/lib/rc/bin/service_started %s" %daemon):
|
|
|
|
|
runDaemons[daemon] = True
|
|
|
|
|
else:
|
|
|
|
@ -1090,7 +1091,7 @@ in a sambaDomainName',
|
|
|
|
|
"""Проверка, запущен ли сервис с данным именем"""
|
|
|
|
|
flagError = False
|
|
|
|
|
if not nameService in self.servicesDaemons.keys():
|
|
|
|
|
self.printERROR(_("Can not supported service '%s'")%nameService)
|
|
|
|
|
self.printERROR(_("Can1 not supported service '%s'")%nameService)
|
|
|
|
|
self.printERROR(_("Can not check run service"))
|
|
|
|
|
return False
|
|
|
|
|
# Названия демонов для сервиса
|
|
|
|
@ -1836,6 +1837,7 @@ This command is not allowed."))
|
|
|
|
|
return self.dialogYesNo(message)
|
|
|
|
|
|
|
|
|
|
def createJabberCertificate(self):
|
|
|
|
|
hostname = self.clVars.Get("sr_jabber_host")
|
|
|
|
|
# создаем сертификат если есть используем прежний
|
|
|
|
|
if not os.path.exists("/etc/jabber/ssl.pem"):
|
|
|
|
|
if os.path.exists("/etc/jabber/self-cert.sh"):
|
|
|
|
@ -1846,6 +1848,7 @@ This command is not allowed."))
|
|
|
|
|
"Automatically-generated ejabberd SSL key",
|
|
|
|
|
userName="jabber",
|
|
|
|
|
groupName="jabber",
|
|
|
|
|
sslCommonName=hostname,
|
|
|
|
|
certFile="/etc/jabber/ssl.pem",
|
|
|
|
|
genDH=True):
|
|
|
|
|
return False
|
|
|
|
@ -6317,14 +6320,15 @@ of version > 2.1.10, then you can delete this file.") + "\n"
|
|
|
|
|
if not flagError:
|
|
|
|
|
netbios = self.clVars.Get("sr_samba_netbios")
|
|
|
|
|
netbios = netbios.upper()
|
|
|
|
|
fileTxt='NET USE R: /D\r\nNET USE R: \\\\%s\\share\
|
|
|
|
|
\r\nNET USE T: /D\r\nNET VIEW \\\\%s | find "ftp"\r\n\
|
|
|
|
|
fileTxt='NET USE R: /D /Y\r\nNET USE R: \\\\%s\\share\
|
|
|
|
|
\r\nNET USE T: /D /Y\r\nNET VIEW \\\\%s | find "ftp"\r\n\
|
|
|
|
|
if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
fileDirectory = os.path.join(createDirLogon,
|
|
|
|
|
"start.cmd")
|
|
|
|
|
if not self.createUserFile(fileDirectory,
|
|
|
|
|
fileTxt, uid, gid):
|
|
|
|
|
flagError = True
|
|
|
|
|
os.chmod(fileDirectory, 0o755)
|
|
|
|
|
# Cоздаем директорию профиля win
|
|
|
|
|
if not flagError and createDirWinProfile:
|
|
|
|
|
if not self.createUserDir(uid,gid,createDirWinProfile):
|
|
|
|
@ -6989,6 +6993,8 @@ options '-w, --workgroup'"))
|
|
|
|
|
# Удаляем из автозапуска демона
|
|
|
|
|
if not self.delDaemonAutostart("samba"):
|
|
|
|
|
return False
|
|
|
|
|
if not self.delDaemonAutostart("calculate-profile"):
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем из share файл .replrun
|
|
|
|
|
if not self.delReplFile(self.clVars):
|
|
|
|
|
return False
|
|
|
|
@ -7056,12 +7062,14 @@ options '-w, --workgroup'"))
|
|
|
|
|
print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
|
|
|
|
|
return False
|
|
|
|
|
self.printOK(_("Added ldif file") + " ...")
|
|
|
|
|
textLines = self.execProg("/etc/init.d/samba restart")
|
|
|
|
|
if textLines == False:
|
|
|
|
|
self.printNotOK(_("Starting") + " Samba ...")
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printOK(_("Starting") + " Samba ...")
|
|
|
|
|
for service_initd, service_name in [("samba", "Samba"), ("calculate-profile", "Calculate Profile")]:
|
|
|
|
|
textLines = self.execProg("/etc/init.d/%s restart"%service_initd)
|
|
|
|
|
if textLines == False:
|
|
|
|
|
self.printNotOK(_("Starting") + " %s ..."%service_name)
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printOK(_("Starting") + " %s ..."%service_name)
|
|
|
|
|
|
|
|
|
|
# Добавляем статические Samba группы и изменяем настройки
|
|
|
|
|
if not self.upgradeService():
|
|
|
|
|
return False
|
|
|
|
@ -7138,6 +7146,8 @@ options '-w, --workgroup'"))
|
|
|
|
|
# Устанавливаем автозапуск демона
|
|
|
|
|
if not self.setDaemonAutostart("samba"):
|
|
|
|
|
return False
|
|
|
|
|
if not self.setDaemonAutostart("calculate-profile"):
|
|
|
|
|
return False
|
|
|
|
|
# если нет share то создадим
|
|
|
|
|
sharePath = self.clVars.Get("sr_samba_share_path")
|
|
|
|
|
if not os.path.exists(sharePath):
|
|
|
|
@ -7814,6 +7824,15 @@ outdated. If the backup is obsolete, use cl-backup-server."))
|
|
|
|
|
self.delDaemonAutostart("sortmilter")
|
|
|
|
|
if not flagError and "samba" in servInstalled and\
|
|
|
|
|
serviceUpdate in ["all","samba"]:
|
|
|
|
|
self.setDaemonAutostart("calculate-profile")
|
|
|
|
|
for service_initd, service_name in [("calculate-profile", "Calculate Profile")]:
|
|
|
|
|
textLines = self.execProg("/etc/init.d/%s restart"%service_initd)
|
|
|
|
|
if textLines == False:
|
|
|
|
|
self.printNotOK(_("Starting") + " %s ..."%service_name)
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
self.printOK(_("Starting") + " %s ..."%service_name)
|
|
|
|
|
|
|
|
|
|
# Добавляем статические Samba группы и изменяем настройки
|
|
|
|
|
if not self.servSambaObj.upgradeService():
|
|
|
|
|
flagError = True
|
|
|
|
@ -8801,13 +8820,15 @@ for running replication")%bFile)
|
|
|
|
|
self.printERROR(_("Can not extract archive") +\
|
|
|
|
|
": "+str(bFile))
|
|
|
|
|
return False
|
|
|
|
|
self.changeHostname()
|
|
|
|
|
if not self.changeHostname():
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
# Распаковываем целиком архив
|
|
|
|
|
if self.execProg(tarCommand + "-xjf %s" %(bFile)) == False:
|
|
|
|
|
self.printERROR(_("Can not extract archive") + ": "+str(bFile))
|
|
|
|
|
return False
|
|
|
|
|
self.changeHostname()
|
|
|
|
|
if not self.changeHostname():
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем временные файлы
|
|
|
|
|
self.removeTmpFiles()
|
|
|
|
|
# считаем переменные из ini файлов
|
|
|
|
@ -8841,8 +8862,17 @@ for running replication")%bFile)
|
|
|
|
|
hostname_fn = "/proc/sys/kernel/hostname"
|
|
|
|
|
old_hostname = open(hostname_fn, 'r').read().strip()
|
|
|
|
|
if old_hostname != hostname:
|
|
|
|
|
with open("/proc/sys/kernel/hostname",'w') as f:
|
|
|
|
|
f.write(hostname)
|
|
|
|
|
try:
|
|
|
|
|
with open("/proc/sys/kernel/hostname",'w') as f:
|
|
|
|
|
f.write(hostname)
|
|
|
|
|
except IOError:
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("Failed to change hostname from {ohn} to {nhn}").format(
|
|
|
|
|
ohn=old_hostname,
|
|
|
|
|
nhn=hostname
|
|
|
|
|
) + ".")
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def removeTmpFiles(self):
|
|
|
|
|
"""Удаляем временные файлы"""
|
|
|
|
@ -9126,6 +9156,7 @@ class cl_ldap(shareLdap):
|
|
|
|
|
'cl-dhcp-hostdel':26,
|
|
|
|
|
'cl-dhcp-hostmod':27,
|
|
|
|
|
'dhcp':28,
|
|
|
|
|
'execsamba':29
|
|
|
|
|
}
|
|
|
|
|
# Cвязь сервисов и действующих опций
|
|
|
|
|
self.relServices = {"samba":[_("Common options"),
|
|
|
|
@ -11382,6 +11413,24 @@ service")
|
|
|
|
|
'test' when mounting its resources") + ".",
|
|
|
|
|
self.consolewidth-self.column_width)
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(29,),
|
|
|
|
|
'optVal':"MAKEDIR",
|
|
|
|
|
'longOption':"makedir",
|
|
|
|
|
'helpChapter':_("Common options"),
|
|
|
|
|
'help':_("user name to create user directories on the server")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(29,),
|
|
|
|
|
'optVal':"LOGOUT",
|
|
|
|
|
'longOption':"logout",
|
|
|
|
|
'helpChapter':_("Common options"),
|
|
|
|
|
'help':_("user name to logout from the server")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(29,),
|
|
|
|
|
'shortOption':"s",
|
|
|
|
|
'longOption':"silent",
|
|
|
|
|
'helpChapter':_("Common options"),
|
|
|
|
|
'help':_("silent mode messages")
|
|
|
|
|
},
|
|
|
|
|
#{
|
|
|
|
|
#'helpChapter':_("Examples"),
|
|
|
|
|
#'help':pcs(" " + cmdName + " --env boot", self.column_width,
|
|
|
|
@ -12275,16 +12324,20 @@ class servRepl(shareLdap):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def getProfileDirs(self, userName):
|
|
|
|
|
def getProfileDirs(self, userName, onlyLogoutFile=False):
|
|
|
|
|
"""Выводит директории профилей для пользователя"""
|
|
|
|
|
profileDir = os.path.join(self.clVars.Get("sr_samba_linprof_path"),
|
|
|
|
|
userName)
|
|
|
|
|
if not os.path.exists(profileDir):
|
|
|
|
|
return False
|
|
|
|
|
return filter(lambda x:\
|
|
|
|
|
if onlyLogoutFile:
|
|
|
|
|
filterFunc = lambda x: os.path.exists(os.path.join(x, self.logOutFile))
|
|
|
|
|
else:
|
|
|
|
|
filterFunc = lambda x:\
|
|
|
|
|
os.path.exists(os.path.join(x, self.logOutFile)) or \
|
|
|
|
|
os.path.exists(os.path.join(x, self.srvFile)) or\
|
|
|
|
|
os.path.exists(os.path.join(x, self.deskFile)),
|
|
|
|
|
os.path.exists(os.path.join(x, self.deskFile))
|
|
|
|
|
return filter(filterFunc,
|
|
|
|
|
[profileDir] + map(lambda x: os.path.join(profileDir, x),\
|
|
|
|
|
filter(lambda x:\
|
|
|
|
|
os.path.isdir(os.path.join(profileDir, x)) ,\
|
|
|
|
@ -12375,14 +12428,15 @@ class servRepl(shareLdap):
|
|
|
|
|
# Создаем start.cmd
|
|
|
|
|
netbios = self.clVars.Get("sr_samba_netbios")
|
|
|
|
|
netbios = netbios.upper()
|
|
|
|
|
fileTxt='NET USE R: /D\r\nNET USE R: \\\\%s\\share\
|
|
|
|
|
\r\nNET USE T: /D\r\nNET VIEW \\\\%s | find "ftp"\r\n\
|
|
|
|
|
fileTxt='NET USE R: /D /Y\r\nNET USE R: \\\\%s\\share\
|
|
|
|
|
\r\nNET USE T: /D /Y\r\nNET VIEW \\\\%s | find "ftp"\r\n\
|
|
|
|
|
if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
fileDirectory = os.path.join(userDir,"start.cmd")
|
|
|
|
|
if not self.createUserFile(fileDirectory,
|
|
|
|
|
fileTxt, uid, gid):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
os.chmod(fileDirectory, 0o755)
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
@ -13254,6 +13308,270 @@ incompatible"))
|
|
|
|
|
restorePrintMethods(prnSucces, prnErr)
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
|
|
|
|
|
def execSamba(self, options, logObj=False):
|
|
|
|
|
"""Выполняется при монтировании и отмонтировании пользовательской
|
|
|
|
|
директории. При использвании нового алгоритма rsync+ssh
|
|
|
|
|
"""
|
|
|
|
|
def printErrMessages(errMessages, verboseMode, logObj):
|
|
|
|
|
"""Печать и запись в лог-файл сообщений о ошибках"""
|
|
|
|
|
if errMessages:
|
|
|
|
|
if verboseMode:
|
|
|
|
|
for errMess in errMessages:
|
|
|
|
|
self.printERROR(errMess)
|
|
|
|
|
if logObj:
|
|
|
|
|
for errMess in errMessages:
|
|
|
|
|
logObj.writeError(errMess)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def printSuccessMessages(messages, verboseMode, logObj):
|
|
|
|
|
"""Печать и запись в лог-файл сообщений о успехе"""
|
|
|
|
|
if verboseMode:
|
|
|
|
|
for mess in messages:
|
|
|
|
|
self.printSUCCESS(mess)
|
|
|
|
|
if logObj:
|
|
|
|
|
for mess in messages:
|
|
|
|
|
logObj.writeSuccess(mess)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def redefinePrintMethods(messages, errMessages):
|
|
|
|
|
"""Переопределение методов печати успешных сообщений и ошибок"""
|
|
|
|
|
prnErr = cl_utils2.cl_smartcon.printERROR
|
|
|
|
|
cl_utils2.cl_smartcon.printERROR=lambda *x: errMessages.append(x[1])
|
|
|
|
|
prnSucces = cl_utils2.cl_smartcon.printSUCCESS
|
|
|
|
|
cl_utils2.cl_smartcon.printSUCCESS=lambda *x: messages.append(x[1])
|
|
|
|
|
return prnSucces, prnErr
|
|
|
|
|
|
|
|
|
|
def restorePrintMethods(prnSucces, prnErr):
|
|
|
|
|
"""Восстанавление методов печати успешных сообщений и ошибок"""
|
|
|
|
|
cl_utils2.cl_smartcon.printERROR = prnErr
|
|
|
|
|
cl_utils2.cl_smartcon.printSUCCESS = prnSucces
|
|
|
|
|
|
|
|
|
|
# Сообщения о успехе
|
|
|
|
|
messages = []
|
|
|
|
|
# Сообщения о ошибках
|
|
|
|
|
errMessages = []
|
|
|
|
|
# Опция выключает вывод cообщений на экран
|
|
|
|
|
verboseMode = True
|
|
|
|
|
if options.has_key('s'):
|
|
|
|
|
verboseMode = False
|
|
|
|
|
logout = ""
|
|
|
|
|
makeDir = ""
|
|
|
|
|
isLogout = options.has_key('logout')
|
|
|
|
|
isMakeDir = options.has_key('makedir')
|
|
|
|
|
dictOpt = {"logout":isLogout, "makedir":isMakeDir}
|
|
|
|
|
firstOpt = filter(lambda x: x[1] ,dictOpt.items())
|
|
|
|
|
lenOpt = len(firstOpt)
|
|
|
|
|
if lenOpt == 1:
|
|
|
|
|
if isLogout:
|
|
|
|
|
# Выход пользователя
|
|
|
|
|
logout = options['logout']
|
|
|
|
|
elif isMakeDir:
|
|
|
|
|
# Создание директорий для пользователя
|
|
|
|
|
makeDir = options['makedir']
|
|
|
|
|
elif lenOpt == 0:
|
|
|
|
|
errMessages.append(\
|
|
|
|
|
_("command line option '--logout' or '--makedir' is \
|
|
|
|
|
not set"))
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
else:
|
|
|
|
|
errMessages.append(\
|
|
|
|
|
_("command line option '--logout' and '--makedir' is \
|
|
|
|
|
incompatible"))
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
# Создаем переменные шаблонов
|
|
|
|
|
self.createClVars()
|
|
|
|
|
# Проверка на установку сервиса LDAP
|
|
|
|
|
if self.clVars.Get("sr_ldap_set") != "on":
|
|
|
|
|
errMessages.append(_("LDAP service not setuped"))
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
# Проверка на установку samba
|
|
|
|
|
if self.clVars.Get("sr_samba_set") != "on":
|
|
|
|
|
errMessages.append(_("Samba service not setuped"))
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
# включена или нет репликация
|
|
|
|
|
flagRepl = False
|
|
|
|
|
if self.clVars.Get("ld_repl_set") == "on":
|
|
|
|
|
flagRepl = True
|
|
|
|
|
|
|
|
|
|
if makeDir:
|
|
|
|
|
# Переопределение печати успешных сообщений и ошибок
|
|
|
|
|
prnSucces, prnErr = redefinePrintMethods(messages, errMessages)
|
|
|
|
|
userName = makeDir
|
|
|
|
|
if self.execMakedirs(userName, flagRepl, True):
|
|
|
|
|
# Восстановление печати успешных сообщений и ошибок
|
|
|
|
|
restorePrintMethods(prnSucces, prnErr)
|
|
|
|
|
return printSuccessMessages(messages, verboseMode, logObj)
|
|
|
|
|
# Восстановление печати успешных сообщений и ошибок
|
|
|
|
|
restorePrintMethods(prnSucces, prnErr)
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
elif logout:
|
|
|
|
|
# Переопределение печати успешных сообщений и ошибок
|
|
|
|
|
prnSucces, prnErr = redefinePrintMethods(messages, errMessages)
|
|
|
|
|
userName = logout
|
|
|
|
|
# Выход пользователя из сеанса
|
|
|
|
|
if self.execLogoutUserNew(userName, flagRepl):
|
|
|
|
|
# Восстановление печати успешных сообщений и ошибок
|
|
|
|
|
restorePrintMethods(prnSucces, prnErr)
|
|
|
|
|
return printSuccessMessages(messages, verboseMode, logObj)
|
|
|
|
|
# Восстановление печати успешных сообщений и ошибок
|
|
|
|
|
restorePrintMethods(prnSucces, prnErr)
|
|
|
|
|
return printErrMessages(errMessages, verboseMode, logObj)
|
|
|
|
|
|
|
|
|
|
def execMakedirs(self, userName, flagRepl, flagMakeDir):
|
|
|
|
|
"""Действия на сервере при входе пользователя в сеанс"""
|
|
|
|
|
# Поиск пользователя в Samba сервисе
|
|
|
|
|
if not self.servSambaObj.searchSambaUser(userName):
|
|
|
|
|
self.printERROR(_("Samba user %s is not found")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
# Создаем пользовательские директории на сервере
|
|
|
|
|
if not self.createUserDirs(userName):
|
|
|
|
|
self.printERROR(_("Can not create user %s directories")\
|
|
|
|
|
%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("User %s login")%userName)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def execLogoutUserNew(self, userName, flagRepl):
|
|
|
|
|
"""Действия на сервере при выходе пользователя из сеанса"""
|
|
|
|
|
|
|
|
|
|
def printErrMessages(error):
|
|
|
|
|
"""Печать сообщений о ошибках"""
|
|
|
|
|
errors = error.splitlines()
|
|
|
|
|
for err in errors:
|
|
|
|
|
self.printERROR(err)
|
|
|
|
|
|
|
|
|
|
def setWorkedUser(userName, dirLogOut, profileDir):
|
|
|
|
|
"""Запись пользователя в Worked ветку LDAP"""
|
|
|
|
|
if dirLogOut == profileDir:
|
|
|
|
|
userLogin = userName
|
|
|
|
|
else:
|
|
|
|
|
clientOs = os.path.split(dirLogOut)[1].\
|
|
|
|
|
replace(".","")
|
|
|
|
|
# если есть старый пользователь в ветке
|
|
|
|
|
# Worked и клиентская система CLD -
|
|
|
|
|
# удаляем старого пользователя
|
|
|
|
|
if self.searchWorkedUser(userName) and\
|
|
|
|
|
clientOs=="CLD":
|
|
|
|
|
# Удаляем пользователя из ветки
|
|
|
|
|
# второй параметр False
|
|
|
|
|
if not self.delReplWorkedUser(userName,
|
|
|
|
|
False):
|
|
|
|
|
self.printERROR(_("Can not \
|
|
|
|
|
remove user %s in the LDAP branch 'Worked'")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
userLogin = "%s@%s"%(userName,clientOs)
|
|
|
|
|
# Добавляем пользователя в ветку репликации
|
|
|
|
|
if not self.addReplWorkedUser(userLogin):
|
|
|
|
|
self.printERROR(_("Can not add user \
|
|
|
|
|
%s in LDAP branch 'Replication'")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
# Поиск пользователя в Samba сервисе
|
|
|
|
|
if not self.servSambaObj.searchSambaUser(userName):
|
|
|
|
|
self.printERROR(_("Samba user %s is not found")%str(userName))
|
|
|
|
|
return False
|
|
|
|
|
# Директория хранения профилей
|
|
|
|
|
profileDir = os.path.join(\
|
|
|
|
|
self.clVars.Get("sr_samba_linprof_path"), userName)
|
|
|
|
|
# получаем директории профилей
|
|
|
|
|
dirsLogOut= self.getProfileDirs(userName, onlyLogoutFile=True)
|
|
|
|
|
flagLogOut = True
|
|
|
|
|
# Удаляем файлы .logout
|
|
|
|
|
for dirLogOut in dirsLogOut:
|
|
|
|
|
logoutFile = os.path.join(dirLogOut, self.logOutFile)
|
|
|
|
|
retStr = self.deleteLogoutFile(userName, logoutFile)
|
|
|
|
|
if not retStr:
|
|
|
|
|
self.printERROR(\
|
|
|
|
|
_("No access to the file %s")%logoutFile)
|
|
|
|
|
return False
|
|
|
|
|
# Читаем данные из ~/.calculate/desktop.env файла
|
|
|
|
|
desktopFile = os.path.join(dirLogOut,self.deskFile)
|
|
|
|
|
if retStr == "SUCCESS":
|
|
|
|
|
varsPackDict = {}
|
|
|
|
|
# Управление сервером
|
|
|
|
|
srvFile = os.path.join(dirLogOut,self.srvFile)
|
|
|
|
|
if os.path.exists(srvFile):
|
|
|
|
|
# Поддерживаемые секции которые не нужно удалять
|
|
|
|
|
supportSections = []
|
|
|
|
|
# Получим текущую дату
|
|
|
|
|
strCurrentTime = time.strftime(\
|
|
|
|
|
"%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
|
|
|
|
|
# Получаем переменные из env файла
|
|
|
|
|
txtConfig = cl_base.iniParser(srvFile)
|
|
|
|
|
# Cловарь переменных из файла для изменения пароля
|
|
|
|
|
# пользователя
|
|
|
|
|
sectionPwd = ["command","passwd_samba"]
|
|
|
|
|
varsPwdDict = txtConfig.getAreaVars(sectionPwd)
|
|
|
|
|
# Если включена репликация
|
|
|
|
|
if flagRepl:
|
|
|
|
|
# Команда для упаковки профиля
|
|
|
|
|
sectionPack = ["command","pack"]
|
|
|
|
|
varsPackDict = txtConfig.getAreaVars(sectionPack)
|
|
|
|
|
error = txtConfig.getError()
|
|
|
|
|
if error:
|
|
|
|
|
printErrMessages(error)
|
|
|
|
|
return False
|
|
|
|
|
# Изменение пароля пользователя
|
|
|
|
|
if varsPwdDict:
|
|
|
|
|
# Если run=on выполняем команду
|
|
|
|
|
if varsPwdDict.get("run") == "on":
|
|
|
|
|
supportSections.append(",".join(sectionPwd))
|
|
|
|
|
if self.changeUserPassword(userName,
|
|
|
|
|
varsPwdDict,
|
|
|
|
|
srvFile,strCurrentTime):
|
|
|
|
|
# Записываем статус - успех
|
|
|
|
|
if not self.setDateAndStatusToConfig(\
|
|
|
|
|
sectionPwd,
|
|
|
|
|
"success",
|
|
|
|
|
strCurrentTime,
|
|
|
|
|
txtConfig):
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
# Записываем статус - ошибка
|
|
|
|
|
self.setDateAndStatusToConfig(sectionPwd,
|
|
|
|
|
"error",
|
|
|
|
|
strCurrentTime,
|
|
|
|
|
txtConfig)
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
if set(varsPwdDict.keys()) == set(["date",
|
|
|
|
|
"status"]):
|
|
|
|
|
supportSections.append(",".join(sectionPwd))
|
|
|
|
|
# Упаковка профиля пользователя
|
|
|
|
|
if flagRepl and varsPackDict:
|
|
|
|
|
# Если run=on выполняем команду
|
|
|
|
|
if varsPackDict.get("run") == "on":
|
|
|
|
|
# Дата новее которой файлы помещаются в архив
|
|
|
|
|
strArchDate = varsPackDict.get("arch_date")
|
|
|
|
|
# Текущее время на клинтском компьютере
|
|
|
|
|
strCurrentTime = varsPackDict.get("curr_time")
|
|
|
|
|
if strArchDate and strCurrentTime:
|
|
|
|
|
# Создаем инкрементный архив
|
|
|
|
|
if not self.packUserProfile(dirLogOut,
|
|
|
|
|
strArchDate,
|
|
|
|
|
strCurrentTime,
|
|
|
|
|
txtConfig):
|
|
|
|
|
return False
|
|
|
|
|
# Удаление секций которые не можем отработать
|
|
|
|
|
# и секции для создания архива профиля пользователя
|
|
|
|
|
sections = txtConfig.getAllSectionNames()
|
|
|
|
|
if supportSections:
|
|
|
|
|
sections = list(set(sections)-set(["command"]))
|
|
|
|
|
sections = set(sections)-set(supportSections)
|
|
|
|
|
delSections = map(lambda x: x.split(","), sections)
|
|
|
|
|
for delSect in delSections:
|
|
|
|
|
txtConfig.delArea(delSect)
|
|
|
|
|
# Если включена репликация и нет команды на упаковку
|
|
|
|
|
# профиля пользователя
|
|
|
|
|
if flagRepl and not varsPackDict:
|
|
|
|
|
# Запись пользователя в Worked ветку LDAP
|
|
|
|
|
if not setWorkedUser(userName, dirLogOut, profileDir):
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("User %s logout")%userName)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setDateAndStatusToConfig(self, section, status, strDate, objConfig):
|
|
|
|
|
"""Устанавливает для секции текущюю дату и статус"""
|
|
|
|
|
def printErrMessages(error):
|
|
|
|
|