Modify profile.applyProfiles() method

master
Самоукин Алексей 14 years ago
parent 7386d87c14
commit c702dce70b

@ -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):

Loading…
Cancel
Save