|
|
|
@ -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):
|
|
|
|
|
# Изменяем владельца файла
|
|
|
|
|