Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,34 @@

All notable changes to this project will be documented in this file.

## Unreleased
## 26.8.5.1 - August 5, 2026

## [26.8.1.1] - 2026-07-06
### Added

- **New private core operating system module helpers** — Added `Private/core-operatingsystem/Get-ModuleCoreOperatingSystems.ps1` and `Private/core-operatingsystem/Get-OSDCloudCoreOperatingSystems.ps1` to support normalized operating system catalog parsing for core selection and deployment workflows.
- **New private core device cache helpers** — Added `Private/core-device/Get-OSDCoreCacheDrive.ps1`, `Private/core-device/Get-OSDCoreCacheUSBPath.ps1`, and `Private/core-device/Test-OSDCoreCacheUSB.ps1`.

### Changed

- **Core operating system helper reorganization** — Moved operating system helper implementations into `Private/core-operatingsystem`, including `Get-OSDCoreOperatingSystems`, `Set-OSDCoreOperatingSystemCloudObject`, and `dev/Get-OSDCloudDefaultOS`.
- **Core driver pack helper reorganization** — Moved `Get-OSDCoreDriverPacks` implementation from `Public/core` to `Private/core-driverpack` as `Get-ModuleCoreDriverPacks`.
- **Core device/cache helper reorganization** — Moved cache and device implementations into `Private/core-device`, including `Get-OSDCoreCacheContent`, `Initialize-OSDCoreDevice`, and `Sync-OSDCoreDateTime`.
- **Recast USB cache updater relocation** — Moved `Update-RecastOSDCloudUSBCache` implementation from `Public/core-recast` to `Private/core-device`.
- **Recast CLI/GUI driver pack lookup update** — Updated `Start-RecastOSDCloudCLI` and `Start-RecastOSDCloudGUI` to use `Get-ModuleCoreDriverPacks` for manufacturer override resolution.
- **Module manifest metadata refresh** (`OSD.psd1`) — Bumped module version to `26.8.5.1` and replaced the module description with a multi-line summary that references `recastsoftware.com`.
- **Export surface cleanup** (`OSD.psd1`) — Removed direct exports for cache, device, driver pack catalog, and USB cache update commands that were migrated to internal/private implementations.
Comment on lines +19 to +20
- **Help and docs refresh** — Updated `docs/Get-OSDCoreOperatingSystems.md` with expanded description/examples and regenerated `en-US/OSD-help.xml` to align with the refactored command surface.

### Removed

- **Deprecated generated docs for migrated internal commands** — Removed generated docs for cache, driver pack catalog, device initialization, USB cache test, and USB cache update command topics under `docs` (for example: `Get-OSDCoreCacheContent`, `Get-OSDCoreCacheDrive`, `Get-OSDCoreCacheUSBPath`, `Get-OSDCoreDriverPacks`, `Initialize-OSDCoreDevice`, `Test-OSDCoreCacheUSB`, `Update-RecastOSDCloudUSBCache`).

## 26.8.1.1 - August 1, 2026

### Changed

- **`Invoke-OSDCloud` analytics instrumentation** (`Public/OSDCloud.ps1`) — Added deployment analytics event handling in the launch validation flow, including privacy-safe hashed device UUID generation for correlation and expanded deployment telemetry property collection.
- **`OSD.psd1`** — Bumped module version to `26.8.1.1` and updated generated-on date to `2026-07-06`.
- **`OSD.psd1`** — Bumped module version to `26.8.1.1`.

## 26.7.22.1 - July 22, 2026

