Public/Get-specTonorefIcons.ps1

Function Get-specTonorefIcons {
    <#
    .SYNOPSIS
        Downloads Tonoref icons from a remote location if needed, ensuring local copies match what's available remotely.
 
    .DESCRIPTION
        This function helps manage icons for Tonoref devices. It checks local icon files against remote versions (using hash comparisons) and downloads them only if they are missing or outdated.
 
    .PARAMETER IconName
        Specifies the name (or names) of the icons to check and potentially download. Accepts pipeline input.
 
    .PARAMETER LocalIconPath
        The path on the local machine where icons should be stored.
 
    .PARAMETER RemoteIconPath
        The base URL path of the remote location where the icons are stored. Do not include the icon name or SAS token in this parameter.
 
    .PARAMETER sasReadToken
        A valid SAS Read Token for accessing the remote icon storage.
 
    .EXAMPLE
        $iconList = "Icon1.png", "Icon2.png"
        $iconList | Get-specTonorefIcons -LocalIconPath "C:\Icons\" -RemoteIconPath "https://icons.storage.blob.core.windows.net/container" -sasReadToken "?sv=2020-08-04&ss=bfqt&srt=sco&sp=rl&st=2022-10-11&se=2023-12-31&sig=0a0b34c12d..."
 
    .NOTES
        Author: owen.heaume
        Version: 1.0.0 - Initial release
    #>


    [cmdletBinding()]
    [Alias ('Download-specTonorefIconsIfRequired')]

    param (
        [Parameter(Mandatory, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]]$IconName,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)]
        [string]$LocalIconPath,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)]
        [string]$RemoteIconPath,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)]
        [string]$sasReadToken
    )

    Begin {
    }

    Process {
        foreach ($icon in $IconName) {
            Write-Host "Checking for $icon" -ForegroundColor DarkCyan
            $fullLocalIconPath = Join-Path -Path $localIconPath -ChildPath $icon
            $fullRemoteIconPath = "$remoteIconPath/$icon" + $sasReadToken

            If (Test-Path $fullLocalIconPath) {
                $LocalHash = Get-SpecMDFileHashBase64 -FilePath $fullLocalIconPath
            } else {
                $LocalHash = $null
            }

            #2. Get the hash of the remote file
            $RemoteHash = Get-SpecMDFileHashBase64 -FileURL $fullRemoteIconPath


            #3. If hashes match - then nothing to do
            if ($LocalHash -eq $RemoteHash) {
                Write-Host "Local file [$FullLocalIconPath] already exists and has the same hash as remote file`n" -ForegroundColor DarkGray
            }

            #4. Hashes do not match - download the file from blob storage.
            if ($LocalHash -ne $RemoteHash) {
                Write-Host "Local file hash is different or null compared to remote file so downloading remote file" -ForegroundColor DarkGray
                # Download file to designate path on local device (overwrites if already there)
                $result = Get-SpecBlobFileFromURL -FileUrl $fullRemoteIconPath -FilePath $fullLocalIconPath
                if ($result -eq 0) {
                    Write-Host "Downloaded file OK`n" -ForegroundColor darkGreen
                } else {
                    Write-Host "An error occurred downloading the file" -ForegroundColor DarkRed
                }
            }
        }
    }
}