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"