Skip to content

Commit 6ddfb45

Browse files
authored
Moving the class based resources from nested modules to root module (#45)
* Moving the class based resources Moving the class based resources from nested modules to root module Adding herited classes that contains helper methods * Moving LocalizedData of class based resources - Moving LocalizedData of class based resources in .strings.psd1 files. Based on stylesguidelines of DscCommunity. * Fix unassigned variable in Test method * Removing dummy object
1 parent e27250f commit 6ddfb45

16 files changed

+264
-286
lines changed

CHANGELOG.md

+14
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
55

66
## [Unreleased]
77

8+
### Added
9+
10+
- Adding herited classes that contains helper methods.
11+
12+
### Changed
13+
14+
- Moving the class based resources from nested modules to root module.
15+
- Moving LocalizedData of class based resources in .strings.psd1 files.
16+
Based on [stylesguidelines](https://dsccommunity.org/styleguidelines/localization/) of DscCommunity.
17+
18+
### Removed
19+
20+
- Removing dummy object
21+
822
## [0.7.2] - 2020-09-29
923

1024
### Changed

build.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
####################################################
55
CopyPaths:
66
- en-US
7-
- DSCClassResources
7+
#- DSCClassResources
88
- Modules
99
Encoding: UTF8
1010
VersionedOutputDirectory: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath Modules
2+
3+
Import-Module -Name (Join-Path -Path $modulePath -ChildPath DscResource.Common)
4+
Import-Module -Name (Join-Path -Path $modulePath -ChildPath (Join-Path -Path JeaDsc.Common -ChildPath JeaDsc.Common.psm1))
5+
6+
$script:localizedDataRole = Get-LocalizedData -DefaultUICulture en-US -FileName 'JeaRoleCapabilities.strings.psd1'
7+
8+
class RoleCapabilitiesUtility
9+
{
10+
hidden [boolean] ValidatePath()
11+
{
12+
$fileObject = [System.IO.FileInfo]::new($this.Path)
13+
Write-Verbose -Message ($script:localizedDataRole.ValidatingPath -f $fileObject.Fullname)
14+
Write-Verbose -Message ($script:localizedDataRole.CheckPsrcExtension -f $fileObject.Fullname)
15+
if ($fileObject.Extension -ne '.psrc')
16+
{
17+
Write-Verbose -Message ($script:localizedDataRole.NotPsrcExtension -f $fileObject.Fullname)
18+
return $false
19+
}
20+
21+
Write-Verbose -Message ($script:localizedDataRole.CheckParentFolder -f $fileObject.Fullname)
22+
if ($fileObject.Directory.Name -ne 'RoleCapabilities')
23+
{
24+
Write-Verbose -Message ($script:localizedDataRole.NotRoleCapabilitiesParent -f $fileObject.Fullname)
25+
return $false
26+
}
27+
28+
29+
Write-Verbose -Message $script:localizedDataRole.ValidePsrcPath
30+
return $true
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
$script:localizedDataSession = Get-LocalizedData -DefaultUICulture en-US -FileName 'JeaSessionConfiguration.strings.psd1'
2+
3+
class SessionConfigurationUtility
4+
{
5+
hidden [bool] TestParameters()
6+
{
7+
if (-not $this.SessionType)
8+
{
9+
$this.SessionType = 'RestrictedRemoteServer'
10+
}
11+
12+
if ($this.RunAsVirtualAccountGroups -and $this.GroupManagedServiceAccount)
13+
{
14+
throw $script:localizedDataSession.ConflictRunAsVirtualAccountGroupsAndGroupManagedServiceAccount
15+
}
16+
17+
if ($this.GroupManagedServiceAccount -and $this.RunAsVirtualAccount)
18+
{
19+
throw $script:localizedDataSession.ConflictRunAsVirtualAccountAndGroupManagedServiceAccount
20+
}
21+
22+
if (-not $this.GroupManagedServiceAccount)
23+
{
24+
$this.RunAsVirtualAccount = $true
25+
Write-Warning -Message $script:localizedDataSession.NotDefinedGMSaAndVirtualAccount
26+
}
27+
28+
return $true
29+
}
30+
31+
## Get a PS Session Configuration based on its name
32+
hidden [object] GetPSSessionConfiguration($Name)
33+
{
34+
$winRMService = Get-Service -Name 'WinRM'
35+
if ($winRMService -and $winRMService.Status -eq 'Running')
36+
{
37+
# Temporary disabling Verbose as xxx-PSSessionConfiguration methods verbose messages are useless for DSC debugging
38+
$verbosePreferenceBackup = $Global:VerbosePreference
39+
$Global:VerbosePreference = 'SilentlyContinue'
40+
$psSessionConfiguration = Get-PSSessionConfiguration -Name $Name -ErrorAction SilentlyContinue
41+
$Global:VerbosePreference = $verbosePreferenceBackup
42+
43+
if ($psSessionConfiguration)
44+
{
45+
return $psSessionConfiguration
46+
}
47+
else
48+
{
49+
return $null
50+
}
51+
}
52+
else
53+
{
54+
Write-Verbose -Message $script:localizedDataSession.WinRMNotRunningGetPsSession
55+
return $null
56+
}
57+
}
58+
59+
## Unregister a PS Session Configuration based on its name
60+
hidden [void] UnregisterPSSessionConfiguration($Name)
61+
{
62+
$winRMService = Get-Service -Name 'WinRM'
63+
if ($winRMService -and $winRMService.Status -eq 'Running')
64+
{
65+
# Temporary disabling Verbose as xxx-PSSessionConfiguration methods verbose messages are useless for DSC debugging
66+
$verbosePreferenceBackup = $Global:VerbosePreference
67+
$Global:VerbosePreference = 'SilentlyContinue'
68+
$null = Unregister-PSSessionConfiguration -Name $Name -Force -WarningAction 'SilentlyContinue'
69+
$Global:VerbosePreference = $verbosePreferenceBackup
70+
}
71+
else
72+
{
73+
throw ($script:localizedDataSession.WinRMNotRunningUnRegisterPsSession -f $Name)
74+
}
75+
}
76+
77+
## Register a PS Session Configuration and handle a WinRM hanging situation
78+
hidden [Void] RegisterPSSessionConfiguration($Name, $Path, $Timeout)
79+
{
80+
$winRMService = Get-Service -Name 'WinRM'
81+
if ($winRMService -and $winRMService.Status -eq 'Running')
82+
{
83+
Write-Verbose -Message ($script:localizedDataSession.RegisterPSSessionConfiguration -f $Name,$Path,$Timeout)
84+
# Register-PSSessionConfiguration has been hanging because the WinRM service is stuck in Stopping state
85+
# therefore we need to run Register-PSSessionConfiguration within a job to allow us to handle a hanging WinRM service
86+
87+
# Save the list of services sharing the same process as WinRM in case we have to restart them
88+
$processId = Get-CimInstance -ClassName 'Win32_Service' -Filter "Name LIKE 'WinRM'" | Select-Object -ExpandProperty ProcessId
89+
$serviceList = Get-CimInstance -ClassName 'Win32_Service' -Filter "ProcessId=$processId" | Select-Object -ExpandProperty Name
90+
foreach ($service in $serviceList.clone())
91+
{
92+
$dependentServiceList = Get-Service -Name $service | ForEach-Object { $_.DependentServices }
93+
foreach ($dependentService in $dependentServiceList)
94+
{
95+
if ($dependentService.Status -eq 'Running' -and $serviceList -notcontains $dependentService.Name)
96+
{
97+
$serviceList += $dependentService.Name
98+
}
99+
}
100+
}
101+
102+
if ($Path)
103+
{
104+
$registerString = "`$null = Register-PSSessionConfiguration -Name '$Name' -Path '$Path' -NoServiceRestart -Force -ErrorAction 'Stop' -WarningAction 'SilentlyContinue'"
105+
}
106+
else
107+
{
108+
$registerString = "`$null = Register-PSSessionConfiguration -Name '$Name' -NoServiceRestart -Force -ErrorAction 'Stop' -WarningAction 'SilentlyContinue'"
109+
}
110+
111+
$registerScriptBlock = [scriptblock]::Create($registerString)
112+
113+
if ($Timeout -gt 0)
114+
{
115+
$job = Start-Job -ScriptBlock $registerScriptBlock
116+
Wait-Job -Job $job -Timeout $Timeout
117+
Receive-Job -Job $job
118+
Remove-Job -Job $job -Force -ErrorAction 'SilentlyContinue'
119+
120+
# If WinRM is still Stopping after the job has completed / exceeded $Timeout, force kill the underlying WinRM process
121+
$winRMService = Get-Service -Name 'WinRM'
122+
if ($winRMService -and $winRMService.Status -eq 'StopPending')
123+
{
124+
$processId = Get-CimInstance -ClassName 'Win32_Service' -Filter "Name LIKE 'WinRM'" | Select-Object -ExpandProperty ProcessId
125+
Write-Verbose -Message ($script:localizedDataSession.ForcingProcessToStop -f $processId)
126+
$failureList = @()
127+
try
128+
{
129+
# Kill the process hosting WinRM service
130+
Stop-Process -Id $processId -Force
131+
Start-Sleep -Seconds 5
132+
Write-Verbose -Message ($script:localizedDataSession.RegisterPSSessionConfiguration -f $($serviceList -join ', '))
133+
# Then restart all services previously identified
134+
foreach ($service in $serviceList)
135+
{
136+
try
137+
{
138+
Start-Service -Name $service
139+
}
140+
catch
141+
{
142+
$failureList += $script:localizedDataSession.FailureListStartService -f $service
143+
}
144+
}
145+
}
146+
catch
147+
{
148+
$failureList += $script:localizedDataSession.FailureListKillWinRMProcess
149+
}
150+
151+
if ($failureList)
152+
{
153+
Write-Verbose -Message ($script:localizedDataSession.FailureListKillWinRMProcess -f $($failureList -join ', '))
154+
}
155+
}
156+
elseif ($winRMService -and $winRMService.Status -eq 'Stopped')
157+
{
158+
Write-Verbose -Message $script:localizedDataSession.RestartWinRM
159+
Start-Service -Name 'WinRM'
160+
}
161+
}
162+
else
163+
{
164+
Invoke-Command -ScriptBlock $registerScriptBlock
165+
}
166+
}
167+
else
168+
{
169+
throw ($script:localizedDataSession.WinRMNotRunningRegisterPsSession -f $Name)
170+
}
171+
}
172+
173+
}

source/DSCClassResources/JeaRoleCapabilities/JeaRoleCapabilities.psm1 source/Classes/JeaRoleCapabilities.ps1

+4-40
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
enum Ensure
2-
{
3-
Present
4-
Absent
5-
}
6-
7-
$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules'
8-
9-
Import-Module -Name (Join-Path -Path $modulePath -ChildPath DscResource.Common)
10-
Import-Module -Name (Join-Path -Path $modulePath -ChildPath (Join-Path -Path JeaDsc.Common -ChildPath JeaDsc.Common.psm1))
11-
12-
$script:localizedData = Get-LocalizedData -DefaultUICulture en-US
13-
141
[DscResource()]
15-
class JeaRoleCapabilities
2+
class JeaRoleCapabilities:RoleCapabilitiesUtility
163
{
174

185
[DscProperty()]
@@ -97,29 +84,6 @@ class JeaRoleCapabilities
9784
[DscProperty()]
9885
[string[]]$AssembliesToLoad
9986

100-
hidden [boolean] ValidatePath()
101-
{
102-
$fileObject = [System.IO.FileInfo]::new($this.Path)
103-
Write-Verbose -Message "Validating Path: $($fileObject.Fullname)"
104-
Write-Verbose -Message "Checking file extension is psrc for: $($fileObject.Fullname)"
105-
if ($fileObject.Extension -ne '.psrc')
106-
{
107-
Write-Verbose -Message "Doesn't have psrc extension for: $($fileObject.Fullname)"
108-
return $false
109-
}
110-
111-
Write-Verbose -Message "Checking parent forlder is RoleCapabilities for: $($fileObject.Fullname)"
112-
if ($fileObject.Directory.Name -ne 'RoleCapabilities')
113-
{
114-
Write-Verbose -Message "Parent folder isn't RoleCapabilities for: $($fileObject.Fullname)"
115-
return $false
116-
}
117-
118-
119-
Write-Verbose -Message 'Path is a valid psrc path. Returning true.'
120-
return $true
121-
}
122-
12387
[JeaRoleCapabilities] Get()
12488
{
12589
$currentState = [JeaRoleCapabilities]::new()
@@ -189,8 +153,8 @@ class JeaRoleCapabilities
189153
{
190154
if ($functionDefinitionName -notin $desiredState['VisibleFunctions'])
191155
{
192-
Write-Verbose -"Function defined but not visible to Role Configuration: $functionDefinitionName"
193-
Write-Error "Function defined but not visible to Role Configuration: $functionDefinitionName"
156+
Write-Verbose ($script:localizedDataRole.FunctionDefinedNotVisible -f $functionDefinitionName)
157+
Write-Error ($script:localizedDataRole.FunctionDefinedNotVisible -f $functionDefinitionName)
194158
$invalidConfiguration = $true
195159
}
196160
}
@@ -218,7 +182,7 @@ class JeaRoleCapabilities
218182
{
219183
if (-not ($this.ValidatePath()))
220184
{
221-
Write-Error -Message "Invalid path specified. It must point to a Module folder, be a psrc file and the parent folder must be called RoleCapabilities"
185+
Write-Error -Message $script:localizedDataRole.InvalidPath
222186
return $false
223187
}
224188
if ($this.Ensure -eq [Ensure]::Present -and -not (Test-Path -Path $this.Path))

0 commit comments

Comments
 (0)