# 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 = @(); RegImported = $null } # --- If UDC or eDNC is still at placeholder 9999, try to pull the # per-machine .reg backup from the SFLD share and restore all # the eFocas/PPDCS/Hssb config. The tech-typed $NewNumber is still # written last (below), so the restore never clobbers it. --- $current = Get-CurrentMachineNumber $isPlaceholder = (($current.Udc -in @('9999', $null, '')) -or ($current.Ednc -in @('9999', $null, ''))) if ($isPlaceholder -and $NewNumber -ne '9999') { $sharePath = $null $siteCfgPath = 'C:\Enrollment\site-config.json' if (Test-Path $siteCfgPath) { try { $cfg = Get-Content $siteCfgPath -Raw | ConvertFrom-Json $sharePath = $cfg.pcProfiles.'Standard-Machine'.ntlarsBackupSharePath } catch {} } if ($sharePath) { try { . (Join-Path $PSScriptRoot 'Restore-EDncReg.ps1') $mounted = Mount-SFLDShare -SharePath $sharePath -DriveLetter 'V:' if ($mounted) { try { $out.RegImported = Import-EDncRegBackup -SourceRoot 'V:\' -MachineNumber $NewNumber } finally { & net use V: /delete /y 2>$null | Out-Null } } else { Write-Host " Update-MachineNumber: SFLD share unreachable - skipping restore." } } catch { $out.Errors += "ntlars restore failed: $_" } } } # --- 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 { # UDC.exe arg signature: quoted site name (with space), then # dash-prefixed machine number. Example: UDC.exe "West Jefferson" -7605 Start-Process -FilePath $script:UdcExePath -ArgumentList @("`"$Site`"", "-$NewNumber") } catch { $out.Errors += "UDC relaunch failed: $_" } } return $out }