Skip to content

Commit

Permalink
Merge pull request #1415 from ykuijs/master
Browse files Browse the repository at this point in the history
  • Loading branch information
ykuijs authored Nov 9, 2022
2 parents 9978e8c + 8a160b5 commit 3882797
Show file tree
Hide file tree
Showing 15 changed files with 2,235 additions and 281 deletions.
19 changes: 18 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- SPProductUpdate
- Added support for SharePoint Subscription Edition

### Changed

- SPProductUpdate
- Added logic to check if all servers in the farm are on the same
patch level before resuming the search crawls again

### Fixed

- SPInstallPrereqs
- Fix issue where a failed VC++ upgrade results in two versions being present, which
the code didn't handle properly
- SPShellAdmins
- Fix issue where Get-SPDatabase could not be found
- SPUserProfileServiceApp
- Fixed issue where error 'You cannot call a method on a null-valued expression' was thrown when no MySiteHost was specified
- Fixed issue where error 'You cannot call a method on a null-valued expression' was
thrown when no MySiteHost was specified

## [5.2.0] - 2022-05-12

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1425,6 +1425,13 @@ function Test-SPDscPrereqInstallStatus
}
else
{
# Fix to prevent multiple items being returned when two items have the same BundleUpgradeCode
# This sometimes happens when the VC++ isn't upgraded properly.
if ($installedItem.Count -gt 1)
{
$installedItem = $installedItem | Sort-Object -Property DisplayVersion | Select-Object -Last 1
}

$isRequiredVersionInstalled = $true;

[System.Version]$minimumRequiredVersion = $itemToCheck.MinimumRequiredVersion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,17 +115,24 @@ function Get-TargetResource
$fileVersionInfo = New-Object -TypeName System.Version -ArgumentList $fileVersion
if ($fileVersionInfo.Major -eq 15)
{
$sharePointVersion = 2013
$sharePointVersion = '2013'
}
else
{
if ($fileVersionInfo.Build.ToString().Length -eq 4)
{
$sharePointVersion = 2016
$sharePointVersion = '2016'
}
else
{
$sharePointVersion = 2019
if ($fileVersionInfo.Build -lt 13000)
{
$sharePointVersion = '2019'
}
else
{
$sharePointVersion = 'SE'
}
}
}

Expand Down Expand Up @@ -501,6 +508,7 @@ function Set-TargetResource
$searchSAs = Get-SPEnterpriseSearchServiceApplication
foreach ($searchSA in $searchSAs)
{
Write-Verbose -Message "Pausing all search service applications"
if ($searchSA.isPaused() -eq 0)
{
$searchSA.Pause()
Expand Down Expand Up @@ -661,14 +669,25 @@ function Set-TargetResource
{
# Resuming Search Service Application if paused###
Invoke-SPDscCommand -ScriptBlock {
$searchSAs = Get-SPEnterpriseSearchServiceApplication
foreach ($searchSA in $searchSAs)
$unpatchedServers = Get-SPDscAllServersPatchStatus | Where-Object { $_.Status -ne "UpgradeRequired" -and $_.Status -ne "UpgradeAvailable" }

if ($unpatchedServers.Count -eq 0)
{
if (($searchSA.IsPaused() -band 0x80) -ne 0)
Write-Verbose -Message "All servers are on the same patch level. Resuming the all search service applications!"
$searchSAs = Get-SPEnterpriseSearchServiceApplication
foreach ($searchSA in $searchSAs)
{
$searchSA.Resume()
if (($searchSA.IsPaused() -band 0x80) -ne 0)
{
$searchSA.Resume()
}
}
}
else
{
Write-Verbose -Message "There are still some unpatched servers. Skipping resuming the search!"
Write-Verbose -Message "The following servers aren't on the correct patch level: $($unpatchedServers -join ", ")"
}
}
}

Expand Down Expand Up @@ -741,8 +760,8 @@ function Get-SPDscLocalVersionInfo
(
# Parameter help description
[Parameter(Mandatory = $true)]
[ValidateSet(2013, 2016, 2019)]
[System.Int32]
[ValidateSet('2013', '2016', '2019', 'SE')]
[System.String]
$ProductVersion,

[Parameter()]
Expand All @@ -754,16 +773,25 @@ function Get-SPDscLocalVersionInfo
$IsWssPackage
)

$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($ProductVersion) Core"
if ($ProductVersion -eq 'SE')
{
$spVersion = 'Subscription Edition'
}
else
{
$spVersion = $ProductVersion
}

$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($spVersion) Core"

if (0 -ne $Lcid)
{
$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($ProductVersion) $($Lcid) (Lang|Language) Pack"
$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($spVersion) $($Lcid) (Lang|Language) Pack"
}

if ($IsWssPackage)
{
$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($ProductVersion) \d{4} (Lang|Language) Pack"
$productNameRegEx = "Microsoft SharePoint (Foundation|Server) $($spVersion) \d{4} (Lang|Language) Pack"
}
Write-Verbose "Product Name RegEx: $($productNameRegEx)"

Expand Down Expand Up @@ -812,7 +840,7 @@ function Get-SPDscLocalVersionInfo

if ($null -ne $patchGuid)
{
$detailedPatchInformation = Get-ItemProperty "$($patchRegistryPath)\$($patchGuid)"
$detailedPatchInformation = Get-ItemProperty "$($patchRegistryPath)\$($patchGuid)" -ErrorAction SilentlyContinue
$localPackage = $detailedPatchInformation.LocalPackage

if ($null -ne $localPackage)
Expand Down
6 changes: 6 additions & 0 deletions SharePointDsc/DSCResources/MSFT_SPProductUpdate/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ stream is added to indicate that the file is potentially from an unsafe source.
To use these files, make sure you first unblock them using Unblock-File.
SPProductUpdate will throw an error when it detects the file is blocked.

NOTE2:
When specifying the ShutdownServices parameter, the resource is stopping
several SharePoint services and pausing all search crawls. After patching
is complete, search crawls are only resumed when all servers in the farm
are patched on the same patch level.

IMPORTANT:
Since v3.3, this resource no longer relies on the farm being present to check
the installed patches. This means it is now possible to deploy updates during
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ function Get-TargetResource
}
}

$databaseOwners = Get-SPDscDatabaseOwnerList
$sqlInstances = (Get-SPDatabase -Verbose:$false).NormalizedDataSource | Sort-Object | Get-Unique
$databaseOwners = Get-SPDscDatabaseOwnerList -sqlInstances $sqlInstances

$shellAdmins = Get-SPShellAdmin -Verbose:$false

Expand Down Expand Up @@ -515,7 +516,7 @@ function Set-TargetResource
# Check if configured database exists, throw error if not
Write-Verbose -Message "Processing Database: $($database.Name)"

$currentCDB = Get-SPDatabase -Verbose:$false | Where-Object -FilterScript {
$currentCDB = Get-SPDatabase -Verbose:$false | Where-Object -FilterScript {
$_.Name -eq $database.Name
}
if ($null -ne $currentCDB)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
function Get-SPDscDatabaseOwnerList
{
param ( )
param
(
[Parameter(Mandatory = $true)]
[System.Object]
$sqlInstances
)

$sqlInstances = (Get-SPDatabase -Verbose:$false).NormalizedDataSource | Sort-Object | Get-Unique
$databaseOwners = $sqlInstances | ForEach-Object {
$connection = New-Object -TypeName "System.Data.SqlClient.SqlConnection"
$command = New-Object -TypeName "System.Data.SqlClient.SqlCommand"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
'Export-SPConfiguration',
'Export-SPDscDiagnosticData',
'Format-OfficePatchGUID',
'Get-SPDscAllServersPatchStatus',
'Get-SPDscAssemblyVersion',
'Get-SPDscBuildVersion',
'Get-SPDscContentService',
Expand Down
33 changes: 33 additions & 0 deletions SharePointDsc/Modules/SharePointDsc.Util/SharePointDsc.Util.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,39 @@ function Get-SPDscServerPatchStatus
return $statusType
}

function Get-SPDscAllServersPatchStatus
{
param ()

$farm = Get-SPFarm
$productVersions = [Microsoft.SharePoint.Administration.SPProductVersions]::GetProductVersions($farm)
$servers = Get-SPServer | Where-Object -FilterScript { $_.Role -ne "Invalid" }

[array]$srvStatus = @()
foreach ($server in $servers)
{
$serverProductInfo = $productVersions.GetServerProductInfo($server.Id);
if ($null -ne $serverProductInfo)
{
$statusType = $serverProductInfo.InstallStatus;
if ($statusType -ne 0)
{
$statusType = $serverProductInfo.GetUpgradeStatus($farm, $server);
}
}
else
{
$statusType = [Microsoft.SharePoint.Administration.SPServerProductInfo+StatusType]::NoActionRequired;
}

$srvStatus += [PSCustomObject]@{
Name = $server.Name
Status = $statusType
}
}
return $srvStatus
}

function Get-SPDscServiceContext
{
[CmdletBinding()]
Expand Down
1 change: 1 addition & 0 deletions SharePointDsc/SharePointDsc.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
'Export-SPDscDiagnosticData',
'Format-OfficePatchGUID',
'Get-SPDscDBForAlias',
'Get-SPDscAllServersPatchStatus',
'Get-SPDscAssemblyVersion',
'Get-SPDscBuildVersion',
'Get-SPDscClaimTypeMapping',
Expand Down
4 changes: 2 additions & 2 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ stages:
- 'Test_Unit_2019'
- 'Test_Unit_SPSE'
pool:
vmImage: 'ubuntu-18.04'
vmImage: 'ubuntu-latest'
timeoutInMinutes: 0
steps:
- pwsh: |
Expand Down Expand Up @@ -323,7 +323,7 @@ stages:
- job: Deploy_Module
displayName: 'Deploy Module'
pool:
vmImage: 'ubuntu-18.04'
vmImage: 'ubuntu-latest'
steps:
- task: DownloadPipelineArtifact@2
displayName: 'Download Pipeline Artifact'
Expand Down
2 changes: 1 addition & 1 deletion build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ Pester:
Script:
- tests/Unit/SharePointDsc
Tag:
CodeCoverageThreshold: 75 # Set to 0 to bypass
CodeCoverageThreshold: 73 # Set to 0 to bypass
CodeCoverageOutputFile: CodeCoverage.xml
CodeCoverageOutputFileEncoding: ascii

Expand Down
Loading

0 comments on commit 3882797

Please sign in to comment.