DSCResources/AzureFileSyncServerEndpoint/AzureFileSyncServerEndpoint.psm1

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

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

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

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

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

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

    $null = Import-Module "C:\Program Files\Azure\StorageSyncAgent\StorageSync.Management.PowerShell.Cmdlets.dll" -WarningAction SilentlyContinue

    $null = Login-AzureRmStorageSync -SubscriptionId $AzureSubscriptionId -Credential $AzureCredential


    Write-Verbose "ComputerName for verifying if node is already registered with Azure: $($env:COMPUTERNAME)"

    $Registered = Get-AzureRmStorageSyncServer -SubscriptionId $AzureSubscriptionId -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName | Select-Object *, @{n = 'ComputerName'; e = {$PSitem.DisplayName.Split('.')[0]}} | Where-Object ComputerName -eq $env:COMPUTERNAME

    Write-Verbose "Number of registered instances with ComputerName $($env:COMPUTERNAME) : $(@($Registered).Count)"

       if (Get-AzureRmStorageSyncServerEndpoint -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName -SyncGroupName $AzureFileSyncGroup | Select-Object *,@{n='ComputerName';e={$PSitem.DisplayName.Split('.')[0]}} | Where-Object ComputerName -eq $env:COMPUTERNAME) {

        $AzureStorageSyncServerEndpoint = $true

    } else {

        $AzureStorageSyncServerEndpoint = $false

    }

    $returnValue = @{
        AzureSubscriptionId        = $AzureSubscriptionId
        AzureFileSyncResourceGroup = $AzureFileSyncResourceGroup
        AzureFileSyncInstanceName  = $AzureFileSyncInstanceName
        AzureCredential            = $AzureCredential.UserName
        AzureStorageSyncServerEndpointCompliant = $AzureStorageSyncServerEndpoint
    }

    $returnValue
}


