From 43a89cd70596742fff58269b94fece957e76f1a1 Mon Sep 17 00:00:00 2001 From: Ryan Yates Date: Wed, 30 Nov 2016 11:38:05 +0000 Subject: [PATCH] Module Overhaul + Added Arguement Completion Small Simplifaction in arguement completers --- Completers/Artifacts.Completion.ps1 | 24 +++++++++++++++++++ .../Discover_AddRemovePrograms.ps1 | 4 ++++ .../Generate_AddRemovePrograms.ps1 | 4 ++++ .../AllWindowsFeatures/DefaultFeatures.txt | 0 .../Discover_AllWindowsFeatures.ps1 | 5 +++- .../Generate_AllWindowsFeatures.ps1 | 5 +++- .../Artifacts/Apache/Discover_Apache.ps1 | 5 +++- .../Artifacts/Apache/Generate_Apache.ps1 | 5 +++- .../DHCPServer/Discover_DHCPServer.ps1 | 5 +++- .../DHCPServer/Generate_DHCPServer.ps1 | 5 +++- .../DNSServer/Discover_DNSServer.ps1 | 5 +++- .../DNSServer/Generate_DNSServer.ps1 | 5 +++- .../Artifacts}/IIS/DefaultHandlers.xml | 0 .../Private/Artifacts/IIS/Discover_IIS.ps1 | 4 ++++ .../Private/Artifacts/IIS/Generate_IIS.ps1 | 3 +++ .../Private/Artifacts/MSMQ/Discover_MSMQ.ps1 | 5 +++- .../Private/Artifacts/MSMQ/Generate_MSMQ.ps1 | 4 ++++ .../SQLServer/Discover_SQLServer.ps1 | 5 +++- .../SQLServer/Generate_SQLServer.ps1 | 4 ++++ Functions/Private/DiscoverArtifacts.ps1 | 4 +--- Functions/Private/GenerateDockerfile.ps1 | 2 +- Image2Docker.psm1 | 5 +++- 22 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 Completers/Artifacts.Completion.ps1 rename Artifacts/AddRemovePrograms/Discover.ps1 => Functions/Private/Artifacts/AddRemovePrograms/Discover_AddRemovePrograms.ps1 (98%) rename Artifacts/AddRemovePrograms/Generate.ps1 => Functions/Private/Artifacts/AddRemovePrograms/Generate_AddRemovePrograms.ps1 (93%) rename {Artifacts => Functions/Private/Artifacts}/AllWindowsFeatures/DefaultFeatures.txt (100%) rename Artifacts/AllWindowsFeatures/Discover.ps1 => Functions/Private/Artifacts/AllWindowsFeatures/Discover_AllWindowsFeatures.ps1 (95%) rename Artifacts/AllWindowsFeatures/Generate.ps1 => Functions/Private/Artifacts/AllWindowsFeatures/Generate_AllWindowsFeatures.ps1 (90%) rename Artifacts/Apache/Discover.ps1 => Functions/Private/Artifacts/Apache/Discover_Apache.ps1 (96%) rename Artifacts/Apache/Generate.ps1 => Functions/Private/Artifacts/Apache/Generate_Apache.ps1 (94%) rename Artifacts/DHCPServer/Discover.ps1 => Functions/Private/Artifacts/DHCPServer/Discover_DHCPServer.ps1 (95%) rename Artifacts/DHCPServer/Generate.ps1 => Functions/Private/Artifacts/DHCPServer/Generate_DHCPServer.ps1 (90%) rename Artifacts/DNSServer/Discover.ps1 => Functions/Private/Artifacts/DNSServer/Discover_DNSServer.ps1 (94%) rename Artifacts/DNSServer/Generate.ps1 => Functions/Private/Artifacts/DNSServer/Generate_DNSServer.ps1 (90%) rename {Artifacts => Functions/Private/Artifacts}/IIS/DefaultHandlers.xml (100%) rename Artifacts/IIS/Discover.ps1 => Functions/Private/Artifacts/IIS/Discover_IIS.ps1 (99%) rename Artifacts/IIS/Generate.ps1 => Functions/Private/Artifacts/IIS/Generate_IIS.ps1 (98%) rename Artifacts/MSMQ/Discover.ps1 => Functions/Private/Artifacts/MSMQ/Discover_MSMQ.ps1 (96%) rename Artifacts/MSMQ/Generate.ps1 => Functions/Private/Artifacts/MSMQ/Generate_MSMQ.ps1 (96%) rename Artifacts/SQLServer/Discover.ps1 => Functions/Private/Artifacts/SQLServer/Discover_SQLServer.ps1 (97%) rename Artifacts/SQLServer/Generate.ps1 => Functions/Private/Artifacts/SQLServer/Generate_SQLServer.ps1 (96%) diff --git a/Completers/Artifacts.Completion.ps1 b/Completers/Artifacts.Completion.ps1 new file mode 100644 index 0000000..63a2f5f --- /dev/null +++ b/Completers/Artifacts.Completion.ps1 @@ -0,0 +1,24 @@ + +function Completion_Artifact { + + param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) + + Function Get-Artifacts { + $artifacts = Get-ChildItem -Path $modulepath\Functions\Private\Artifacts -Directory | Select-Object -ExpandProperty BaseName + $artifacts + } + + ### Create fresh completion results for Artifacts + Get-Artifacts | Where-Object { $PSItem -match $wordToComplete } | ForEach-Object { + $CompletionText = $PSItem; + $ToolTip = $PSItem; + $ListItemText = $PSItem; + $CompletionResultType = [System.Management.Automation.CompletionResultType]::ParameterValue; + + New-Object -TypeName System.Management.Automation.CompletionResult -ArgumentList @($CompletionText, $ListItemText, $CompletionResultType, $ToolTip); + } + +} + +Microsoft.PowerShell.Core\Register-ArgumentCompleter -CommandName ConvertTo-DockerFile -ParameterName Artifact -ScriptBlock $Function:Completion_Artifact + diff --git a/Artifacts/AddRemovePrograms/Discover.ps1 b/Functions/Private/Artifacts/AddRemovePrograms/Discover_AddRemovePrograms.ps1 similarity index 98% rename from Artifacts/AddRemovePrograms/Discover.ps1 rename to Functions/Private/Artifacts/AddRemovePrograms/Discover_AddRemovePrograms.ps1 index 6a81b11..71b27fc 100644 --- a/Artifacts/AddRemovePrograms/Discover.ps1 +++ b/Functions/Private/Artifacts/AddRemovePrograms/Discover_AddRemovePrograms.ps1 @@ -1,3 +1,4 @@ +function Discover_AddRemovePrograms { <# .SYNOPSIS Scans for Add/Remove Programs entries @@ -64,3 +65,6 @@ Write-Verbose -Message 'Finished unmounting the registry hive' ### Write out the discovery results to the manifest file $SoftwareList | ConvertTo-Json | Set-Content -Path $ManifestPath Write-Verbose -Message ('Finished discovery for {0} artifact' -f (Split-Path -Path $PSScriptRoot -Leaf)) + +} + diff --git a/Artifacts/AddRemovePrograms/Generate.ps1 b/Functions/Private/Artifacts/AddRemovePrograms/Generate_AddRemovePrograms.ps1 similarity index 93% rename from Artifacts/AddRemovePrograms/Generate.ps1 rename to Functions/Private/Artifacts/AddRemovePrograms/Generate_AddRemovePrograms.ps1 index d617408..67c3ef8 100644 --- a/Artifacts/AddRemovePrograms/Generate.ps1 +++ b/Functions/Private/Artifacts/AddRemovePrograms/Generate_AddRemovePrograms.ps1 @@ -1,3 +1,4 @@ +function Generate_AddRemovePrograms { <# .SYNOPSIS Generate Dockerfile contents for Add/Remove Programs entries @@ -24,3 +25,6 @@ foreach ($Item in $Artifact) { } Write-Output -InputObject $Result + +} + diff --git a/Artifacts/AllWindowsFeatures/DefaultFeatures.txt b/Functions/Private/Artifacts/AllWindowsFeatures/DefaultFeatures.txt similarity index 100% rename from Artifacts/AllWindowsFeatures/DefaultFeatures.txt rename to Functions/Private/Artifacts/AllWindowsFeatures/DefaultFeatures.txt diff --git a/Artifacts/AllWindowsFeatures/Discover.ps1 b/Functions/Private/Artifacts/AllWindowsFeatures/Discover_AllWindowsFeatures.ps1 similarity index 95% rename from Artifacts/AllWindowsFeatures/Discover.ps1 rename to Functions/Private/Artifacts/AllWindowsFeatures/Discover_AllWindowsFeatures.ps1 index 0ede2a6..3e13970 100644 --- a/Artifacts/AllWindowsFeatures/Discover.ps1 +++ b/Functions/Private/Artifacts/AllWindowsFeatures/Discover_AllWindowsFeatures.ps1 @@ -1,3 +1,4 @@ +function Discover_AllWindowsFeatures { <# .SYNOPSIS Scans for presence of DHCP Server component in a Windows Server image. @@ -42,4 +43,6 @@ $ManifestResult.Status = 'Enabled' ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/AllWindowsFeatures/Generate.ps1 b/Functions/Private/Artifacts/AllWindowsFeatures/Generate_AllWindowsFeatures.ps1 similarity index 90% rename from Artifacts/AllWindowsFeatures/Generate.ps1 rename to Functions/Private/Artifacts/AllWindowsFeatures/Generate_AllWindowsFeatures.ps1 index 2297f85..720af33 100644 --- a/Artifacts/AllWindowsFeatures/Generate.ps1 +++ b/Functions/Private/Artifacts/AllWindowsFeatures/Generate_AllWindowsFeatures.ps1 @@ -1,3 +1,4 @@ +function Generate_AllWindowsFeatures { <# .SYNOPSIS Generates Dockerfile contents for DHCP Server component @@ -25,4 +26,6 @@ $FeatureNames = $Artifact.FeatureName.replace(';',',') $Result += "RUN powershell.exe -ExecutionPolicy Bypass -Command Enable-WindowsOptionalFeature -Online -FeatureName $FeatureNames -All `r`n" -Write-Output -InputObject $Result \ No newline at end of file +Write-Output -InputObject $Result +} + diff --git a/Artifacts/Apache/Discover.ps1 b/Functions/Private/Artifacts/Apache/Discover_Apache.ps1 similarity index 96% rename from Artifacts/Apache/Discover.ps1 rename to Functions/Private/Artifacts/Apache/Discover_Apache.ps1 index 8d5e286..d8a7020 100644 --- a/Artifacts/Apache/Discover.ps1 +++ b/Functions/Private/Artifacts/Apache/Discover_Apache.ps1 @@ -1,3 +1,4 @@ +function Discover_Apache { <# .SYNOPSIS Scans for the Apache Web Server @@ -46,4 +47,6 @@ else { ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/Apache/Generate.ps1 b/Functions/Private/Artifacts/Apache/Generate_Apache.ps1 similarity index 94% rename from Artifacts/Apache/Generate.ps1 rename to Functions/Private/Artifacts/Apache/Generate_Apache.ps1 index 2151c5c..e551de0 100644 --- a/Artifacts/Apache/Generate.ps1 +++ b/Functions/Private/Artifacts/Apache/Generate_Apache.ps1 @@ -1,3 +1,4 @@ +function Generate_Apache { <# .SYNOPSIS Generates Dockerfile contents for Apache Web Server component @@ -32,4 +33,6 @@ if ($Artifact.Status -eq 'Present') { Write-Verbose -Message ('Artifact is present: {0}. Adding text to Dockerfile {1}.' -f $ArtifactName, $Result) } -Write-Output -InputObject $Result \ No newline at end of file +Write-Output -InputObject $Result +} + diff --git a/Artifacts/DHCPServer/Discover.ps1 b/Functions/Private/Artifacts/DHCPServer/Discover_DHCPServer.ps1 similarity index 95% rename from Artifacts/DHCPServer/Discover.ps1 rename to Functions/Private/Artifacts/DHCPServer/Discover_DHCPServer.ps1 index 5249bec..a6845e5 100644 --- a/Artifacts/DHCPServer/Discover.ps1 +++ b/Functions/Private/Artifacts/DHCPServer/Discover_DHCPServer.ps1 @@ -1,3 +1,4 @@ +function Discover_DHCPServer { <# .SYNOPSIS Scans for presence of DHCP Server component in a Windows Server image. @@ -40,4 +41,6 @@ else { ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/DHCPServer/Generate.ps1 b/Functions/Private/Artifacts/DHCPServer/Generate_DHCPServer.ps1 similarity index 90% rename from Artifacts/DHCPServer/Generate.ps1 rename to Functions/Private/Artifacts/DHCPServer/Generate_DHCPServer.ps1 index cf30dfb..23f2bd0 100644 --- a/Artifacts/DHCPServer/Generate.ps1 +++ b/Functions/Private/Artifacts/DHCPServer/Generate_DHCPServer.ps1 @@ -1,3 +1,4 @@ +function Generate_DHCPServer { <# .SYNOPSIS Generates Dockerfile contents for DHCP Server component @@ -22,4 +23,6 @@ if ($Artifact.Status -eq 'Present') { $Result = 'RUN powershell.exe -ExecutionPolicy Bypass -Command Enable-WindowsOptionalFeature -Online -FeatureName DHCPServer' } -Write-Output -InputObject $Result \ No newline at end of file +Write-Output -InputObject $Result +} + diff --git a/Artifacts/DNSServer/Discover.ps1 b/Functions/Private/Artifacts/DNSServer/Discover_DNSServer.ps1 similarity index 94% rename from Artifacts/DNSServer/Discover.ps1 rename to Functions/Private/Artifacts/DNSServer/Discover_DNSServer.ps1 index 74bf05f..bb22c48 100644 --- a/Artifacts/DNSServer/Discover.ps1 +++ b/Functions/Private/Artifacts/DNSServer/Discover_DNSServer.ps1 @@ -1,3 +1,4 @@ +function Discover_DNSServer { <# .SYNOPSIS Scans for presence of DNS Server component in a Windows image. @@ -30,4 +31,6 @@ $ManifestResult = @{ ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/DNSServer/Generate.ps1 b/Functions/Private/Artifacts/DNSServer/Generate_DNSServer.ps1 similarity index 90% rename from Artifacts/DNSServer/Generate.ps1 rename to Functions/Private/Artifacts/DNSServer/Generate_DNSServer.ps1 index 14fa5b6..685f6e7 100644 --- a/Artifacts/DNSServer/Generate.ps1 +++ b/Functions/Private/Artifacts/DNSServer/Generate_DNSServer.ps1 @@ -1,3 +1,4 @@ +function Generate_DNSServer { <# .SYNOPSIS Generates Dockerfile contents for DNS Server component @@ -22,4 +23,6 @@ if ($Artifact.Status -eq 'Enabled') { $Result = 'RUN powershell.exe -ExecutionPolicy Bypass -Command Enable-WindowsOptionalFeature -Online -FeatureName DNS-Server-Full-Role' } -Write-Output -InputObject $Result \ No newline at end of file +Write-Output -InputObject $Result +} + diff --git a/Artifacts/IIS/DefaultHandlers.xml b/Functions/Private/Artifacts/IIS/DefaultHandlers.xml similarity index 100% rename from Artifacts/IIS/DefaultHandlers.xml rename to Functions/Private/Artifacts/IIS/DefaultHandlers.xml diff --git a/Artifacts/IIS/Discover.ps1 b/Functions/Private/Artifacts/IIS/Discover_IIS.ps1 similarity index 99% rename from Artifacts/IIS/Discover.ps1 rename to Functions/Private/Artifacts/IIS/Discover_IIS.ps1 index 220effd..62963c1 100644 --- a/Artifacts/IIS/Discover.ps1 +++ b/Functions/Private/Artifacts/IIS/Discover_IIS.ps1 @@ -1,3 +1,4 @@ +function Discover_IIS { <# .SYNOPSIS Scans for presence of the Internet Information Services (IIS) Web Server @@ -96,3 +97,6 @@ else { $ManifestResult | ConvertTo-Json -Depth 3 | Set-Content -Path $Manifest Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + + diff --git a/Artifacts/IIS/Generate.ps1 b/Functions/Private/Artifacts/IIS/Generate_IIS.ps1 similarity index 98% rename from Artifacts/IIS/Generate.ps1 rename to Functions/Private/Artifacts/IIS/Generate_IIS.ps1 index af16599..cad1ff3 100644 --- a/Artifacts/IIS/Generate.ps1 +++ b/Functions/Private/Artifacts/IIS/Generate_IIS.ps1 @@ -1,3 +1,4 @@ +Function Generate_IIS { <# .SYNOPSIS Generates Dockerfile contents for Internet Information Services (IIS) feature @@ -57,3 +58,5 @@ Write-Output $endOutput -NoEnumerate } +} + diff --git a/Artifacts/MSMQ/Discover.ps1 b/Functions/Private/Artifacts/MSMQ/Discover_MSMQ.ps1 similarity index 96% rename from Artifacts/MSMQ/Discover.ps1 rename to Functions/Private/Artifacts/MSMQ/Discover_MSMQ.ps1 index e761412..3d6f754 100644 --- a/Artifacts/MSMQ/Discover.ps1 +++ b/Functions/Private/Artifacts/MSMQ/Discover_MSMQ.ps1 @@ -1,3 +1,4 @@ +function Discover_MSMQ { <# .SYNOPSIS Scans for presence of the MSMQ Windows feature @@ -42,4 +43,6 @@ else { ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/MSMQ/Generate.ps1 b/Functions/Private/Artifacts/MSMQ/Generate_MSMQ.ps1 similarity index 96% rename from Artifacts/MSMQ/Generate.ps1 rename to Functions/Private/Artifacts/MSMQ/Generate_MSMQ.ps1 index bdbbd62..a2ae153 100644 --- a/Artifacts/MSMQ/Generate.ps1 +++ b/Functions/Private/Artifacts/MSMQ/Generate_MSMQ.ps1 @@ -1,3 +1,4 @@ +function Generate_MSMQ { <# .SYNOPSIS Generates Dockerfile contents for Microsoft Message Queue (MSMQ) Server feature @@ -26,3 +27,6 @@ ENTRYPOINT ["ping", "8.8.8.8", "-t"]' Write-Output -InputObject $Result } + +} + diff --git a/Artifacts/SQLServer/Discover.ps1 b/Functions/Private/Artifacts/SQLServer/Discover_SQLServer.ps1 similarity index 97% rename from Artifacts/SQLServer/Discover.ps1 rename to Functions/Private/Artifacts/SQLServer/Discover_SQLServer.ps1 index 0059ec9..261f1b4 100644 --- a/Artifacts/SQLServer/Discover.ps1 +++ b/Functions/Private/Artifacts/SQLServer/Discover_SQLServer.ps1 @@ -1,3 +1,4 @@ +Function Discover_SqlServer { <# .SYNOPSIS Scans for presence of the MSMQ Windows feature @@ -74,4 +75,6 @@ $ManifestResult = @{ ### Write the result to the manifest file $ManifestResult | ConvertTo-Json | Set-Content -Path $Manifest -Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) \ No newline at end of file +Write-Verbose -Message ('Finished discovering {0} artifact' -f $ArtifactName) +} + diff --git a/Artifacts/SQLServer/Generate.ps1 b/Functions/Private/Artifacts/SQLServer/Generate_SQLServer.ps1 similarity index 96% rename from Artifacts/SQLServer/Generate.ps1 rename to Functions/Private/Artifacts/SQLServer/Generate_SQLServer.ps1 index 2379114..72f5721 100644 --- a/Artifacts/SQLServer/Generate.ps1 +++ b/Functions/Private/Artifacts/SQLServer/Generate_SQLServer.ps1 @@ -1,3 +1,4 @@ +function Generate_SQLServer { <# .SYNOPSIS Generates Dockerfile contents for Microsoft SQL Server @@ -32,3 +33,6 @@ RUN powershell.exe -ExecutionPolicy Bypass -Command \ Write-Output -InputObject $Result } + +} + diff --git a/Functions/Private/DiscoverArtifacts.ps1 b/Functions/Private/DiscoverArtifacts.ps1 index e8e276e..46b18b7 100644 --- a/Functions/Private/DiscoverArtifacts.ps1 +++ b/Functions/Private/DiscoverArtifacts.ps1 @@ -13,8 +13,6 @@ function DiscoverArtifacts { ### Perform discovery of artifacts foreach ($item in $Artifact) { - $DiscoveryScript = '{0}\Artifacts\{1}\Discover.ps1' -f $ModulePath, $item - Write-Verbose -Message ('Invoking artifact discovery scripts: {0}' -f $DiscoveryScript) - . $DiscoveryScript -OutputPath $OutputPath -MountPath $Mount.Path + & "Discover_$item" -OutputPath $OutputPath -MountPath $Mount.Path } } \ No newline at end of file diff --git a/Functions/Private/GenerateDockerfile.ps1 b/Functions/Private/GenerateDockerfile.ps1 index a2b4e79..2d7c991 100644 --- a/Functions/Private/GenerateDockerfile.ps1 +++ b/Functions/Private/GenerateDockerfile.ps1 @@ -26,7 +26,7 @@ function GenerateDockerfile { $Dockerfile = Get-Content -Raw -Path $DockerfileTemplate foreach ($item in $Artifact) { - $Result = & $ModulePath\Artifacts\$item\Generate.ps1 -ManifestPath $ArtifactPath + $Result = & "Generate_$item" -ManifestPath $ArtifactPath $Dockerfile += '{0}{1}' -f $Result, "`r`n" } diff --git a/Image2Docker.psm1 b/Image2Docker.psm1 index b68688a..195247f 100644 --- a/Image2Docker.psm1 +++ b/Image2Docker.psm1 @@ -10,7 +10,7 @@ enum ImageType { $ModulePath = $ExecutionContext.SessionState.Module.ModuleBase ### Import private (internal) functions -$PrivateFunctionList = Get-ChildItem -Path $PSScriptRoot\Functions\Private -File -Filter *.ps1 +$PrivateFunctionList = Get-ChildItem -Path $PSScriptRoot\Functions\Private -File -Filter *.ps1 -Recurse foreach ($File in $PrivateFunctionList) { . $File.FullName } @@ -24,3 +24,6 @@ foreach ($File in $PublicFunctionList) { } Remove-Variable -Name File + + +Get-ChildItem -Path $PSScriptRoot\completers\*.ps1 | foreach { . $_.FullName} \ No newline at end of file