Make the install script action agnostic

This commit is contained in:
Manuel Thalmann 2024-08-28 00:03:28 +02:00
parent 3c36299efb
commit f31eed5616
3 changed files with 117 additions and 47 deletions

View file

@ -2,6 +2,12 @@ using namespace Microsoft.Win32;
using namespace System.Security.AccessControl; using namespace System.Security.AccessControl;
using namespace System.Security.Principal; using namespace System.Security.Principal;
enum WindowsInstallerStage {
Initialize
Run
Completed
}
enum SetupStage { enum SetupStage {
Configure Configure
Install Install
@ -18,6 +24,7 @@ enum UserStage {
$null = New-Module { $null = New-Module {
[string] $configRoot = "HKLM:\Software\PortValhalla"; [string] $configRoot = "HKLM:\Software\PortValhalla";
[string] $stageOption = "Stage"; [string] $stageOption = "Stage";
[string] $setupStageOption = "SetupStage";
[string] $userOption = "SetupUser"; [string] $userOption = "SetupUser";
[string] $userStageOption = "UserStage"; [string] $userStageOption = "UserStage";
[string] $accountOption = "MSAccount"; [string] $accountOption = "MSAccount";
@ -272,11 +279,44 @@ $null = New-Module {
<# <#
.SYNOPSIS .SYNOPSIS
Gets the name of the current setup stage. Gets the name of the current stage of the Windows install script action.
#> #>
function Get-Stage { function Get-Stage {
$stage = Get-SetupOption $stageOption; $stage = Get-SetupOption $stageOption;
if ($null -ne $stage) {
$stage = [WindowsInstallerStage]$stage;
}
return $stage;
}
<#
.SYNOPSIS
Sets the name of the current stage of the Windows install script action.
.PARAMETER Name
The name of the stage to set.
#>
function Set-Stage {
param(
$Name
)
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
$Name = ([WindowsInstallerStage]$Name).ToString();
}
$null = Set-SetupOption $stageOption $Name;
}
<#
.SYNOPSIS
Gets the name of the current setup stage.
#>
function Get-SetupStage {
$stage = Get-SetupOption $setupStageOption;
if ($null -ne $stage) { if ($null -ne $stage) {
$stage = [SetupStage]$stage; $stage = [SetupStage]$stage;
} }
@ -291,7 +331,7 @@ $null = New-Module {
.PARAMETER Name .PARAMETER Name
The name to set the current stage to. The name to set the current stage to.
#> #>
function Set-Stage { function Set-SetupStage {
param( param(
$Name $Name
) )
@ -300,7 +340,7 @@ $null = New-Module {
$Name = ([SetupStage]$Name).ToString(); $Name = ([SetupStage]$Name).ToString();
} }
$null = Set-SetupOption $stageOption $Name; $null = Set-SetupOption $setupStageOption $Name;
} }
<# <#

View file

@ -18,6 +18,7 @@ $null = New-Module {
. "$PSScriptRoot/../Scripts/Security.ps1"; . "$PSScriptRoot/../Scripts/Security.ps1";
. "$PSScriptRoot/../Scripts/Update.ps1"; . "$PSScriptRoot/../Scripts/Update.ps1";
. "$PSScriptRoot/../Scripts/Users.ps1"; . "$PSScriptRoot/../Scripts/Users.ps1";
. "$PSScriptRoot/../Types/WindowsInstallerAction.ps1";
. "$PSScriptRoot/../../Common/Scripts/Config.ps1"; . "$PSScriptRoot/../../Common/Scripts/Config.ps1";
. "$PSScriptRoot/../../Common/Scripts/Operations.ps1"; . "$PSScriptRoot/../../Common/Scripts/Operations.ps1";
. "$PSScriptRoot/../../Common/Scripts/Software.ps1"; . "$PSScriptRoot/../../Common/Scripts/Software.ps1";
@ -30,7 +31,7 @@ $null = New-Module {
#> #>
function Start-WindowsInstallation { function Start-WindowsInstallation {
Start-Operation -NoImplicitCleanup { Start-Operation -NoImplicitCleanup {
Start-InstallationLoop; Start-InstallationLoop ([WindowsInstallerAction]::Install);
}; };
} }
@ -39,60 +40,85 @@ $null = New-Module {
Starts the installation loop. Starts the installation loop.
#> #>
function Start-InstallationLoop { function Start-InstallationLoop {
while (-not (Get-IsFinished)) { param(
if (Test-Admin) { [WindowsInstallerAction] $Action
$null = Import-Module PSWindowsUpdate; )
Invoke-Hook "Invoke-WindowsUpdate" -Fallback {
Update-WindowsInstallation;
};
if ((Get-WURebootStatus -Silent)) {
Restart-Intermediate;
return;
}
}
while ((Get-Stage) -ne ([WindowsInstallerStage]::Completed)) {
switch (Get-Stage) { switch (Get-Stage) {
($null) { ($null) {
Set-Stage ([SetupStage]::Configure); Set-Stage ([WindowsInstallerStage]::Initialize);
break; break;
} }
([SetupStage]::Configure) { ([WindowsInstallerStage]::Initialize) {
if (Get-Config "valhalla.windows.dualboot.enable") { Set-Stage ([WindowsInstallerStage]::Run);
if (-not (Test-Qemu)) { break;
# Fix synchronization between Linux and Windows clocks. }
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Value 1 -Type "DWord"; ([WindowsInstallerStage]::Run) {
} switch ($Action) {
([WindowsInstallerAction]::Install) {
while (-not (Get-IsFinished)) {
if (Test-Admin) {
$null = Import-Module PSWindowsUpdate;
# Force time resynchronization Invoke-Hook "Invoke-WindowsUpdate" -Fallback {
$timeZoneOption = "Start"; Update-WindowsInstallation;
$timeZoneKey = "HKLM:\SYSTEM\CurrentControlSet\Services\tzautoupdate"; };
$service = Get-Service W32Time;
$autoUpdate = (Get-Item $timeZoneKey).GetValue($timeZoneOption);
$stopped = ($service.Status -eq "Stopped");
$setUpdate = { param([int] $Value) Set-ItemProperty $timeZoneKey -Name $timeZoneOption $Value }; if ((Get-WURebootStatus -Silent)) {
& $setUpdate 3; Restart-Intermediate;
Start-Service $service; return;
w32tm /resync /force; }
& $setUpdate $autoUpdate; }
if ($stopped) { switch (Get-SetupStage) {
Stop-Service $service; ($null) {
Set-SetupStage ([SetupStage]::Configure);
break;
}
([SetupStage]::Configure) {
if (Get-Config "valhalla.windows.dualboot.enable") {
if (-not (Test-Qemu)) {
# Fix synchronization between Linux and Windows clocks.
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Value 1 -Type "DWord";
}
# Force time resynchronization
$timeZoneOption = "Start";
$timeZoneKey = "HKLM:\SYSTEM\CurrentControlSet\Services\tzautoupdate";
$service = Get-Service W32Time;
$autoUpdate = (Get-Item $timeZoneKey).GetValue($timeZoneOption);
$stopped = ($service.Status -eq "Stopped");
$setUpdate = { param([int] $Value) Set-ItemProperty $timeZoneKey -Name $timeZoneOption $Value };
& $setUpdate 3;
Start-Service $service;
w32tm /resync /force;
& $setUpdate $autoUpdate;
if ($stopped) {
Stop-Service $service;
}
}
Set-SetupStage ([SetupStage]::Install);
}
([SetupStage]::Install) {
Write-Host "Entering install phase";
Deploy-SoftwareAction;
Set-SetupStage ([SetupStage]::CreateUser);
}
([SetupStage]::CreateUser) {
Install-ValhallaUsers;
Set-IsFinished $true;
}
}
}
} }
} }
Set-Stage ([SetupStage]::Install); Set-Stage ([WindowsInstallerStage]::Completed);
} break;
([SetupStage]::Install) {
Write-Host "Entering install phase";
Deploy-SoftwareAction;
Set-Stage ([SetupStage]::CreateUser);
}
([SetupStage]::CreateUser) {
Install-ValhallaUsers;
Set-IsFinished $true;
} }
} }
} }

View file

@ -0,0 +1,4 @@
enum WindowsInstallerAction {
Backup
Install
}