Private/Start-cChocoPackageInstall.ps1
function Start-cChocoPackageInstall { [CmdletBinding()] param ( [Parameter()] [array] $Configurations ) $ActiveToast = $false Write-Log -Severity "Information" -Message "cChocoPackageInstall:Validating Chocolatey Packages are Setup" #Evaluate Ring Status $Ring = Get-cChocoExRing Write-Log -Severity 'Information' -Message "Local Machine Deployment Ring: $Ring" #Evaluate VPN Status $VPNStatus = Get-VPNStatus #Validate No Duplicate Packages Defined with no Ring Details $DuplicateSearch = (Compare-Object -ReferenceObject $Configurations.Name -DifferenceObject ($Configurations.Name | Select-Object -Unique) | Where-Object { $_.SideIndicator -eq '<=' }).InputObject $Duplicates = $Configurations | Where-Object { $DuplicateSearch -eq $_.Name } | Where-Object { $null -eq $_.Ring } if ($Duplicates) { Write-Log -Severity 'Warning' -Message "Duplicate cChocoPackageInstall" Write-Log -Severity 'Warning' -Message "Duplicate Package Found removing from active processesing" $Configurations | Where-Object { $Duplicates.Name -eq $_.Name } | ForEach-Object { Write-Log -Severity 'Warning' -Message "Name: $($_.Name)" Write-Log -Severity 'Warning' -Message "Version $($_.Version)" Write-Log -Severity 'Warning' -Message "MinimumVersion $($_.MinimumVersion)" Write-Log -Severity 'Warning' -Message "DSC: $($_.DSC)" Write-Log -Severity 'Warning' -Message "Source: $($_.Source)" Write-Log -Severity 'Warning' -Message "Ensure: $($_.Ensure)" Write-Log -Severity 'Warning' -Message "AutoUpgrade: $($_.AutoUpgrade)" Write-Log -Severity 'Warning' -Message "VPN: $($_.VPN)" Write-Log -Severity 'Warning' -Message "Params: $($_.Params)" Write-Log -Severity 'Warning' -Message "ChocoParams: $($_.ChocoParams)" Write-Log -Severity 'Warning' -Message "Ring: $($_.Ring)" Write-Log -Severity 'Warning' -Message "Priority: $($_.Priority)" Write-Log -Severity 'Warning' -Message "OverrideMaintenanceWindow: $($_.OverrideMaintenanceWindow)" Write-Log -Severity 'Warning' -Message "Duplicate Package Defined" } #Filter Out Duplicates and Clear all package configuration files for next time processing Write-Log -Severity 'Warning' -Message "Filter Out Duplicates and Clear all package configuration files for next time processing" $Configurations = $Configurations | Where-Object { $Duplicates.Name -notcontains $_.Name } Get-ChildItem -Path $PackageConfigDestination -Filter *.psd1 | Where-Object { $_.Name -notmatch "sources.psd1|config.psd1|features.psd1" } | Remove-Item -Force -ErrorAction SilentlyContinue } #Filter and Validate Packages with defined deploymentrings Write-Log -Severity 'Information' -Message "Getting Valid Deployment Ring Packages" $PriorityConfigurations = Get-PackagePriority -Configurations $Configurations $ModulePath = (Join-Path "$ModuleBase\DSCResources" "cChocoPackageInstall") Import-Module $ModulePath $i = 0 $Status = @() $PriorityConfigurations | ForEach-Object { $DSC = $null $Configuration = $_ $Object = [PSCustomObject]@{ Name = $Configuration.Name DSC = $null Version = $Configuration.Version MinimumVersion = $Configuration.MinimumVersion Ensure = $Configuration.Ensure Source = $Configuration.Source AutoUpgrade = $Configuration.AutoUpgrade VPN = $Configuration.VPN Params = $Configuration.Params ChocoParams = $Configuration.ChocoParams Ring = $Configuration.Ring Priority = $Configuration.Priority OverrideMaintenanceWindow = $Configuration.OverrideMaintenanceWindow Warning = $null } #Write Progress to Console if ($Configuration.Version) { $StatusMessage = "$($Configuration.Name) - $($Configuration.Version)" } elseif ($Configuration.MinimumVersion) { $StatusMessage = "$($Configuration.Name) - $($Configuration.MinimumVersion)" } else { $StatusMessage = "$($Configuration.Name)" } Write-Progress -Activity "cChocoPackageInstall - $i/$($PriorityConfigurations.Count)" -Status $StatusMessage -PercentComplete ( ( $i / $PriorityConfigurations.Count ) * 100 ) $i++ #Evaluate VPN Restrictions if ($null -ne $Configuration.VPN) { if ($Configuration.VPN -eq $false -and $VPNStatus) { $Configuration.Remove("VPN") $Configuration.Remove("Ring") $Configuration.Remove("OverrideMaintenanceWindow") $Configuration.Remove("Priority") $Object.Warning = "Configuration restricted when VPN is connected" $DSC = Test-TargetResource @Configuration $Object.DSC = $DSC $Status += $Object return } if ($Configuration.VPN -eq $true -and -not($VPNStatus)) { $Configuration.Remove("VPN") $Configuration.Remove("Ring") $Configuration.Remove("OverrideMaintenanceWindow") $Configuration.Remove("Priority") $Object.Warning = "Configuration restricted when VPN is not established" $DSC = Test-TargetResource @Configuration $Object.DSC = $DSC $Status += $Object return } $Configuration.Remove("VPN") } #Evaluate Ring Restrictions if ($null -ne $Configuration.Ring) { $ConfigurationRingValue = Get-RingValue -Name $Configuration.Ring if ($Ring) { $SystemRingValue = Get-RingValue -Name $Ring } if ($SystemRingValue -lt $ConfigurationRingValue ) { $Object.Warning = "Configuration restricted to $($Configuration.Ring) ring. Current ring $Ring" $Configuration.Remove("Ring") $Configuration.Remove("OverrideMaintenanceWindow") $Configuration.Remove("VPN") $Configuration.Remove("Priority") $DSC = Test-TargetResource @Configuration $Object.DSC = $DSC $Status += $Object return } $Configuration.Remove("Ring") } #Evaluate Maintenance Window Restrictions if (($Configuration.OverrideMaintenanceWindow -ne $true) -and ($Global:OverrideMaintenanceWindow -ne $true)) { if (-not($Global:MaintenanceWindowEnabled -and $Global:MaintenanceWindowActive)) { $Object.Warning = "Configuration restricted to Maintenance Window" $Configuration.Remove("OverrideMaintenanceWindow") $Configuration.Remove("Ring") $Configuration.Remove("VPN") $Configuration.Remove("Priority") $DSC = Test-TargetResource @Configuration $Object.DSC = $DSC $Status += $Object #Create Pending Update Notice if (($Global:EnableNotifications) -and (-not($DSC))) { $UpdateToast = $true } return } } $Configuration.Remove("OverrideMaintenanceWindow") $Configuration.Remove("Priority") $DSC = Test-TargetResource @Configuration if (-not($DSC)) { #Create Active Update Notice if ((-not($ActiveToast)) -and $Global:EnableNotifications) { New-PackageInstallNotification $ActiveToast = $true } $null = Set-TargetResource @Configuration $DSC = Test-TargetResource @Configuration } $Object.DSC = $DSC $Status += $Object } #Remove Module for Write-Host limitations Remove-Module "cChocoPackageInstall" Write-Progress -Activity 'cChocoPackageInstall' -Completed Write-Log -Severity "Information" -Message "Starting cChocoPackageInstall" $Status | ForEach-Object { Write-Host '----------cChocoPackageInstall----------' -ForegroundColor DarkCyan Write-Log -Severity 'Information' -Message "Name: $($_.Name)" Write-Log -Severity 'Information' -Message "DSC: $($_.DSC)" Write-Log -Severity 'Information' -Message "Version $($_.Version)" Write-Log -Severity 'Information' -Message "MinimumVersion $($_.MinimumVersion)" Write-Log -Severity 'Information' -Message "Source: $($_.Source)" Write-Log -Severity 'Information' -Message "Ensure: $($_.Ensure)" Write-Log -Severity 'Information' -Message "AutoUpgrade: $($_.AutoUpgrade)" Write-Log -Severity 'Information' -Message "VPN: $($_.VPN)" Write-Log -Severity 'Information' -Message "Params: $($_.Params)" Write-Log -Severity 'Information' -Message "ChocoParams: $($_.ChocoParams)" Write-Log -Severity 'Information' -Message "Ring: $($_.Ring)" Write-Log -Severity 'Information' -Message "Priority: $($_.Priority)" Write-Log -Severity 'Information' -Message "OverrideMaintenanceWindow: $($_.OverrideMaintenanceWindow)" if ($_.Warning) { Write-Log -Severity Warning -Message "$($_.Warning)" } } Write-Host '----------cChocoPackageInstall----------' -ForegroundColor DarkCyan #Complete Active Toast Notification $PendingReboot = Test-PendingReboot -ErrorAction SilentlyContinue if ($Global:EnableNotifications -and $ActiveToast) { if ($PendingReboot) { Update-PackageInstallNotification -PendingReboot } else { Update-PackageInstallNotification } } #Create Pending Update Toast if ($Global:EnableNotifications -and $UpdateToast) { $GetcChocoExMaintenanceWindow = Get-cChocoExMaintenanceWindow New-PendingUpdateNotification -Start $GetcChocoExMaintenanceWindow.Start -End $GetcChocoExMaintenanceWindow.End -UTC $GetcChocoExMaintenanceWindow.UTC } } |