DSCResources/cChocoConfig/cChocoConfig.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# Copyright (c) 2017 Chocolatey Software, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

<#
.Description
Returns the configuration for cChocoConfig.
 
.Example
Get-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco'
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [string]
        $ConfigName,

        [ValidateSet('Present','Absent')]
        [string]
        $Ensure='Present',

        [parameter(Mandatory = $false)]
        [string]
        $Value
    )

    Write-Verbose "Starting cChocoConfig Get-TargetResource - Config Name: $ConfigName, Ensure: $Ensure"

    $returnValue = @{
        ConfigName = $ConfigName
        Ensure = $Ensure
        Value = $Value
    }

    $returnValue

}

<#
.Description
Performs the set for the cChocoConfig resource.
 
.Example
Set-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco'
 
#>

function Set-TargetResource
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param
    (
        [parameter(Mandatory = $true)]
        [string]
        $ConfigName,

        [ValidateSet('Present','Absent')]
        [string]
        $Ensure='Present',

        [parameter(Mandatory = $false)]
        [string]
        $Value
    )


    Write-Verbose "Starting cChocoConfig Set-TargetResource - Config Name: $ConfigName, Ensure: $Ensure"

    if ($pscmdlet.ShouldProcess("Choco config $ConfigName will be ensured $Ensure."))
    {
        if ($Ensure -eq 'Present')
        {
            Write-Verbose "Setting choco config $ConfigName."
            choco config set --name "'$ConfigName'" --value "'$Value'"
        }
        else 
        {
            Write-Verbose "Unsetting choco config $ConfigName."
            choco config unset --name "'$ConfigName'"
        }
    }

}

<#
.Description
Performs the test for cChocoFeature.
 
.Example
Test-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco'
#>

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [string]
        $ConfigName,

        [ValidateSet('Present','Absent')]
        [string]
        $Ensure='Present',

        [parameter(Mandatory = $false)]
        [string]
        $Value
    )

    Write-Verbose "Starting cChocoConfig Test-TargetResource - Config Name: $ConfigName, Ensure: $Ensure."

    # validate value is given when ensure present
    if ($Ensure -eq 'Present' -and (-not $PSBoundParameters.ContainsKey('Value') -or [String]::IsNullOrEmpty($Value))) {
        throw "Missing parameter 'Value' when ensuring config is present!"
    }

    if($env:ChocolateyInstall -eq "" -or $null -eq $env:ChocolateyInstall)
    {
        $command = Get-Command -Name choco.exe -ErrorAction SilentlyContinue

        if(!$command) {
            throw "Unable to find choco.exe. Please make sure Chocolatey is installed correctly."
        }

        $chocofolder = Split-Path $command.Source

        if( $chocofolder.EndsWith("bin") )
        {
            $chocofolder = Split-Path $chocofolder
        }
    }
    else
    {
        $chocofolder = $env:ChocolateyInstall
    }

    if(!(Get-Item -Path $chocofolder -ErrorAction SilentlyContinue)) {
        throw "Unable to find Chocolatey installation folder. Please make sure Chocolatey is installed and configured properly."
    }
    
    $configfolder = Join-Path -Path $chocofolder -ChildPath "config"
    $configfile = Get-ChildItem -Path $configfolder | Where-Object {$_.Name -match "chocolatey.config$"}

    if(!(Get-Item -Path $configfile.FullName -ErrorAction SilentlyContinue)) {
        throw "Unable to find Chocolatey config file. Please make sure Chocolatey is installed and configured properly."
    }

    # There is currently no choco command that only returns the settings in an CSV format.
    # choco config list -r shows settings, sources, features and a note about API keys.
    $xml = [xml](Get-Content -Path $configfile.FullName)
    $settings = $xml.chocolatey.config.add
    foreach($setting in $settings)
    {
        # If the config name matches and it should be present, check the value and
        # if it matches it returns true.
        if($setting.key -eq $ConfigName -and $Ensure -eq 'Present')
        {
            return ($setting.value -eq $Value)
        }
        # If the config name matches and it should be absent, check the value and
        # if it is null or empty, return true
        elseif($setting.key -eq $ConfigName -and $Ensure -eq 'Absent')
        {
            return ([String]::IsNullOrEmpty($setting.value))
        }
    }

    # If we get this far, the configuraion item hasn't been found.
    # There is currently no value, so return false if it should be present.
    # True otherwise.
    return !($Ensure -eq 'Present')
}

Export-ModuleMember -Function *-TargetResource