|
|
|
@ -2236,7 +2236,61 @@ class utfBin:
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class profile(_file, _terms, xmlShare):
|
|
|
|
|
class processingTemplates:
|
|
|
|
|
"""Класс для обработки шаблонов"""
|
|
|
|
|
|
|
|
|
|
def processingFile(self, path, prefix):
|
|
|
|
|
"""Обработка в случае профиля файла"""
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def processingDirectory(self, path, prefix):
|
|
|
|
|
"""Обработка в случае директории если возвращаем None то пропуск дир."""
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def scanningTemplates(self, scanDir, skipFile=[], skipDir=[],
|
|
|
|
|
prefix=None, flagDir=False):
|
|
|
|
|
"""Время последней модификации внутри директории scanDir"""
|
|
|
|
|
ret = True
|
|
|
|
|
if not prefix:
|
|
|
|
|
prefix = os.path.join(scanDir,"")[:-1]
|
|
|
|
|
if not flagDir:
|
|
|
|
|
# проверка корневой директории
|
|
|
|
|
retDir = self.processingDirectory(scanDir, scanDir)
|
|
|
|
|
if retDir is None:
|
|
|
|
|
return None
|
|
|
|
|
elif retDir is False:
|
|
|
|
|
return False
|
|
|
|
|
if flagDir or stat.S_ISDIR(os.lstat(scanDir)[stat.ST_MODE]):
|
|
|
|
|
for fileOrDir in sorted(os.listdir(scanDir)):
|
|
|
|
|
absPath = os.path.join(scanDir,fileOrDir)
|
|
|
|
|
relPath = absPath.split(prefix)[1]
|
|
|
|
|
stInfo = os.lstat(absPath)
|
|
|
|
|
statInfo = stInfo[stat.ST_MODE]
|
|
|
|
|
if stat.S_ISREG(statInfo):
|
|
|
|
|
# Обработка файла
|
|
|
|
|
if relPath in skipFile:
|
|
|
|
|
continue
|
|
|
|
|
if not self.processingFile(absPath, prefix):
|
|
|
|
|
ret = False
|
|
|
|
|
break
|
|
|
|
|
elif stat.S_ISDIR(statInfo):
|
|
|
|
|
# Обработка директории
|
|
|
|
|
if relPath in skipDir:
|
|
|
|
|
continue
|
|
|
|
|
retDir = self.processingDirectory(absPath, prefix)
|
|
|
|
|
if retDir is None:
|
|
|
|
|
continue
|
|
|
|
|
elif retDir is False:
|
|
|
|
|
ret = False
|
|
|
|
|
break
|
|
|
|
|
ret = self.scanningTemplates(absPath, skipFile,
|
|
|
|
|
skipDir, prefix, True)
|
|
|
|
|
if ret is False:
|
|
|
|
|
break
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class profile(_file, _terms, xmlShare, processingTemplates):
|
|
|
|
|
"""Класс для работы с профилями
|
|
|
|
|
|
|
|
|
|
На вход 2 параметра: объект хранения переменных, имя сервиса - не
|
|
|
|
@ -2291,14 +2345,28 @@ class profile(_file, _terms, xmlShare):
|
|
|
|
|
if self._baseDir == "/":
|
|
|
|
|
self._baseDir = ""
|
|
|
|
|
# Последняя часть директории профиля (имя сервиса: samba, mail)
|
|
|
|
|
self._servDir = servDir
|
|
|
|
|
|
|
|
|
|
self._servDir = servDir
|
|
|
|
|
if self._servDir:
|
|
|
|
|
if self._servDir[0] != "/":
|
|
|
|
|
self._servDir = "/" + self._servDir
|
|
|
|
|
if self._servDir[-1] != "/":
|
|
|
|
|
self._servDir += "/"
|
|
|
|
|
self._servDir = os.path.split(self._servDir)[0]
|
|
|
|
|
# Созданные директории
|
|
|
|
|
self.createdDirs = []
|
|
|
|
|
# Примененные файлы
|
|
|
|
|
self.filesApply = []
|
|
|
|
|
# номер обрабатываемого файла
|
|
|
|
|
self.numberProcessProf = 0
|
|
|
|
|
# имя текущей программы
|
|
|
|
|
_nameProgram = self.objVar.Get("cl_name").capitalize()
|
|
|
|
|
# версия текущей программы
|
|
|
|
|
_versionProgram = self.objVar.Get("cl_ver")
|
|
|
|
|
# имя и версия текущей программы
|
|
|
|
|
self.programVersion = "%s %s"%(_nameProgram, _versionProgram)
|
|
|
|
|
# Словарь измененных директорий
|
|
|
|
|
self.changeDirs = {}
|
|
|
|
|
|
|
|
|
|
# Преобразование восьмеричного в целое (ввод строка, вывод число)
|
|
|
|
|
def __octToInt(self, strOct):
|
|
|
|
|
if strOct:
|
|
|
|
@ -2316,6 +2384,7 @@ class profile(_file, _terms, xmlShare):
|
|
|
|
|
"""Рекурсивное удаление директории
|
|
|
|
|
|
|
|
|
|
входной параметр директория
|
|
|
|
|
Обязательно должен быть определен метод self.printERROR
|
|
|
|
|
"""
|
|
|
|
|
if not os.path.exists(rmDir):
|
|
|
|
|
self.printERROR(_("Not found remove dir %s") %rmDir)
|
|
|
|
@ -3164,6 +3233,14 @@ class profile(_file, _terms, xmlShare):
|
|
|
|
|
return False
|
|
|
|
|
dirsProfiles = self.objVar.Get("cl_profile_path")
|
|
|
|
|
dirsProfiles.sort()
|
|
|
|
|
# Словарь измененных директорий
|
|
|
|
|
self.changeDirs = {}
|
|
|
|
|
# Созданные директории
|
|
|
|
|
self.createdDirs = []
|
|
|
|
|
# Примененные файлы
|
|
|
|
|
self.filesApply = []
|
|
|
|
|
# Номер применяемого шаблона
|
|
|
|
|
self.numberProcessProf = 0
|
|
|
|
|
if self._servDir:
|
|
|
|
|
tmpDirsProfiles = []
|
|
|
|
|
for dirP in dirsProfiles:
|
|
|
|
@ -3174,135 +3251,109 @@ class profile(_file, _terms, xmlShare):
|
|
|
|
|
else:
|
|
|
|
|
tmpDirsProfiles.append(False)
|
|
|
|
|
dirsProfiles = tmpDirsProfiles
|
|
|
|
|
dirObjs = self.scanDirs(dirsProfiles,self.objVar)
|
|
|
|
|
#файлы к которым были применены профили
|
|
|
|
|
filesApply = []
|
|
|
|
|
# Словарь измененных директорий
|
|
|
|
|
changeDirs = {}
|
|
|
|
|
#созданные директории
|
|
|
|
|
createdDirs = []
|
|
|
|
|
# Получаем общее количество профилей (нужно для прогресбара)
|
|
|
|
|
allApplyFiles = self.scanProfiles(False, dirObjs)
|
|
|
|
|
if allApplyFiles == False:
|
|
|
|
|
return False
|
|
|
|
|
numberAllProfiles = len(allApplyFiles)
|
|
|
|
|
# Вызываем пустой метод с параметром общее количество профилей
|
|
|
|
|
# тестовое значение количества профилей
|
|
|
|
|
numberAllProfiles = 1000
|
|
|
|
|
self.numberAllProfiles(numberAllProfiles)
|
|
|
|
|
# номер обрабатываемого файла
|
|
|
|
|
numberProcessProfiles = 0
|
|
|
|
|
# имя текущей программы
|
|
|
|
|
_nameProgram = self.objVar.Get("cl_name").capitalize()
|
|
|
|
|
# версия текущей программы
|
|
|
|
|
_versionProgram = self.objVar.Get("cl_ver")
|
|
|
|
|
# имя и версия текущей программы
|
|
|
|
|
programVersion = "%s %s"%(_nameProgram, _versionProgram)
|
|
|
|
|
dirObjsApply = []
|
|
|
|
|
for dirObj in dirObjs:
|
|
|
|
|
dirInfoFile = os.path.join(dirObj.baseDir, self.profDirNameFile)
|
|
|
|
|
ret = self.__isApplyHeadDir(dirInfoFile)
|
|
|
|
|
if ret:
|
|
|
|
|
dirObjsApply.append(dirObj)
|
|
|
|
|
for dirTemplate in dirsProfiles:
|
|
|
|
|
if self.scanningTemplates(dirTemplate,
|
|
|
|
|
skipFile=self.filesFilter,
|
|
|
|
|
skipDir=self.dirsFilter) is False:
|
|
|
|
|
return False
|
|
|
|
|
return (self.createdDirs, self.filesApply)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def processingFile(self, path, prefix):
|
|
|
|
|
"""Обработка в случае профиля файла"""
|
|
|
|
|
self.numberProcessProf += 1
|
|
|
|
|
self.numberProcessProfiles(self.numberProcessProf)
|
|
|
|
|
# Пропуск шаблонов директорий
|
|
|
|
|
if self.profDirNameFile == os.path.split(path)[1]:
|
|
|
|
|
return True
|
|
|
|
|
if self.getNeedProfile(path):
|
|
|
|
|
if self.getError():
|
|
|
|
|
return False
|
|
|
|
|
fileProfileChange = path
|
|
|
|
|
findChangeDir = False
|
|
|
|
|
listD = self.changeDirs.items()
|
|
|
|
|
listD.reverse()
|
|
|
|
|
for dirChangeIn, dirChangeOut in listD:
|
|
|
|
|
st,mid,end = path.partition(dirChangeIn)
|
|
|
|
|
if (not st) and mid and end:
|
|
|
|
|
findChangeDir = True
|
|
|
|
|
break
|
|
|
|
|
if findChangeDir:
|
|
|
|
|
oldFile = dirChangeOut + end
|
|
|
|
|
else:
|
|
|
|
|
if self.getError():
|
|
|
|
|
oldFile = path.partition(prefix)[2]
|
|
|
|
|
# файл в системе без условий
|
|
|
|
|
oldFile = "/".join(map(lambda x:x.split("?")[0],\
|
|
|
|
|
oldFile.split("/")))
|
|
|
|
|
if not findChangeDir:
|
|
|
|
|
oldFile = self._baseDir + oldFile
|
|
|
|
|
# Фильтрация профилей по названию файла
|
|
|
|
|
if oldFile in self.filesFilter:
|
|
|
|
|
return True
|
|
|
|
|
listProfTitle = prefix.split("/")[-2:]
|
|
|
|
|
profTitle = '"' + "/".join(listProfTitle) + '"'
|
|
|
|
|
# Записываем в переменную обрабатываемый файл
|
|
|
|
|
self.objVar.Set("cl_pass_file",oldFile)
|
|
|
|
|
filesApl = self.join(path, oldFile,
|
|
|
|
|
(self.programVersion,profTitle))
|
|
|
|
|
if filesApl:
|
|
|
|
|
self.filesApply += filesApl
|
|
|
|
|
else:
|
|
|
|
|
if self.getError():
|
|
|
|
|
#print self.getError()
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def processingDirectory(self, path, prefix):
|
|
|
|
|
"""Обработка в случае директории если возвращаем None то пропуск дир."""
|
|
|
|
|
# Файл шаблона директории
|
|
|
|
|
dirInfoFile = os.path.join(path, self.profDirNameFile)
|
|
|
|
|
# Проверяем заголовок
|
|
|
|
|
ret = self.__isApplyHeadDir(dirInfoFile)
|
|
|
|
|
if not ret:
|
|
|
|
|
if self.getError():
|
|
|
|
|
self.setError(_("Incorrect profile: " ) + dirInfoFile)
|
|
|
|
|
return False
|
|
|
|
|
return None
|
|
|
|
|
newDir = self._baseDir + path.partition(prefix)[2]
|
|
|
|
|
newDir = "/".join(map(lambda x:x.split("?")[0],\
|
|
|
|
|
newDir.split("/")))
|
|
|
|
|
# Применяем шаблон
|
|
|
|
|
pathDir, objHeadDir = self.__getApplyHeadDir(newDir,
|
|
|
|
|
dirInfoFile,
|
|
|
|
|
self.changeDirs)
|
|
|
|
|
# Фильтрация профилей по названию директории
|
|
|
|
|
if pathDir in self.dirsFilter:
|
|
|
|
|
return None
|
|
|
|
|
if objHeadDir:
|
|
|
|
|
if isinstance(objHeadDir, dirHeader):
|
|
|
|
|
if not objHeadDir.headerCorrect:
|
|
|
|
|
self.setError(_("Incorrect profile: " ) +\
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
self.setError(objHeadDir.errorMessage)
|
|
|
|
|
return False
|
|
|
|
|
for dirObj in dirObjsApply:
|
|
|
|
|
# сортируем файлы по названию
|
|
|
|
|
if dirObj.files:
|
|
|
|
|
dirObj.files.sort()
|
|
|
|
|
# сортируем директории по названию
|
|
|
|
|
if dirObj.dirs:
|
|
|
|
|
dirObj.dirs.sort()
|
|
|
|
|
blockDirs = []
|
|
|
|
|
for dirProfile in dirObj.dirs:
|
|
|
|
|
newDir = self._baseDir + dirProfile.partition(dirObj.baseDir)[2]
|
|
|
|
|
newDir = "/".join(map(lambda x:x.split("?")[0],\
|
|
|
|
|
newDir.split("/")))
|
|
|
|
|
# Проверяем условие на директорию
|
|
|
|
|
dirInfoFile = os.path.join(dirProfile, self.profDirNameFile)
|
|
|
|
|
pathDir, objHeadDir = self.__getApplyHeadDir(newDir,
|
|
|
|
|
dirInfoFile,
|
|
|
|
|
changeDirs)
|
|
|
|
|
# Фильтрация профилей по названию директории
|
|
|
|
|
if pathDir in self.dirsFilter:
|
|
|
|
|
blockDirs.append(dirProfile)
|
|
|
|
|
continue
|
|
|
|
|
if objHeadDir:
|
|
|
|
|
if isinstance(objHeadDir, dirHeader):
|
|
|
|
|
if not objHeadDir.headerCorrect:
|
|
|
|
|
self.setError(_("Incorrect profile: " ) +\
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
self.setError(objHeadDir.errorMessage)
|
|
|
|
|
return False
|
|
|
|
|
if not objHeadDir.headerTerm:
|
|
|
|
|
if objHeadDir.getError():
|
|
|
|
|
self.setError(_("Incorrect profile: " ) +\
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
return False
|
|
|
|
|
if objHeadDir.params.has_key("name"):
|
|
|
|
|
changeDirs[dirProfile] = pathDir
|
|
|
|
|
crDirs = self.createDir(dirObj.baseDir, dirProfile,
|
|
|
|
|
self._baseDir, pathDir)
|
|
|
|
|
if crDirs == False:
|
|
|
|
|
return False
|
|
|
|
|
createdDirs += crDirs
|
|
|
|
|
else:
|
|
|
|
|
if self.getError():
|
|
|
|
|
if not objHeadDir.headerTerm:
|
|
|
|
|
if objHeadDir.getError():
|
|
|
|
|
self.setError(_("Incorrect profile: " ) +\
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
return False
|
|
|
|
|
blockDirs.append(dirProfile)
|
|
|
|
|
for fileProfile in dirObj.files:
|
|
|
|
|
findBlock = False
|
|
|
|
|
for blDir in blockDirs:
|
|
|
|
|
st,mid,end = fileProfile.partition(blDir)
|
|
|
|
|
if (not st) and mid and end:
|
|
|
|
|
findBlock = True
|
|
|
|
|
break
|
|
|
|
|
if findBlock:
|
|
|
|
|
continue
|
|
|
|
|
numberProcessProfiles += 1
|
|
|
|
|
self.numberProcessProfiles(numberProcessProfiles)
|
|
|
|
|
if self.getNeedProfile(fileProfile):
|
|
|
|
|
if self.getError():
|
|
|
|
|
#print self.getError()
|
|
|
|
|
return False
|
|
|
|
|
fileProfileChange = fileProfile
|
|
|
|
|
findChangeDir = False
|
|
|
|
|
listD = changeDirs.items()
|
|
|
|
|
listD.reverse()
|
|
|
|
|
for dirChangeIn, dirChangeOut in listD:
|
|
|
|
|
st,mid,end = fileProfile.partition(dirChangeIn)
|
|
|
|
|
if (not st) and mid and end:
|
|
|
|
|
findChangeDir = True
|
|
|
|
|
break
|
|
|
|
|
if findChangeDir:
|
|
|
|
|
oldFile = dirChangeOut + end
|
|
|
|
|
else:
|
|
|
|
|
oldFile = fileProfile.partition(dirObj.baseDir)[2]
|
|
|
|
|
# файл в системе без условий
|
|
|
|
|
oldFile = "/".join(map(lambda x:x.split("?")[0],\
|
|
|
|
|
oldFile.split("/")))
|
|
|
|
|
if not findChangeDir:
|
|
|
|
|
oldFile = self._baseDir + oldFile
|
|
|
|
|
# Фильтрация профилей по названию файла
|
|
|
|
|
if oldFile in self.filesFilter:
|
|
|
|
|
continue
|
|
|
|
|
listProfTitle = dirObj.baseDir.split("/")[-2:]
|
|
|
|
|
profTitle = '"' + "/".join(listProfTitle) + '"'
|
|
|
|
|
# Записываем в переменную обрабатываемый файл
|
|
|
|
|
self.objVar.Set("cl_pass_file",oldFile)
|
|
|
|
|
filesApl = self.join(fileProfile, oldFile,
|
|
|
|
|
(programVersion,profTitle))
|
|
|
|
|
if filesApl:
|
|
|
|
|
filesApply += filesApl
|
|
|
|
|
else:
|
|
|
|
|
if self.getError():
|
|
|
|
|
#print self.getError()
|
|
|
|
|
return False
|
|
|
|
|
self.closeFiles()
|
|
|
|
|
return (createdDirs, filesApply)
|
|
|
|
|
if objHeadDir.params.has_key("name"):
|
|
|
|
|
self.changeDirs[path] = pathDir
|
|
|
|
|
crDirs = self.createDir(prefix, path,
|
|
|
|
|
self._baseDir, pathDir)
|
|
|
|
|
if crDirs == False:
|
|
|
|
|
return False
|
|
|
|
|
self.createdDirs += crDirs
|
|
|
|
|
else:
|
|
|
|
|
if self.getError():
|
|
|
|
|
self.setError(_("Incorrect profile: " ) +\
|
|
|
|
|
dirInfoFile)
|
|
|
|
|
return False
|
|
|
|
|
return None
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def __getGenHeadDir(self, newDir, profileDirFile, changeDirs):
|
|
|
|
|
"""Определяет название создаваемой директории"""
|
|
|
|
@ -3530,29 +3581,29 @@ class profile(_file, _terms, xmlShare):
|
|
|
|
|
profileDirFile)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Изменяем название директории
|
|
|
|
|
if objHead.params.has_key("name"):
|
|
|
|
|
self.setError (_("Invalid name 'name' in profile: " ) +\
|
|
|
|
|
profileDirFile)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Удаляем директорию
|
|
|
|
|
if objHead.typeAppend == "remove":
|
|
|
|
|
self.setError (_("Invalid name 'remove' in profile: " ) +\
|
|
|
|
|
profileDirFile)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# chmod - изменяем права
|
|
|
|
|
if objHead.params.has_key("chmod"):
|
|
|
|
|
self.setError (_("Invalid name 'chmod' in profile: " ) +\
|
|
|
|
|
profileDirFile)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# chown - изменяем владельца и группу
|
|
|
|
|
if objHead.params.has_key("chown"):
|
|
|
|
|
self.setError (_("Invalid name 'chown' in profile: " ) +\
|
|
|
|
|
profileDirFile)
|
|
|
|
|
return False
|
|
|
|
|
## Изменяем название директории
|
|
|
|
|
#if objHead.params.has_key("name"):
|
|
|
|
|
#self.setError (_("Invalid name 'name' in profile: " ) +\
|
|
|
|
|
#profileDirFile)
|
|
|
|
|
#return False
|
|
|
|
|
|
|
|
|
|
## Удаляем директорию
|
|
|
|
|
#if objHead.typeAppend == "remove":
|
|
|
|
|
#self.setError (_("Invalid name 'remove' in profile: " ) +\
|
|
|
|
|
#profileDirFile)
|
|
|
|
|
#return False
|
|
|
|
|
|
|
|
|
|
## chmod - изменяем права
|
|
|
|
|
#if objHead.params.has_key("chmod"):
|
|
|
|
|
#self.setError (_("Invalid name 'chmod' in profile: " ) +\
|
|
|
|
|
#profileDirFile)
|
|
|
|
|
#return False
|
|
|
|
|
|
|
|
|
|
## chown - изменяем владельца и группу
|
|
|
|
|
#if objHead.params.has_key("chown"):
|
|
|
|
|
#self.setError (_("Invalid name 'chown' in profile: " ) +\
|
|
|
|
|
#profileDirFile)
|
|
|
|
|
#return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def __getApplyHeadDir(self, newDir, profileDirFile, changeDirs):
|
|
|
|
|