Change module server.utils

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

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

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

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

Loading…
Cancel
Save