DSCResources/MSFT_xSCSRServerSetup/MSFT_xSCSRServerSetup.psm1

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $SourcePath,

        [System.String]
        $SourceFolder = "\SystemCenter2012R2\Orchestrator",

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $SetupCredential,

        [System.String]
        [ValidateSet("Yes","No")]
        $SendCEIPReports = "No",

        [System.String]
        [ValidateSet("Yes","No")]
        $UseMicrosoftUpdate = "No",

        [System.String]
        $InstallFolder,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServerInstance,

        [System.String]
        $RepositoryDatabaseName = "UsageRepositoryDB",

        [System.String]
        $StagingDatabaseName = "UsageStagingDB",

        [System.String]
        $DWDatabaseName = "UsageWarehouseDB",

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServerInstance,

        [System.String]
        $AnalysisDatabaseName = "UsageAnalysisDB"
    )

    Import-Module $PSScriptRoot\..\..\xPDT.psm1
        
    $Path = Join-Path -Path (Join-Path -Path $SourcePath -ChildPath $SourceFolder) -ChildPath "\Service Reporting\setup.exe"
    $Path = ResolvePath $Path
    $Version = (Get-Item -Path $Path).VersionInfo.ProductVersion

    switch($Version)
    {
        "7.2.462.0"
        {
            $IdentifyingNumber = "{643E2225-E1BB-4586-9CBE-8BC2DED6D12E}"
            $SCVersion = "System Center 2012 R2"
        }
        "7.2.3002.0"
        {
            $IdentifyingNumber = "{643E2225-E1BB-4586-9CBE-8BC2DED6D12E}"
            $SCVersion = "System Center Technical Preview"
        }
        Default
        {
            throw "Unknown version of Service Reporting!"
        }
    }

    if(Get-WmiObject -Class Win32_Product | Where-Object {$_.IdentifyingNumber -eq $IdentifyingNumber})
    {
        switch($SCVersion)
        {
            "System Center 2012 R2"
            {
                $Reg = "HKLM:\SOFTWARE\Microsoft\System Center Service Reporting\R2"
            }
            "System Center Technical Preview"
            {
                $Reg = "HKLM:\SOFTWARE\Microsoft\System Center Service Reporting\R2"
            }
        }
        $InstallFolder = (Get-ItemProperty -Path $Reg -Name "PackageFolder").PackageFolder
        $DatabaseServer = (Get-ItemProperty -Path $Reg -Name "DWRepositoryDBHost").DWRepositoryDBHost
        if($DatabaseServer.Contains("\"))
        {
            $DatabaseServerInstance = $DatabaseServer.Split("\")[1]
            $DatabaseServer = $DatabaseServer.Split("\")[0]
        }
        else
        {
            $DatabaseServerInstance = "MSSQLSERVER"
        }
        $RepositoryDatabaseName = (Get-ItemProperty -Path $Reg -Name "ETLRepositoryDBName").ETLRepositoryDBName
        $StagingDatabaseName = (Get-ItemProperty -Path $Reg -Name "StagingDBName").StagingDBName
        $DWDatabaseName = (Get-ItemProperty -Path $Reg -Name "DWRepositoryDBName").DWRepositoryDBName
        $AnalysisDatabaseServer = (Get-ItemProperty -Path $Reg -Name "AnalysisDBHost").AnalysisDBHost
        if($AnalysisDatabaseServer.Contains("\"))
        {
            $AnalysisDatabaseServerInstance = $AnalysisDatabaseServer.Split("\")[1]
            $AnalysisDatabaseServer = $AnalysisDatabaseServer.Split("\")[0]
        }
        else
        {
            $AnalysisDatabaseServerInstance = "MSSQLSERVER"
        }
        $AnalysisDatabaseName = (Get-ItemProperty -Path $Reg -Name "AnalysisDBName").AnalysisDBName
        
        $returnValue = @{
            Ensure = "Present"
            SourcePath = $SourcePath
            SourceFolder = $SourceFolder
            InstallFolder = $InstallFolder
            DatabaseServer = $DatabaseServer
            DatabaseServerInstance = $DatabaseServerInstance
            RepositoryDatabaseName = $RepositoryDatabaseName
            StagingDatabaseName = $StagingDatabaseName
            DWDatabaseName = $DWDatabaseName
            AnalysisDatabaseServer = $AnalysisDatabaseServer
            AnalysisDatabaseServerInstance = $AnalysisDatabaseServerInstance
            AnalysisDatabaseName = $AnalysisDatabaseName
        }
    }
    else
    {
        $returnValue = @{
            Ensure = "Absent"
            SourcePath = $SourcePath
            SourceFolder = $SourceFolder
        }
    }
        
    $returnValue
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $SourcePath,

        [System.String]
        $SourceFolder = "\SystemCenter2012R2\Orchestrator",

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $SetupCredential,

        [System.String]
        [ValidateSet("Yes","No")]
        $SendCEIPReports = "No",

        [System.String]
        [ValidateSet("Yes","No")]
        $UseMicrosoftUpdate = "No",

        [System.String]
        $InstallFolder,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServerInstance,

        [System.String]
        $RepositoryDatabaseName = "UsageRepositoryDB",

        [System.String]
        $StagingDatabaseName = "UsageStagingDB",

        [System.String]
        $DWDatabaseName = "UsageWarehouseDB",

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServerInstance,

        [System.String]
        $AnalysisDatabaseName = "UsageAnalysisDB"
    )

    Import-Module $PSScriptRoot\..\..\xPDT.psm1
        
    $Path = Join-Path -Path (Join-Path -Path $SourcePath -ChildPath $SourceFolder) -ChildPath "\Service Reporting\setup.exe"
    $Path = ResolvePath $Path
    $Version = (Get-Item -Path $Path).VersionInfo.ProductVersion
    Write-Verbose "Path: $Path"

    switch($Version)
    {
        "7.2.462.0"
        {
            $IdentifyingNumber = "{643E2225-E1BB-4586-9CBE-8BC2DED6D12E}"
        }
        "7.2.3002.0"
        {
            $IdentifyingNumber = "{643E2225-E1BB-4586-9CBE-8BC2DED6D12E}"
        }
        Default
        {
            throw "Unknown version of Service Reporting!"
        }
    }

    switch($Ensure)
    {
        "Present"
        {
            # Create install arguments
            $TempFile = [IO.Path]::GetTempFileName()
            $Arguments = "-Silent $TempFile"
            $AnswerFile = @("-AcceptEULA Yes")
            if($DatabaseServerInstance -eq "MSSQLSERVER")
            {
                $DatabaseServerInstance = $DatabaseServer
            }
            if($AnalysisDatabaseServerInstance -eq "MSSQLSERVER")
            {
                $AnalysisDatabaseServerInstance = $AnalysisDatabaseServer
            }
            $AnswerFileVars = @(
                "SendCEIPReports",
                "UseMicrosoftUpdate",
                "InstallFolder",
                "DatabaseServer",
                "DatabaseServerInstance",
                "RepositoryDatabaseName",
                "StagingDatabaseName",
                "DWDatabaseName",
                "AnalysisDatabaseServer",
                "AnalysisDatabaseServerInstance",
                "AnalysisDatabaseName"
            )
            foreach($AnswerFileVar in $AnswerFileVars)
            {
                if(!([String]::IsNullOrEmpty((Get-Variable -Name $AnswerFileVar).Value)) -and ((Get-Variable -Name $AnswerFileVar).Value -ne 0))
                {
                    if([Environment]::ExpandEnvironmentVariables((Get-Variable -Name $AnswerFileVar).Value).Contains(" "))
                    {
                        $AnswerFile += "-$AnswerFileVar `"" + [Environment]::ExpandEnvironmentVariables((Get-Variable -Name $AnswerFileVar).Value) + "`""
                    }
                    else
                    {
                        $AnswerFile += "-$AnswerFileVar " + [Environment]::ExpandEnvironmentVariables((Get-Variable -Name $AnswerFileVar).Value)
                    }
                }
            }

            Write-Verbose "AnswerFile: $TempFile"
            foreach($Line in $AnswerFile)
            {
                Add-Content -Path $TempFile -Value $Line -Encoding Ascii
                Write-Verbose $Line
            }
        }
        "Absent"
        {
            # Create uninstall arguments
            $Arguments = "-Uninstall"
        }
    }

    Write-Verbose "Arguments: $Arguments"
    
    $Process = StartWin32Process -Path $Path -Arguments $Arguments -Credential $SetupCredential
    Write-Verbose $Process
    WaitForWin32ProcessEnd -Path $Path -Arguments $Arguments -Credential $SetupCredential

    # Clean up
    if(Test-Path -Path $TempFile)
    {
        Remove-Item -Path $TempFile
    }

    if((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction SilentlyContinue) -ne $null)
    {
        $global:DSCMachineStatus = 1
    }
    else
    {
        if(!(Test-TargetResource @PSBoundParameters))
        {
            throw "Set-TargetResouce failed"
        }
    }
}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $SourcePath,

        [System.String]
        $SourceFolder = "\SystemCenter2012R2\Orchestrator",

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $SetupCredential,

        [System.String]
        [ValidateSet("Yes","No")]
        $SendCEIPReports = "No",

        [System.String]
        [ValidateSet("Yes","No")]
        $UseMicrosoftUpdate = "No",

        [System.String]
        $InstallFolder,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServerInstance,

        [System.String]
        $RepositoryDatabaseName = "UsageRepositoryDB",

        [System.String]
        $StagingDatabaseName = "UsageStagingDB",

        [System.String]
        $DWDatabaseName = "UsageWarehouseDB",

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServer,

        [parameter(Mandatory = $true)]
        [System.String]
        $AnalysisDatabaseServerInstance,

        [System.String]
        $AnalysisDatabaseName = "UsageAnalysisDB"
    )
 
    $result = ((Get-TargetResource @PSBoundParameters).Ensure -eq $Ensure)
    
    $result
}


Export-ModuleMember -Function *-TargetResource