OpenText: track Setup-OpenText scripts in repo, opt-in KillAfterDetection
Two related fixes from a debugging round on the test PC:
1. PreInstall runner: detection-during-install kill is now opt-in via
"KillAfterDetection: true" on JSON entries that need it. Old behavior
killed any installer as soon as its detection passed - which broke
Oracle: Oracle creates its registry key partway through install,
the runner detected it at the 25s poll, killed msiexec mid-install,
and msiserver was still doing rollback when the next install (VC++
2008) started - so VC++ 2008 hit ERROR_INSTALL_ALREADY_RUNNING
(1618). Only UDC needs the detection-kill (its installer spawns a
hidden WPF window and never exits). Other installers exit cleanly
on their own and shouldn't be killed.
2. Track Setup-OpenText scripts in git. The bundled OpenText install
scripts (Setup-OpenText.ps1, Setup-OpenText.cmd, version.txt) live
at runtime in /home/camp/pxe-images/main/dependencies/opentext/
alongside the binary install files (~106 MB of MSI/CAB/MSP/MST plus
profile content). The binaries stay outside git but the script
logic and version stamp are mirrored into playbook/preinstall/
opentext/ here so git history captures changes to the install
logic and version bumps. README.md explains the workflow.
Latest Setup-OpenText.ps1 includes:
- $SourceDir default moved into script body (PowerShell evaluates
param([string]$X = $PSScriptRoot) defaults at parameter-binding
time, when $PSScriptRoot may not yet be populated, so the
default came out as empty string and Join-Path crashed)
- Logging set up FIRST so any startup error gets captured
- REBOOT=ReallySuppress dropped from both msiexec calls (base MSI
and SP1 patch) - OpenText installs shell extensions that hook
explorer.exe, and Restart Manager closes explorer to replace
the shell DLLs. With REBOOT=ReallySuppress, RM closed explorer
but interpreted the relaunch as a "reboot action" and refused
to do it, leaving the user with no desktop. /norestart on its
own prevents the actual Windows reboot but lets RM cleanly
close-and-relaunch explorer mid-install.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -244,11 +244,17 @@ foreach ($app in $config.Applications) {
|
||||
while ($elapsed -lt $timeoutSec) {
|
||||
if ($proc.HasExited) { break }
|
||||
|
||||
# If detection passes mid-install, the installer already did its job -
|
||||
# we can kill any zombie process (like UDC_Setup.exe waiting on its hidden
|
||||
# WPF window) and move on.
|
||||
if (Test-AppInstalled -App $app) {
|
||||
Write-PreInstallLog " Detection passed at $elapsed s - killing installer to advance"
|
||||
# Detection-during-install kill is OPT-IN via "KillAfterDetection: true"
|
||||
# in the JSON entry. It's only safe for installers that hang forever after
|
||||
# creating their detection markers (UDC_Setup.exe spawns a hidden WPF window
|
||||
# and never exits). For normal installers (Oracle, msiexec, etc.) the
|
||||
# detection registry key often gets written midway through the install AND
|
||||
# msiexec is still doing post-install cleanup AND msiserver is still holding
|
||||
# the install mutex - killing msiexec at that point leaves the system in a
|
||||
# bad state and the NEXT msiexec call returns 1618 ERROR_INSTALL_ALREADY_
|
||||
# RUNNING. So opt-out by default; only kill apps that explicitly need it.
|
||||
if ($app.KillAfterDetection -and (Test-AppInstalled -App $app)) {
|
||||
Write-PreInstallLog " Detection passed at $elapsed s - killing installer to advance (KillAfterDetection)"
|
||||
try { $proc.Kill(); $proc.WaitForExit(5000) | Out-Null } catch { }
|
||||
|
||||
# UDC's installer auto-launches UDC.exe in silent mode. Kill that too
|
||||
|
||||
Reference in New Issue
Block a user