DSCPullServerSetup/PublishModulesAndMofsToPullServer.psm1
<#
.Synopsis Package DSC modules and mof configuration document and publish them on enterprise DSC pull server in the required format .DESCRIPTION Uses Publish-DSCModulesAndMofs cmdlet to package DSC modules into zip files with the version info. If Publishes the zip modules on "$env:ProgramFiles\WindowsPowerShell\DscService\Modules" Publishes all mof configuration documents that present in $Source folder on "$env:ProgramFiles\WindowsPowerShell\DscService\Configuration" Use $Force to overwrite the version of the module that exists in powershell module path with the version from $source folder Use $ModuleNameList to specify the names of the modules to be published if the modules do not exist in $Source folder .EXAMPLE $moduleList = @("xWebAdministration", "xPhp") Publish-DSCModuleAndMof -Source C:\LocalDepot -ModuleNameList $moduleList .EXAMPLE Publish-DSCModuleAndMof -Source C:\LocalDepot -Force #> # Tools to use to package DSC modules and mof configuration document and publish them on enterprise DSC pull server in the required format function Publish-DSCModuleAndMof { param( [Parameter(Mandatory=$True)] [string]$Source = $pwd, # The folder that contains the configuration mof documents and modules to be published on pull server. Everything in this folder will be packaged and published. [switch]$Force, #switch to overwrite the module in PSModulePath with the version provided in $Sources [string[]]$ModuleNameList # Package and publish the modules listed in $ModuleNameList based on powershell module path content ) #Create a working directory $tempFolder = "$pwd\temp" New-Item -Path $tempFolder -ItemType Directory -Force -ErrorAction SilentlyContinue #Copy the mof documents from the $Source to working dir Copy-Item -Path "$Source\*.mof" -Destination $tempFolder -Force -Verbose #Start Deployment! Write-Host "Start deployment" CreateZipFromPSModulePath -listModuleNames $ModuleNameList -destination $tempFolder CreateZipFromSource -source $Source -destination $tempFolder # Generate the checkSum file for all the zip and mof files. New-DSCCheckSum $tempFolder -Force # Publish mof and modules to pull server repositories PublishModulesAndChecksum -source $tempFolder PublishMofDocuments -source $tempFolder #Deployment is complete! Remove-Item -Path $tempFolder -Recurse -Force -ErrorAction SilentlyContinue Write-Host "End deployment" } #Package the modules using powershell module path function CreateZipFromPSModulePath { param($listModuleNames, $destination) # Move all required modules from powershell module path to a temp folder and package them if(($listModuleNames -eq $null) -or ($listModuleNames.Count -eq 0)) { Write-Host "No additional modules are specified to be packaged." } foreach ($module in $listModuleNames) { $allVersions = Get-Module -Name $module -ListAvailable -Verbose #package all versions of the module foreach($moduleVersion in $allVersions) { $name = $moduleVersion.Name $source = "$destination\$name" #Create package zip $path = $moduleVersion.ModuleBase Compress-Archive -Path "$path\*" -DestinationPath "$source.zip" -Verbose -Force $version = $moduleVersion.Version.ToString() $newName = "$destination\$name" + "_" + "$version" + ".zip" # Rename the module folder to contain the version info. if(Test-Path($newName)) { Remove-Item $newName -Recurse -Force } Rename-Item -Path "$source.zip" -NewName $newName -Force } } } #Function to package modules using a given folder after installing to ps module path. function CreateZipFromSource { param($source, $destination) # for each module under $Source folder create a zip package that has the same name as the folder. $allModulesInSource = Get-ChildItem $source -Directory $modules = @() foreach ($item in $allModulesInSource) { $name = $item.Name $alreadyExists = Get-Module -Name $name -ListAvailable -Verbose if(($alreadyExists -eq $null) -or ($Force)) { #install the modules into powershell module path and overwrite the content Copy-Item $item.FullName -Recurse -Force -Destination "$env:ProgramFiles\WindowsPowerShell\Modules" -Verbose } else { Write-Host "Skipping module overwrite. Module with the name $name already exists. Please specify -Force to overwrite the module with the local version of the module located in $source or list names of the modules in ModuleNameList parameter to be packaged from powershell module pat instead and remove them from $source folder" -Fore Red } $modules+= @("$name") } #Package the module in $destination CreateZipFromPSModulePath -listModuleNames $modules -destination $destination } # Deploy modules to the pullsever repository. function PublishModulesAndChecksum { param($source) # Check if the current machine is a server sku. $moduleRepository = "$env:ProgramFiles\WindowsPowerShell\DscService\Modules" if( (Get-Module ServerManager -ListAvailable) -and (Test-Path ($moduleRepository))) { Copy "$source\*.zip*" $moduleRepository -Force -Verbose } else { Write-Host "Copying modules to pullserver module repository skipped because the machine is not a server sku or Pull server endpoint is not deployed." -Fore Yellow } } # function deploy configuratoin and thier checksum. function PublishMofDocuments { param($source) # Check if the current machine is a server sku. $mofRepository = "$env:ProgramFiles\WindowsPowerShell\DscService\Configuration" if( (Get-Module ServerManager -ListAvailable) -and (Test-Path ($mofRepository)) ) { Copy-Item "$source\*.mof*" $mofRepository -Force -Verbose } else { Write-Host "Copying configuration(s) to pullserver configuration repository skipped because the machine is not a server sku or Pull server endpoint is not deployed." -Fore Yellow } } Export-ModuleMember -Function Publish-DSCModuleAndMof |