From f4c39df25e643957d9df3bca9536f18451381662 Mon Sep 17 00:00:00 2001 From: "Jason T. Greene" Date: Tue, 30 Aug 2022 16:27:41 -0500 Subject: [PATCH 1/3] Add win-sshproxy.exe to windows client zips Signed-off-by: Jason T. Greene --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index 0ced638a66..a42f1f1815 100644 --- a/Makefile +++ b/Makefile @@ -690,6 +690,9 @@ podman-remote-release-%.zip: test/version/version ## Build podman-remote for %=$ else \ $(MAKE) $(GOPLAT) podman-remote; \ fi + if [[ "$(GOOS)" == "windows" ]]; then \ + $(MAKE) $(GOPLAT) TMPDIR="" win-sshproxy; \ + fi cp -r ./docs/build/remote/$(GOOS) "$(TMPDIR)/$(SUBDIR)/docs/" cp ./contrib/remote/containers.conf "$(TMPDIR)/$(SUBDIR)/" $(MAKE) $(GOPLAT) $(_DSTARGS) SELINUXOPT="" install.remote @@ -752,6 +755,8 @@ install.remote: install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(BINDIR) install ${SELINUXOPT} -m 755 $(SRCBINDIR)/podman$(BINSFX) \ $(DESTDIR)$(BINDIR)/podman$(BINSFX) + test "${GOOS}" != "windows" || \ + install -m 755 $(SRCBINDIR)/win-sshproxy.exe $(DESTDIR)$(BINDIR) test -z "${SELINUXOPT}" || \ chcon --verbose --reference=$(DESTDIR)$(BINDIR)/podman-remote \ bin/podman-remote From ecb9f99b88f11556f3c5c3a890c130b16ea6f254 Mon Sep 17 00:00:00 2001 From: "Jason T. Greene" Date: Tue, 30 Aug 2022 23:23:14 -0500 Subject: [PATCH 2/3] Add new windows installer and build Signed-off-by: Jason T. Greene --- .github/workflows/upload-win-installer.yml | 96 +++++++++++ RELEASE_PROCESS.md | 37 +++- cmd/podman-msihooks/main.go | 46 +++++ cmd/podman-wslkerninst/event-hook.go | 73 ++++++++ cmd/podman-wslkerninst/main.go | 103 ++++++++++++ contrib/win-installer/README.md | 28 ++++ contrib/win-installer/build-burn.bat | 7 + contrib/win-installer/build-hooks.bat | 4 + contrib/win-installer/build-msi.bat | 8 + contrib/win-installer/build.ps1 | 156 +++++++++++++++++ contrib/win-installer/burn.wxs | 43 +++++ contrib/win-installer/check.ps1 | 63 +++++++ contrib/win-installer/podman-theme.wxl | 68 ++++++++ contrib/win-installer/podman-theme.xml | 97 +++++++++++ contrib/win-installer/podman-ui.wxs | 62 +++++++ contrib/win-installer/podman.wxs | 84 ++++++++++ contrib/win-installer/process-release.ps1 | 158 ++++++++++++++++++ .../win-installer/resources/podman-banner.png | Bin 0 -> 4069 bytes .../resources/podman-banner2.png | Bin 0 -> 12002 bytes .../win-installer/resources/podman-dialog.png | Bin 0 -> 14142 bytes .../win-installer/resources/podman-logo.ico | Bin 0 -> 15086 bytes .../win-installer/resources/podman-logo.png | Bin 0 -> 7153 bytes .../resources/podman-sidebar.png | Bin 0 -> 13016 bytes contrib/win-installer/welcome-install-dlg.wxs | 31 ++++ pkg/machine/wsl/machine.go | 14 +- pkg/machine/wsl/util_windows.go | 15 ++ .../x/sys/windows/svc/eventlog/install.go | 81 +++++++++ .../x/sys/windows/svc/eventlog/log.go | 70 ++++++++ vendor/modules.txt | 1 + 29 files changed, 1334 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/upload-win-installer.yml create mode 100644 cmd/podman-msihooks/main.go create mode 100644 cmd/podman-wslkerninst/event-hook.go create mode 100644 cmd/podman-wslkerninst/main.go create mode 100644 contrib/win-installer/README.md create mode 100644 contrib/win-installer/build-burn.bat create mode 100644 contrib/win-installer/build-hooks.bat create mode 100644 contrib/win-installer/build-msi.bat create mode 100644 contrib/win-installer/build.ps1 create mode 100644 contrib/win-installer/burn.wxs create mode 100644 contrib/win-installer/check.ps1 create mode 100644 contrib/win-installer/podman-theme.wxl create mode 100644 contrib/win-installer/podman-theme.xml create mode 100644 contrib/win-installer/podman-ui.wxs create mode 100644 contrib/win-installer/podman.wxs create mode 100644 contrib/win-installer/process-release.ps1 create mode 100644 contrib/win-installer/resources/podman-banner.png create mode 100644 contrib/win-installer/resources/podman-banner2.png create mode 100644 contrib/win-installer/resources/podman-dialog.png create mode 100644 contrib/win-installer/resources/podman-logo.ico create mode 100644 contrib/win-installer/resources/podman-logo.png create mode 100644 contrib/win-installer/resources/podman-sidebar.png create mode 100644 contrib/win-installer/welcome-install-dlg.wxs create mode 100644 vendor/golang.org/x/sys/windows/svc/eventlog/install.go create mode 100644 vendor/golang.org/x/sys/windows/svc/eventlog/log.go diff --git a/.github/workflows/upload-win-installer.yml b/.github/workflows/upload-win-installer.yml new file mode 100644 index 0000000000..125100a281 --- /dev/null +++ b/.github/workflows/upload-win-installer.yml @@ -0,0 +1,96 @@ +name: Upload Windows Installer + +on: + release: + types: [created, published, edited] + workflow_dispatch: + inputs: + version: + description: 'Release version to build and upload (e.g. "4.2.1")' + required: true +jobs: + build: + runs-on: windows-latest + env: + FETCH_BASE_URL: ${{ github.server_url }}/${{ github.repository }} + steps: + - name: Determine version + id: getversion + run: | + $version = "${{ inputs.version }}" + if ($version.Length -lt 1) { + $version = "${{ github.event.release.tag_name }}" + if ($version.Length -lt 1) { + Write-Host "Could not determine version!" + Exit 1 + } + } + Write-Output "::set-output name=version::$version" + - uses: actions/checkout@v3 + - name: Check + id: check + run: | + Push-Location contrib\win-installer + .\check.ps1 ${{steps.getversion.outputs.version}} + $code = $LASTEXITCODE + if ($code -eq 2) { + Write-Output "::set-output name=already-exists::true" + Pop-Location + Exit 0 + } + Write-Output "UPLOAD_ASSET_NAME=$env:UPLOAD_ASSET_NAME" | Out-File -FilePath $env:GITHUB_ENV -Append + Pop-Location + Exit $code + - name: Set up Go + uses: actions/setup-go@v3 + if: steps.check.outputs.already-exists != 'true' + with: + go-version: 1.18 + - name: Setup Signature Tooling + if: steps.Check.outputs.already-exists != 'true' + run: | + dotnet tool install --global AzureSignTool --version 3.0.0 + echo "CERT_NAME=${{secrets.AZ_CERT_NAME}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "VAULT_ID=${{secrets.AZ_VAULT_ID}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "APP_ID=${{secrets.AZ_APP_ID}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "TENANT_ID=${{secrets.AZ_TENANT_ID}}" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "CLIENT_SECRET=${{secrets.AZ_CLIENT_SECRET}}" | Out-File -FilePath $env:GITHUB_ENV -Append + - name: Build + id: build + if: steps.check.outputs.already-exists != 'true' + run: | + Push-Location contrib\win-installer + .\build.ps1 ${{steps.getversion.outputs.version}} prod + $code = $LASTEXITCODE + if ($code -eq 2) { + Write-Output "::set-output name=artifact-missing::true" + Pop-Location + Exit 0 + } + Pop-Location + Exit $code + - name: Upload + if: steps.check.outputs.already-exists != 'true' && steps.build.outputs.artifact-missing != 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + Push-Location contrib\win-installer + $version = "${{ steps.getversion.outputs.version }}" + if ($version[0] -ne "v") { + $version = "v$version" + } + gh release upload $version $ENV:UPLOAD_ASSET_NAME + if ($LASTEXITCODE -ne 0) { + .\check.ps1 $version + if ($LASTEXITCODE -eq 2) { + Write-Host "Another job uploaded before us, skipping" + Pop-Location + Exit 0 + } + Pop-Location + Exit 1 + } + if (Test-Path -Path shasums) { + gh release upload --clobber $version shasums + } + Pop-Location diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md index 66cc746938..17590be971 100644 --- a/RELEASE_PROCESS.md +++ b/RELEASE_PROCESS.md @@ -244,18 +244,17 @@ spelled with complete minutiae. $ make podman-remote-release-darwin_amd64.zip \ podman-remote-release-darwin_arm64.zip \ podman-remote-release-windows_amd64.zip \ - podman.msi \ podman-remote-static $ mv podman-* bin/ $ cd bin/ $ tar -cvzf podman-remote-static.tar.gz podman-remote-static - $ sha256sum *.zip *.msi *.tar.gz > shasums + $ sha256sum *.zip *.tar.gz > shasums ``` 1. The `podman-vX.Y.Z.dmg` file is produced manually by someone in possession of a developer signing key. 1. In the directory where you downloaded the archives, run - `sha256sum *.tar.gz *.zip *.msi > shasums` to generate SHA sums. + `sha256sum *.tar.gz *.zip > shasums` to generate SHA sums. 1. Go to `https://github.com/containers/podman/releases/tag/vX.Y.Z` and press the "Edit Release" button. Change the name to the form `vX.Y.Z` 1. If this is a release candidate be certain to click the pre-release @@ -273,4 +272,34 @@ spelled with complete minutiae. * podman-vX.Y.Z.msi * podman-remote-static.tar.gz * shasums - 1. Save the release. + 1. Click the Publish button to make the release (or pre-release) + available. + 1. Check the "Actions" tab, after the publish you should see a job + automatically launch to build the windows installer (named after + the release). There may be more than one running due to the multiple + event states triggered, but this can be ignored, as any duplicates + will gracefully back-off. The job takes 5-6 minutes to complete. + 1. Confirm the podman-[version]-setup.exe file is now on the release + page. This might not be the case if you accidentally published the + release before uploading the binaries, as the job may look before + they are available. If that happens, you can either manually kick + off the job (see below), or just make a harmless edit to the + release (e.g. add an extra whitespace character somewhere). As + long as the body content is different in some way, a new run will + be triggered. + + ## Manually Triggering Windows Installer Build & Upload + + + ### *CLI Approach* + 1. Install the GitHub CLI (e.g. `sudo dnf install gh`) + 1. Run (replacing below version number to release version) + ``` + gh workflow run "Upload Windows Installer" -F version="4.2.0" + ``` + ### *GUI Approach* + 1. Go to the "Actions" tab + 1. On the left pick the "Update Windows Installer" category + 1. A blue box will appear above the job list with a right side drop + -down. Click the drop-down and specify the version number in the + dialog that appears diff --git a/cmd/podman-msihooks/main.go b/cmd/podman-msihooks/main.go new file mode 100644 index 0000000000..903c91abbc --- /dev/null +++ b/cmd/podman-msihooks/main.go @@ -0,0 +1,46 @@ +//go:build windows +// +build windows + +package main + +import ( + "C" + "syscall" + "unsafe" + + "github.com/containers/podman/v4/pkg/machine/wsl" +) + +const KernelWarning = "WSL Kernel installation did not complete successfully. " + + "Podman machine will attempt to install this at a later time. " + + "You can also manually complete the installation using the " + + "\"wsl --update\" command." + +//export CheckWSL +func CheckWSL(hInstall uint32) uint32 { + installed := wsl.IsWSLInstalled() + feature := wsl.IsWSLFeatureEnabled() + setMsiProperty(hInstall, "HAS_WSL", strBool(installed)) + setMsiProperty(hInstall, "HAS_WSLFEATURE", strBool(feature)) + + return 0 +} + +func setMsiProperty(hInstall uint32, name string, value string) { + nameW, _ := syscall.UTF16PtrFromString(name) + valueW, _ := syscall.UTF16PtrFromString(value) + + msi := syscall.NewLazyDLL("msi") + proc := msi.NewProc("MsiSetPropertyW") + _, _, _ = proc.Call(uintptr(hInstall), uintptr(unsafe.Pointer(nameW)), uintptr(unsafe.Pointer(valueW))) + +} +func strBool(val bool) string { + if val { + return "1" + } + + return "0" +} + +func main() {} diff --git a/cmd/podman-wslkerninst/event-hook.go b/cmd/podman-wslkerninst/event-hook.go new file mode 100644 index 0000000000..a5c23e4cfc --- /dev/null +++ b/cmd/podman-wslkerninst/event-hook.go @@ -0,0 +1,73 @@ +//go:build windows +// +build windows + +package main + +import ( + "bytes" + "fmt" + + "github.com/sirupsen/logrus" + "golang.org/x/sys/windows/svc/eventlog" +) + +// Logrus hook that delegates to windows event log +type EventLogHook struct { + events *eventlog.Log +} + +type LogFormat struct { + name string +} + +func (f *LogFormat) Format(entry *logrus.Entry) ([]byte, error) { + var b *bytes.Buffer + + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + fmt.Fprintf(b, "[%-5s] %s: %s", entry.Level.String(), f.name, entry.Message) + + for key, value := range entry.Data { + fmt.Fprintf(b, " {%s = %s}", key, value) + } + + b.WriteByte('\n') + return b.Bytes(), nil +} + +func NewEventHook(events *eventlog.Log, name string) *EventLogHook { + logrus.SetFormatter(&LogFormat{name}) + return &EventLogHook{events} +} + +func (hook *EventLogHook) Fire(entry *logrus.Entry) error { + line, err := entry.String() + if err != nil { + return err + } + + switch entry.Level { + case logrus.PanicLevel: + return hook.events.Error(1002, line) + case logrus.FatalLevel: + return hook.events.Error(1001, line) + case logrus.ErrorLevel: + return hook.events.Error(1000, line) + case logrus.WarnLevel: + return hook.events.Warning(1000, line) + case logrus.InfoLevel: + return hook.events.Info(1000, line) + case logrus.DebugLevel, logrus.TraceLevel: + return hook.events.Info(1001, line) + default: + return nil + } +} + +func (hook *EventLogHook) Levels() []logrus.Level { + return logrus.AllLevels +} diff --git a/cmd/podman-wslkerninst/main.go b/cmd/podman-wslkerninst/main.go new file mode 100644 index 0000000000..0485db13c7 --- /dev/null +++ b/cmd/podman-wslkerninst/main.go @@ -0,0 +1,103 @@ +//go:build windows +// +build windows + +package main + +import ( + "fmt" + "os" + "path" + "syscall" + "time" + "unsafe" + + "github.com/containers/podman/v4/pkg/machine/wsl" + "github.com/sirupsen/logrus" + "golang.org/x/sys/windows/svc/eventlog" +) + +const ( + MB_ICONWARNING = 0x00000030 + MB_OK = 0x00000000 + MB_DEFBUTTON1 = 0x00000000 +) + +const KernelWarning = "WSL Kernel installation did not complete successfully. " + + "Podman machine will attempt to install this at a later time. " + + "You can also manually complete the installation using the " + + "\"wsl --update\" command." + +func setupLogging(name string) (*eventlog.Log, error) { + // Reuse the Built-in .NET Runtime Source so that we do not + // have to provide a messaage table and modify the system + // event configuration + log, err := eventlog.Open(".NET Runtime") + if err != nil { + return nil, err + } + + logrus.AddHook(NewEventHook(log, name)) + logrus.SetLevel(logrus.InfoLevel) + + return log, nil +} + +func installWslKernel() error { + logrus.Info("Installing WSL Kernel update") + var ( + err error + ) + backoff := 500 * time.Millisecond + for i := 1; i < 6; i++ { + err = wsl.SilentExec("wsl", "--update") + if err == nil { + break + } + + // In case of unusual circumstances (e.g. race with installer actions) + // retry a few times + logrus.Warn("An error occurred attempting the WSL Kernel update, retrying...") + time.Sleep(backoff) + backoff *= 2 + } + + if err != nil { + err = fmt.Errorf("could not install WSL Kernel: %w", err) + } + + return err +} + +// Creates an "warn" style pop-up window +func warn(title string, caption string) int { + format := MB_ICONWARNING | MB_OK | MB_DEFBUTTON1 + + user32 := syscall.NewLazyDLL("user32.dll") + captionPtr, _ := syscall.UTF16PtrFromString(caption) + titlePtr, _ := syscall.UTF16PtrFromString(title) + ret, _, _ := user32.NewProc("MessageBoxW").Call( + uintptr(0), + uintptr(unsafe.Pointer(captionPtr)), + uintptr(unsafe.Pointer(titlePtr)), + uintptr(format)) + + return int(ret) +} + +func main() { + args := os.Args + setupLogging(path.Base(args[0])) + if wsl.IsWSLInstalled() { + // nothing to do + logrus.Info("WSL Kernel already installed") + return + } + + result := installWslKernel() + if result != nil { + logrus.Error(result.Error()) + _ = warn("Podman Setup", KernelWarning) + } + + logrus.Info("WSL Kernel update successful") +} diff --git a/contrib/win-installer/README.md b/contrib/win-installer/README.md new file mode 100644 index 0000000000..9cd1d29a56 --- /dev/null +++ b/contrib/win-installer/README.md @@ -0,0 +1,28 @@ +# Windows Installer Build + +## Requirements + +1. Win 10+ +2. Golang +3. MingW +4. Dotnet SDK (if AzureSignTool) +5. AzureSignTool (optional) +6. WiX Toolset + +## Usage + +``` +.\build.ps1 [prod|dev] [release_dir] +``` + +## One off build (-dev output (default), unsigned (default)) + +``` +.\build.ps1 4.2.0 +``` + +## Build with a pre-downloaded win release zip in my-download dir + +``` +.\build.ps1 4.2.0 dev my-download +``` diff --git a/contrib/win-installer/build-burn.bat b/contrib/win-installer/build-burn.bat new file mode 100644 index 0000000000..637a4e7444 --- /dev/null +++ b/contrib/win-installer/build-burn.bat @@ -0,0 +1,7 @@ +@if "%1" == "" ( + @echo "usage: build-burn.bat " + @exit /b 1 +) + +candle -ext WixUIExtension -ext WixUtilExtension -ext WixBalExtension -arch x64 -dManSource="docs" -dVERSION="%1" burn.wxs || exit /b 1 +light -ext WixUIExtension -ext WixUtilExtension -ext WixBalExtension .\burn.wixobj -out podman-setup.exe || exit /b 1 diff --git a/contrib/win-installer/build-hooks.bat b/contrib/win-installer/build-hooks.bat new file mode 100644 index 0000000000..d663f87b8c --- /dev/null +++ b/contrib/win-installer/build-hooks.bat @@ -0,0 +1,4 @@ +cd ../.. +go build -buildmode=c-shared -o contrib/win-installer/artifacts/podman-msihooks.dll ./cmd/podman-msihooks || exit /b 1 +go build -ldflags -H=windowsgui -o contrib/win-installer/artifacts/podman-wslkerninst.exe ./cmd/podman-wslkerninst || exit /b 1 +cd contrib/win-installer diff --git a/contrib/win-installer/build-msi.bat b/contrib/win-installer/build-msi.bat new file mode 100644 index 0000000000..28a77734de --- /dev/null +++ b/contrib/win-installer/build-msi.bat @@ -0,0 +1,8 @@ +@if "%1" == "" ( + @echo "usage: build-msi.bat " + @exit /b 1 +) + +heat dir docs -var var.ManSource -cg ManFiles -dr INSTALLDIR -gg -g1 -srd -out pages.wxs || exit /b 1 +candle -ext WixUIExtension -ext WixUtilExtension -ext .\artifacts\PanelSwWixExtension.dll -arch x64 -dManSource="docs" -dVERSION="%1" podman.wxs pages.wxs podman-ui.wxs welcome-install-dlg.wxs || exit /b 1 +light -ext WixUIExtension -ext WixUtilExtension -ext .\artifacts\PanelSwWixExtension.dll .\podman.wixobj .\pages.wixobj .\podman-ui.wixobj .\welcome-install-dlg.wixobj -out podman.msi || exit /b 1 diff --git a/contrib/win-installer/build.ps1 b/contrib/win-installer/build.ps1 new file mode 100644 index 0000000000..ba1b975481 --- /dev/null +++ b/contrib/win-installer/build.ps1 @@ -0,0 +1,156 @@ +function ExitOnError() { + if ($LASTEXITCODE -ne 0) { + Exit 1 + } +} + +function FetchPanel() { + Remove-Item -Recurse -Force -Path fetch -ErrorAction SilentlyContinue | Out-Null + New-Item -Force -ItemType Directory fetch | Out-Null + Push-Location fetch + + $ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -UseBasicParsing -OutFile nuget.exe -ErrorAction Stop ` + -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe + + .\nuget.exe install PanelSwWixExtension + $code = $LASTEXITCODE + Pop-Location + if ($code -gt 0) { + Exit 1 + } + $loc = Get-ChildItem -Recurse -Path fetch -Name PanelSwWixExtension.dll + if (!$loc) { + Write-Host "Could not locate PanelSwWixExtension.dll" + Exit 1 + } + + Copy-Item -Path fetch/$loc -Destination artifacts/PanelSwWixExtension.dll -ErrorAction Stop +} + +function SignItem() { + param( + [Parameter(Mandatory)] + [string[]]$fileNames + ) + + foreach ($val in $ENV:APP_ID, $ENV:TENANT_ID, $ENV:CLIENT_SECRET, $ENV:CERT_NAME) { + if (!$val) { + Write-Host "Skipping signing (no config)" + Return + } + } + + CheckCommand AzureSignTool.exe "AzureSignTool" + + AzureSignTool.exe sign -du "https://github.com/containers/podman" ` + -kvu "https://$ENV:VAULT_ID.vault.azure.net" ` + -kvi $ENV:APP_ID ` + -kvt $ENV:TENANT_ID ` + -kvs $ENV:CLIENT_SECRET ` + -kvc $ENV:CERT_NAME ` + -tr http://timestamp.digicert.com $fileNames + + ExitOnError +} + +function CheckCommand() { + param( + [Parameter(Mandatory)] + [string] $cmd, + [Parameter(Mandatory)] + [string] $description + ) + + if (! (Get-Command $cmd -errorAction SilentlyContinue)) { + Write-Host "Required dep `"$description`" is not installed" + Exit 1 + } +} + +function CheckRequirements() { + CheckCommand "gcc" "MingW CC" + CheckCommand "candle" "WiX Toolset" + CheckCommand "go" "Golang" +} + + +if ($args.Count -lt 1 -or $args[0].Length -lt 1) { + Write-Host "Usage: " $MyInvocation.MyCommand.Name " [dev|prod] [release_dir]" + Write-Host + Write-Host 'Uses Env Vars: ' + Write-Host ' $ENV:FETCH_BASE_URL - GitHub Repo Address to locate release on' + Write-Host 'Env Settings for signing (optional)' + Write-Host ' $ENV:VAULT_ID' + Write-Host ' $ENV:APP_ID' + Write-Host ' $ENV:TENANT_ID' + Write-Host ' $ENV:CLIENT_SECRET' + Write-Host ' $ENV:CERT_NAME' + Write-Host + Write-Host "Example: Download and build from the official Github release (dev output): " + Write-Host " .\build.ps1 4.2.0" + Write-Host + Write-Host "Example: Build a dev build from a pre-download release " + Write-Host " .\build.ps1 4.2.0 dev fetchdir" + Write-Host + + Exit 1 +} + +# Pre-set to standard locations in-case build env does not refresh paths +$Env:Path="$Env:Path;C:\Program Files (x86)\WiX Toolset v3.11\bin;C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin;;C:\Program Files\Go\bin" + +CheckRequirements + +$version = $args[0] + +if ($version[0] -eq "v") { + $version = $version.Substring(1) +} + +$suffix = "-dev" +if ($args.Count -gt 1 -and $args[1] -eq "prod") { + $suffix = "" +} + +$releaseDir = "" +if ($args.Count -gt 2) { + $releaseDir = $args[2] +} + +.\process-release.ps1 $version $releaseDir +if ($LASTEXITCODE -eq 2) { + Write-Host "Skip signaled, relaying skip" + Exit 2 +} +if ($ENV:INSTVER -eq "") { + Write-Host "process-release did not define an install version!" + Exit 1 +} + +FetchPanel + +.\build-hooks.bat; ExitOnError +SignItem @("artifacts/win-sshproxy.exe", + "artifacts/podman.exe", + "artifacts/podman-msihooks.dll", + "artifacts/podman-wslkerninst.exe") + +.\build-msi.bat $ENV:INSTVER; ExitOnError +SignItem @("podman.msi") + +.\build-burn.bat $ENV:INSTVER; ExitOnError +insignia -ib podman-setup.exe -o engine.exe; ExitOnError +SignItem @("engine.exe") + +$file = "podman-$version$suffix-setup.exe" +insignia -ab engine.exe podman-setup.exe -o $file; ExitOnError +SignItem @("$file") + +if (Test-Path -Path shasums) { + $hash = (Get-FileHash -Algorithm SHA256 $file).Hash.ToLower() + Write-Output "$hash $file" | Out-File -Append -FilePath shasums +} + +Write-Host "Complete" +Get-ChildItem "podman-$version$suffix-setup.exe" diff --git a/contrib/win-installer/burn.wxs b/contrib/win-installer/burn.wxs new file mode 100644 index 0000000000..f4534e5fdd --- /dev/null +++ b/contrib/win-installer/burn.wxs @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + = v10.0 AND (CBNumber >= 19041 OR AllowOldWin = 1)]]> + + + 5 OR WixBundleInstalled OR WixBundleForcedRestartPackage OR PreviousVersion <> VERSION]]> + + + + + + + + + + + diff --git a/contrib/win-installer/check.ps1 b/contrib/win-installer/check.ps1 new file mode 100644 index 0000000000..6e3aa9c2e6 --- /dev/null +++ b/contrib/win-installer/check.ps1 @@ -0,0 +1,63 @@ +function SkipExists { + param( + [Parameter(Mandatory)] + [string]$url, + [Parameter(Mandatory)] + [string]$desc + ) + try { + Invoke-WebRequest -Method HEAD -UseBasicParsing -ErrorAction Stop -Uri $url + Write-Host "$desc already uploaded, skipping..." + Exit 2 + } Catch { + if ($_.Exception.Response.StatusCode -eq 404) { + Write-Host "$desc does not exist, continuing..." + Return + } + + throw $_.Exception + } +} + +function SkipNotExists { + param( + [Parameter(Mandatory)] + [string]$url, + [Parameter(Mandatory)] + [string]$desc + ) + $ret = "" + try { + Invoke-WebRequest -Method HEAD -UseBasicParsing -ErrorAction Stop -Uri $url + Write-Host "$desc exists, continuing..." + } Catch { + if ($_.Exception.Response.StatusCode -eq 404) { + Write-Host "$desc does not exist, skipping ..." + Exit 2 + } + + throw $_.Exception + } +} + +if ($args.Count -lt 1 -or $args[0].Length -lt 2) { + Write-Host "Usage: " $MyInvocation.MyCommand.Name "" + Exit 1 +} + +$release = $args[0] +$version = $release +if ($release[0] -eq "v") { + $version = $release.Substring(1) +} else { + $release = "v$release" +} + +$base_url = "$ENV:FETCH_BASE_URL" +if ($base_url.Length -le 0) { + $base_url = "https://github.com/containers/podman" +} + +$ENV:UPLOAD_ASSET_NAME = "podman-$version-setup.exe" +SkipExists "$base_url/releases/download/$release/podman-$version-setup.exe" "Installer" +SkipNotExists "$base_url/releases/download/$release/podman-remote-release-windows_amd64.zip" "Windows client zip" diff --git a/contrib/win-installer/podman-theme.wxl b/contrib/win-installer/podman-theme.wxl new file mode 100644 index 0000000000..7fea09054a --- /dev/null +++ b/contrib/win-installer/podman-theme.wxl @@ -0,0 +1,68 @@ + + + + + + [WixBundleName] [VERSION] Setup + [WixBundleName] [VERSION] + Welcome to [WixBundleName] Setup + Welcome to the [WixBundleName] [VERSION] setup wizard. This will install [WixBundleName] on your computer. + +Additionally, you have the option to also install WSL (required by podman) if it is not already enabled. This operation requires a reboot during the installation process. Alternatively, you can deselect the WSL checkbox, and install WSL manually using the wsl --install command. + +Finally, click install to continue, or Close to abort the installation. + Version [WixBundleVersion] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Repair Successfully Completed + Uninstall Successfully Completed + Installation Successfully Completed + Setup Successful + &Open Guide && Close + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Setup Failed + Uninstall Failed + Repair Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + No action was taken as a system reboot is required. + diff --git a/contrib/win-installer/podman-theme.xml b/contrib/win-installer/podman-theme.xml new file mode 100644 index 0000000000..8d7be5d722 --- /dev/null +++ b/contrib/win-installer/podman-theme.xml @@ -0,0 +1,97 @@ + + + + + + #(loc.Title) Setup + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + Segoe UI + + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + + #(loc.InstallHeader) + #(loc.InstallMessage) + + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + Install WSL if not present + + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + + + #(loc.FilesInUseHeader) + #(loc.FilesInUseLabel) + + + + + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.Title) + + #(loc.ModifyHeader) + + + + + + #(loc.Title) + + #(loc.SuccessHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) + + #(loc.SuccessRestartText) + + + + + + #(loc.FailureHeader) + #(loc.FailureInstallHeader) + #(loc.FailureUninstallHeader) + #(loc.FailureRepairHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + diff --git a/contrib/win-installer/podman-ui.wxs b/contrib/win-installer/podman-ui.wxs new file mode 100644 index 0000000000..1270459500 --- /dev/null +++ b/contrib/win-installer/podman-ui.wxs @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + 1 + + 1 + 1 + 1 + + Installed AND PATCH + Installed AND PATCH + + + Installed AND PATCH + (NOT Installed) AND NOT AFTERREBOOT + + + + + + + + diff --git a/contrib/win-installer/podman.wxs b/contrib/win-installer/podman.wxs new file mode 100644 index 0000000000..b61bb2802a --- /dev/null +++ b/contrib/win-installer/podman.wxs @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + NOT (WITH_WSL = 0) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (NOT Installed) AND WSL_INSTALL = 1 AND HAS_WSLFEATURE = 0 + + + + + + + + + + + + + + + + + + + + + + + + + WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed + + + + WSL_INSTALL = 1 + (NOT Installed) AND WSL_INSTALL = 1 AND HAS_WSLFEATURE = 0 AND NOT AFTERREBOOT + + + + diff --git a/contrib/win-installer/process-release.ps1 b/contrib/win-installer/process-release.ps1 new file mode 100644 index 0000000000..ba7b47f4b7 --- /dev/null +++ b/contrib/win-installer/process-release.ps1 @@ -0,0 +1,158 @@ +function Copy-Artifact { + param( + [Parameter(Mandatory)] + [string]$fileName + ) + $file = Get-ChildItem -Recurse -Path . -Name $fileName + if (!$file) { + throw "Could not find $filename" + } + Write-Host "file:" $file + Copy-Item -Path $file -Destination "..\artifacts\$filename" -ErrorAction Stop +} + +function DownloadOrSkip { + param( + [Parameter(Mandatory)] + [string]$url, + [Parameter(Mandatory)] + [string]$file + ) + $ProgressPreference = 'SilentlyContinue'; + try { + Invoke-WebRequest -UseBasicParsing -ErrorAction Stop -Uri $url -OutFile $file + } Catch { + if ($_.Exception.Response.StatusCode -eq 404) { + Write-Host "URL not available, signaling skip:" + Write-Host "URL: $url" + Exit 2 + } + + throw $_.Exception + } +} + +function DownloadOptional { + param( + [Parameter(Mandatory)] + [string]$url, + [Parameter(Mandatory)] + [string]$file + ) + $ProgressPreference = 'SilentlyContinue'; + try { + Invoke-WebRequest -UseBasicParsing -ErrorAction Stop -Uri $url -OutFile $file + } Catch { + } + + Return +} + + +if ($args.Count -lt 1) { + Write-Host "Usage: " $MyInvocation.MyCommand.Name " [release_dir]" + Exit 1 +} + +$releaseDir = "" +if ($args.Count -gt 1 -and $args[1].Length -gt 0) { + $path = $args[1] + $releaseDir = (Resolve-Path -Path "$path" -ErrorAction Stop).Path +} + + +$base_url = "$ENV:FETCH_BASE_URL" +if ($base_url.Length -le 0) { + $base_url = "https://github.com/containers/podman" +} + +$version = $args[0] +if ($version -notmatch '^v?([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$') { + Write-Host "Invalid version" + Exit 1 +} + +# WiX burn requires a QWORD version only, numeric only +$Env:INSTVER=$Matches[1] + +if ($version[0] -ne 'v') { + $version = 'v' + $version +} + +$restore = 0 +$exitCode = 0 + +try { + Write-Host "Cleaning up old artifacts" + Remove-Item -Force -Recurse -Path .\docs -ErrorAction SilentlyContinue | Out-Null + Remove-Item -Force -Recurse -Path .\artifacts -ErrorAction SilentlyContinue | Out-Null + Remove-Item -Force -Recurse -Path .\fetch -ErrorAction SilentlyContinue | Out-Null + + New-Item fetch -ItemType Directory | Out-Null + New-Item artifacts -ItemType Directory | Out-Null + + Write-Host "Fetching zip release" + + Push-Location fetch -ErrorAction Stop + $restore = 1 + $ProgressPreference = 'SilentlyContinue'; + + if ($releaseDir.Length -gt 0) { + Copy-Item -Path "$releaseDir/podman-remote-release-windows_amd64.zip" "release.zip" + } else { + DownloadOrSkip "$base_url/releases/download/$version/podman-remote-release-windows_amd64.zip" "release.zip" + DownloadOptional "$base_url/releases/download/$version/shasums" ..\shasums + } + Expand-Archive -Path release.zip + $loc = Get-ChildItem -Recurse -Path . -Name win-sshproxy.exe + if (!$loc) { + if ($releaseDir.Length -gt 0) { + throw "Release dir only supports zip which includes win-sshproxy.exe" + } + Write-Host "Old release, zip does not include win-sshproxy.exe, fetching via msi" + DownloadOrSkip "$base_url/releases/download/$version/podman-$version.msi" "podman.msi" + dark -x expand ./podman.msi + if (!$?) { + throw "Dark command failed" + } + $loc = Get-ChildItem -Recurse -Path expand -Name 4A2AD125-34E7-4BD8-BE28-B2A9A5EDBEB5 + if (!$loc) { + throw "Could not obtain win-sshproxy.exe" + } + Copy-Item -Path "expand\$loc" -Destination "win-sshproxy.exe" -ErrorAction Stop + Remove-Item -Recurse -Force -Path expand + } + + Write-Host "Copying artifacts" + Foreach ($fileName in "win-sshproxy.exe", "podman.exe") { + Copy-Artifact($fileName) + } + + $docsloc = Get-ChildItem -Path . -Name docs -Recurse + $loc = Get-ChildItem -Recurse -Path . -Name podman-for-windows.html + if (!$loc) { + Write-Host "Old release did not include welcome page, using podman-machine instead" + $loc = Get-ChildItem -Recurse -Path . -Name podman-machine.html + Copy-Item -Path $loc -Destination "$docsloc\podman-for-windows.html" + } + + Write-Host "Copying docs" + Copy-Item -Recurse -Path $docsloc -Destination ..\docs -ErrorAction Stop + Write-Host "Done!" + + if (!$loc) { + throw "Could not find docs" + } +} +catch { + Write-Host $_ + + $exitCode = 1 +} +finally { + if ($restore) { + Pop-Location + } +} + +exit $exitCode diff --git a/contrib/win-installer/resources/podman-banner.png b/contrib/win-installer/resources/podman-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..e5070db986bb22d65b545d4ec1490233d289b643 GIT binary patch literal 4069 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 AzyJUM literal 0 HcmV?d00001 diff --git a/contrib/win-installer/resources/podman-dialog.png b/contrib/win-installer/resources/podman-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0c49d984f85dbeab7a401c2a3db29dfa9ca8db GIT binary patch literal 14142 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 literal 0 HcmV?d00001 diff --git a/contrib/win-installer/resources/podman-logo.ico b/contrib/win-installer/resources/podman-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..cb1dab6a75ca66387a3ee719272466a7bd19c1c5 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/contrib/win-installer/resources/podman-sidebar.png b/contrib/win-installer/resources/podman-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..cc02497065abab93a10659b28f5da6c9cdd2bbf5 GIT binary patch literal 13016 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 literal 0 HcmV?d00001 diff --git a/contrib/win-installer/welcome-install-dlg.wxs b/contrib/win-installer/welcome-install-dlg.wxs new file mode 100644 index 0000000000..cc0f1c6433 --- /dev/null +++ b/contrib/win-installer/welcome-install-dlg.wxs @@ -0,0 +1,31 @@ + + + + + + + + + + + + + !(wix.WixUICostingPopupOptOut) OR CostingComplete = 1 + 1]]> + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST) + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + (OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F") + + + 1 + + + + + + + NOT Installed + + + diff --git a/pkg/machine/wsl/machine.go b/pkg/machine/wsl/machine.go index 81f1d187f7..f13482b501 100644 --- a/pkg/machine/wsl/machine.go +++ b/pkg/machine/wsl/machine.go @@ -638,13 +638,13 @@ func installScripts(dist string) error { } func checkAndInstallWSL(opts machine.InitOptions) (bool, error) { - if isWSLInstalled() { + if IsWSLInstalled() { return true, nil } admin := hasAdminRights() - if !isWSLFeatureEnabled() { + if !IsWSLFeatureEnabled() { return false, attemptFeatureInstall(opts, admin) } @@ -1105,9 +1105,10 @@ func waitPipeExists(pipeName string, retries int, checkFailure func() error) err return err } -func isWSLInstalled() bool { - cmd := exec.Command("wsl", "--status") +func IsWSLInstalled() bool { + cmd := SilentExecCmd("wsl", "--status") out, err := cmd.StdoutPipe() + cmd.Stderr = nil if err != nil { return false } @@ -1131,9 +1132,8 @@ func isWSLInstalled() bool { return true } -func isWSLFeatureEnabled() bool { - cmd := exec.Command("wsl", "--set-default-version", "2") - return cmd.Run() == nil +func IsWSLFeatureEnabled() bool { + return SilentExec("wsl", "--set-default-version", "2") == nil } func isWSLRunning(dist string) (bool, error) { diff --git a/pkg/machine/wsl/util_windows.go b/pkg/machine/wsl/util_windows.go index 6c74e5652c..6613bde1f0 100644 --- a/pkg/machine/wsl/util_windows.go +++ b/pkg/machine/wsl/util_windows.go @@ -6,6 +6,7 @@ import ( "fmt" "io/ioutil" "os" + "os/exec" "path/filepath" "strings" "syscall" @@ -343,3 +344,17 @@ func sendQuit(tid uint32) { postMessage := user32.NewProc("PostThreadMessageW") postMessage.Call(uintptr(tid), WM_QUIT, 0, 0) } + +func SilentExec(command string, args ...string) error { + cmd := exec.Command(command, args...) + cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000} + cmd.Stdout = nil + cmd.Stderr = nil + return cmd.Run() +} + +func SilentExecCmd(command string, args ...string) *exec.Cmd { + cmd := exec.Command(command, args...) + cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000} + return cmd +} diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/vendor/golang.org/x/sys/windows/svc/eventlog/install.go new file mode 100644 index 0000000000..43e324f4b4 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/eventlog/install.go @@ -0,0 +1,81 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows +// +build windows + +package eventlog + +import ( + "errors" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/registry" +) + +const ( + // Log levels. + Info = windows.EVENTLOG_INFORMATION_TYPE + Warning = windows.EVENTLOG_WARNING_TYPE + Error = windows.EVENTLOG_ERROR_TYPE +) + +const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` + +// Install modifies PC registry to allow logging with an event source src. +// It adds all required keys and values to the event log registry key. +// Install uses msgFile as the event message file. If useExpandKey is true, +// the event message file is installed as REG_EXPAND_SZ value, +// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and +// log.Info to specify events supported by the new event source. +func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) + if err != nil { + return err + } + defer appkey.Close() + + sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) + if err != nil { + return err + } + defer sk.Close() + if alreadyExist { + return errors.New(addKeyName + `\` + src + " registry key already exists") + } + + err = sk.SetDWordValue("CustomSource", 1) + if err != nil { + return err + } + if useExpandKey { + err = sk.SetExpandStringValue("EventMessageFile", msgFile) + } else { + err = sk.SetStringValue("EventMessageFile", msgFile) + } + if err != nil { + return err + } + err = sk.SetDWordValue("TypesSupported", eventsSupported) + if err != nil { + return err + } + return nil +} + +// InstallAsEventCreate is the same as Install, but uses +// %SystemRoot%\System32\EventCreate.exe as the event message file. +func InstallAsEventCreate(src string, eventsSupported uint32) error { + return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) +} + +// Remove deletes all registry elements installed by the correspondent Install. +func Remove(src string) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) + if err != nil { + return err + } + defer appkey.Close() + return registry.DeleteKey(appkey, src) +} diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/vendor/golang.org/x/sys/windows/svc/eventlog/log.go new file mode 100644 index 0000000000..f37b4b5107 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/eventlog/log.go @@ -0,0 +1,70 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows +// +build windows + +// Package eventlog implements access to Windows event log. +package eventlog + +import ( + "errors" + "syscall" + + "golang.org/x/sys/windows" +) + +// Log provides access to the system log. +type Log struct { + Handle windows.Handle +} + +// Open retrieves a handle to the specified event log. +func Open(source string) (*Log, error) { + return OpenRemote("", source) +} + +// OpenRemote does the same as Open, but on different computer host. +func OpenRemote(host, source string) (*Log, error) { + if source == "" { + return nil, errors.New("Specify event log source") + } + var s *uint16 + if host != "" { + s = syscall.StringToUTF16Ptr(host) + } + h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) + if err != nil { + return nil, err + } + return &Log{Handle: h}, nil +} + +// Close closes event log l. +func (l *Log) Close() error { + return windows.DeregisterEventSource(l.Handle) +} + +func (l *Log) report(etype uint16, eid uint32, msg string) error { + ss := []*uint16{syscall.StringToUTF16Ptr(msg)} + return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) +} + +// Info writes an information event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Info(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) +} + +// Warning writes an warning event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Warning(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) +} + +// Error writes an error event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Error(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index cc3d7b6a7f..f1d4758e4a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -794,6 +794,7 @@ golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry +golang.org/x/sys/windows/svc/eventlog # golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 ## explicit golang.org/x/term From 744878a71cb225fca6cf6b8f322539b717559614 Mon Sep 17 00:00:00 2001 From: "Jason T. Greene" Date: Tue, 6 Sep 2022 14:24:12 -0500 Subject: [PATCH 3/3] Add win-installer build/verify workflows to CI Signed-off-by: Jason T. Greene --- .cirrus.yml | 24 +++++++++- contrib/cirrus/win-installer-install.ps1 | 6 +++ contrib/cirrus/win-installer-main.ps1 | 60 ++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 contrib/cirrus/win-installer-install.ps1 create mode 100644 contrib/cirrus/win-installer-main.ps1 diff --git a/.cirrus.yml b/.cirrus.yml index dc07358360..5d9500e92b 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -14,6 +14,8 @@ env: GOPATH: &gopath "/var/tmp/go" GOCACHE: "${GOPATH}/cache" GOSRC: &gosrc "/var/tmp/go/src/github.com/containers/podman" + # Store the unaltered default location, for tasks that need it + CIRRUS_DEFAULT_WORK: ${CIRRUS_WORKING_DIR} CIRRUS_WORKING_DIR: *gosrc # The default is 'sh' if unspecified CIRRUS_SHELL: "/bin/bash" @@ -60,9 +62,10 @@ env: # Curl-command prefix for downloading task artifacts, simply add the # the url-encoded task name, artifact name, and path as a suffix. + ART_URL: https://api.cirrus-ci.com/v1/artifact/build/${CIRRUS_BUILD_ID} ARTCURL: >- curl --retry 5 --retry-delay 8 --fail --location -O - --url https://api.cirrus-ci.com/v1/artifact/build/${CIRRUS_BUILD_ID} + --url ${ART_URL} # Default timeout for each task @@ -1019,6 +1022,7 @@ success_task: - consistency_aarch64 - alt_build - osx_alt_build + - win_installer - docker-py_test - unit_test - apiv2_test @@ -1103,6 +1107,24 @@ artifacts_task: type: application/octet-stream +win_installer_task: + name: "Verify Win Installer Build" + alias: win_installer + depends_on: + - alt_build + windows_container: + image: cirrusci/windowsservercore:2019 + env: + PATH: "${PATH};C:\\ProgramData\\chocolatey\\bin" + CIRRUS_SHELL: powershell + CIRRUS_CLONE_DEPTH: 1 + # Fake version, we are only testing the installer functions, so version doesn't matter + WIN_INST_VER: 9.9.9 + CIRRUS_WORKING_DIR: "${CIRRUS_DEFAULT_WORK}" + install_script: '.\contrib\cirrus\win-installer-install.ps1' + main_script: '.\contrib\cirrus\win-installer-main.ps1' + + # When a new tag is pushed, confirm that the code and commits # meet criteria for an official release. release_task: diff --git a/contrib/cirrus/win-installer-install.ps1 b/contrib/cirrus/win-installer-install.ps1 new file mode 100644 index 0000000000..f3fc4508d7 --- /dev/null +++ b/contrib/cirrus/win-installer-install.ps1 @@ -0,0 +1,6 @@ +# Update service is required for dotnet 3.5 (dep of wix) +Set-Service -Name wuauserv -StartupType "Manual" +choco install -y wixtoolset mingw golang archiver +if ($LASTEXITCODE -ne 0) { + Exit 1 +} diff --git a/contrib/cirrus/win-installer-main.ps1 b/contrib/cirrus/win-installer-main.ps1 new file mode 100644 index 0000000000..64a94ee639 --- /dev/null +++ b/contrib/cirrus/win-installer-main.ps1 @@ -0,0 +1,60 @@ + # Powershell doesn't exit after + function CheckExit { + if ($LASTEXITCODE -ne 0) { + Exit $LASTEXITCODE + } +} +function DownloadFile { + param( + [Parameter(Mandatory)] + [string]$url, + [Parameter(Mandatory)] + [string]$file, + [Int]$retries=5, + [Int]$delay=8 + ) + $ProgressPreference = 'SilentlyContinue'; + Write-Host "Downloading $url to $file" + For($i = 0;;) { + Try { + Invoke-WebRequest -UseBasicParsing -ErrorAction Stop -Uri $url -OutFile $file + Break + } Catch { + if (++$i -gt $retries) { + throw $_.Exception + } + Write-Host "Download failed - retrying:" $_.Exception.Response.StatusCode + Start-Sleep -Seconds $delay + } + } +} +# Drop global envs which have unix paths, defaults are fine +Remove-Item Env:\GOPATH +Remove-Item Env:\GOSRC +Remove-Item Env:\GOCACHE + +Set-Location contrib\win-installer + +# Download and extract alt_build win release zip +$url = "${ENV:ART_URL}/Windows Cross/repo/repo.tbz" +# Arc requires extension to be "tbz2" +DownloadFile "$url" "repo.tbz2" +arc unarchive repo.tbz2 .; CheckExit + +# Build Installer +.\build.ps1 $Env:WIN_INST_VER dev repo; CheckExit + +# Run the installer silently and WSL install option disabled (prevent reboots, wsl requirements) +# We need AllowOldWin=1 for server 2019 (cirrus image), can be dropped after server 2022 +$ret = Start-Process -Wait -PassThru ".\podman-${ENV:WIN_INST_VER}-dev-setup.exe" -ArgumentList "/install /quiet WSLCheckbox=0 AllowOldWin=1 /log inst.log" +if ($ret.ExitCode -ne 0) { + Write-Host "Install failed, dumping log" + Get-Content inst.log + Exit $ret.ExitCode +} +if (! ((Test-Path -Path "C:\Program Files\RedHat\Podman\podman.exe") -and ` + (Test-Path -Path "C:\Program Files\RedHat\Podman\win-sshproxy.exe"))) { + Write-Host "Expected podman.exe and win-sshproxy.exe, one or both not present after install" + Exit 1 +} +Write-Host "Installer verification successful!"