SifHelper.psm1

#Requires -RunAsAdministrator
#Requires -Modules PKI,WebAdministration

Set-StrictMode -Version Latest

# Pass verbose on if required

$DestinationFolder = Split-Path $PSScriptRoot -Parent
$filename = "SifHelper.{0:yyMMdd}" -f (Get-Date)

$counter = 2
$fullPath = Join-Path $DestinationFolder "$filename.log"
while (Test-Path $fullPath) {
    $fullPath = Join-Path $DestinationFolder "$filename ($($counter)).log"
    $counter++
}

Start-Transcript -Path $fullpath -IncludeInvocationHeader

try {


    # $nugetPackageProvider = Get-PackageProvider -Name NuGet -Force -Verbose:$verboseSetting -ErrorAction Stop
    # if (!$nugetPackageProvider) {
    # Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm:$false -Verbose:$verboseSetting
    # }

    # # TODO remove the module imports for PKI and WebAdministration.. should be done in module .PSD1
    # if (!(Get-Module PKI)) { Import-Module PKI -ErrorAction Stop -Verbose:$verboseSetting }

    # if (!(Get-Module WebAdministration) -or (!(Get-PSDrive IIS -ErrorAction SilentlyContinue -Verbose:$verboseSetting))) {
    # Get-Module WebAdministration | Remove-Module -Force -Confirm:$false
    # Import-Module WebAdministration -ErrorAction Stop -Force -Verbose:$verboseSetting
    # }

    # $SitecoreGalleryUrl = "https://sitecore.myget.org/F/sc-powershell/api/v2"

    # if (-not(Get-PSRepository -name SitecoreGallery)) {
    # Register-PSRepository -Name SitecoreGallery -SourceLocation $SitecoreGalleryUrl -InstallationPolicy Trusted -Verbose:$verboseSetting
    # }

    # ("SitecoreInstallFramework", "SqlServer") | ForEach-Object -Verbose:$verboseSetting {

    # if ((Get-InstalledModule -Name $_ -Verbose:$verboseSetting -ErrorAction SilentlyContinue)) {
    # Update-Module $_ -Confirm:$false -Verbose:$verboseSetting
    # }
    # else {
    # Install-Module $_ -Confirm:$false -AllowClobber -SkipPublisherCheck -Force -Verbose:$verboseSetting
    # }

    # if (!(Get-Module $_)) {
    # Write-Warning "Module '$_' is not loaded!"
    # Import-Module $_ -Force -Verbose:$verboseSetting
    # }
    # }

    $scriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path

    ('Private' , 'Public') | ForEach-Object {
        $itemName = $_
        $childItemPath = (Join-Path $scriptRoot $itemName)
        Write-Verbose "Evaluating path $($childItemPath)."
        $childItems = Get-ChildItem -Path $childItemPath -Include *.ps1,*.psm1 -Exclude *.Tests.ps1 -File -Recurse -ErrorAction SilentlyContinue -Verbose
        $childItemsCount = 0
        if ($childItems) {
            $childItemsCount = $childItems.Count
        }
        Write-Verbose "Found $childItemsCount items."
        $childItems | ForEach-Object {
            try {
                $fullName = $_.FullName
                Write-Verbose "Importing module $fullName"
                Import-Module $fullName -Force -Verbose
                Write-Verbose "Dot Sourcing $fullName"
                . $fullName -Verbose
                if ($itemName -eq 'Public') {
                    Export-ModuleMember -Function $_.BaseName -Verbose
                }
            }
            catch {
                Write-Warning $_.Exception.Message
            }
        }
    }

    # $dacFxBinPath = $null

    # function Get-DacFxPath {

    # $dacFxBinPath = $null


    # $sqlPackagePath = Get-SQLPackagePath -ErrorAction SilentlyContinue

    # if ($sqlPackagePath) {
    # $dacFxBinPath = Split-Path -Path $sqlPackagePath -Parent
    # }

    # return $dacFxBinPath
    # }

    # $dacFxBinPath = Get-DacFxPath
    # Write-Verbose "dacFxBinPath: $dacFxBinPath"

    # function Install-DacFx {

    # Write-Verbose "Installing DacFx 17.3"

    # function silentInstallMsi {
    # param (
    # [ValidateScript( { Test-Path $_ -IsValid })]
    # [string]$path
    # )
    # $DataStamp = get-date -Format yyyyMMddTHHmmss
    # $file = get-item $path
    # $logFile = '{0}-{1}.log' -f $file.fullname, $DataStamp
    # $MSIArguments = @(
    # "/i"
    # ('"{0}"' -f $file.fullname)
    # "/qn"
    # "/norestart"
    # "/L*v"
    # $logFile
    # )
    # Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow
    # }

    # $sqlClrTypes = 'https://download.microsoft.com/download/C/0/2/C02DBE78-3265-4779-9AE1-634A4BF1CD6E/EN/SQL140/amd64/SQLSysClrTypes.msi'
    # $sqlClrTypesFilename = Split-Path $sqlClrTypes -Leaf
    # $sqlClrTypesTempFile = Join-Path $env:TEMP $sqlClrTypesFilename

    # $dacFx173 = 'https://download.microsoft.com/download/3/7/F/37F3C5CE-E96B-41AC-B361-27735365AA16/EN/x64/DacFramework.msi'
    # $dacFx173Filename = Split-Path $dacFx173 -Leaf
    # $dacFx173TempFile = Join-Path $env:TEMP $dacFx173Filename

    # # Start-BitsTransfer -Source $sqlClrTypes, $dacFx173 -Destination $sqlClrTypesTempFile, $dacFx173TempFile
    # $startTime = Get-Date

    # try {
    # Write-Verbose "Downloading $sqlClrTypes to $sqlClrTypesTempFile"

    # Invoke-WebRequest -Uri $sqlClrTypes -OutFile $sqlClrTypesTempFile -UseBasicParsing
    # $endTime = Get-Date
    # $timeTaken = $endTime.Subtract($startTime)
    # Write-Verbose "Time taken: $($timeTaken.TotalSeconds) seconds"
    # }
    # catch {
    # Write-Error -Message ("Error downloading $sqlClrTypes" + ": $($_.Exception.Message)")
    # throw
    # }

    # $startTime = Get-Date

    # try {
    # Write-Verbose "Downloading $dacFx173 to $dacFx173TempFile"

    # Invoke-WebRequest -Uri $dacFx173 -OutFile $dacFx173TempFile -UseBasicParsing
    # $endTime = Get-Date
    # $timeTaken = $endTime.Subtract($startTime)
    # Write-Verbose "Time taken: $($timeTaken.TotalSeconds) seconds"
    # }
    # catch {
    # Write-Error -Message ("Error downloading $dacFx173" + ": $($_.Exception.Message)")
    # throw
    # }


    # # install sql clr types
    # silentInstallMsi -path $sqlClrTypesTempFile

    # # install dac fx 17.3
    # silentInstallMsi -path $dacFx173TempFile

    # Write-Verbose "Completed DacFx 17.3 installation."
    # }

    # $dacVersion = $null

    # if ($dacFxBinPath) {
    # $dacFxPath = Split-Path $dacFxBinPath -Parent
    # $dacVersionPath = Split-Path $dacFxPath -Parent
    # $dacVersion = Split-Path $dacVersionPath -Leaf
    # }

    # if (!$dacVersion -or ($dacVersion -and $dacVersion -ne 140)) {

    # Install-DacFx

    # }

    # $chocoInstallScript = (New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')
    # Set-ExecutionPolicy Bypass -Scope Process -Force
    # Invoke-Expression $chocoInstallScript
    # choco upgrade webdeploy -y -f

    # $msDeployKeyName = 'HKLM:\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3'
    # $msDeployKeyProperties = Get-ItemProperty -Path $msDeployKeyName -ErrorAction SilentlyContinue

    # if ($msDeployKeyProperties) {

    # $dacFxPathKeyProp = $msDeployKeyProperties | Select-Object -ExpandProperty DacFxPath -ErrorAction SilentlyContinue

    # if (!$dacFxPathKeyProp) {
    # New-ItemProperty -Path $msDeployKeyName -Name 'DacFxPath' -Value $dacFxBinPath -Force
    # }
    # else {
    # Set-ItemProperty -Path $msDeployKeyName -Name 'DacFxPath' -Value $dacFxBinPath -Force
    # }

    # $dacFxDependenciesPathKeyProp = $msDeployKeyProperties | Select-Object -ExpandProperty DacFxDependenciesPath -ErrorAction SilentlyContinue

    # if (!$dacFxDependenciesPathKeyProp) {
    # New-ItemProperty -Path $msDeployKeyName -Name 'DacFxDependenciesPath' -Value $dacFxBinPath -Force
    # }
    # else {
    # Set-ItemProperty -Path $msDeployKeyName -Name 'DacFxDependenciesPath' -Value $dacFxBinPath -Force
    # }
    # }
    # else {
    # Write-Warning 'Could not find MSDeploy in registry.'
    # }

    # choco upgrade urlrewrite -y -f

}
catch {
    Write-Error $_
    throw
}
finally {
    Stop-Transcript
}