diff --git a/pym/cl_template.py b/pym/cl_template.py index ac24b1c..e36d439 100644 --- a/pym/cl_template.py +++ b/pym/cl_template.py @@ -31,7 +31,7 @@ from cl_ldap import ldapFun # Переопределение exit import cl_overriding -from cl_utils import _error, _toUNICODE +from cl_utils import _error, _toUNICODE, getModeFile import cl_lang tr = cl_lang.lang() @@ -1988,25 +1988,12 @@ class _file(_error): self.FO.flush() return True - def getModeFile(self, nameFile): - """Выдает информацию о файле - - права файла, владелец, группа файла (777,test, group) - """ - fd = os.open(nameFile, os.O_RDONLY) - fst = os.fstat(fd) - uid = fst.st_uid - gid = fst.st_gid - mode = stat.S_IMODE(fst.st_mode) - os.close(fd) - return (mode,uid,gid) - def __openNewFile(self, nameFileNew): """Открыть файл шаблона""" FN = False try: FN = open (nameFileNew, "r") - self._mode,self._uid,self._gid = self.getModeFile(nameFileNew) + self._mode,self._uid,self._gid = getModeFile(nameFileNew) except: self.setError (_("not open file:" ) + nameFileNew) return False @@ -3135,7 +3122,7 @@ class template(_file, _terms, xmlShare, templateFormat, _shareTemplate): createDirs.append(prevDir) prevDir = os.path.split(prevDir)[0] try: - tmpMode,dUid,dGid = self.getModeFile(prevDir) + tmpMode,dUid,dGid = getModeFile(prevDir) except OSError: self.setError (_("Not access dir: " ) + prevDir) return False diff --git a/pym/cl_utils.py b/pym/cl_utils.py index fa54d7f..881b8b2 100644 --- a/pym/cl_utils.py +++ b/pym/cl_utils.py @@ -153,3 +153,17 @@ def _toUNICODE(val): return val else: return str(val).decode('UTF-8') + + +def getModeFile(nameFile): + """Выдает информацию о файле + + права файла, владелец, группа файла (777,test, group) + """ + fd = os.open(nameFile, os.O_RDONLY) + fst = os.fstat(fd) + uid = fst.st_uid + gid = fst.st_gid + mode = stat.S_IMODE(fst.st_mode) + os.close(fd) + return (mode,uid,gid) \ No newline at end of file diff --git a/pym/server/utils.py b/pym/server/utils.py index f7ef9b1..653ecb2 100644 --- a/pym/server/utils.py +++ b/pym/server/utils.py @@ -27,7 +27,10 @@ import termios import tty # Работа со временем import time -from cl_utils import scan, getModeFile, getpathenv, runOsCommand + +from shutil import copytree + +from cl_utils import getModeFile, getpathenv, runOsCommand """общие функции серверных программ""" @@ -42,6 +45,7 @@ def dialogYn(message): """Вывод сообщения, ожидание нажатия Y или n если Y - True если n - False""" + def getChar(): fd = sys.stdin.fileno() oldSet = termios.tcgetattr(fd) @@ -49,6 +53,7 @@ def dialogYn(message): char = sys.stdin.read(1) termios.tcsetattr(fd, termios.TCSADRAIN, oldSet) return char + def term(char): if ord(char) == 3: return None @@ -59,6 +64,7 @@ def dialogYn(message): else: char = getChar() return term(char) + sys.stdout.write(message + ":") char = getChar() res = term(char) @@ -86,99 +92,38 @@ def chownR(directory, uid, gid): для всех файлов и директорий внутри directory """ - fileObj = scan() - scanObjs = fileObj.scanDirs([directory]) - # меняем владельца домашней директории - os.chown(directory, uid,gid) - # Меняем владельца директорий - for dirCh in scanObjs[0].dirs: - os.chown(dirCh, uid,gid) - # Меняем владельца файлов - for fileCh in scanObjs[0].files: - os.chown(fileCh, uid,gid) - # Меняем владельца ссылок - for linkCh in scanObjs[0].links: - os.lchown(linkCh[1], uid, gid) + def chownPaths(rootPath, listPath, uid, gid): + for chPath in listPath: + chownPath = os.path.join(rootPath, chPath) + statInfo = os.lstat(chownPath)[stat.ST_MODE] + if stat.S_ISLNK(statInfo): + os.lchown(chownPath, uid, gid) + else: + os.chown(chownPath, uid, gid) + + for root, dirs, files in os.walk(directory): + # меняем владельца директории + os.chown(root, uid, gid) + # Меняем владельца директорий + chownPaths(root, dirs, uid, gid) + # Меняем владельца файлов + chownPaths(root, files, uid, gid) return True -def copyDir(destDir, srcDir): +def copyDir(srcDir, destDir): """Копируем директорию srcDir в destDir При копировании сохраняются владелец, группа, права """ - if os.path.exists(destDir) and not os.listdir(destDir): - os.rmdir(destDir) - if not os.path.exists(destDir): - # Создаем директорию - os.makedirs(destDir) - # Файловый объект - fileObj = scan() - # Сканируем директорию - scanObjs = fileObj.scanDirs([srcDir]) - if not scanObjs: - return True - for dirSrc in scanObjs[0].dirs: - #создаем в домашней директории директории из srcDir - dirName = destDir + dirSrc.split(srcDir)[1] - os.mkdir(dirName) - mode,uid,gid = getModeFile(dirSrc) - os.chown(dirName, uid,gid) - os.chmod(destDir, mode) - # размер файлового буфера в байтах (5Mb) - sizeBuffer = 5242880 - for fileCopy in scanObjs[0].files: - oldFile = destDir + fileCopy.split(srcDir)[1] - #копируем файлы - # Открываем файл - источник - fd = os.open(fileCopy, os.O_RDONLY) - fst = os.fstat(fd) - uid = fst.st_uid - gid = fst.st_gid - mode = stat.S_IMODE(fst.st_mode) - size = fst.st_size - # Открываем файл приемник - fdCr = os.open(oldFile, os.O_CREAT|os.O_WRONLY, mode) - if size: - # Количество циклов копирования - numbCycles = size/sizeBuffer - # Размер остатка файла после выполения циклов копирования - sizeTailFile = size - numbCycles * sizeBuffer - for i in xrange(numbCycles): - # Читаем порцию данных - buff = os.read(fd, sizeBuffer) - # Записываем порцию данных - os.write(fdCr, buff) - # Если есть остаток файла записываем его - if sizeTailFile: - # Читаем остаток файла - buff = os.read(fd, sizeTailFile) - # Записываем остаток файла - os.write(fdCr, buff) - # Закрываем файлы - os.close(fd) - os.close(fdCr) - # Меняем владельца - os.chown(oldFile, uid, gid) - #os.chmod(oldFile, mode) - for linkCreate in scanObjs[0].links: - #копируем ссылки - dst = destDir + linkCreate[1].split(srcDir)[1] - srcDestList = linkCreate[0].split(srcDir) - if len(srcDestList)>1: - src = destDir + srcDestList[1] - else: - src = linkCreate[0] - os.symlink(src,dst) - if os.path.exists(dst): - mode,uid,gid = getModeFile(dst) - #Изменение прав на ссылки - os.lchown(dst, uid, gid) - # Удаляем сокеты - for rmSocket in scanObjs[0].sockets: - os.remove(rmSocket) - mode,uid,gid = getModeFile(srcDir) - os.chmod(destDir, mode) - os.chown(destDir, uid,gid) + def ignoreFile(path, names): + """Игнорирование сокетов при копировании""" + ignore = [] + for name in names: + if stat.S_ISSOCK(os.lstat(os.path.join(path, name))[stat.ST_MODE]): + ignore.append(name) + return ignore + + copytree(srcDir, destDir, ignore=ignoreFile) return True def rawInput(promptText="", inputText=""):