Change module server.utils

develop
Самоукин Алексей 14 years ago
parent ed6e997bd4
commit 381d96024e

@ -31,7 +31,7 @@ from cl_ldap import ldapFun
# Переопределение exit # Переопределение exit
import cl_overriding import cl_overriding
from cl_utils import _error, _toUNICODE from cl_utils import _error, _toUNICODE, getModeFile
import cl_lang import cl_lang
tr = cl_lang.lang() tr = cl_lang.lang()
@ -1988,25 +1988,12 @@ class _file(_error):
self.FO.flush() self.FO.flush()
return True 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): def __openNewFile(self, nameFileNew):
"""Открыть файл шаблона""" """Открыть файл шаблона"""
FN = False FN = False
try: try:
FN = open (nameFileNew, "r") FN = open (nameFileNew, "r")
self._mode,self._uid,self._gid = self.getModeFile(nameFileNew) self._mode,self._uid,self._gid = getModeFile(nameFileNew)
except: except:
self.setError (_("not open file:" ) + nameFileNew) self.setError (_("not open file:" ) + nameFileNew)
return False return False
@ -3135,7 +3122,7 @@ class template(_file, _terms, xmlShare, templateFormat, _shareTemplate):
createDirs.append(prevDir) createDirs.append(prevDir)
prevDir = os.path.split(prevDir)[0] prevDir = os.path.split(prevDir)[0]
try: try:
tmpMode,dUid,dGid = self.getModeFile(prevDir) tmpMode,dUid,dGid = getModeFile(prevDir)
except OSError: except OSError:
self.setError (_("Not access dir: " ) + prevDir) self.setError (_("Not access dir: " ) + prevDir)
return False return False

@ -153,3 +153,17 @@ def _toUNICODE(val):
return val return val
else: else:
return str(val).decode('UTF-8') 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)

@ -27,7 +27,10 @@ import termios
import tty import tty
# Работа со временем # Работа со временем
import time 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 или n
если Y - True если n - False""" если Y - True если n - False"""
def getChar(): def getChar():
fd = sys.stdin.fileno() fd = sys.stdin.fileno()
oldSet = termios.tcgetattr(fd) oldSet = termios.tcgetattr(fd)
@ -49,6 +53,7 @@ def dialogYn(message):
char = sys.stdin.read(1) char = sys.stdin.read(1)
termios.tcsetattr(fd, termios.TCSADRAIN, oldSet) termios.tcsetattr(fd, termios.TCSADRAIN, oldSet)
return char return char
def term(char): def term(char):
if ord(char) == 3: if ord(char) == 3:
return None return None
@ -59,6 +64,7 @@ def dialogYn(message):
else: else:
char = getChar() char = getChar()
return term(char) return term(char)
sys.stdout.write(message + ":") sys.stdout.write(message + ":")
char = getChar() char = getChar()
res = term(char) res = term(char)
@ -86,99 +92,38 @@ def chownR(directory, uid, gid):
для всех файлов и директорий внутри directory для всех файлов и директорий внутри directory
""" """
fileObj = scan() def chownPaths(rootPath, listPath, uid, gid):
scanObjs = fileObj.scanDirs([directory]) for chPath in listPath:
# меняем владельца домашней директории chownPath = os.path.join(rootPath, chPath)
os.chown(directory, uid,gid) statInfo = os.lstat(chownPath)[stat.ST_MODE]
# Меняем владельца директорий if stat.S_ISLNK(statInfo):
for dirCh in scanObjs[0].dirs: os.lchown(chownPath, uid, gid)
os.chown(dirCh, uid,gid) else:
# Меняем владельца файлов os.chown(chownPath, uid, gid)
for fileCh in scanObjs[0].files:
os.chown(fileCh, uid,gid) for root, dirs, files in os.walk(directory):
# Меняем владельца ссылок # меняем владельца директории
for linkCh in scanObjs[0].links: os.chown(root, uid, gid)
os.lchown(linkCh[1], uid, gid) # Меняем владельца директорий
chownPaths(root, dirs, uid, gid)
# Меняем владельца файлов
chownPaths(root, files, uid, gid)
return True return True
def copyDir(destDir, srcDir): def copyDir(srcDir, destDir):
"""Копируем директорию srcDir в destDir """Копируем директорию srcDir в destDir
При копировании сохраняются владелец, группа, права При копировании сохраняются владелец, группа, права
""" """
if os.path.exists(destDir) and not os.listdir(destDir): def ignoreFile(path, names):
os.rmdir(destDir) """Игнорирование сокетов при копировании"""
if not os.path.exists(destDir): ignore = []
# Создаем директорию for name in names:
os.makedirs(destDir) if stat.S_ISSOCK(os.lstat(os.path.join(path, name))[stat.ST_MODE]):
# Файловый объект ignore.append(name)
fileObj = scan() return ignore
# Сканируем директорию
scanObjs = fileObj.scanDirs([srcDir]) copytree(srcDir, destDir, ignore=ignoreFile)
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)
return True return True
def rawInput(promptText="", inputText=""): def rawInput(promptText="", inputText=""):

Loading…
Cancel
Save