[Bug]: VMware applications fail due to changes to product API
What happened?
Recent changes to the VMware products and the move Omnissa have broken the available updates from the products API at: https://customerconnect.vmware.com/channel/public/api/v1.0/products/getProductsAtoZ
These will likely remain broken until the new Omnissa downloads site is live and working, and assuming it will also provide a similar API.
This affects:
- VMwareHorizonClient
- VMwareOSOptimizationTool
- VMwareSDWANClient
- VMwareWorkstationPlayer
- VMwareWorkstationPro
Version
2405.994
What PowerShell edition/s are you running Evergreen on?
PowerShell Core, Windows PowerShell
Which operating system/s are you running Evergreen on?
Windows 10+, macOS
Have you reviewed the documentation?
- [X] Troubleshooting at: https://stealthpuppy.com/evergreen/troubleshoot/
- [X] Known issues at: https://stealthpuppy.com/evergreen/issues/
Verbose output
VERBOSE: Function path: /Users/aaron/projects/evergreen/Evergreen/Apps/Get-VMwareWorkstationPro.ps1
VERBOSE: Function exists: /Users/aaron/projects/evergreen/Evergreen/Apps/Get-VMwareWorkstationPro.ps1.
VERBOSE: Dot sourcing: /Users/aaron/projects/evergreen/Evergreen/Apps/Get-VMwareWorkstationPro.ps1.
VERBOSE: Get-FunctionResource: read application resource strings from [/Users/aaron/projects/evergreen/Evergreen/Manifests/VMwareWorkstationPro.json]
VERBOSE: Calling: Get-VMwareWorkstationPro.
VERBOSE: Get-VMwareAPIPath: Return https://customerconnect.vmware.com/channel/public/api/v1.0/products
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: ContentType: application/json; charset=utf-8.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: DisableKeepAlive: True.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: Method: Default.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: MaximumRedirection: 2.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.2478.67.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: Uri: https://customerconnect.vmware.com/channel/public/api/v1.0/products/getProductsAtoZ.
VERBOSE: Invoke-EvergreenRestMethod: Invoke-RestMethod parameter: UseBasicParsing: True.
VERBOSE: Requested HTTP/1.1 GET with 0-byte payload
VERBOSE: Received HTTP/1.1 response of content type text/html of unknown size
VERBOSE: Content encoding: utf-8
Get-VMwareProductDownload: /Users/aaron/projects/evergreen/Evergreen/Apps/Get-VMwareWorkstationPro.ps1:17
Line |
17 | Get-VMwareProductDownload | `
| ~~~~~~~~~~~~~~~~~~~~~~~~~
| The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its
| properties do not match any of the parameters that take pipeline input.
I'll be removing these applications from Evergreen for the time being. It's likely the API used to find downloads is not going to be available on the Broadcom site and changes at Omnissa are still on-going
VMware Horizon Client is available on Omnissa.
https://customerconnect.omnissa.com/downloads/info/slug/desktop_end_user_computing/vmware_horizon_clients/horizon_8
I've reversed the auto update API call, but the downloads are in .tar format and they are cut down in that there are no VMware Tools ISOs included.
function Decompress-GZip($Path, $Destination) {
$inStream = New-Object System.IO.FileStream $Path, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read)
$gzipStream = New-Object System.IO.Compression.GZipStream $inStream, ([IO.Compression.CompressionMode]::Decompress)
$outStream = New-Object System.IO.FileStream $Destination, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None)
$buffer = New-Object byte[](1024)
while(($read = $gzipStream.Read($buffer, 0, 1024)) -gt 0) {
$outStream.Write($buffer, 0, $read)
}
$gzipStream.Close()
$outStream.Close()
$inStream.Close()
}
$TempPath = Join-Path $env:TEMP (New-Guid).Guid
New-Item -Path $TempPath -ItemType Directory -Force | Out-Null
$Products = @(
@{
ProductName = 'VMware Workstation Pro'
URL = 'https://softwareupdate.vmware.com/cds/vmw-desktop/ws-windows.xml'
MajorVersion = 17
}
@{
ProductName = 'VMware Workstation Player'
URL = 'https://softwareupdate.vmware.com/cds/vmw-desktop/player-windows.xml'
MajorVersion = 17
}
@{
ProductName = 'VMware Remote Console'
URL = 'https://softwareupdate.vmware.com/cds/vmw-desktop/vmrc-windows.xml'
#MajorVersion = 12
}
)
foreach ($Product in $Products) {
try {
$XML = Invoke-RestMethod -Uri $Product.URL -DisableKeepAlive
}
catch {
Write-Error "Failed to download $($Product.URL): $_"
continue
}
$MajorVersions = ($XML.metaList.metadata.url | Select-String -Pattern '\d+').Matches.Groups.Value | Sort-Object -Unique
if ($Product.MajorVersion) {
$MajorVersions = $MajorVersions | Where-Object {$_ -eq $Product.MajorVersion}
}
foreach ($MajorVersion in $MajorVersions) {
try {
$Version = (($XML.metaList.metadata.url | Select-String -Pattern "$MajorVersion(?:\.\d+)+").Matches.Groups.Value | ForEach-Object {[version]$_} | Sort-Object -Descending | Select-Object -First 1).ToString()
$MetadataURL = 'https://softwareupdate.vmware.com/cds/vmw-desktop/' + ($XML.metaList.metadata.url | Where-Object {$_ -match "/$Version/(?!.*packages)"})
$Download = Invoke-Download -Uri $MetadataURL -Destination $TempPath -PassThru
$MetadataPath = $Download.FullName -Replace '\.gz$'
Decompress-GZip -Path $Download.FullName -Destination $MetadataPath
$MetadataXML = [xml](Get-Content -Path $MetadataPath)
$URL = (Split-Path $MetadataURL -Parent) + $MetadataXML.metadataResponse.bulletin.componentList.component.relativePath.'#text'
[PSCustomObject]@{
Name = $Product.ProductName
MajorVersion = $MajorVersion
Version = $Version
URI = $URL
}
}
catch {
Write-Error "Error: $_"
continue
}
}
}
Remove-Item -Path $TempPath -Recurse -Force
(Invoke-Download is from my PsDownload, so install that or change the code to run the above)