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