From fe91dcbf67ec79b91713d501c82034d85bab72fc Mon Sep 17 00:00:00 2001 From: Jeffrey Martin Date: Mon, 30 Jan 2023 10:38:32 -0600 Subject: [PATCH] download windows pre-req files using the host OS Many pre-req file have moved to require TLS 1.2, to address this downloading these files in the host system will allows this requirement to be meet even when the guest OS being built does not yet support TLS 1.2. * downloads dotnet and wmf from a provisioner run by the host OS * updates dotnet to 4.5.2 * update wmf for powershell 5.1 * adjust install process for wmf to run as SYSTEM * moves boxstarter and Ruby install into the chocolatey_installs path Furhter work should be done to validate the downlaod hash and support caching downloads instead of force each build to download again. This does not remove the need for downloads by chocolatey when preforming those installs. --- .gitignore | 1 + packer/answer_files/2008_r2/Autounattend.xml | 10 ----- packer/templates/windows_2008_r2.json | 44 ++++++++++++++----- resources/download-windows-files.ps1 | 23 ++++++++++ resources/download-windows-files.sh | 3 ++ resources/windows_pre_downloads/.gitkeep | 0 .../boxstarter.bat} | 0 .../chocolatey-compatibility.bat | 4 ++ .../ruby.bat} | 0 scripts/installs/chocolatey.cmd | 1 - scripts/installs/chocolatey.ps1 | 4 ++ scripts/installs/install_dotnet45.ps1 | 10 +---- scripts/installs/install_wmf.ps1 | 38 ++++++++++------ 13 files changed, 94 insertions(+), 44 deletions(-) create mode 100644 resources/download-windows-files.ps1 create mode 100755 resources/download-windows-files.sh create mode 100644 resources/windows_pre_downloads/.gitkeep rename scripts/{installs/install_boxstarter.bat => chocolatey_installs/boxstarter.bat} (100%) create mode 100644 scripts/chocolatey_installs/chocolatey-compatibility.bat rename scripts/{installs/install_ruby.bat => chocolatey_installs/ruby.bat} (100%) delete mode 100644 scripts/installs/chocolatey.cmd diff --git a/.gitignore b/.gitignore index 628caa9..d8e0330 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ packer_cache/ packer/builds/ resources/drivers/ +resources/windows_pre_downloads/ *.vfd *.exe *.msi diff --git a/packer/answer_files/2008_r2/Autounattend.xml b/packer/answer_files/2008_r2/Autounattend.xml index f9e1978..8ba893d 100644 --- a/packer/answer_files/2008_r2/Autounattend.xml +++ b/packer/answer_files/2008_r2/Autounattend.xml @@ -261,16 +261,6 @@ cmd.exe /c mkdir -p C:\vagrant\scripts Create directory for vagrant files to avoid provisioner bug with packer. 26 - - - cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\install_dotnet45.ps1 -AutoStart - 97 - Install .NET 4.5.1 - - - cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\install_wmf.ps1 -AutoStart - 98 - Installing Windows Management Framework 5.0 diff --git a/packer/templates/windows_2008_r2.json b/packer/templates/windows_2008_r2.json index 0aa5d5b..92dcc2f 100644 --- a/packer/templates/windows_2008_r2.json +++ b/packer/templates/windows_2008_r2.json @@ -18,8 +18,6 @@ "{{user `scripts_dir`}}/configs/microsoft-updates.bat", "{{user `scripts_dir`}}/configs/win-updates.ps1", "{{user `scripts_dir`}}/installs/openssh.ps1", - "{{user `scripts_dir`}}/installs/install_dotnet45.ps1", - "{{user `scripts_dir`}}/installs/install_wmf.ps1", "{{user `resources_dir`}}/certs/oracle-cert.cer", "{{user `resources_dir`}}/certs/gdig2.crt", "{{user `resources_dir`}}/certs/comodorsadomainvalidationsecureserverca.crt", @@ -56,8 +54,6 @@ "{{user `scripts_dir`}}/configs/microsoft-updates.bat", "{{user `scripts_dir`}}/configs/win-updates.ps1", "{{user `scripts_dir`}}/installs/openssh.ps1", - "{{user `scripts_dir`}}/installs/install_dotnet45.ps1", - "{{user `scripts_dir`}}/installs/install_wmf.ps1", "{{user `resources_dir`}}/certs/oracle-cert.cer", "{{user `resources_dir`}}/certs/gdig2.crt", "{{user `resources_dir`}}/certs/comodorsadomainvalidationsecureserverca.crt", @@ -99,8 +95,6 @@ "{{user `scripts_dir`}}/configs/microsoft-updates.bat", "{{user `scripts_dir`}}/configs/win-updates.ps1", "{{user `scripts_dir`}}/installs/openssh.ps1", - "{{user `scripts_dir`}}/installs/install_dotnet45.ps1", - "{{user `scripts_dir`}}/installs/install_wmf.ps1", "{{user `resources_dir`}}/certs/oracle-cert.cer", "{{user `resources_dir`}}/certs/gdig2.crt", "{{user `resources_dir`}}/certs/comodorsadomainvalidationsecureserverca.crt", @@ -150,8 +144,6 @@ "{{user `scripts_dir`}}/configs/microsoft-updates.bat", "{{user `scripts_dir`}}/configs/win-updates.ps1", "{{user `scripts_dir`}}/installs/openssh.ps1", - "{{user `scripts_dir`}}/installs/install_dotnet45.ps1", - "{{user `scripts_dir`}}/installs/install_wmf.ps1", "{{user `resources_dir`}}/certs/oracle-cert.cer", "{{user `resources_dir`}}/certs/gdig2.crt", "{{user `resources_dir`}}/certs/comodorsadomainvalidationsecureserverca.crt", @@ -184,6 +176,16 @@ } ], "provisioners": [ + { + "type": "shell-local", + "only_on": ["linux", "darwin"], + "inline": ["cd {{user `resources_dir`}} && {{user `resources_dir`}}/download-windows-files.sh"] + }, + { + "type": "shell-local", + "only_on": ["windows"], + "inline": ["cd {{user `resources_dir`}} && powershell {{user `resources_dir`}}/download-windows-files.ps1"] + }, { "type": "file", "source": "{{user `scripts_dir`}}", @@ -200,7 +202,6 @@ "execute_command": "{{.Vars}} cmd /c C:/Windows/Temp/script.bat", "scripts": [ "{{user `scripts_dir`}}/configs/update_root_certs.bat", - "{{user `scripts_dir`}}/configs/disable-auto-logon.bat", "{{user `scripts_dir`}}/configs/enable-rdp.bat" ] }, @@ -215,6 +216,25 @@ { "type": "windows-restart" }, + { + "type": "powershell", + "scripts": [ + "{{user `scripts_dir`}}/installs/install_dotnet45.ps1" + ] + }, + { + "type": "windows-restart" + }, + { + "type": "powershell", + "scripts": [ + "{{user `scripts_dir`}}/installs/install_wmf.ps1" + ] + }, + { + "type": "windows-restart", + "pause_before": "180s" + }, { "type": "powershell", "scripts": [ @@ -240,7 +260,9 @@ "remote_path": "C:/Windows/Temp/script.bat", "execute_command": "{{.Vars}} cmd /c C:/Windows/Temp/script.bat", "scripts": [ - "{{user `scripts_dir`}}/installs/install_boxstarter.bat", + "{{user `scripts_dir`}}/configs/disable-auto-logon.bat", + "{{user `scripts_dir`}}/chocolatey_installs/chocolatey-compatibility.bat", + "{{user `scripts_dir`}}/chocolatey_installs/boxstarter.bat", "{{user `scripts_dir`}}/chocolatey_installs/7zip.bat", "{{user `scripts_dir`}}/configs/apply_password_settings.bat", "{{user `scripts_dir`}}/configs/create_users.bat", @@ -267,7 +289,7 @@ "{{user `scripts_dir`}}/installs/install_wordpress.bat", "{{user `scripts_dir`}}/installs/install_openjdk6.bat", "{{user `scripts_dir`}}/installs/setup_jmx.bat", - "{{user `scripts_dir`}}/installs/install_ruby.bat", + "{{user `scripts_dir`}}/chocolatey_installs/ruby.bat", "{{user `scripts_dir`}}/installs/install_devkit.bat" ] }, diff --git a/resources/download-windows-files.ps1 b/resources/download-windows-files.ps1 new file mode 100644 index 0000000..edd817f --- /dev/null +++ b/resources/download-windows-files.ps1 @@ -0,0 +1,23 @@ +$Logfile = "C:\Windows\Temp\wmf-install.log" +function LogWrite { + Param ([string]$logstring) + $now = Get-Date -format s + Add-Content $Logfile -value "$now $logstring" + Write-Host $logstring +} + +LogWrite "Downloading dotNet 4.5.2" +try { + (New-Object System.Net.WebClient).DownloadFile('https://download.microsoft.com/download/E/2/1/E21644B5-2DF2-47C2-91BD-63C560427900/NDP452-KB2901907-x86-x64-AllOS-ENU.exe', 'windows_pre_downloads/dotnet.exe') +} catch { + LogWrite $_.Exception | Format-List -force + LogWrite "Failed to download file." +} + +LogWrite "Downloading Windows Management Framework 5.1" +try { + (New-Object System.Net.WebClient).DownloadFile('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip', 'windows_pre_downloads/wmf.zip') +} catch { + LogWrite $_.Exception | Format-List -force + LogWrite "Failed to download file." +} diff --git a/resources/download-windows-files.sh b/resources/download-windows-files.sh new file mode 100755 index 0000000..de8a529 --- /dev/null +++ b/resources/download-windows-files.sh @@ -0,0 +1,3 @@ +#!/bin/bash -e +curl -L --output windows_pre_downloads/dotnet.exe https://download.microsoft.com/download/E/2/1/E21644B5-2DF2-47C2-91BD-63C560427900/NDP452-KB2901907-x86-x64-AllOS-ENU.exe +curl -L --output windows_pre_downloads/wmf.zip https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip diff --git a/resources/windows_pre_downloads/.gitkeep b/resources/windows_pre_downloads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/scripts/installs/install_boxstarter.bat b/scripts/chocolatey_installs/boxstarter.bat similarity index 100% rename from scripts/installs/install_boxstarter.bat rename to scripts/chocolatey_installs/boxstarter.bat diff --git a/scripts/chocolatey_installs/chocolatey-compatibility.bat b/scripts/chocolatey_installs/chocolatey-compatibility.bat new file mode 100644 index 0000000..b3c2c71 --- /dev/null +++ b/scripts/chocolatey_installs/chocolatey-compatibility.bat @@ -0,0 +1,4 @@ +chocolatey feature enable -n=allowGlobalConfirmation +choco install chocolatey-compatibility.extension +chocolatey feature disable -n=allowGlobalConfirmation +exit diff --git a/scripts/installs/install_ruby.bat b/scripts/chocolatey_installs/ruby.bat similarity index 100% rename from scripts/installs/install_ruby.bat rename to scripts/chocolatey_installs/ruby.bat diff --git a/scripts/installs/chocolatey.cmd b/scripts/installs/chocolatey.cmd deleted file mode 100644 index 564707c..0000000 --- a/scripts/installs/chocolatey.cmd +++ /dev/null @@ -1 +0,0 @@ -@powershell -NoProfile -ExecutionPolicy Bypass -File "%systemdrive%\vagrant\scripts\installs\install_chocolatey.ps1" \ No newline at end of file diff --git a/scripts/installs/chocolatey.ps1 b/scripts/installs/chocolatey.ps1 index d75d56a..01d6ea5 100644 --- a/scripts/installs/chocolatey.ps1 +++ b/scripts/installs/chocolatey.ps1 @@ -40,6 +40,10 @@ function Invoke-CLR4PowerShellCommand { } +if (!(Test-Path -Path $PROFILE)) { + New-Item -ItemType File -Path $PROFILE -Force +} + $ErrorActionPreference = 'Stop' Set-StrictMode -Version Latest diff --git a/scripts/installs/install_dotnet45.ps1 b/scripts/installs/install_dotnet45.ps1 index 8bcd188..3ce8572 100644 --- a/scripts/installs/install_dotnet45.ps1 +++ b/scripts/installs/install_dotnet45.ps1 @@ -6,17 +6,9 @@ function LogWrite { Write-Host $logstring } -LogWrite "Downloading dotNet 4.5.1" -try { - (New-Object System.Net.WebClient).DownloadFile('http://download.microsoft.com/download/1/6/7/167F0D79-9317-48AE-AEDB-17120579F8E2/NDP451-KB2858728-x86-x64-AllOS-ENU.exe', 'C:\Windows\Temp\dotnet.exe') -} catch { - LogWrite $_.Exception | Format-List -force - LogWrite "Failed to download file." -} - LogWrite "Starting installation process..." try { - Start-Process -FilePath "C:\Windows\Temp\dotnet.exe" -ArgumentList "/I /q /norestart" -Wait -PassThru + Start-Process -FilePath "C:\vagrant\resources\windows_pre_downloads\dotnet.exe" -ArgumentList "/I /q /norestart" -Wait -PassThru } catch { LogWrite $_.Exception | Format-List -force LogWrite "Exception during install process." diff --git a/scripts/installs/install_wmf.ps1 b/scripts/installs/install_wmf.ps1 index 4556136..94d8388 100644 --- a/scripts/installs/install_wmf.ps1 +++ b/scripts/installs/install_wmf.ps1 @@ -5,19 +5,31 @@ function LogWrite { Add-Content $Logfile -value "$now $logstring" Write-Host $logstring } - -LogWrite "Downloading Windows Management Framework 5.0" -try { - (New-Object System.Net.WebClient).DownloadFile('https://download.microsoft.com/download/2/C/6/2C6E1B4A-EBE5-48A6-B225-2D2058A9CEFB/Win7AndW2K8R2-KB3134760-x64.msu', 'C:\Windows\Temp\wmf.msu') -} catch { - LogWrite $_.Exception | Format-List -force - LogWrite "Failed to download file." + + +LogWrite "Extracting Archive..." + +$extractLocation = "C:\vagrant\resources\windows_pre_downloads\wmf_install" +New-Item -Path $extractLocation -ItemType Directory + +$shell = New-Object -ComObject shell.application +$zip = $shell.NameSpace("C:\vagrant\resources\windows_pre_downloads\wmf.zip") +foreach ($item in $zip.items()) { + $shell.Namespace($extractLocation).CopyHere($item) } +Set-Location -Path $extractLocation -PassThru +$installCmd = "powershell.exe -ExecutionPolicy Bypass -Command " + '"' + ${extractLocation} + "\Install-WMF5.1.ps1 -AcceptEula" + '"' + LogWrite "Starting installation process..." -try { - Start-Process -FilePath "wusa.exe" -ArgumentList "C:\Windows\Temp\wmf.msu /quiet /norestart" -Wait -PassThru -} catch { - LogWrite $_.Exception | Format-List -force - LogWrite "Exception during install process." -} + +New-Item C:\vagrant\resources\windows_pre_downloads\wmf_install\install_wmf.bat -ItemType "file" +Set-Content C:\vagrant\resources\windows_pre_downloads\wmf_install\install_wmf.bat $installCmd + +$Taskname = "updatepsh" + +SCHTASKS /CREATE /sc ONCE /st 00:00 /TN $Taskname /RU SYSTEM /RL HIGHEST /TR "C:\vagrant\resources\windows_pre_downloads\wmf_install\install_wmf.bat" +schtasks /Run /TN $Taskname +start-sleep -s 5 +schtasks /delete /tn $Taskname /f +start-sleep -s 30