Shared machine-number helper, site-config for OpenText + PreInstall, placeholder type dirs
Three optimization batches from the pipeline audit:
1. Shared Update-MachineNumber.ps1 helper (lib/)
Extracts duplicated machine-number update logic from Configure-PC.ps1,
Check-MachineNumber.ps1, and Set-MachineNumber.ps1 into a shared
dot-sourceable helper at Shopfloor/lib/Update-MachineNumber.ps1.
Exports:
Get-CurrentMachineNumber → @{ Udc = $string; Ednc = $string }
Update-MachineNumber -NewNumber <n> [-Site <s>] → @{ UdcUpdated; EdncUpdated; Errors }
All three consumers now dot-source the helper instead of duplicating
~50 lines each. Set-MachineNumber.ps1 also migrated from inline
Get-SiteConfig to dot-sourcing Get-PCProfile.ps1 for consistency.
2. Site-config integration for remaining scripts
Setup-OpenText.ps1: exclude lists (profiles + shortcuts) now read from
site-config.json opentext section, falling back to West Jefferson
defaults. Inline Get-SiteConfig since the script runs from
C:\PreInstall\installers\opentext\ (can't dot-source Get-PCProfile).
00-PreInstall-MachineApps.ps1: after parsing preinstall.json, scans
InstallArgs for "West Jefferson" and replaces with site-config
siteName if different. Inline Get-SiteConfig for same reason.
3. Placeholder type-specific directories
Created skeleton 01-Setup-*.ps1 scripts for all PC types so the
directory structure is in place and Run-ShopfloorSetup's type-specific
loop has something to iterate over:
Genspect/01-Setup-Genspect.ps1
Keyence/01-Setup-Keyence.ps1
WaxAndTrace/01-Setup-WaxAndTrace.ps1
Lab/01-Setup-Lab.ps1
Each logs a "no type-specific apps configured yet" banner and exits.
Fill in app installs when details are finalized; for share-based
installs, copy the CMM/01-Setup-CMM.ps1 pattern.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,19 @@ $installerDir = Join-Path $preInstallDir "installers"
|
||||
$logDir = "C:\Logs\PreInstall"
|
||||
$logFile = Join-Path $logDir "install.log"
|
||||
|
||||
# --- Inline site-config reader (same pattern as Setup-OpenText.ps1; this script
|
||||
# runs from C:\Enrollment\shopfloor-setup\Shopfloor\ but Get-PCProfile.ps1 may
|
||||
# not be available yet, so keep the lookup self-contained) ---
|
||||
function Get-SiteConfig {
|
||||
$configPath = 'C:\Enrollment\site-config.json'
|
||||
if (-not (Test-Path $configPath)) { return $null }
|
||||
try {
|
||||
return Get-Content $configPath -Raw | ConvertFrom-Json
|
||||
} catch {
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
||||
# --- Setup logging ---
|
||||
# IMPORTANT: do NOT wipe the log on each run. The runner can get killed by an
|
||||
# installer-triggered reboot mid-execution. On the next autologon, the dispatcher
|
||||
@@ -102,6 +115,20 @@ if (-not $config.Applications) {
|
||||
Write-PreInstallLog "Staged installer dir: $installerDir"
|
||||
Write-PreInstallLog "Found $($config.Applications.Count) app entries in preinstall.json"
|
||||
|
||||
# --- Site-name override: replace "West Jefferson" in InstallArgs if site-config says otherwise ---
|
||||
$siteConfig = Get-SiteConfig
|
||||
if ($siteConfig -and $siteConfig.siteName -and $siteConfig.siteName -ne 'West Jefferson') {
|
||||
Write-PreInstallLog "Site config loaded - siteName: $($siteConfig.siteName)"
|
||||
foreach ($app in $config.Applications) {
|
||||
if ($app.InstallArgs -and $app.InstallArgs -match 'West Jefferson') {
|
||||
$app.InstallArgs = $app.InstallArgs -replace 'West Jefferson', $siteConfig.siteName
|
||||
Write-PreInstallLog " Overrode site name in $($app.Name) args: $($app.InstallArgs)"
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Write-PreInstallLog "No site-config override for siteName (using defaults in preinstall.json)"
|
||||
}
|
||||
|
||||
# --- Detection helper (mirrors Simple-Install.ps1's Test-ApplicationInstalled) ---
|
||||
function Test-AppInstalled {
|
||||
param($App)
|
||||
|
||||
@@ -20,46 +20,19 @@ try { Start-Transcript -Path $transcriptPath -Append -Force | Out-Null } catch {
|
||||
Write-Host "Check-MachineNumber.ps1 starting $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
|
||||
Write-Host "Running as: $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)"
|
||||
|
||||
function Get-SiteConfig {
|
||||
$configPath = 'C:\Enrollment\site-config.json'
|
||||
if (-not (Test-Path -LiteralPath $configPath)) {
|
||||
Write-Host "site-config.json not found - using defaults" -ForegroundColor DarkGray
|
||||
return $null
|
||||
}
|
||||
try {
|
||||
return (Get-Content -LiteralPath $configPath -Raw -ErrorAction Stop | ConvertFrom-Json)
|
||||
} catch {
|
||||
Write-Warning "Failed to parse site-config.json: $_"
|
||||
return $null
|
||||
}
|
||||
}
|
||||
$siteConfig = Get-SiteConfig
|
||||
. "$PSScriptRoot\lib\Get-PCProfile.ps1"
|
||||
. "$PSScriptRoot\lib\Update-MachineNumber.ps1"
|
||||
|
||||
Add-Type -AssemblyName Microsoft.VisualBasic
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
|
||||
$taskName = 'Check Machine Number'
|
||||
$udcSettingsPath = 'C:\ProgramData\UDC\udc_settings.json'
|
||||
$udcExePath = 'C:\Program Files\UDC\UDC.exe'
|
||||
$ednRegPath = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'
|
||||
$site = if ($siteConfig) { $siteConfig.siteName } else { 'West Jefferson' }
|
||||
$taskName = 'Check Machine Number'
|
||||
$site = if ($siteConfig) { $siteConfig.siteName } else { 'West Jefferson' }
|
||||
|
||||
# --- Read current values ---
|
||||
$currentUdc = $null
|
||||
$currentEdnc = $null
|
||||
|
||||
if (Test-Path $udcSettingsPath) {
|
||||
try {
|
||||
$json = Get-Content $udcSettingsPath -Raw | ConvertFrom-Json
|
||||
$currentUdc = $json.GeneralSettings.MachineNumber
|
||||
} catch {}
|
||||
}
|
||||
|
||||
if (Test-Path $ednRegPath) {
|
||||
try {
|
||||
$currentEdnc = (Get-ItemProperty -Path $ednRegPath -Name MachineNo -ErrorAction Stop).MachineNo
|
||||
} catch {}
|
||||
}
|
||||
$currentMN = Get-CurrentMachineNumber
|
||||
$currentUdc = $currentMN.Udc
|
||||
$currentEdnc = $currentMN.Ednc
|
||||
|
||||
# --- Check if placeholder ---
|
||||
Write-Host "UDC machine number: $(if ($currentUdc) { $currentUdc } else { '(not found)' })"
|
||||
@@ -111,41 +84,13 @@ if ($new -notmatch '^\d+$') {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# --- Update UDC ---
|
||||
# --- Update via shared helper ---
|
||||
$mnResult = Update-MachineNumber -NewNumber $new -Site $site
|
||||
|
||||
$results = @()
|
||||
if (Test-Path $udcSettingsPath) {
|
||||
# Stop UDC first
|
||||
Get-Process UDC -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
try { $_.Kill(); $_.WaitForExit(5000) | Out-Null } catch {}
|
||||
}
|
||||
Start-Sleep -Seconds 1
|
||||
|
||||
try {
|
||||
$json = Get-Content $udcSettingsPath -Raw | ConvertFrom-Json
|
||||
$json.GeneralSettings.MachineNumber = $new
|
||||
$json | ConvertTo-Json -Depth 99 | Set-Content -Path $udcSettingsPath -Encoding UTF8
|
||||
$results += "UDC updated to $new"
|
||||
} catch {
|
||||
$results += "UDC FAILED: $_"
|
||||
}
|
||||
}
|
||||
|
||||
# --- Update eDNC ---
|
||||
if (Test-Path $ednRegPath) {
|
||||
try {
|
||||
Set-ItemProperty -Path $ednRegPath -Name MachineNo -Value $new -Type String -Force
|
||||
$results += "eDNC updated to $new"
|
||||
} catch {
|
||||
$results += "eDNC FAILED: $_"
|
||||
}
|
||||
}
|
||||
|
||||
# --- Relaunch UDC ---
|
||||
if (Test-Path $udcExePath) {
|
||||
try {
|
||||
Start-Process -FilePath $udcExePath -ArgumentList @('-site', "`"$site`"", '-machine', $new)
|
||||
} catch {}
|
||||
}
|
||||
if ($mnResult.UdcUpdated) { $results += "UDC updated to $new" }
|
||||
if ($mnResult.EdncUpdated) { $results += "eDNC updated to $new" }
|
||||
foreach ($err in $mnResult.Errors) { $results += $err -replace '^', 'FAILED: ' }
|
||||
|
||||
# --- Show result ---
|
||||
$summary = ($results -join "`n") + "`n`nTo apply eDNC changes, restart any running DncMain.exe."
|
||||
|
||||
@@ -31,6 +31,7 @@ Write-Host "Running as: $([System.Security.Principal.WindowsIdentity]::GetCurren
|
||||
# Load site config + PC profile (resolves pc-type.txt + pc-subtype.txt
|
||||
# into a profile from site-config.json's pcProfiles section)
|
||||
. "$PSScriptRoot\lib\Get-PCProfile.ps1"
|
||||
. "$PSScriptRoot\lib\Update-MachineNumber.ps1"
|
||||
|
||||
$startupDir = 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup'
|
||||
$publicDesktop = 'C:\Users\Public\Desktop'
|
||||
@@ -88,25 +89,9 @@ function New-StartupLnk {
|
||||
# Machine number - read current state
|
||||
# ============================================================================
|
||||
|
||||
$udcSettingsPath = 'C:\ProgramData\UDC\udc_settings.json'
|
||||
$udcExePath = 'C:\Program Files\UDC\UDC.exe'
|
||||
$ednRegPath = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'
|
||||
|
||||
$currentUdc = $null
|
||||
$currentEdnc = $null
|
||||
|
||||
if (Test-Path $udcSettingsPath) {
|
||||
try {
|
||||
$json = Get-Content $udcSettingsPath -Raw | ConvertFrom-Json
|
||||
$currentUdc = $json.GeneralSettings.MachineNumber
|
||||
} catch {}
|
||||
}
|
||||
|
||||
if (Test-Path $ednRegPath) {
|
||||
try {
|
||||
$currentEdnc = (Get-ItemProperty -Path $ednRegPath -Name MachineNo -ErrorAction Stop).MachineNo
|
||||
} catch {}
|
||||
}
|
||||
$currentMN = Get-CurrentMachineNumber
|
||||
$currentUdc = $currentMN.Udc
|
||||
$currentEdnc = $currentMN.Ednc
|
||||
|
||||
$needsMachineNumber = ($currentUdc -eq '9999' -or $currentEdnc -eq '9999')
|
||||
|
||||
@@ -296,44 +281,19 @@ if ($needsMachineNumber) {
|
||||
$newNum = $newNum.Trim()
|
||||
|
||||
if ($newNum -and $newNum -match '^\d+$') {
|
||||
$updated = @()
|
||||
$site = if ($siteConfig) { $siteConfig.siteName } else { 'West Jefferson' }
|
||||
$mnResult = Update-MachineNumber -NewNumber $newNum -Site $site
|
||||
|
||||
# Stop UDC before editing its JSON
|
||||
Get-Process UDC -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
try { $_.Kill(); $_.WaitForExit(5000) | Out-Null } catch {}
|
||||
if ($mnResult.UdcUpdated) {
|
||||
Write-Host " UDC : $currentUdc -> $newNum" -ForegroundColor Green
|
||||
$currentUdc = $newNum
|
||||
}
|
||||
Start-Sleep -Seconds 1
|
||||
|
||||
# UDC JSON
|
||||
if (Test-Path $udcSettingsPath) {
|
||||
try {
|
||||
$json = Get-Content $udcSettingsPath -Raw | ConvertFrom-Json
|
||||
$json.GeneralSettings.MachineNumber = $newNum
|
||||
$json | ConvertTo-Json -Depth 99 | Set-Content -Path $udcSettingsPath -Encoding UTF8
|
||||
Write-Host " UDC : $currentUdc -> $newNum" -ForegroundColor Green
|
||||
$updated += 'UDC'
|
||||
$currentUdc = $newNum
|
||||
} catch { Write-Warning " UDC update failed: $_" }
|
||||
}
|
||||
|
||||
# eDNC registry
|
||||
if (Test-Path $ednRegPath) {
|
||||
try {
|
||||
Set-ItemProperty -Path $ednRegPath -Name MachineNo -Value $newNum -Type String -Force
|
||||
Write-Host " eDNC : $currentEdnc -> $newNum" -ForegroundColor Green
|
||||
$updated += 'eDNC'
|
||||
$currentEdnc = $newNum
|
||||
} catch { Write-Warning " eDNC update failed: $_" }
|
||||
}
|
||||
|
||||
# Relaunch UDC
|
||||
if ((Test-Path $udcExePath) -and $updated -contains 'UDC') {
|
||||
try {
|
||||
$site = if ($siteConfig) { $siteConfig.siteName } else { 'West Jefferson' }
|
||||
Start-Process -FilePath $udcExePath -ArgumentList @('-site', "`"$site`"", '-machine', $newNum)
|
||||
Write-Host " UDC.exe relaunched."
|
||||
} catch {}
|
||||
if ($mnResult.EdncUpdated) {
|
||||
Write-Host " eDNC : $currentEdnc -> $newNum" -ForegroundColor Green
|
||||
$currentEdnc = $newNum
|
||||
}
|
||||
foreach ($err in $mnResult.Errors) { Write-Warning " $err" }
|
||||
if ($mnResult.UdcUpdated) { Write-Host " UDC.exe relaunched." }
|
||||
|
||||
$needsMachineNumber = ($currentUdc -eq '9999' -or $currentEdnc -eq '9999')
|
||||
} elseif ($newNum) {
|
||||
|
||||
103
playbook/shopfloor-setup/Shopfloor/lib/Update-MachineNumber.ps1
Normal file
103
playbook/shopfloor-setup/Shopfloor/lib/Update-MachineNumber.ps1
Normal file
@@ -0,0 +1,103 @@
|
||||
# Update-MachineNumber.ps1 - Shared helper for reading and updating the
|
||||
# machine number in UDC and eDNC. Dot-source from any script that needs
|
||||
# machine-number operations:
|
||||
#
|
||||
# . "$PSScriptRoot\lib\Update-MachineNumber.ps1" (from Shopfloor\ scripts)
|
||||
# . "$PSScriptRoot\..\Shopfloor\lib\Update-MachineNumber.ps1" (from Standard\ scripts)
|
||||
# . "$PSScriptRoot\Update-MachineNumber.ps1" (from lib\ scripts)
|
||||
#
|
||||
# Exported functions:
|
||||
# Get-CurrentMachineNumber - returns @{ Udc = $string_or_null; Ednc = $string_or_null }
|
||||
# Update-MachineNumber - updates both, returns @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
|
||||
#
|
||||
# Both handle missing files/keys gracefully (app not installed = skip, not error).
|
||||
|
||||
$script:UdcSettingsPath = 'C:\ProgramData\UDC\udc_settings.json'
|
||||
$script:UdcExePath = 'C:\Program Files\UDC\UDC.exe'
|
||||
$script:EdncRegPath = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'
|
||||
|
||||
function Get-CurrentMachineNumber {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Reads the current machine number from UDC settings JSON and eDNC registry.
|
||||
.OUTPUTS
|
||||
Hashtable with keys Udc ($string or $null) and Ednc ($string or $null).
|
||||
#>
|
||||
$result = @{ Udc = $null; Ednc = $null }
|
||||
|
||||
if (Test-Path $script:UdcSettingsPath) {
|
||||
try {
|
||||
$json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
|
||||
$result.Udc = $json.GeneralSettings.MachineNumber
|
||||
} catch {}
|
||||
}
|
||||
|
||||
if (Test-Path $script:EdncRegPath) {
|
||||
try {
|
||||
$result.Ednc = (Get-ItemProperty -Path $script:EdncRegPath -Name MachineNo -ErrorAction Stop).MachineNo
|
||||
} catch {}
|
||||
}
|
||||
|
||||
return $result
|
||||
}
|
||||
|
||||
function Update-MachineNumber {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Updates UDC + eDNC machine number in one step. Stops UDC before writing,
|
||||
relaunches after.
|
||||
.PARAMETER NewNumber
|
||||
The new machine number (digits only - caller validates).
|
||||
.PARAMETER Site
|
||||
Site name passed to UDC.exe -site argument. Defaults to 'West Jefferson'.
|
||||
.OUTPUTS
|
||||
Hashtable: @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[string]$NewNumber,
|
||||
|
||||
[string]$Site = 'West Jefferson'
|
||||
)
|
||||
|
||||
$out = @{ UdcUpdated = $false; EdncUpdated = $false; Errors = @() }
|
||||
|
||||
# --- Stop UDC before editing its JSON (avoid stale shutdown write) ---
|
||||
Get-Process UDC -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
try { $_.Kill(); $_.WaitForExit(5000) | Out-Null } catch {}
|
||||
}
|
||||
Start-Sleep -Seconds 1
|
||||
|
||||
# --- Update UDC settings JSON ---
|
||||
if (Test-Path $script:UdcSettingsPath) {
|
||||
try {
|
||||
$json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
|
||||
$json.GeneralSettings.MachineNumber = $NewNumber
|
||||
$json | ConvertTo-Json -Depth 99 | Set-Content -Path $script:UdcSettingsPath -Encoding UTF8
|
||||
$out.UdcUpdated = $true
|
||||
} catch {
|
||||
$out.Errors += "UDC update failed: $_"
|
||||
}
|
||||
}
|
||||
|
||||
# --- Update eDNC registry ---
|
||||
if (Test-Path $script:EdncRegPath) {
|
||||
try {
|
||||
Set-ItemProperty -Path $script:EdncRegPath -Name MachineNo -Value $NewNumber -Type String -Force
|
||||
$out.EdncUpdated = $true
|
||||
} catch {
|
||||
$out.Errors += "eDNC update failed: $_"
|
||||
}
|
||||
}
|
||||
|
||||
# --- Relaunch UDC with new args ---
|
||||
if ((Test-Path $script:UdcExePath) -and $out.UdcUpdated) {
|
||||
try {
|
||||
Start-Process -FilePath $script:UdcExePath -ArgumentList @('-site', "`"$Site`"", '-machine', $NewNumber)
|
||||
} catch {
|
||||
$out.Errors += "UDC relaunch failed: $_"
|
||||
}
|
||||
}
|
||||
|
||||
return $out
|
||||
}
|
||||
Reference in New Issue
Block a user