Public/Install-SitecoreLocalModules.ps1

#Set-StrictMode -Version Latest
#####################################################
# Install-SitecoreLocalModules
#####################################################
<#PSScriptInfo

.VERSION 0.0

.GUID 602bc07e-a621-4738-8c27-0edf4a4cea8e

.AUTHOR David Walker, Sitecore Dave, Radical Dave

.COMPANYNAME David Walker, Sitecore Dave, Radical Dave

.COPYRIGHT David Walker, Sitecore Dave, Radical Dave

.TAGS sitecore powershell local install iis solr

.LICENSEURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal/blob/main/LICENSE

.PROJECTURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal

.ICONURI

.EXTERNALMODULEDEPENDENCIES

.REQUIREDSCRIPTS

.EXTERNALSCRIPTDEPENDENCIES

.RELEASENOTES


#>


<#
.SYNOPSIS
@@synoposis@@

.DESCRIPTION
@@description@@

.EXAMPLE
PS> .\Install-SitecoreLocalModules

.EXAMPLE
PS> .\Install-SitecoreLocalModules 'XP0-SitecoreLocal.json'

.Link
https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal

.OUTPUTS
    System.String
#>

#####################################################
# Install-SitecoreLocalModules
#####################################################
function Install-SitecoreLocalModules {
    [alias("in-sc-mods")]
    Param(
        # Path to Configuration File [ version
        [ValidateScript({Test-Path $_ -PathType 'Leaf'})]
        [Parameter(Mandatory=$false)]
        [string] $ConfigurationFile = "",

        # path if you want to use custom
        [Parameter(Mandatory=$false)]
        [string]$ConfigurationRoot = "",

        # path if you want to use custom [default=[hostname].json]
        [Parameter(Mandatory=$false)]
        [string]$ConfigurationFileName = "",
        
        # path if you want to use custom
        [Parameter(Mandatory=$false)]
        [string]$ConfigurationTemplate = "XP0",

        # Name of new Sitecore Local instance [default=dev]
        [Parameter(Mandatory=$false)] [string]$name = 'dev',

        # Version of new Sitecore Local instance [default=9.3.0]
        #[Parameter(Mandatory=$false)] [string]$version = "9.3.0",
        [Parameter(Mandatory=$false)] [string]$version = "10.1.0",

        # Prefix of new Sitecore Local instance [default=$version[\.].[name]]
        [Parameter(Mandatory=$false)] [string]$prefix = '$version',

        # Suffix of new Sitecore Local instance [default=.local]
        [Parameter(Mandatory=$false)] [string]$suffix = '.local'
    )
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    # Turning off progress bar to (greatly) speed up installation
    $Global:ProgressPreference = "SilentlyContinue"
    $PSScriptName = ($MyInvocation.MyCommand.Name.Replace(".ps1",""))
    $parametersResults = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$($PSScriptName):start" -Show -Stamp -StartWatch
    Write-Host $parametersResults.output -ForegroundColor Green
    $started = $parametersResults.started
    $PSScriptCaller = $parametersResults.PSScriptCaller

    $StopWatch = New-Object -TypeName System.Diagnostics.Stopwatch
    $StopWatch.Start()

    $ErrorActionPreference = 'Stop'
    Set-Location $PSScriptRoot

    #$LogFolder = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($LogFolder)
    #if (!(Test-Path $LogFolder)) {
    # New-item -ItemType Directory -Path $LogFolder
    #}
    #$LogFile = Join-path $LogFolder $LogFileName
    #if (Test-Path $LogFile) {
    # Get-Item $LogFile | Remove-Item
    #}

    if ([string]::IsNullOrEmpty($ConfigurationFile)) {
        $PSScriptPath = Join-Path $PSScriptRoot $MyInvocation.MyCommand.Name
        $PSScriptFolder = Split-Path $PSScriptPath -Parent
        #$PSRootDrive = if (Get-PSDrive 'd' -ErrorAction SilentlyContinue) { 'd:' } else { 'c:' }
        $PSRepoPath = Split-Path $PSScriptFolder -Parent
        if ($PSRepoPath.IndexOf('src') -ne -1) {
            $PSRepoPath = Split-Path (Split-Path $PSRepoPath -Parent) -Parent
        }
        if (!$assets) { $assets = Join-Path $PSRepoPath "assets" }
        if (!$certs) { $certs = Join-Path $assets "certs" }
        if (!$ConfigurationRoot) { $ConfigurationRoot = Join-Path $assets "configs\$version\$ConfigurationTemplate" }


        if($prefix -eq '$version'){ $prefix = ($version.Replace(".", "") + ".") }
        #$prefix += "$name"
        if(!$hostname){ $hostname = "$prefix.$name.$suffix" }

        if (!$ConfigurationFileName) { $ConfigurationFileName = "$hostname.json" }
        if (!$ConfigurationFile) { $ConfigurationFile = Join-Path $ConfigurationRoot $ConfigurationFileName }
    }
    if (!$ConfigurationRoot) { $ConfigurationRoot = Split-Path $ConfigurationFile -Parent }

    if (!(Test-Path $ConfigurationFile)) {
        Write-Host "Configuration file '$($ConfigurationFile)' not found." -ForegroundColor Red
        Write-Host  "Please use 'set-installation...ps1' files to generate a configuration file." -ForegroundColor Red
        Exit 1
    }
    $config = Get-Content -Raw $ConfigurationFile | ConvertFrom-Json
    if (!$config) {
        throw "Error trying to load configuration!"
    }
    $assets = $config.assets

    $sharedResourcePath = Join-Path $assets.sharedUtilitiesRoot "assets\configuration"
    Write-Host "sharedResourcePath:$sharedResourcePath"
    $downloadFolder = $assets.packageRepository
    $packagesFolder = (Join-Path $downloadFolder "modules")

    #$loginSession = $null

    Write-Host "PSScriptCaller:$($PSScriptCaller.FunctionName)"
    #if ($PSScriptCaller.FunctionName -eq 'Install-SitecoreLocalModules') {
        # if not called from Install-SitecoreLocal these are needed:
        Import-Module (Join-Path $assets.sharedUtilitiesRoot "assets\modules\SharedInstallationUtilities\SharedInstallationUtilities.psm1") -Force

        Import-Module SqlServer

        #Ensure the Correct SIF Version is Imported
        Import-SitecoreInstallFramework -version $assets.installerVersion -repositoryName $assets.psRepositoryName -repositoryUrl $assets.psRepository
    #}

    if (!(Test-Path $packagesFolder)) {
        New-Item $packagesFolder -ItemType Directory -Force  > $null
    }
    
    Install-SitecoreAzureToolkit $ConfigurationFile
    New-ModuleInstallationConfiguration $ConfigurationFile -Verbose
    Install-Modules $ConfigurationFile -Verbose
    $results = 'done'

    $StopWatch.Stop()
    $StopWatch

    $parametersResults = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$($PSScriptName):$results" -Show -StopWatch -Started $started
    Write-Host $parametersResults.output -ForegroundColor Green    
}