Public/Get-TerraformApplicationReleaseNumber.ps1
|
function Get-TerraformApplicationReleaseNumber { <# .SYNOPSIS Get version numbers of published/available Terraform releases .DESCRIPTION The function gets version numbers of published/available Terraform releases either from HashiCorp's release website or from GitHub repository. Either the latest stable release number or all release numbers are returned. .PARAMETER HashiCorp [Switch] The mandatory parameter -HashiCorp forces the function to use HashiCorp's release website as data source. .PARAMETER GitHub [Switch] The mandatory parameter -GitHub forces the function to use HashiCorp's GitHub repository. as data source. .PARAMETER All [Switch] The optional parameter -All specifies to return all version numbers instead of the latest stable. .OUTPUTS System.IO.String .EXAMPLE Get-TerraformApplicationReleaseNumber -HashiCorp .EXAMPLE Get-TerraformApplicationReleaseNumber -GitHub -All .EXAMPLE To process the result for version comparison use [Version] prefix (only working without -All switch because -All switch returns an array of values and also includes alpha/beta releases), e.g.: $AsVersion = [Version]$(Get-TerraformApplicationReleaseNumber -HashiCorp) #> [CmdletBinding(HelpUri='https://github.com/uplink-systems/powershell-modules/UplinkSystems.Terraform')] [Alias('Get-TfApplicationReleaseNumber')] param ( [Parameter(Mandatory=$true,Position=0,ParameterSetName='HashiCorp')] [Switch] $HashiCorp, [Parameter(Mandatory=$true,Position=0,ParameterSetName='GitHub')] [Switch] $GitHub, [Parameter(Mandatory=$false)] [Switch] $All ) begin { [Array]$Preferences = $ErrorActionPreference,$WarningPreference,$InformationPreference $ErrorActionPreference = 'SilentlyContinue' } process { switch ($PSCmdlet.ParameterSetName) { 'HashiCorp' { try { [System.Collections.ArrayList]$Releases = (Invoke-WebRequest -Uri 'https://releases.hashicorp.com/terraform/' -UseBasicParsing | Select-Object -ExpandProperty Content) -split "`n" | Select-String -Pattern '(?<=\/)([\d]+.[\d]+.[\d]+-[\w]+[\d]+|[\d]+.[\d]+.[\d]+)' | ForEach-Object {$_.Matches | ForEach-Object {$_.Groups[1].Value}} switch ($All) { $true { return $Releases } default { switch ($Releases[0] -match '-') { $true { $i = 0; do {$i += 1; $Release = $Releases[$i]} while ($Release -match '-') } default {$Release = $Releases[0]} } return $Release } } } catch { return $null } } 'GitHub' { try { switch ($All) { $true { $RestMethodUri = 'https://api.github.com/repos/hashicorp/terraform/releases' } default { $RestMethodUri = 'https://api.github.com/repos/hashicorp/terraform/releases/latest' } } $Releases = ((Invoke-RestMethod -Method GET -Uri $RestMethodUri -ErrorAction Stop).tag_name).SubString(1) return $Releases } catch { return $null } } } } end { $ErrorActionPreference = $Preferences[0] } } |