Functions/Private/Artifacts/IIS/Generate_IIS.ps1

Function Generate_IIS {
<#
.SYNOPSIS
Generates Dockerfile contents for Internet Information Services (IIS) feature
 
.PARAMETER ManifestPath
The filesystem path where the JSON manifests are stored.
 
.PARAMETER ArtifactParam
Optional - one or more Website names to include in the output.
#>

[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess",'')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments",'')]
[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string] $ManifestPath,

    [Parameter(Mandatory = $false)]
    [string[]] $ArtifactParam
)

$ArtifactName = Split-Path -Path $PSScriptRoot -Leaf

Write-Verbose -Message ('Generating result for {0} component' -f (Split-Path -Path $PSScriptRoot -Leaf))
$Manifest = '{0}\{1}.json' -f $ManifestPath, $ArtifactName 
$ResultBuilder = New-Object System.Text.StringBuilder

$Artifact = Get-Content -Path $Manifest -Raw | ConvertFrom-Json

if ($Artifact.Status -eq 'Present') {
    Write-Verbose ('Copying {0} configuration files' -f $ArtifactName)
    $ConfigPath = $Mount.Path + "\" + "Windows\System32\inetsrv\config"
    if (Test-Path -Path $ConfigPath) {
        Copy-Item $ConfigPath $ManifestPath -Recurse    
    }

    Write-Verbose -Message ('Writing instruction to install IIS')
    $null = $ResultBuilder.AppendLine('# Install Windows features for IIS')
    $null = $ResultBuilder.Append('RUN Add-WindowsFeature Web-server')
    if ($Artifact.AspNetStatus -eq 'Present') {
        Write-Verbose -Message ('Writing instruction to install ASP.NET')
        $null = $ResultBuilder.Append(', NET-Framework-45-ASPNET, Web-Asp-Net45')
    }
    $null = $ResultBuilder.AppendLine('')

    if ($Artifact.FeatureName.length -gt 0) {
        $null = $ResultBuilder.AppendLine("RUN Enable-WindowsOptionalFeature -Online -FeatureName $($Artifact.FeatureName.Replace(';',','))")
        $null = $ResultBuilder.AppendLine('')
    }

    if ($Artifact.HttpHandlers.Count > 0) {
        Write-Verbose -Message ('Writing instruction to add HTTP handlers')
        $null = $ResultBuilder.Append('RUN ')
        foreach ($HttpHandler in $Artifact.HttpHandlers) {
             $null = $ResultBuilder.AppendLine('New-WebHandler -Name "{0}" -Path "{1}" -Verb "{2}" `' -f $HttpHandler.Name, $HttpHandler.Path, $HttpHandler.Verb)
        }
        $null = $ResultBuilder.AppendLine('')
    }    

    $null = $ResultBuilder.AppendLine('')
    $null = $ResultBuilder.AppendLine("RUN Remove-Website 'Default Web Site'")

    $null = $ResultBuilder.AppendLine('')
    for ($i=0;$i -lt $Artifact.Websites.Count;$i++) {
        $Site = $Artifact.Websites[$i]
        $SitePath = $Mount.Path + $Site.PhysicalPath
        Write-Verbose -Message ('Copying website files from {0} to {1}' -f $SitePath, $ManifestPath)
        Copy-Item $SitePath $ManifestPath -Recurse

        Write-Verbose -Message ('Writing instruction to copy files for {0} site' -f  $Site.Name)
        $null = $ResultBuilder.AppendLine("# Set up website: $($Site.Name)")        
        $copy = "COPY {0} {1}" -f (Split-Path $Site.PhysicalPath -Leaf),($Site.PhysicalPath -Replace "\\","/")
        $null = $ResultBuilder.AppendLine($copy)

        Write-Verbose -Message ('Writing instruction to create site {0}' -f  $Site.Name)
        $newSite = 'RUN New-Website -Name ''{0}'' -PhysicalPath "C:{1}" -Port {2} -Force' -f ($Site.Name -replace "'","''"), $Site.PhysicalPath, $Site.binding.bindingInformation.split(':')[-2]
        $null = $ResultBuilder.AppendLine($newSite)

        Write-Verbose -Message ('Writing instruction to expose port for site {0}' -f  $Site.Name)
        $null = $ResultBuilder.AppendLine("EXPOSE $($Site.binding.bindingInformation.split(':')[-2])")
        $null = $ResultBuilder.AppendLine('')
    }
        
    $null = $ResultBuilder.AppendLine('CMD /Wait-Service.ps1 -ServiceName W3SVC -AllowServiceRestart')
}


Write-Output $ResultBuilder.ToString() -NoEnumerate

}