DSCResources/MSFT_HybridRunbookWorker/MSFT_HybridRunbookWorker.psm1

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

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

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

        [parameter(Mandatory = $true)]
        [System.String]
        $GroupName
    )
    $ModulePresent = TestRegModule
    if (-not $ModulePresent) {
        $ErrorParam = @{
            ErrorId = 'ModuleNotPresent'
            ErrorMessage = 'HybridRegistration Module is not Present. OMS Agent is probably not installed'
            ErrorCategory = 'ObjectNotFound'
            ErrorAction = 'Stop'
        }
        New-TerminatingError @ErrorParam
    }
    $Actived = TestRegRegistry
    if ($Actived) {
        $Ensure = 'Present'
    } else {
        $Ensure = 'Absent'
    }
    if ($Actived) {
        $Config = GetRegRegistry
        return @{
            Ensure = $Ensure
            GroupName = $config.RunbookWorkerGroup
            Endpoint = $Endpoint
            Token = $null
        }
    } else {
        return @{
            Ensure = $Ensure
            GroupName = $GroupName
            Endpoint = $Endpoint
            Token = $null
        }
    }
}


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

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

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

        [parameter(Mandatory = $true)]
        [System.String]
        $GroupName
    )
    $ModulePresent = TestRegModule
    if (-not $ModulePresent) {
        $ErrorParam = @{
            ErrorId = 'ModuleNotPresent'
            ErrorMessage = 'HybridRegistration Module is not Present. OMS Agent is probably not installed'
            ErrorCategory = 'ObjectNotFound'
            ErrorAction = 'Stop'
        }
        New-TerminatingError @ErrorParam
    }

    $Actived = TestRegRegistry

    if ($Ensure -eq 'Present' -and $Actived) {
        Write-Verbose -Message 'Change Hybrid Runbook Worker Group'
        Remove-HybridRunbookWorker -Url $Endpoint -Key $Token.GetNetworkCredential().Password
        Add-HybridRunbookWorker -Url $Endpoint -GroupName $GroupName -Key $Token.GetNetworkCredential().Password
    } elseif ($Ensure -eq 'Present') {
        Write-Verbose -Message 'Registering Hybrid Runbook Worker'
        Add-HybridRunbookWorker -Url $Endpoint -GroupName $GroupName -Key $Token.GetNetworkCredential().Password
    } else {
        Write-Verbose -Message 'Remove Hybrid Runbook Worker registration'
        Remove-HybridRunbookWorker -Url $Endpoint -Key $Token.GetNetworkCredential().Password
    }
}


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

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

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

        [parameter(Mandatory = $true)]
        [System.String]
        $GroupName
    )
    $ModulePresent = TestRegModule
    if (-not $ModulePresent) {
        $ErrorParam = @{
            ErrorId = 'ModuleNotPresent'
            ErrorMessage = 'HybridRegistration Module is not Present. OMS Agent is probably not installed'
            ErrorCategory = 'ObjectNotFound'
            ErrorAction = 'Stop'
        }
        New-TerminatingError @ErrorParam
    }
    $Actived = TestRegRegistry
    if ($Ensure -eq 'Present') {
        if ($Actived) {
            Write-Verbose -Message 'Hybrid Runbook Worker Configuration Present'
            $Config = GetRegRegistry
            Write-Verbose -Message "Config: $($Config | Out-String)"
            if ($Config.RunbookWorkerGroup -eq $GroupName) {
                Write-Verbose -Message 'Hybrid Runbook Worker GroupName Correct'
                $true
            } else {
                Write-Verbose -Message 'Hybrid Runbook Worker GroupName InCorrect'
                $false
            }
        } else {
            Write-Verbose -Message 'Hybrid Runbook Worker Configuration Absent. Should be Present'
            $false
        }
    } else {
        if ($Actived) {
            Write-Verbose -Message 'Hybrid Runbook Worker Configuration Present. Should be Absent'
            $false
        } else {
            Write-Verbose -Message 'Hybrid Runbook Worker Configuration Absent'
            $true
        }
    }
}

#region helper functions
function TestRegModule {
    if (Get-Module -Name HybridRegistration -ListAvailable) {
        $true
    } else {
        $false
    }
}

function TestRegRegistry {
    Test-Path -Path HKLM:\SOFTWARE\Microsoft\HybridRunbookWorker
}

function GetRegRegistry {
    Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\HybridRunbookWorker
}

function New-TerminatingError
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory)]
        [String] $ErrorId,

        [Parameter(Mandatory)]
        [String] $ErrorMessage,

        [Parameter(Mandatory)]
        [System.Management.Automation.ErrorCategory] $ErrorCategory
    )

    $exception = New-Object System.InvalidOperationException $errorMessage
    $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null
    throw $errorRecord
}
#endregion

Export-ModuleMember -Function *-TargetResource