Рекурсивные права при chown, поддержка сохранения предыдущего chown и
изменение пользователя только для пересоздаваемых файлов
master 3.7.3.15
root 1 year ago
parent 562356200e
commit f35a1ba7b0

@ -4013,7 +4013,9 @@ class Template(_file, _terms, _warning, xmlShare, _shareTemplate):
self.objVar.Get("cl_root_path"))
self._baseDir = os.path.normpath(self._baseDir)
self.base_uid, self.base_gid, self.homeDir = self.getDataUser()
self.deletedFiles = []
self.prevDir = None
self.knownDirs = {}
# Домашняя директория, плюс базовая директория
self.homeDir = pathJoin(self._baseDir, self.homeDir)
if self.cltObj:
@ -4813,6 +4815,19 @@ gettext -d cl_template "$*"
self.objVar.Get('cl_ebuild_phase') == '':
self.dispatchConf(self.filesApply)
def getDirOwner(self, dir_path, prefix):
counter = len(dir_path)
own = (self.base_uid, self.base_gid)
for dir, owner in self.knownDirs.items():
if dir == dir_path:
return owner
if (dir + '/') in dir_path:
# Ищем наиболее приближенный путь из известных
if len(dir_path.split((dir + '/'))[1]) < counter:
counter = len(dir_path.split((dir + '/'))[1])
own = owner
return own
#TODO: skipTemplates=() - horrible antipattern, but im not sure if
# fixin it will break something
def scanningTemplates(self, scanDir, prefix=None, flagDir=False,
@ -4848,12 +4863,7 @@ gettext -d cl_template "$*"
scanDir)
return False
for fileOrDir in sorted(listDirectory(scanDir)):
if self.prevDir and self.prevDir != scanDir:
self.prevDir = scanDir
self.uid, self.gid = self.base_uid, self.base_gid
elif self.prevDir is None:
self.prevDir = scanDir
self.uid, self.gid = self.base_uid, self.base_gid
self.uid, self.gid = self.getDirOwner(scanDir, prefix)
absPath = os.path.join(scanDir, fileOrDir)
if skipTemplates and absPath in skipTemplates:
continue
@ -5296,6 +5306,7 @@ gettext -d cl_template "$*"
if os.path.isdir(removePath):
# удаляем директорию
try:
[self.deletedFiles.append(pathJoin(removePath, x)) for x in listDirectory(removePath)]
removeDir(removePath)
except OSError:
self.setError(
@ -5628,6 +5639,8 @@ gettext -d cl_template "$*"
if self.objVar.Get('cl_protect_use_set') == 'on':
pathOldFile = self.fixNameFileConfig(pathOldFile)
pathOldFile = self.checkOnNewConfigName(pathOldFile)
if not os.path.exists(pathOldFile):
self.deletedFiles.append(pathOldFile)
# буффер для использование в link=
newBuffer = None
applyFiles = [pathOldFile]
@ -5751,6 +5764,7 @@ gettext -d cl_template "$*"
# удаляем файл
newBuffer = ""
try:
self.deletedFiles.append(pathOldFile)
os.remove(pathOldFile)
except OSError:
self.setError(_("Template error") + _(": ") +
@ -5781,6 +5795,7 @@ gettext -d cl_template "$*"
not objHeadNew.params[HParams.Link]):
if os.path.exists(pathOldFile):
try:
self.deletedFiles.append(pathOldFile)
os.remove(pathOldFile)
except OSError:
self.setError(_("Template error") + _(": ") +
@ -5829,6 +5844,7 @@ gettext -d cl_template "$*"
if os.path.exists(pathOldFile):
newBuffer = ""
try:
self.deletedFiles.append(pathOldFile)
os.remove(pathOldFile)
except OSError:
self.setError(_("Template error") + _(": ") +
@ -5903,7 +5919,6 @@ gettext -d cl_template "$*"
else:
uid = self.getUidFromPasswd(strUid)
import pwd
try:
if uid is None:
uid = pwd.getpwnam(strUid).pw_uid
@ -5914,6 +5929,7 @@ gettext -d cl_template "$*"
% HParams.ChangeOwner) + _(": ")
+ nameFileTemplate)
preReturn(pathProg)
return [], False
if strGid.isdigit():
gid = int(strGid)
@ -5939,6 +5955,9 @@ gettext -d cl_template "$*"
nameFileTemplate):
preReturn(pathProg)
return [], False
else:
tempDir = pathJoin('/', *nameFileTemplate.split('/')[:-1])
self.knownDirs[tempDir] = (uid, gid)
else:
self.setError((_("Wrong value '%s' in the template")
% HParams.ChangeOwner) + _(": ")
@ -5958,9 +5977,11 @@ gettext -d cl_template "$*"
return [], False
if HParams.ChangeOwner not in objHeadNew.params and \
HParams.Symbolic not in objHeadNew.params:
# Устанавливаем владельцем конфигурационного файла,
# только для файлов, которые удалялись утилитами
# Устанавливаем владельцем конфигурационного файла
# пользователя по умолчанию (переменная шаблона ur_login)
if os.path.exists(pathOldFile):
# если был chown - будет применен этот пользователь
if os.path.exists(pathOldFile) and pathOldFile in self.deletedFiles:
tUid, tGid = getModeFile(pathOldFile, mode="owner")
if (self.uid, self.gid) != (tUid, tGid):
# Изменяем владельца файла

Loading…
Cancel
Save