function Set-TargetResource {
    [CmdletBinding()]
    param
    (
        [System.String]
        $TierFilesOlderThanDays,

        [System.Boolean]
        $CloudTiering,

        [System.String]
        $VolumeFreeSpacePercent,

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

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

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

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

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

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

    $null = Import-Module "C:\Program Files\Azure\StorageSyncAgent\StorageSync.Management.PowerShell.Cmdlets.dll" -WarningAction SilentlyContinue

    $null = Login-AzureRmStorageSync -SubscriptionId $AzureSubscriptionId -Credential $AzureCredential

    Write-Verbose "Variable AzureFileSyncSubscriptionId is $AzureSubscriptionId"
    Write-Verbose "Variable AzureFileSyncResourceGroup is $AzureFileSyncResourceGroup"
    Write-Verbose "Variable AzureFileSyncInstanceName is $AzureFileSyncInstanceName"
    Write-Verbose "Username for credential object AzureCredential is $($AzureCredential.UserName)"

    $null = Import-Module "C:\Program Files\Azure\StorageSyncAgent\StorageSync.Management.PowerShell.Cmdlets.dll" -WarningAction SilentlyContinue

    $null = Login-AzureRmStorageSync -SubscriptionId $AzureSubscriptionId -Credential $AzureCredential


    $Registered = Get-AzureRmStorageSyncServer -SubscriptionId $AzureSubscriptionId -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName | Select-Object *, @{n = 'ComputerName'; e = {$PSitem.DisplayName.Split('.')[0]}} | Where-Object ComputerName -eq $env:COMPUTERNAME

    $Parameters = @{}
    $Parameters.Add('ResourceGroupName',$AzureFileSyncResourceGroup)
    $Parameters.Add('StorageSyncServiceName',$AzureFileSyncInstanceName)
    $Parameters.Add('SyncGroupName',$AzureFileSyncGroup)
    $Parameters.Add('ServerId',$Registered.Id)
    $Parameters.Add('ServerLocalPath',$ServerLocalPath)

if ($PSBoundParameters.ContainsKey('CloudTiering')) {

    $Parameters.Add('CloudTiering',$CloudTiering)

}

if ($PSBoundParameters.ContainsKey('VolumeFreeSpacePercent')) {

    $Parameters.Add('VolumeFreeSpacePercent',$VolumeFreeSpacePercent)

}

if ($PSBoundParameters.ContainsKey('TierFilesOlderThanDays')) {

    $Parameters.Add('TierFilesOlderThanDays',$TierFilesOlderThanDays)

}

New-AzureRmStorageSyncServerEndpoint @Parameters

}


function Test-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [System.String]
        $TierFilesOlderThanDays,

        [System.Boolean]
        $CloudTiering,

        [System.String]
        $VolumeFreeSpacePercent,

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

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

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

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

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

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

    Write-Verbose "Variable AzureFileSyncSubscriptionId is $AzureSubscriptionId"
    Write-Verbose "Variable AzureFileSyncResourceGroup is $AzureFileSyncResourceGroup"
    Write-Verbose "Variable AzureFileSyncInstanceName is $AzureFileSyncInstanceName"
    Write-Verbose "Username for credential object AzureCredential is $($AzureCredential.UserName)"

    $null = Import-Module "C:\Program Files\Azure\StorageSyncAgent\StorageSync.Management.PowerShell.Cmdlets.dll" -WarningAction SilentlyContinue

    $null = Login-AzureRmStorageSync -SubscriptionId $AzureSubscriptionId -Credential $AzureCredential

    Write-Verbose "ComputerName for verifying if node is already registered with Azure: $($env:COMPUTERNAME)"

    $Registered = Get-AzureRmStorageSyncServer -SubscriptionId $AzureSubscriptionId -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName | Select-Object *, @{n = 'ComputerName'; e = {$PSitem.DisplayName.Split('.')[0]}} | Where-Object ComputerName -eq $env:COMPUTERNAME

    Write-Verbose "Number of registered instances with ComputerName $($env:COMPUTERNAME) : $(@($Registered).Count)"

    if (@($Registered).Count -eq 1) {

        Write-Verbose "Found server with registered DisplayName $DisplayName : $($Registered.DisplayName)"

        $AzureStorageSyncGroup = Get-AzureRmStorageSyncGroup -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName

        if (@($AzureStorageSyncGroup).Count -ge 1) {

            $AzureStorageSyncServerEndpoint = Get-AzureRmStorageSyncServerEndpoint -ResourceGroupName $AzureFileSyncResourceGroup -StorageSyncServiceName $AzureFileSyncInstanceName -SyncGroupName $AzureFileSyncGroup | Select-Object *, @{n = 'ComputerName'; e = {$PSitem.DisplayName.Split('.')[0]}} | Where-Object ComputerName -eq $env:COMPUTERNAME

            if (@($AzureStorageSyncServerEndpoint).Count -eq 1) {

                $LocalServerCurrentRegistration = Get-Item HKLM:\SOFTWARE\Microsoft\Azure\StorageSync\ServerRegistration | where Property -like ServerRegistration*

                if ($LocalServerCurrentRegistration) {

                    Write-Verbose "Local server is already registered - skipping registration"
                    $true

                } else {

                    Write-Verbose "Local server is not registered, adding even though existing server is present"
                    $false

                }


            }
            else {

                Write-Verbose "Sync group with name $AzureFileSyncGroup found, but server endpoint for $($env:COMPUTERNAME) is not present - returning false"

                $false

            }

        }
        else {

            Write-Verbose "No sync group with name $AzureFileSyncGroup found"
            Write-Verbose "Unable to find or add server endpoint - returning false"

            $false

        }



    }
    else {

        Write-Verbose "No server registered with DisplayName $DisplayName : $($Registered.DisplayName)"
        Write-Verbose "Unable to find or add server endpoint - returning false"

        $false

    }

}


Export-ModuleMember -Function *-TargetResource