diff --git a/pym/cl_profile.py b/pym/cl_profile.py index ebd6f05..1f763df 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -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):