@mytechtoday/augment-extensions 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +29 -99
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +518 -106
- package/package.json +12 -3
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# PowerShell DSC Configurations
|
|
2
|
+
|
|
3
|
+
Best practices for Desired State Configuration, configuration data separation, and LCM setup.
|
|
4
|
+
|
|
5
|
+
## Configuration Structure
|
|
6
|
+
|
|
7
|
+
### Basic DSC Configuration
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
#Requires -Version 7.4
|
|
11
|
+
|
|
12
|
+
Configuration WebServerConfig
|
|
13
|
+
{
|
|
14
|
+
param(
|
|
15
|
+
[Parameter(Mandatory)]
|
|
16
|
+
[string[]]$ComputerName,
|
|
17
|
+
|
|
18
|
+
[Parameter()]
|
|
19
|
+
[string]$WebsiteName = 'Default Web Site'
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
Import-DscResource -ModuleName PSDesiredStateConfiguration
|
|
23
|
+
Import-DscResource -ModuleName xWebAdministration
|
|
24
|
+
|
|
25
|
+
Node $ComputerName
|
|
26
|
+
{
|
|
27
|
+
WindowsFeature IIS
|
|
28
|
+
{
|
|
29
|
+
Ensure = 'Present'
|
|
30
|
+
Name = 'Web-Server'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
WindowsFeature AspNet45
|
|
34
|
+
{
|
|
35
|
+
Ensure = 'Present'
|
|
36
|
+
Name = 'Web-Asp-Net45'
|
|
37
|
+
DependsOn = '[WindowsFeature]IIS'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
xWebsite DefaultSite
|
|
41
|
+
{
|
|
42
|
+
Ensure = 'Present'
|
|
43
|
+
Name = $WebsiteName
|
|
44
|
+
State = 'Started'
|
|
45
|
+
PhysicalPath = 'C:\inetpub\wwwroot'
|
|
46
|
+
DependsOn = '[WindowsFeature]IIS'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Configuration Data Separation
|
|
53
|
+
|
|
54
|
+
### Configuration Data File
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
# ConfigData.psd1
|
|
58
|
+
@{
|
|
59
|
+
AllNodes = @(
|
|
60
|
+
@{
|
|
61
|
+
NodeName = 'WebServer01'
|
|
62
|
+
Role = 'WebServer'
|
|
63
|
+
Environment = 'Production'
|
|
64
|
+
CertificateFile = 'C:\Certs\WebServer01.cer'
|
|
65
|
+
},
|
|
66
|
+
@{
|
|
67
|
+
NodeName = 'WebServer02'
|
|
68
|
+
Role = 'WebServer'
|
|
69
|
+
Environment = 'Production'
|
|
70
|
+
CertificateFile = 'C:\Certs\WebServer02.cer'
|
|
71
|
+
},
|
|
72
|
+
@{
|
|
73
|
+
NodeName = '*'
|
|
74
|
+
PSDscAllowPlainTextPassword = $false
|
|
75
|
+
PSDscAllowDomainUser = $true
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
NonNodeData = @{
|
|
80
|
+
WebsiteName = 'Corporate Portal'
|
|
81
|
+
DatabaseServer = 'SQL01.contoso.com'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Using Configuration Data
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
Configuration WebServerWithData
|
|
90
|
+
{
|
|
91
|
+
Import-DscResource -ModuleName PSDesiredStateConfiguration
|
|
92
|
+
|
|
93
|
+
Node $AllNodes.Where{$_.Role -eq 'WebServer'}.NodeName
|
|
94
|
+
{
|
|
95
|
+
$websiteName = $ConfigurationData.NonNodeData.WebsiteName
|
|
96
|
+
|
|
97
|
+
WindowsFeature IIS
|
|
98
|
+
{
|
|
99
|
+
Ensure = 'Present'
|
|
100
|
+
Name = 'Web-Server'
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
File WebContent
|
|
104
|
+
{
|
|
105
|
+
Ensure = 'Present'
|
|
106
|
+
DestinationPath = 'C:\inetpub\wwwroot\index.html'
|
|
107
|
+
Contents = "Welcome to $websiteName on $($Node.NodeName)"
|
|
108
|
+
Type = 'File'
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
# Compile configuration
|
|
114
|
+
$configData = Import-PowerShellDataFile -Path '.\ConfigData.psd1'
|
|
115
|
+
WebServerWithData -ConfigurationData $configData -OutputPath 'C:\DSC\Configs'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Idempotency
|
|
119
|
+
|
|
120
|
+
### Ensure Idempotent Resources
|
|
121
|
+
|
|
122
|
+
```powershell
|
|
123
|
+
Configuration IdempotentConfig
|
|
124
|
+
{
|
|
125
|
+
param([string]$ComputerName)
|
|
126
|
+
|
|
127
|
+
Import-DscResource -ModuleName PSDesiredStateConfiguration
|
|
128
|
+
|
|
129
|
+
Node $ComputerName
|
|
130
|
+
{
|
|
131
|
+
# ✅ GOOD: Idempotent - can run multiple times safely
|
|
132
|
+
File LogDirectory
|
|
133
|
+
{
|
|
134
|
+
Ensure = 'Present'
|
|
135
|
+
Type = 'Directory'
|
|
136
|
+
DestinationPath = 'C:\Logs'
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
Registry DisableIPv6
|
|
140
|
+
{
|
|
141
|
+
Ensure = 'Present'
|
|
142
|
+
Key = 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters'
|
|
143
|
+
ValueName = 'DisabledComponents'
|
|
144
|
+
ValueData = '0xFF'
|
|
145
|
+
ValueType = 'Dword'
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Service W32Time
|
|
149
|
+
{
|
|
150
|
+
Name = 'W32Time'
|
|
151
|
+
State = 'Running'
|
|
152
|
+
StartupType = 'Automatic'
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Test Idempotency
|
|
159
|
+
|
|
160
|
+
```powershell
|
|
161
|
+
# Test configuration multiple times
|
|
162
|
+
$config = IdempotentConfig -ComputerName 'localhost' -OutputPath 'C:\DSC\Test'
|
|
163
|
+
|
|
164
|
+
# First run - should make changes
|
|
165
|
+
Start-DscConfiguration -Path 'C:\DSC\Test' -Wait -Verbose
|
|
166
|
+
|
|
167
|
+
# Second run - should report no changes needed
|
|
168
|
+
Start-DscConfiguration -Path 'C:\DSC\Test' -Wait -Verbose
|
|
169
|
+
|
|
170
|
+
# Verify state
|
|
171
|
+
Test-DscConfiguration -Path 'C:\DSC\Test' -Verbose
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Local Configuration Manager (LCM)
|
|
175
|
+
|
|
176
|
+
### Configure LCM
|
|
177
|
+
|
|
178
|
+
```powershell
|
|
179
|
+
[DSCLocalConfigurationManager()]
|
|
180
|
+
Configuration LCMConfig
|
|
181
|
+
{
|
|
182
|
+
param([string[]]$ComputerName)
|
|
183
|
+
|
|
184
|
+
Node $ComputerName
|
|
185
|
+
{
|
|
186
|
+
Settings
|
|
187
|
+
{
|
|
188
|
+
RefreshMode = 'Push'
|
|
189
|
+
ConfigurationMode = 'ApplyAndAutoCorrect'
|
|
190
|
+
RebootNodeIfNeeded = $true
|
|
191
|
+
ActionAfterReboot = 'ContinueConfiguration'
|
|
192
|
+
ConfigurationModeFrequencyMins = 15
|
|
193
|
+
RefreshFrequencyMins = 30
|
|
194
|
+
AllowModuleOverwrite = $true
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
# Apply LCM configuration
|
|
200
|
+
LCMConfig -ComputerName 'WebServer01' -OutputPath 'C:\DSC\LCM'
|
|
201
|
+
Set-DscLocalConfigurationManager -Path 'C:\DSC\LCM' -Verbose
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Pull Server Configuration
|
|
205
|
+
|
|
206
|
+
```powershell
|
|
207
|
+
[DSCLocalConfigurationManager()]
|
|
208
|
+
Configuration PullClientConfig
|
|
209
|
+
{
|
|
210
|
+
param(
|
|
211
|
+
[string]$NodeName,
|
|
212
|
+
[string]$RegistrationKey,
|
|
213
|
+
[string]$ServerURL
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
Node $NodeName
|
|
217
|
+
{
|
|
218
|
+
Settings
|
|
219
|
+
{
|
|
220
|
+
RefreshMode = 'Pull'
|
|
221
|
+
ConfigurationMode = 'ApplyAndAutoCorrect'
|
|
222
|
+
RebootNodeIfNeeded = $true
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
ConfigurationRepositoryWeb PullServer
|
|
226
|
+
{
|
|
227
|
+
ServerURL = $ServerURL
|
|
228
|
+
RegistrationKey = $RegistrationKey
|
|
229
|
+
ConfigurationNames = @('WebServerConfig')
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
ReportServerWeb PullServerReports
|
|
233
|
+
{
|
|
234
|
+
ServerURL = $ServerURL
|
|
235
|
+
RegistrationKey = $RegistrationKey
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Credentials and Secrets
|
|
242
|
+
|
|
243
|
+
### Encrypted Credentials
|
|
244
|
+
|
|
245
|
+
```powershell
|
|
246
|
+
Configuration SecureConfig
|
|
247
|
+
{
|
|
248
|
+
param(
|
|
249
|
+
[Parameter(Mandatory)]
|
|
250
|
+
[PSCredential]$Credential
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
Import-DscResource -ModuleName PSDesiredStateConfiguration
|
|
254
|
+
|
|
255
|
+
Node 'WebServer01'
|
|
256
|
+
{
|
|
257
|
+
User LocalAdmin
|
|
258
|
+
{
|
|
259
|
+
Ensure = 'Present'
|
|
260
|
+
UserName = 'AppAdmin'
|
|
261
|
+
Password = $Credential
|
|
262
|
+
PasswordNeverExpires = $true
|
|
263
|
+
PasswordChangeNotAllowed = $false
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
# Use certificate for encryption
|
|
269
|
+
$configData = @{
|
|
270
|
+
AllNodes = @(
|
|
271
|
+
@{
|
|
272
|
+
NodeName = 'WebServer01'
|
|
273
|
+
CertificateFile = 'C:\Certs\WebServer01.cer'
|
|
274
|
+
Thumbprint = '1234567890ABCDEF1234567890ABCDEF12345678'
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
$cred = Get-Credential -UserName 'AppAdmin' -Message 'Enter password'
|
|
280
|
+
SecureConfig -Credential $cred -ConfigurationData $configData -OutputPath 'C:\DSC\Secure'
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Best Practices
|
|
284
|
+
|
|
285
|
+
1. **Separate configuration from data** - Use ConfigurationData parameter
|
|
286
|
+
2. **Use certificates for encryption** - Never use plain text passwords
|
|
287
|
+
3. **Test idempotency** - Run configurations multiple times
|
|
288
|
+
4. **Version control configurations** - Track changes in Git
|
|
289
|
+
5. **Use dependencies** - DependsOn for resource ordering
|
|
290
|
+
6. **Configure LCM appropriately** - Match environment needs
|
|
291
|
+
7. **Use composite resources** - For reusable patterns
|
|
292
|
+
8. **Implement proper error handling** - Validate before applying
|
|
293
|
+
9. **Document node requirements** - Prerequisites and dependencies
|
|
294
|
+
10. **Test in non-production first** - Validate before production deployment
|
|
295
|
+
|
|
296
|
+
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# PowerShell Error Handling
|
|
2
|
+
|
|
3
|
+
Comprehensive error handling patterns and best practices for robust PowerShell code.
|
|
4
|
+
|
|
5
|
+
## Error Action Preference
|
|
6
|
+
|
|
7
|
+
### Set Global Preference
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
# Stop on all errors (recommended for scripts)
|
|
11
|
+
$ErrorActionPreference = 'Stop'
|
|
12
|
+
|
|
13
|
+
# Continue on errors (default, not recommended for scripts)
|
|
14
|
+
$ErrorActionPreference = 'Continue'
|
|
15
|
+
|
|
16
|
+
# Silently continue (use sparingly)
|
|
17
|
+
$ErrorActionPreference = 'SilentlyContinue'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Per-Command Error Action
|
|
21
|
+
|
|
22
|
+
```powershell
|
|
23
|
+
# Override global preference for specific command
|
|
24
|
+
Get-Item -Path 'C:\NonExistent.txt' -ErrorAction SilentlyContinue
|
|
25
|
+
|
|
26
|
+
# Use common parameter
|
|
27
|
+
Test-Path -Path $filePath -ErrorAction Stop
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Try-Catch-Finally
|
|
31
|
+
|
|
32
|
+
### Basic Pattern
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
try
|
|
36
|
+
{
|
|
37
|
+
# Code that might throw errors
|
|
38
|
+
$content = Get-Content -Path $filePath -ErrorAction Stop
|
|
39
|
+
$data = $content | ConvertFrom-Json
|
|
40
|
+
}
|
|
41
|
+
catch
|
|
42
|
+
{
|
|
43
|
+
# Handle all errors
|
|
44
|
+
Write-Error "Failed to process file: $_"
|
|
45
|
+
}
|
|
46
|
+
finally
|
|
47
|
+
{
|
|
48
|
+
# Always executes (cleanup)
|
|
49
|
+
if ($fileStream)
|
|
50
|
+
{
|
|
51
|
+
$fileStream.Close()
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Specific Exception Handling
|
|
57
|
+
|
|
58
|
+
```powershell
|
|
59
|
+
try
|
|
60
|
+
{
|
|
61
|
+
$result = Invoke-RestMethod -Uri $apiUrl -Method Get
|
|
62
|
+
}
|
|
63
|
+
catch [System.Net.WebException]
|
|
64
|
+
{
|
|
65
|
+
Write-Error "Network error: $($_.Exception.Message)"
|
|
66
|
+
}
|
|
67
|
+
catch [System.UnauthorizedAccessException]
|
|
68
|
+
{
|
|
69
|
+
Write-Error "Access denied: $($_.Exception.Message)"
|
|
70
|
+
}
|
|
71
|
+
catch
|
|
72
|
+
{
|
|
73
|
+
Write-Error "Unexpected error: $($_.Exception.Message)"
|
|
74
|
+
throw # Re-throw if you can't handle it
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Nested Try-Catch
|
|
79
|
+
|
|
80
|
+
```powershell
|
|
81
|
+
try
|
|
82
|
+
{
|
|
83
|
+
# Outer operation
|
|
84
|
+
$connection = Connect-Database -Server $server
|
|
85
|
+
|
|
86
|
+
try
|
|
87
|
+
{
|
|
88
|
+
# Inner operation
|
|
89
|
+
$data = Get-DatabaseData -Connection $connection
|
|
90
|
+
}
|
|
91
|
+
catch
|
|
92
|
+
{
|
|
93
|
+
Write-Warning "Data retrieval failed: $_"
|
|
94
|
+
# Handle inner error
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch
|
|
98
|
+
{
|
|
99
|
+
Write-Error "Connection failed: $_"
|
|
100
|
+
}
|
|
101
|
+
finally
|
|
102
|
+
{
|
|
103
|
+
if ($connection)
|
|
104
|
+
{
|
|
105
|
+
Disconnect-Database -Connection $connection
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Error Objects
|
|
111
|
+
|
|
112
|
+
### Accessing Error Information
|
|
113
|
+
|
|
114
|
+
```powershell
|
|
115
|
+
try
|
|
116
|
+
{
|
|
117
|
+
Get-Item -Path 'C:\NonExistent.txt' -ErrorAction Stop
|
|
118
|
+
}
|
|
119
|
+
catch
|
|
120
|
+
{
|
|
121
|
+
# Current error
|
|
122
|
+
Write-Output "Error: $($_.Exception.Message)"
|
|
123
|
+
Write-Output "Type: $($_.Exception.GetType().FullName)"
|
|
124
|
+
Write-Output "Stack: $($_.ScriptStackTrace)"
|
|
125
|
+
|
|
126
|
+
# Error record properties
|
|
127
|
+
Write-Output "Category: $($_.CategoryInfo.Category)"
|
|
128
|
+
Write-Output "Target: $($_.TargetObject)"
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### $Error Automatic Variable
|
|
133
|
+
|
|
134
|
+
```powershell
|
|
135
|
+
# Most recent error
|
|
136
|
+
$Error[0]
|
|
137
|
+
|
|
138
|
+
# All errors in session
|
|
139
|
+
$Error
|
|
140
|
+
|
|
141
|
+
# Clear error history
|
|
142
|
+
$Error.Clear()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Custom Errors
|
|
146
|
+
|
|
147
|
+
### Throw Custom Errors
|
|
148
|
+
|
|
149
|
+
```powershell
|
|
150
|
+
function Get-UserAge
|
|
151
|
+
{
|
|
152
|
+
param([int]$Age)
|
|
153
|
+
|
|
154
|
+
if ($Age -lt 0)
|
|
155
|
+
{
|
|
156
|
+
throw "Age cannot be negative: $Age"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if ($Age -gt 150)
|
|
160
|
+
{
|
|
161
|
+
throw [System.ArgumentOutOfRangeException]::new(
|
|
162
|
+
'Age',
|
|
163
|
+
$Age,
|
|
164
|
+
'Age must be between 0 and 150'
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return $Age
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Write-Error vs Throw
|
|
173
|
+
|
|
174
|
+
```powershell
|
|
175
|
+
# Write-Error: Non-terminating (continues execution)
|
|
176
|
+
function Test-WriteError
|
|
177
|
+
{
|
|
178
|
+
Write-Error "This is a non-terminating error"
|
|
179
|
+
Write-Output "This still executes"
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Throw: Terminating (stops execution)
|
|
183
|
+
function Test-Throw
|
|
184
|
+
{
|
|
185
|
+
throw "This is a terminating error"
|
|
186
|
+
Write-Output "This never executes"
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Validation and Guards
|
|
191
|
+
|
|
192
|
+
### Parameter Validation
|
|
193
|
+
|
|
194
|
+
```powershell
|
|
195
|
+
function Get-FileContent
|
|
196
|
+
{
|
|
197
|
+
[CmdletBinding()]
|
|
198
|
+
param(
|
|
199
|
+
[Parameter(Mandatory)]
|
|
200
|
+
[ValidateNotNullOrEmpty()]
|
|
201
|
+
[ValidateScript({ Test-Path $_ })]
|
|
202
|
+
[string]$Path,
|
|
203
|
+
|
|
204
|
+
[Parameter()]
|
|
205
|
+
[ValidateSet('UTF8', 'ASCII', 'Unicode')]
|
|
206
|
+
[string]$Encoding = 'UTF8'
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
Get-Content -Path $Path -Encoding $Encoding
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Guard Clauses
|
|
214
|
+
|
|
215
|
+
```powershell
|
|
216
|
+
function Process-Data
|
|
217
|
+
{
|
|
218
|
+
param([string]$Data)
|
|
219
|
+
|
|
220
|
+
# Guard clauses at the start
|
|
221
|
+
if ([string]::IsNullOrWhiteSpace($Data))
|
|
222
|
+
{
|
|
223
|
+
throw "Data cannot be null or empty"
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if ($Data.Length -gt 1000)
|
|
227
|
+
{
|
|
228
|
+
throw "Data exceeds maximum length of 1000 characters"
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
# Main logic
|
|
232
|
+
return $Data.ToUpper()
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Best Practices
|
|
237
|
+
|
|
238
|
+
### 1. Always Use Try-Catch for External Operations
|
|
239
|
+
|
|
240
|
+
```powershell
|
|
241
|
+
# ✅ Correct
|
|
242
|
+
try
|
|
243
|
+
{
|
|
244
|
+
$response = Invoke-RestMethod -Uri $apiUrl
|
|
245
|
+
}
|
|
246
|
+
catch
|
|
247
|
+
{
|
|
248
|
+
Write-Error "API call failed: $_"
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
# ❌ Incorrect (no error handling)
|
|
252
|
+
$response = Invoke-RestMethod -Uri $apiUrl
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 2. Provide Context in Error Messages
|
|
256
|
+
|
|
257
|
+
```powershell
|
|
258
|
+
# ✅ Descriptive
|
|
259
|
+
catch
|
|
260
|
+
{
|
|
261
|
+
Write-Error "Failed to process user '$userName' from file '$filePath': $($_.Exception.Message)"
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
# ❌ Generic
|
|
265
|
+
catch
|
|
266
|
+
{
|
|
267
|
+
Write-Error "Error: $_"
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 3. Clean Up Resources
|
|
272
|
+
|
|
273
|
+
```powershell
|
|
274
|
+
$stream = $null
|
|
275
|
+
try
|
|
276
|
+
{
|
|
277
|
+
$stream = [System.IO.File]::OpenRead($path)
|
|
278
|
+
# Process stream
|
|
279
|
+
}
|
|
280
|
+
finally
|
|
281
|
+
{
|
|
282
|
+
if ($stream)
|
|
283
|
+
{
|
|
284
|
+
$stream.Dispose()
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 4. Don't Swallow Errors
|
|
290
|
+
|
|
291
|
+
```powershell
|
|
292
|
+
# ❌ Bad: Silent failure
|
|
293
|
+
try
|
|
294
|
+
{
|
|
295
|
+
Remove-Item $path
|
|
296
|
+
}
|
|
297
|
+
catch
|
|
298
|
+
{
|
|
299
|
+
# Empty catch - error is lost
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# ✅ Good: Log or re-throw
|
|
303
|
+
try
|
|
304
|
+
{
|
|
305
|
+
Remove-Item $path
|
|
306
|
+
}
|
|
307
|
+
catch
|
|
308
|
+
{
|
|
309
|
+
Write-Warning "Could not remove $path: $_"
|
|
310
|
+
# Or re-throw if critical
|
|
311
|
+
throw
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|