Patch/Invoke-AutoUpdate.ps1
<#
.SYNOPSIS .DESCRIPTION .EXAMPLE .NOTES #> function Invoke-AutoUpdate { [alias("Automagic")] [cmdletbinding(SupportsShouldProcess)] param( # After the download completes all patches and extensions will be installed [switch] $autoInstall, # Skip the 45s delay between Sync and Patch Data update request. Usefull when installing small patches in a batch. [Parameter(DontShow)] [switch] $noSleep ) # Panic mode) $ErrorActionPreference = "Stop" #Region Preparation # Loading functions . (Join-Path $PSScriptRoot "Cmdlets\Misc\Save-DownloadedFile.ps1") # Reading config file if (!$PatchHelperConfig) { throw "Patch Helper is not configured. Run configure procedure." } # Fetching certificate $cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | Where-Object -Property Issuer -EQ -Value "CN=ADS Russia LLC" if (!$cert) { $cert = Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object -Property Issuer -EQ -Value "CN=ADS Russia LLC" if (!$cert) { throw "Certificate not found." } } $cert | Write-Verbose #endregion #Region Patches update # Checking installed patches Write-Host "Getting patches" $webSession = $null foreach ($i in 1..2) { $latestPatch = Get-PatchInfo -instanceName $PatchHelperConfig.DefaultInstance -level $i if ($latestPatch) { $latestPatch = $latestPatch.Number } else { $latestPatch = 0 } # Downloading updates # if($i -eq 1) { $latestPatch = 200 } else { $latestPatch = 60 } # debug if ($i -eq 1) { $layer = "dms" } else { if ($PatchHelperConfig.LayerName) { $layer = $PatchHelperConfig.LayerName } else { break; } } Write-Host "For layer $i latest patch detected is $latestPatch. Fetching updates." $checkUrl = "$($PatchHelperConfig.ReportURL)/patches/$layer`?fromNumber=$latestPatch" Write-Verbose $checkUrl $available = Invoke-WebRequest -Uri $checkUrl -Certificate $cert -SessionVariable 'webSession' if ($available.Content) { $patchList = $available.Content | ConvertFrom-Json if ($patchList) { if ($patchList -isnot [array]) { $patchList = @($patchList) } $i = 0; $cnt = $patchList.Count; Write-Progress -Activity "Downloading patch" -PercentComplete 0 $patchList | ForEach-Object { $downloadUrl = "$($PatchHelperConfig.ReportURL)/patches/a/($($_.ID))" Write-Verbose $downloadUrl Write-Progress -Activity "Downloading patch" -Status ($_.Name) -PercentComplete (($i++) / $cnt * 100) if ($PSCmdlet.ShouldProcess("$($_.ID)", "Download patch for layer $layer")) { $ProgressPreferenceBack = $ProgressPreference; $ProgressPreference = "SilentlyContinue"; Invoke-WebRequest -Uri $downloadUrl -Certificate $cert -WebSession $webSession ` | Save-DownloadedFile -Directory $PatchHelperConfig.DefaultPatchFolder $ProgressPreference = $ProgressPreferenceBack; } } Write-Progress -Activity "Downloading patch" -Completed } } } # Install downloaded patches if ($autoInstall) { foreach ($i in 1..2) { if (($i -eq 2) -and !$PatchHelperConfig.LayerName) { break; } Write-Host "Installing patches for layer $i." if ($PSCmdlet.ShouldProcess("$($PatchHelperConfig.DefaultPatchFolder)", "Install-PatchMnogo -instanceName $($PatchHelperConfig.DefaultInstance) -folder ""$($PatchHelperConfig.DefaultPatchFolder)"" -level $i")) { Install-PatchMnogo -instanceName $PatchHelperConfig.DefaultInstance -folder $PatchHelperConfig.DefaultPatchFolder -level $i -noSleep:$noSleep } } } #endregion #Region Extensions ipdate # Download extensions if ($PatchHelperConfig.apps) { Write-Host "Getting Extensions" $webSession = $null foreach ($i in 1..2) { $latestPatch = Get-PatchInfo -instanceName $PatchHelperConfig.DefaultInstance -level $i if ($latestPatch) { $latestPatch = $latestPatch.Number } else { $latestPatch = 0 } # Downloading updates # if($i -eq 1) { $latestPatch = 200 } else { $latestPatch = 60 } # debug if ($i -eq 1) { $layer = "dms" } else { if ($PatchHelperConfig.LayerName) { $layer = $PatchHelperConfig.LayerName } else { break; } } Write-Host "For layer $i latest patch detected is $latestPatch. Fetching updates." $checkUrl = "$($PatchHelperConfig.ReportURL)/extensions/$layer`?filter=$($PatchHelperConfig.apps -join ",")&latestPatch=$latestPatch" Write-Verbose $checkUrl $available = Invoke-WebRequest -Uri $checkUrl -Certificate $cert -SessionVariable 'webSession' if ($available.Content) { $patchList = $available.Content | ConvertFrom-Json if ($patchList) { if ($patchList -isnot [array]) { $patchList = @($patchList) } $i = 0; $cnt = $patchList.Count; Write-Progress -Activity "Downloading extension" -PercentComplete 0 $patchList | ForEach-Object { $downloadUrl = "$($PatchHelperConfig.ReportURL)/extensions/a/($($_.ID))" Write-Verbose $downloadUrl Write-Progress -Activity "Downloading extension" -Status ($_.Name) -PercentComplete (($i++) / $cnt * 100) if ($PSCmdlet.ShouldProcess("$($_.ID)", "Download extension for layer $layer")) { $ProgressPreferenceBack = $ProgressPreference; $ProgressPreference = "SilentlyContinue"; Invoke-WebRequest -Uri $downloadUrl -Certificate $cert -WebSession $webSession ` | Save-DownloadedFile -Directory $PatchHelperConfig.DefaultPatchFolder $ProgressPreference = $ProgressPreferenceBack; } } Write-Progress -Activity "Downloading extension" -Completed } } } # Upgrade extensions if ($autoInstall) { Write-Host "Upgrading extensions" if ($PSCmdlet.ShouldProcess("$($PatchHelperConfig.DefaultPatchFolder)", "Upgrade-Extension -instanceName $($PatchHelperConfig.DefaultInstance) -path $($PatchHelperConfig.DefaultPatchFolder)")) { Upgrade-Extension -instanceName $PatchHelperConfig.DefaultInstance -path $PatchHelperConfig.DefaultPatchFolder } } } #endregion } Export-ModuleMember -Alias "Automagic" -Function "Invoke-AutoUpdate" |