DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.psm1

$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path
Write-Verbose -Message "CurrentPath: $currentPath"

# Load Common Code
Import-Module $currentPath\..\..\xSQLServerHelper.psm1 -Verbose:$false -ErrorAction Stop

# DSC resource to manage SQL Endpoint

# NOTE: This resource requires WMF5 and PsDscRunAsCredential

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $EndPointName,

        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [System.UInt32]
        $Port,

        [System.String]
        $AuthorizedUser,

        [System.String]
        $SQLServer = $env:COMPUTERNAME,

        [System.String]
        $SQLInstanceName = "MSSQLSERVER"
    )
     
    $vConfigured = Test-TargetResource -EndPointName $EndPointName -Ensure $Ensure -Port $Port -AuthorizedUser $AuthorizedUser
    if(!$SQL)
    {
        $SQL = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName
    }
    
    $returnValue = @{
    EndPointName = $EndPointName
    Ensure = $vConfigured
    Port = $sql.Endpoints[$EndPointName].Protocol.Tcp.ListenerPort
    AuthorizedUser = $sql.Endpoints[$EndPointName].EnumObjectPermissions().grantee
    }

    $returnValue
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $EndPointName,

        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [System.UInt32]
        $Port,

        [System.String]
        $AuthorizedUser,

        [System.String]
        $SQLServer = $env:COMPUTERNAME,

        [System.String]
        $SQLInstanceName = "MSSQLSERVER"
    )

    if(!$SQL)
    {
        $SQL = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName
    }
Write-Verbose "Connected to Server"

    if($Ensure -eq "Present")
    {
        Write-Verbose "Check to see login $AuthorizedUser exist on the server"

        if(!$SQL.Logins.Contains($AuthorizedUser))
        {
            throw New-TerminatingError -ErrorType NoAuthorizedUser -FormatArgs @($AuthorizedUser,$SQLServer,$SQLInstanceName) -ErrorCategory InvalidResult
        }
        $Endpoint = New-Object -typename Microsoft.SqlServer.Management.Smo.Endpoint -ArgumentList $Sql,$EndpointName
        $Endpoint.EndpointType = [Microsoft.SqlServer.Management.Smo.EndpointType]::DatabaseMirroring
        $Endpoint.ProtocolType = [Microsoft.SqlServer.Management.Smo.ProtocolType]::Tcp
        $Endpoint.Protocol.Tcp.ListenerPort = $Port
        $Endpoint.Payload.DatabaseMirroring.ServerMirroringRole = [Microsoft.SqlServer.Management.Smo.ServerMirroringRole]::All
        $Endpoint.Payload.DatabaseMirroring.EndpointEncryption = [Microsoft.SqlServer.Management.Smo.EndpointEncryption]::Required
        $Endpoint.Payload.DatabaseMirroring.EndpointEncryptionAlgorithm = [Microsoft.SqlServer.Management.Smo.EndpointEncryptionAlgorithm]::Aes 
        $Endpoint.Create()
        $Endpoint.Start()
        $ConnectPerm = New-Object -TypeName Microsoft.SqlServer.Management.SMO.ObjectPermissionSet
        $ConnectPerm.Connect= $true
        $Endpoint.Grant($ConnectPerm,$AuthorizedUser)
    }
    elseif($Ensure -eq "Absent")
    {
        Write-Verbose "Drop $EndPointName"
        $SQL.Endpoints[$EndPointName].Drop()
    }
}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $EndPointName,

        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [System.UInt32]
        $Port,

        [System.String]
        $AuthorizedUser,

        [System.String]
        $SQLServer = $env:COMPUTERNAME,

        [System.String]
        $SQLInstanceName = "MSSQLSERVER"
    )

    if(!$SQL)
    {
        $SQL = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName
    }
    
    $result = [System.Boolean]


    if(($sql.Endpoints[$EndPointName].Name -eq $EndPointName)-and($ensure -eq "Present") )
    {
        $Result = $true
    }
    else
    {$result = $false}

    $result
}


Export-ModuleMember -Function *-TargetResource