diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ebbe55..f4d24e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [5.3.0] - 2026-10-08 + ### Changed - All Boolean configuration switches now accept `$true`/`$false` **and** `1`/`0`, and reject every other value with a clear error naming the property. Previously the `Reboot`, `Remoting` and `Execution` switches (`Reboot.Enable`, `Reboot.Force`, `Remoting.AllowFallback`, `Execution.InteractiveSequences`) enforced a strict `[bool]` type and threw on `1`, while the older flags (`Binaries.ProductUpdate`, `Binaries.ShutdownServices`, `MountContentDatabase`, `UpgradeContentDatabase`, `SideBySideToken.Enable`) silently coerced any truthy value (so `1` worked but so did a typo like `'false'`, which evaluates to `$true`). A shared `ConvertTo-SPSConfigBoolean` helper now validates and normalizes every switch consistently. ([#76](https://github.com/luigilink/SPSUpdate/issues/76)) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 31695f1..25afd1d 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,20 +1,18 @@ # SPSUpdate - Release Notes -## [5.2.0] - 2026-10-07 +## [5.3.0] - 2026-10-08 -SPSUpdate 5.2.0 refines the automatic reboot and the live patching dashboard introduced in 5.1.0. -The one-shot reboot-confirmation boot task now runs as `NT AUTHORITY\SYSTEM` (no stored -credential), a deferred reboot already performed out-of-band is reconciled instead of restarting -the server again, and the Binaries Installation card shows the real live patch status right after a -`ProductUpdate` installs a cumulative update. +SPSUpdate 5.3.0 harmonizes how every Boolean switch in the environment configuration is parsed. -### Changed - -- **Reboot-confirmation task runs as SYSTEM.** The one-shot `SPSUpdate-RebootConfirm` boot task now runs as `NT AUTHORITY\SYSTEM` instead of the farm InstallAccount decrypted from `secrets.psd1`, removing the stored-credential dependency that could abort the reboot at task registration (`0x8007052E`) and decoupling the reboot from password rotation. `Add-SPSScheduledTask` gains a `-RunAsSystem` switch (mutually exclusive with `-ExecuteAsCredential`). Because a SYSTEM task reaches a UNC status store as the computer account, grant the farm computer accounts (e.g. `Domain Computers`) Modify on the share — add them to `New-SPSDashboardSite.ps1 -WriteAccounts`; `-Action ConfirmReboot` logs a clear, actionable warning when the grant is missing. ([#64](https://github.com/luigilink/SPSUpdate/issues/64)) +Previously the `Reboot`, `Remoting` and `Execution` switches (`Reboot.Enable`, `Reboot.Force`, +`Remoting.AllowFallback`, `Execution.InteractiveSequences`) enforced a strict `[bool]` type and +threw on `Reboot.Enable = 1`, while the older flags (`Binaries.ProductUpdate`, +`Binaries.ShutdownServices`, `MountContentDatabase`, `UpgradeContentDatabase`, +`SideBySideToken.Enable`) silently coerced any truthy value — so `1` worked on those, but so did a +typo such as `'false'`, which evaluates to `$true`. -### Added +### Changed -- **Out-of-band reboot reconciliation.** A deferred automatic reboot that was already performed outside SPSUpdate (a manual restart or a Windows Update reboot) is now reconciled instead of restarting the server again: when a `.pending` reboot request predates the server's last boot time, `Invoke-SPSAutomaticReboot` marks the Reboot phase `Done` ("Reboot already completed out-of-band"), clears the pending marker and skips the restart. A fresh reboot required by an install performed in the same run is unaffected. ([#68](https://github.com/luigilink/SPSUpdate/issues/68)) -- **Live patch status after `ProductUpdate`.** `-Action ProductUpdate` now refreshes the installed server's live patch status on the Binaries Installation card after the cumulative update is installed, so the column reflects the real post-install state (typically `Upgrade Required` until the Configuration Wizard runs) instead of keeping the pre-install value until the next `Default` run. It reuses the same master-side patch-status read as the `Default` baseline (no remoting) and is status-only. A failed read preserves the last-known-good value. ([#59](https://github.com/luigilink/SPSUpdate/issues/59)) +- **All nine Boolean configuration switches now behave the same.** Each one accepts `$true` / `$false` **or** the integers `1` / `0` (`1` = `$true`, `0` = `$false`), and rejects every other value (an out-of-range number, or a string such as `'yes'` / `'false'`) with a clear error naming the property. A shared, unit-tested `ConvertTo-SPSConfigBoolean` helper validates and normalizes every switch, and `Test-SPSUpdateReadiness` applies the same contract at pre-flight time (a bad value is reported as a readiness failure). This also hardens the previously unguarded flags against typos. ([#76](https://github.com/luigilink/SPSUpdate/issues/76)) A full list of changes in each version can be found in the [change log](CHANGELOG.md) diff --git a/src/Modules/SPSUpdate.Common/SPSUpdate.Common.psd1 b/src/Modules/SPSUpdate.Common/SPSUpdate.Common.psd1 index 42a0753..498b225 100644 --- a/src/Modules/SPSUpdate.Common/SPSUpdate.Common.psd1 +++ b/src/Modules/SPSUpdate.Common/SPSUpdate.Common.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'SPSUpdate.Common.psm1' - ModuleVersion = '5.2.0' + ModuleVersion = '5.3.0' GUID = 'd6f4e2b7-3a1c-4d8e-9f2a-6c5b7e0a1d34' Author = 'Jean-Cyril DROUHIN' CompanyName = 'luigilink'