Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(#240) Parameterize setup #284

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 6 additions & 30 deletions Set-SslSecurity.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -231,37 +231,13 @@ process {

$ClientSaltValue = New-CCMSalt
$ServiceSaltValue = New-CCMSalt
$ScriptBlock = @"
`$ClientCommunicationSalt = '$ClientSaltValue'
`$ServiceCommunicationSalt = '$ServiceSaltValue'
`$FQDN = '$SubjectWithoutCN'
`$NexusUserPW = '$NexusPw'

# Touch NOTHING below this line
`$User = 'chocouser'
`$SecurePassword = `$NexusUserPW | ConvertTo-SecureString -AsPlainText -Force
`$RepositoryUrl = "https://`$(`$fqdn):8443/repository/ChocolateyInternal/index.json"

`$credential = [pscredential]::new(`$user, `$securePassword)

`$downloader = [System.Net.WebClient]::new()
`$downloader.Credentials = `$credential

`$script = `$downloader.DownloadString("https://`$(`$FQDN):8443/repository/choco-install/ClientSetup.ps1")

`$params = @{
Credential = `$Credential
ClientSalt = `$ClientCommunicationSalt
ServiceSalt = `$ServiceCommunicationSalt
InternetEnabled = `$true
RepositoryUrl = `$RepositoryUrl
}

& ([scriptblock]::Create(`$script)) @params
"@

$ScriptBlock | Set-Content -Path $EndpointScript

Invoke-TextReplacementInFile -Path $EndpointScript -Replacement @{
"{{ ClientSaltValue }}" = $ClientSaltValue
"{{ ServiceSaltValue }}" = $ServiceSaltValue
"{{ FQDN }}" = $SubjectWithoutCn
}

# Agent Setup
$agentArgs = @{
CentralManagementServiceUrl = "https://$($SubjectWithoutCn):24020/ChocolateyManagementService"
Expand Down
4 changes: 4 additions & 0 deletions modules/C4B-Environment/C4B-Environment.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -2262,6 +2262,10 @@ The host name of the C4B instance.
"{{ jenkins_fqdn .*?}}" = ([uri]$Data.JenkinsUri).DnsSafeHost
"{{ jenkins_port .*?}}" = ([uri]$Data.JenkinsUri).Port
"{{ jenkins_password .*?}}" = [System.Web.HttpUtility]::HtmlEncode($Data.JenkinsCredential.Password.ToPlainText())

# Nexus Chocolatey Source Credential values
"{{ nexus_client_username .*?}}" = 'chocouser'
"{{ nexus_client_password .*?}}" = $Data.ChocoUserPassword
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions modules/C4B-Environment/ReadmeTemplate.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,15 @@ function CopyToClipboard(id)
<td>Chocolatey Central Management Service Salt</td>
<td><a href="#" class="strip-decoration" onclick="CopyToClipboard('ccmservice');return false;"><div id="ccmservice" class="pw blurry-text">{{ ccm_service_salt | e }}</div></a></td>
</tr>
<tr>
<td>Nexus Repository Source Username</td>
<td><a href="#" class="strip-decoration" onclick="CopyToClipboard('nexususername');return false;"><div id="nexususername" class="pw blurry-text">{{ nexus_client_username | e }}</div></a></td>
</tr>
<tr>
<td>Nexus Repository Source Password</td>
<td><a href="#" class="strip-decoration" onclick="CopyToClipboard('nexuspassword');return false;"><div id="nexuspassword" class="pw blurry-text">{{ nexus_client_password | e }}</div></a></td>
</tr>

</table>
<blockquote>
<h3>📝 <strong>Note</strong></h3>
Expand Down
195 changes: 175 additions & 20 deletions scripts/ClientSetup.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ param(
# The credential necessary to access the internal Nexus repository. This can
# be ignored if Anonymous authentication is enabled.
# This parameter will be necessary if your C4B server is web-enabled.
[Parameter()]
[Parameter(Mandatory)]
[pscredential]
$Credential,
$RepositoryCredential,

# Specifies a target version of Chocolatey to install. By default, the
# latest stable version is installed.
Expand All @@ -43,17 +43,41 @@ param(
# value in the Chocolatey config file
[Parameter()]
[string]
$ClientSalt,
$ClientCommunicationSalt,

# Server salt value used to populate the centralManagementServiceCommunicationSaltAdditivePassword
# value in the Chocolatey config file
[Parameter()]
[string]
$ServiceSalt,
$ServiceCommunicationSalt,

#Install the Chocolatey Licensed Extension with right-click context menus available
steviecoaster marked this conversation as resolved.
Show resolved Hide resolved
[Parameter()]
[Switch]
$InternetEnabled
$IncludePackageTools,

# Allows for the application of user-defined configuration that is applied after the base configuration.
# Can override base configuration with this parameter
[Parameter()]
[Hashtable]
$AdditionalConfiguration,

# Allows for the toggling of additonal features that is applied after the base configuration.
# Can override base configuration with this parameter
[Parameter()]
[Hashtable]
$AdditionalFeatures,

# Allows for the installation of additional packages after the system base packages have been installed.
[Parameter()]
[Hashtable[]]
$AdditionalPackages,

# Allows for the addition of alternative sources after the base conifguration has been applied.
# Can override base configuration with this parameter
[Parameter()]
[Hashtable[]]
$AdditionalSources
)

Set-ExecutionPolicy Bypass -Scope Process -Force
Expand All @@ -69,25 +93,29 @@ $params = @{

if (-not $IgnoreProxy) {
if ($ProxyUrl) {
$proxy = [System.Net.WebProxy]::new($ProxyUrl, $true <#bypass on local#>)
$params.Add('ProxyUrl', $ProxyUrl)
}

if ($ProxyCredential) {
$params.Add('ProxyCredential', $ProxyCredential)
$proxy.Credentials = $ProxyCredential

}
}

$webClient = New-Object System.Net.WebClient
if ($Credential) {
$webClient.Credentials = $Credential.GetNetworkCredential()
if ($RepositoryCredential) {
$webClient.Credentials = $RepositoryCredential.GetNetworkCredential()
}

# Find the latest version of Chocolatey, if a version was not specified
$NupkgUrl = if (-not $ChocolateyVersion) {
$QueryUrl = (($RepositoryUrl -replace '/index\.json$'), "v3/registration/Chocolatey/index.json") -join '/'
$Result = $webClient.DownloadString($QueryUrl) | ConvertFrom-Json
$Result.items.items[-1].packageContent
} else {
}
else {
# Otherwise, assume the URL
"$($RepositoryUrl -replace '/index\.json$')/v3/content/chocolatey/$($ChocolateyVersion)/chocolatey.$($ChocolateyVersion).nupkg"
}
Expand Down Expand Up @@ -118,18 +146,19 @@ choco config set commandExecutionTimeoutSeconds 14400
# Nexus NuGet V3 Compatibility
choco feature disable --name="'usePackageRepositoryOptimizations'"

if ($InternetEnabled) {
choco source add --name="'ChocolateyInternal'" --source="'$RepositoryUrl'" --allow-self-service --user="'$($Credential.UserName)'" --password="'$($Credential.GetNetworkCredential().Password)'" --priority=1
}
else {
choco source add --name="'ChocolateyInternal'" --source="'$RepositoryUrl'" --allow-self-service --priority=1
}

# Environment base Source configuration
choco source add --name="'ChocolateyInternal'" --source="'$RepositoryUrl'" --allow-self-service --user="'$($RepositoryCredential.UserName)'" --password="'$($RepositoryCredential.GetNetworkCredential().Password)'" --priority=1
choco source disable --name="'Chocolatey'"
choco source disable --name="'chocolatey.licensed'"

choco upgrade chocolatey-license -y --source="'ChocolateyInternal'"
choco upgrade chocolatey.extension -y --params="'/NoContextMenu'" --source="'ChocolateyInternal'" --no-progress
if (-not $IncludePackageTools) {
choco upgrade chocolatey.extension -y --params="'/NoContextMenu'" --source="'ChocolateyInternal'" --no-progress
}
else {
Write-Warning "IncludePackageTools was passed. Right-Click context menus will be available for installers, .nupkg, and .nuspec file types!"
choco upgrade chocolatey.extension -y --source="'ChocolateyInternal'" --no-progress
}
choco upgrade chocolateygui -y --source="'ChocolateyInternal'" --no-progress
choco upgrade chocolateygui.extension -y --source="'ChocolateyInternal'" --no-progress

Expand All @@ -150,11 +179,137 @@ choco feature enable --name="'usePackageHashValidation'"

# CCM Check-in Configuration
choco config set CentralManagementServiceUrl "https://${hostName}:24020/ChocolateyManagementService"
if ($ClientSalt) {
choco config set centralManagementClientCommunicationSaltAdditivePassword $ClientSalt
if ($ClientCommunicationSalt) {
choco config set centralManagementClientCommunicationSaltAdditivePassword $ClientCommunicationSalt
}
if ($ServiceSalt) {
choco config set centralManagementServiceCommunicationSaltAdditivePassword $ServiceSalt
if ($ServiceCommunicationSalt) {
choco config set centralManagementServiceCommunicationSaltAdditivePassword $ServiceCommunicationSalt
}
choco feature enable --name="'useChocolateyCentralManagement'"
choco feature enable --name="'useChocolateyCentralManagementDeployments'"


if ($AdditionalConfiguration -or $AdditionalFeatures -or $AdditionalSources -or $AdditionalPackages) {
Write-Host "Applying user supplied configuration" -ForegroundColor Cyan
}
# How we call choco from here changes as we need to be more dynamic with thingsii .
if ($AdditionalConfiguration) {
<#
We expect to pass in a hashtable with configuration information with the following shape:

@{
Name = BackgroundServiceAllowedCommands
Value = 'install,upgrade,uninstall'
}
#>

$AdditionalConfiguration.GetEnumerator() | ForEach-Object {
$Config = [System.Collections.Generic.list[string]]::new()
$Config.Add('config')
$Config.Add('set')
$Config.Add("--name='$($_.Key)'")
$Config.Add("--value='$($_.Value)'")

steviecoaster marked this conversation as resolved.
Show resolved Hide resolved
& choco @Config
}
}

if ($AdditionalFeatures) {
<#
We expect to pass in feature information as a hashtable with the following shape:

@{
useBackgroundservice = 'Enabled'
}
#>
$AdditionalFeatures.GetEnumerator() | ForEach-Object {

$Feature = [System.Collections.Generic.list[string]]::new()
$Feature.Add('feature')

$state = switch ($_.Value) {
'Enabled' { 'enable' }
'Disabled' { 'disable' }
default { Write-Error 'State must be either Enabled or Disabled' }
}

$Feature.Add($state)
$Feature.add("--name='$($_.Key)'")
& choco @Feature
}
}

if ($AdditionalSources) {

<#
We expect a user to pass in a hashtable with source information with the folllowing shape:
@{
Name = 'MySource'
Source = 'https://nexus.fabrikam.com/repository/MyChocolateySource'
#Optional items
Credentials = $MySourceCredential
AllowSelfService = $true
AdminOnly = $true
BypassProxy = $true
Priority = 10
Certificate = 'C:\cert.pfx'
CertificatePassword = 's0mepa$$'
}
#>
Foreach ($Source in $AdditionalSources) {
$SourceSplat = [System.Collections.Generic.List[string]]::new()
# Required items
$SourceSplat.Add('source')
$SourceSplat.Add('add')
$SourceSplat.Add("--name='$($Source.Name)'")
$SourceSplat.Add("--source='$($Source.Source)'")

# Add credentials if source has them
if ($Source.ContainsKey('Credentials')) {
$SourceSplat.Add("--user='$($Source.Credentials.Username)'")
$SourceSplat.Add("--password='$($Source.Credentials.GetNetworkCredential().Password)'")
}

switch ($true) {
$Source['AllowSelfService'] { $SourceSplat.add('--allow-self-service') }
$Source['AdminOnly'] { $SourceSplat.Add('--admin-only') }
$Source['BypassProxy'] { $SourceSplat.Add('--bypass-proxy') }
$Source.ContainsKey('Priority') { $SourceSplat.Add("--priority='$($Source.Priority)'") }
$Source.ContainsKey('Certificate') { $SourceSplat.Add("--cert='$($Source.Certificate)'") }
$Source.ContainsKey('CerfificatePassword') { $SourceSplat.Add("--certpassword='$($Source.CertificatePassword)'") }
}
}

& choco @SourceSplat
}

if ($AdditionalPackages) {

<#
We expect to pass in a hashtable with package information with the following shape:

@{
Id = 'firefox'
#Optional
Version = 123.4.56
Pin = $true
}
#>
foreach ($package in $AdditionalPackages.GetEnumerator()) {

$PackageSplat = [System.Collections.Generic.list[string]]::new()
$PackageSplat.add('install')
$PackageSplat.add($package['Id'])

switch ($true) {
$package.ContainsKey('Version') { $PackageSplat.Add("--version='$($package.version)'") }
$package.ContainsKey('Pin') { $PackageSplat.Add('--pin') }
}

# Ensure packages install and they don't flood the console output
$PackageSplat.Add('-y')
$PackageSplat.Add('--no-progress')

& choco @PackageSplat
}
}
6 changes: 0 additions & 6 deletions scripts/New-IISCertificateHost.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,6 @@ if (-not (Get-Website -Name $siteName)) {
Write-Host "Website for hosting certificate import already created" -ForegroundColor Green
}

if ((Get-Website -Name 'Default Web Site')) {
Get-Website -Name 'Default Web Site' | Remove-Website
} else {
Write-Host "Default website already removed" -ForegroundColor Green
}

Write-Host "Restarting IIS to refresh bindings" -ForegroundColor Green
$null = iisreset

Expand Down
Loading
Loading