Expand Down
20 changes: 5 additions & 15 deletions OSD.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@
@{
# --- Identity ---
RootModule = 'OSD.psm1'
ModuleVersion = '26.8.2.1'
ModuleVersion = '26.8.5.1'
CompatiblePSEditions = @('Core', 'Desktop')
Comment on lines +11 to 12
GUID = '9fe5b9b6-0224-4d87-9018-a8978529f6f5'

# --- Authoring ---
Author = 'David Segura'
CompanyName = 'Recast Software'
Copyright = '(c) 2026 Recast Software. All rights reserved.'
Description = 'Root module for OSD.'
Description = @'
PowerShell module for OSD and OSDCloud v1 deployment automation from recastsoftware.com.
Includes operating system, driver pack, and device provisioning workflows.
'@

# --- Requirements ---
PowerShellVersion = '5.1'
Expand All @@ -33,22 +36,9 @@
'Show-OSDCoreLicenseHelp',
# RecastOSDCloud
'Start-RecastOSDCloudCLI',
'Update-RecastOSDCloudUSBCache',
# OSDCoreCache
'Get-OSDCoreCacheContent',
'Get-OSDCoreCacheDrive',
'Get-OSDCoreCacheUSBPath',
'Test-OSDCoreCacheUSB',
# OSDCoreDevice
'Initialize-OSDCoreDevice',
'Get-OSDCoreDeploymentDisk',
Comment on lines 36 to 40
# OSDCoreDriverPack
'Get-OSDCoreDriverPackCatalogDell',
'Get-OSDCoreDriverPackCatalogHP',
'Get-OSDCoreDriverPackCatalogLenovo',
'Get-OSDCoreDriverPackCatalogPanasonic',
'Get-OSDCoreDriverPackCatalogSurface',
'Get-OSDCoreDriverPacks',
'Test-OSDCoreDriverPackCloudObject',
# OSDCoreOperatingSystem
'Get-OSDCoreOperatingSystems',
Expand Down
2 changes: 1 addition & 1 deletion Private/core-dev/Start-RecastOSDCloudGUI.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ function Start-RecastOSDCloudGUI {
# Resolve driver pack metadata for the detected device, with optional manufacturer overrides supplied by the caller.
if ($PSBoundParameters.ContainsKey('OSDManufacturer')) {
$global:OSDCoreDevice.OSDManufacturer = $OSDManufacturer
$global:OSDCoreDriverPacks = Get-OSDCoreDriverPacks -OSDManufacturer $OSDManufacturer
$global:OSDCoreDriverPacks = Get-ModuleCoreDriverPacks -OSDManufacturer $OSDManufacturer
}

# Resolve driver pack metadata for the detected device, with optional model overrides supplied by the caller.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,287 +317,3 @@ function Get-OSDCoreCacheContent {

return $result
}
function Get-OSDCoreCacheDrive {
<#
.SYNOPSIS
Returns OSDCloud cache drive metadata from local file system drives.

.DESCRIPTION
Enumerates mounted file system drives that contain an OSDCloud cache path
and returns only USB, DriveRoot, VolumeLabel, and VolumeUniqueId properties.

.PARAMETER Include
Optional list of drive letters to include when searching for OSDCloud cache
paths. Accepts values such as 'C', 'D:', or 'E:\'.

When omitted, all mounted file system drive letters are considered.

.PARAMETER Exclude
Optional list of drive letters to exclude when searching for OSDCloud cache
paths. Accepts values such as 'C', 'D:', or 'E:\'.

Excluded drives are skipped even when they are also present in Include.

.OUTPUTS
System.Object[]. Objects with USB, DriveRoot, VolumeLabel, and VolumeUniqueId.

.EXAMPLE
Get-OSDCoreCacheDrive

Returns OSDCloud cache drive metadata for all mounted file system drives.

.EXAMPLE
Get-OSDCoreCacheDrive -Include C,D -Exclude D

Returns OSDCloud cache drive metadata only for drive C.

.LINK
https://github.com/OSDeploy/OSD/tree/master/docs

.NOTES
Author: David Segura - Recast Software
2026-07-18 - Initial function created
#>
[CmdletBinding()]
[OutputType([System.Object[]])]
param (
[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Include,

[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Exclude
)

function Get-DriveVolumeMetadata {
param(
[Parameter(Mandatory)]
[string]$DriveRoot
)

$volume = $null
$usb = $false
if ($DriveRoot -match '^[A-Z]:\\$') {
try {
$driveLetter = $DriveRoot.Substring(0, 1)
$volume = Get-Volume -DriveLetter $driveLetter -ErrorAction Stop
$usb = [bool](Get-Disk -ErrorAction SilentlyContinue |
Where-Object { $_.BusType -eq 'USB' } |
Get-Partition -ErrorAction SilentlyContinue |
Where-Object { $_.DriveLetter -eq $driveLetter })
} catch {
$volume = $null
$usb = $false
}
}

[PSCustomObject]@{
USB = [bool]$usb
DriveRoot = $DriveRoot
VolumeLabel = if ($volume) { [string]$volume.FileSystemLabel } else { $null }
VolumeUniqueId = if ($volume) { [string]$volume.UniqueId } else { $null }
}
}

function ConvertTo-DriveLetterList {
param(
[Parameter()]
[string[]]$DriveLetters
)

$normalized = foreach ($driveLetter in $DriveLetters) {
if ([string]::IsNullOrWhiteSpace($driveLetter)) {
continue
}

$value = $driveLetter.Trim().TrimEnd('\\')
if ($value.Length -lt 1) {
continue
}

$letter = $value.Substring(0, 1).ToUpperInvariant()
if ($letter -match '^[A-Z]$') {
$letter
}
}

@($normalized | Sort-Object -Unique)
}

$includedDriveLetters = ConvertTo-DriveLetterList -DriveLetters $Include
$excludedDriveLetters = ConvertTo-DriveLetterList -DriveLetters $Exclude

$result = Get-PSDrive -PSProvider FileSystem |
Where-Object { $_.Root -match '^[A-Z]:\\$' } |
Where-Object {
$driveLetter = ([string]$_.Root).Substring(0, 1).ToUpperInvariant()
(($includedDriveLetters.Count -eq 0) -or ($driveLetter -in $includedDriveLetters)) -and
($driveLetter -notin $excludedDriveLetters)
} |
ForEach-Object {
$driveRoot = [string]$_.Root
$osdCloudPath = Join-Path -Path $driveRoot -ChildPath 'OSDCloud'

if (Test-Path -LiteralPath $osdCloudPath) {
Get-DriveVolumeMetadata -DriveRoot $driveRoot
}
}

return @($result | Sort-Object -Property DriveRoot -Unique)
}
function Get-OSDCoreCacheUSBPath {
<#
.SYNOPSIS
Returns OSDCloud cache paths located on USB drives.

.DESCRIPTION
Uses Get-OSDCoreCacheDrive to enumerate OSDCloud cache drives and returns
the OSDCloud directory path for each discovered cache drive where USB is true,
the file system is NTFS or exFAT, and more than the specified free space is available.

.PARAMETER Include
Optional list of drive letters to include when searching for OSDCloud cache
drives. Accepts values such as 'C', 'D:', or 'E:\'.

When omitted, all mounted file system drive letters are considered.

.PARAMETER Exclude
Optional list of drive letters to exclude when searching for OSDCloud cache
drives. Accepts values such as 'C', 'D:', or 'E:\'.

Excluded drives are skipped even when they are also present in Include.

.PARAMETER SizeRemaining
Optional minimum free space required on the USB cache drive, in GB.

The default is 10 GB.

.OUTPUTS
System.String[]. OSDCloud directory paths located on USB drives with more
than the specified GB free and an NTFS or exFAT file system.

.EXAMPLE
Get-OSDCoreCacheUSBPath

Returns OSDCloud directory paths for all discovered USB cache drives with more than 10 GB free and an NTFS or exFAT file system.

.EXAMPLE
Get-OSDCoreCacheUSBPath -Include D

Returns the OSDCloud directory path when drive D contains an OSDCloud cache path, is a USB drive, has more than 10 GB free, and is formatted NTFS or exFAT.

.EXAMPLE
Get-OSDCoreCacheUSBPath -SizeRemaining 20

Returns OSDCloud directory paths for discovered USB cache drives with more than 20 GB free and an NTFS or exFAT file system.

.LINK
https://github.com/OSDeploy/OSD/tree/master/docs

.NOTES
Author: David Segura - Recast Software
2026-07-18 - Initial function created
#>
[CmdletBinding()]
[OutputType([System.String[]])]
param (
[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Include,

[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Exclude,

[Parameter()]
[ValidateRange(0, [int]::MaxValue)]
[int]$SizeRemaining = 10
)

$cacheDriveParameters = @{}
if ($PSBoundParameters.ContainsKey('Include')) {
$cacheDriveParameters.Include = $Include
}
if ($PSBoundParameters.ContainsKey('Exclude')) {
$cacheDriveParameters.Exclude = $Exclude
}

$minimumSizeRemaining = [int64]$SizeRemaining * 1GB

$cacheUsb = Get-OSDCoreCacheDrive @cacheDriveParameters |
Where-Object {
$volume = $null
if ($_.USB -and $_.DriveRoot -match '^([A-Z]):\\$') {
try {
$volume = Get-Volume -DriveLetter $Matches[1] -ErrorAction Stop
} catch {
$volume = $null
}
}

$volume -and
($volume.FileSystem -in @('NTFS', 'exFAT')) -and
([int64]$volume.SizeRemaining -gt $minimumSizeRemaining)
} |
ForEach-Object { Join-Path -Path $_.DriveRoot -ChildPath 'OSDCloud' }

return @($cacheUsb | Sort-Object -Unique)
}
function Test-OSDCoreCacheUSB {
<#
.SYNOPSIS
Tests whether any OSDCloud cache drive is a USB drive.

.DESCRIPTION
Uses Get-OSDCoreCacheDrive to enumerate OSDCloud cache drives and returns
true when at least one discovered cache drive has USB set to true.

.PARAMETER Include
Optional list of drive letters to include when searching for OSDCloud cache
drives. Accepts values such as 'C', 'D:', or 'E:\'.

When omitted, all mounted file system drive letters are considered.

.PARAMETER Exclude
Optional list of drive letters to exclude when searching for OSDCloud cache
drives. Accepts values such as 'C', 'D:', or 'E:\'.

Excluded drives are skipped even when they are also present in Include.

.OUTPUTS
System.Boolean. True when an OSDCloud cache drive is on USB; otherwise false.

.EXAMPLE
Test-OSDCoreCacheUSB

Returns true if any discovered OSDCloud cache drive is a USB drive.

.EXAMPLE
Test-OSDCoreCacheUSB -Include D

Returns true if drive D contains an OSDCloud cache path and is a USB drive.

.LINK
https://github.com/OSDeploy/OSD/tree/master/docs

.NOTES
Author: David Segura - Recast Software
2026-07-18 - Initial function created
#>
[CmdletBinding()]
[OutputType([System.Boolean])]
param (
[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Include,

[Parameter()]
[ValidatePattern('^[a-zA-Z](:\\)?$|^[a-zA-Z]$')]
[string[]]$Exclude
)

$cacheDrive = @(Get-OSDCoreCacheDrive @PSBoundParameters | Where-Object { $_.USB })

return [bool]($cacheDrive.Count -gt 0)
}
Loading