Bug 53954 - При замене файла не удаляется старый
Summary: При замене файла не удаляется старый
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: gpupdate (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Valery Sinelnikov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-04-23 12:52 MSK by Vladislav Glinkin
Modified: 2025-04-24 13:36 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vladislav Glinkin 2025-04-23 12:52:59 MSK
Версия: gpupdate-0.13.2-alt1

Предварительно:
- Настроены механизмы GPUpdate для управления файлами
- Включены экспериментальные политики

Шаги воспроизведения:
1) В GPUI создать файл для пользователя с местом назначения %DesktopDir%/test.txt
2) Выполнить gpupdate на клиентской машине доменным пользователем
3) Изменить ранее созданный файл, поменяв место назначения на %DesktopDir%/test3.txt и действие на "Заменить"
4) Повторить 2 шаг

Фактический результат:
Создан %DesktopDir%/test3.txt, прошлый %DesktopDir%/test.txt не удалён.

Ожидаемый результат:
Создан %DesktopDir%/test3.txt, прошлый %DesktopDir%/test.txt удалён.

====

Метод act() класса Files_cp:
    def act(self):
        if self.action == FileAction.CREATE:
            self._create_action()
        if self.action == FileAction.UPDATE:
            self._update_action()
        if self.action == FileAction.DELETE:
            self._delete_action()
        if self.action == FileAction.REPLACE:
            self._delete_action()
            self._create_action()

Метод _delete_action() класса Files_cp:
    def _delete_action(self):
        list_target = [self.targetPath.name]
        if self.is_pattern(self.targetPath.name) and self.targetPath.parent.exists() and self.targetPath.parent.is_dir():
            list_target = fnmatch.filter([str(x.name) for x in self.targetPath.parent.iterdir() if x.is_file()], self.targetPath.name)
        logdata = dict()
        for targetFile in list_target:
            targetFile = self.targetPath.parent.joinpath(targetFile)
            try:
                if targetFile.exists():
                    targetFile.unlink()
                    logdata['File'] = targetFile
                    log('D193', logdata)

            except Exception as exc:
                logdata['exc'] = exc
                logdata['targetPath'] = self.targetPath
                logdata['targetFile'] = targetFile
                log('D165', logdata)

Информацию о файлах получаем из dconf, но не обрабатываем прошлое значение, из-за чего при self.action == FileAction.REPLACE выполняется только self._create_action(), хотя по задумке старый файл должен удаляться, а новый создаваться.

На нашем вики написано, что "Групповая политика «Файлы» (Files) позволяет проводить операции с файлами: копировать файлы в нужное расположение, удалять, заменять, обновлять (атрибуты) файлов".
В перечне возможностей:
"удалить файл (или несколько файлов в одном каталоге) и заменить его копией файла из исходного каталога;"
Comment 1 Valery Sinelnikov 2025-04-24 13:36:25 MSK
Действительно, в текущей реализации обработки политик при действии REPLACE отсутствует удаление предыдущей версии. Раньше gpupdate не сохранял предыдущие состояния политик, поэтому логика замены ограничивалась только применением новых значений. Теперь, когда в dconf хранятся предыдущие настройки, можно (и нужно) доработать обработку REPLACE, чтобы она учитывала старые параметры и выполняла полную замену в соответствии с ожидаемым поведением.