From 98974f525e23f3d186071304f6c37088fc07e866 Mon Sep 17 00:00:00 2001 From: OneDeadMachine Date: Fri, 14 Aug 2026 09:10:05 +0300 Subject: [PATCH 1/3] feat: add targeted system-state backup and rollback --- README.md | 2 + docs/architecture.md | 21 +- src/W-Fix.App/MainWindow.xaml | 3 + .../ViewModels/MainWindowViewModel.cs | 286 ++++++++++++++---- src/W-Fix.Core/Fixers/DefaultPrinterFixer.cs | 12 +- src/W-Fix.Core/Fixers/Error02Fixer.cs | 13 +- src/W-Fix.Core/Fixers/Error11bFixer.cs | 7 +- src/W-Fix.Core/Fixers/Error4005Fixer.cs | 13 +- src/W-Fix.Core/Fixers/Error709Fixer.cs | 17 +- src/W-Fix.Core/Fixers/Error7eFixer.cs | 23 +- .../Fixers/ISystemStateChangingFixer.cs | 12 + src/W-Fix.Core/Models/SystemStateBackup.cs | 31 ++ src/W-Fix.Core/Properties/AssemblyInfo.cs | 3 + .../Services/SystemStateBackupService.cs | 266 ++++++++++++++++ .../SystemStateBackupServiceTests.cs | 77 +++++ 15 files changed, 727 insertions(+), 59 deletions(-) create mode 100644 src/W-Fix.Core/Fixers/ISystemStateChangingFixer.cs create mode 100644 src/W-Fix.Core/Models/SystemStateBackup.cs create mode 100644 src/W-Fix.Core/Properties/AssemblyInfo.cs create mode 100644 src/W-Fix.Core/Services/SystemStateBackupService.cs create mode 100644 tests/W-Fix.Core.Tests/SystemStateBackupServiceTests.cs diff --git a/README.md b/README.md index 307bcef..60c9887 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ - 🌐 **Удалённые машины** — применяй фиксеры через WinRM/PowerShell Remoting - 🔍 **Обнаружение принтеров** — CIM / WMI / Get-Printer (тройной fallback) - 📋 **Полный лог** — каждый шаг фиксера отображается в реальном времени +- ↩️ **Точечный откат** — снимок изменяемых ключей реестра и кнопка восстановления после фикса - 🗂 **Active Directory** — обзор принтеров в домене --- @@ -99,6 +100,7 @@ W-Fix/ │ │ ├── Services/ │ │ │ ├── WmiService.cs # Обнаружение принтеров (CIM/WMI/PS) │ │ │ ├── PowerShellEngine.cs # Встроенный PS SDK + внешний fallback +│ │ │ ├── SystemStateBackupService.cs # Снимок реестра + restore.ps1 │ │ │ └── FixerRegistry.cs # Регистрация и поиск фиксеров │ │ └── Models/ # PrinterInfo, FixResult, LogEntry ... │ └── W-Fix.App/ # WPF UI (MVVM + CommunityToolkit) diff --git a/docs/architecture.md b/docs/architecture.md index faaa7f2..a9b30bc 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -30,11 +30,28 @@ UI не должен самостоятельно определять успе - Не сообщать `Success`, если обязательный шаг завершился неуспешно. - Не скрывать ошибку обязательного шага за успешным перезапуском Spooler. - Ограничивать удаление файлов только ресурсами подсистемы печати. -- Для потенциально опасных изменений реестра сохранять исходное состояние перед будущей реализацией rollback. +- Каждый фиксер, изменяющий реестр, реализует `ISystemStateChangingFixer` и точно объявляет затрагиваемые + значения, разделы и ACL. Новое изменение реестра без дополнения плана снимка считается дефектом. - Любой новый сценарий должен иметь тестируемую логику определения результата. +## Снимок и откат системного состояния + +Перед запуском изменяющего реестр фиксера `SystemStateBackupService` сохраняет только затрагиваемое состояние, +а не экспортирует реестр целиком. Снимок содержит `state.clixml`, `manifest.json`, при необходимости `.reg`-файлы +и автономный `restore.ps1`. Каталог создаётся на целевой машине в +`%ProgramData%\W-Fix\Backups\<время>_<фиксер>_`. + +Ошибка снимка выводится как заметное предупреждение, но не превращает W-Fix в режим «только диагностики»: +пользовательский ремонт продолжается. После успешного снимка команда **«Откат»** восстанавливает значения, +удаляет значения, которых до исправления не существовало, возвращает ACL и импортирует сохранённые разделы. +После восстановления перезапускается Print Spooler. + +UI сохраняет выбранные фиксер, принтер и компьютер в начале операции. Поэтому смена выбора во время исполнения +не может направить часть одного сценария на другую цель. Повторные загрузки принтеров, очередей и компьютеров +отменяют устаревшие запросы, чтобы поздний ответ не перезаписывал более актуальное состояние. + ## Следующий архитектурный этап Вынести создание сервисов из `MainWindowViewModel` в composition root и ввести интерфейсы исполнителя, обнаружения принтеров и диалогов. Это позволит тестировать фиксеры без реального изменения Windows и добавить -режим предварительного просмотра/отката системных настроек. +интеграционные проверки снимка/отката на изолированной тестовой машине. diff --git a/src/W-Fix.App/MainWindow.xaml b/src/W-Fix.App/MainWindow.xaml index 39c3b3a..11325f4 100644 --- a/src/W-Fix.App/MainWindow.xaml +++ b/src/W-Fix.App/MainWindow.xaml @@ -54,6 +54,9 @@