Bug 53954

Summary: При замене файла не удаляется старый
Product: Sisyphus Reporter: Vladislav Glinkin <glinkinvd>
Component: gpupdateAssignee: Valery Sinelnikov <greh>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: greh, nir, sin
Version: unstable   
Hardware: x86_64   
OS: Linux   

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, чтобы она учитывала старые параметры и выполняла полную замену в соответствии с ожидаемым поведением.