modules/agents.psm1

# agents-list
<#
function Get-PPDMagents_list {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [string]$ID,
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = ""
 
    )
    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
    
    }
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$ID"
            }
            default {
                $URI = "/$myself"
            }
        }
        $Parameters = @{
            body = $body
            Uri = $Uri
            Method = $Method
            RequestMethod = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver = $apiver
            apiport = 443
            Verbose = $PSBoundParameters['Verbose'] -eq $true
        }
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    }
    end {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response
            }
            default {
                write-output $response
            }
        }
    }
}
 
#>

#/api/v2/agent-registration-status
<#
.SYNOPSIS
Get status and list of Agents
.DESCRIPTION
Used for List and Update of Agents
.EXAMPLE
Get-PPDMagent_registration_status -updateState NOT_SUPPORTED
 
agent : @{id=d8a93b5b-d353-4e27-82f4-d16c9fdf13d1; version=19.13; address=10.0.230.13;
                         preferredAddress=; port=7000; plugins=System.Object[]; certificateSigningRequest=******;
                         createdTime=28/06/2023 06:52:27; registeredTime=28/06/2023 07:24:17}
status : REGISTERED
inventorySourceId : 24343f1e-09b0-4850-9c05-3c320da5c603
hostname : sqlsinglenode.dpslab.home.labbuildr.com
hostId : ba9bcb41-6c6c-435c-8468-39af78f21ddd
throttlingConfig : @{backupMaxCpuPercentage=100}
applications : {@{name=Microsoft Application SQL Agent; version=19.13.0.55.Build.55;
                         packageId=30ceb7a5-77b3-5237-90b3-3854db08f9a4; packageVersion=19.14; type=MSSQL}}
updateVersionAvailable : {}
updateState : NOT_SUPPORTED
os : WINDOWS
updateStateDescription : PowerProtect Data Manager UI does not support the update of an agent with an ItemPoint
                         configuration. Try to manually update the agent from the host.
#>

function Get-PPDMagent_registration_status {
    [CmdletBinding()]
    [Alias('Get-PPDMagents')]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [string]$ID,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [ValidateSet('AVAILABLE',
            'SCHEDULED',
            'IN_PROGRESS',
            'UP_TO_DATE',
            'NOT_SUPPORTED'
        )]
        [string]$updateState,
        [ValidateSet('Microsoft Application SQL Agent',
            'Microsoft Application Exchange Agent',
            'File System Agent',
            'Oracle RMAN Agent',
            'SAP HANA Agent')]
        [string]$type,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2"

    )
    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$ID"
            }
            default {
                $URI = "/$myself"
            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }  
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            apiport          = 8443  
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        } 
        if ($updateState) {
            if ($filter) {
                $filter = 'updateState eq "' + $updateState + '" and ' + $filter 
            }
            else {
                $filter = 'updateState eq "' + $updateState + '"'
            }
        } 
        if ($type) {
            if ($filter) {
                $filter = 'applications.name eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'applications.name eq "' + $type + '"'
            }
        }                
        if ($filter) {
            $parameters.Add('filter', $filter)
        }     
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }     
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}

<#
.SYNOPSIS
Removes Update Sessipn from PPDM
.EXAMPLE
# from Pipeline
Get-PPDMagents_update_sessions -state COMPLETED | Remove-PPDMagents_update_sessions
Fri, 14 Jul 2023 12:30:09 GMT
Fri, 14 Jul 2023 12:30:09 GMT
Fri, 14 Jul 2023 12:30:09 GMT
Fri, 14 Jul 2023 12:30:09 GMT
Fri, 14 Jul 2023 12:30:09 GMT
Fri, 14 Jul 2023 12:30:10 GMT
Fri, 14 Jul 2023 12:30:10 GMT
Fri, 14 Jul 2023 12:30:10 GMT
Fri, 14 Jul 2023 12:30:10 GMT
.EXAMPLE
# By ID
Remove-PPDMagents_update_sessions -id 54ce0375-0917-4703-881d-2d74341677d9
Fri, 14 Jul 2023 12:30:09 GMT
#>

function Remove-PPDMagents_update_sessions {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2",
        [hashtable]$body = @{pageSize = 200 }  
    )
    begin {
        $Response = @()
        $METHOD = "DELETE"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(11) -replace "_", "-").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"

            }

        }   
        $Parameters = @{
            RequestMethod    = 'WEB'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true

        }
   
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                write-host $response.Headers.Date
            }

        }   
    }
}


function Get-PPDMagents_update_sessions {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(        
            'COMPLETED',
            'IN_PROGRESS',
            'SCHEDULED'
        )]
        [string[]]$state,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2"
    )
    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
                $body = @{}  

            }
            default {
                if ($state) {
                    $URI = "/$myself/filter"
                }
                else {
                    $URI = "/$myself"
                }
                
            }
        }          
        if ($state) {
            $body.Add('state', $state -join (','))
        }
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }    
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
            
        }
 
        if ($filter) {
            $parameters.Add('filter', $filter)
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}


<#
.SYNOPSIS
.EXAMPLE
#Run a precheck
Set-PPDMagents_update_sessions -hostid 8c1b3ae0-fef7-4b36-b492-3bcbf796fced -precheckOnly -Name Test
id : 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
name : test
precheckOnly : True
hosts : {@{id=8c1b3ae0-fef7-4b36-b492-3bcbf796fced; appServerTypes=System.Object[]}}
state : IN_PROGRESS
.EXAMPLE
Set-PPDMagents_update_sessions -hostid 8c1b3ae0-fef7-4b36-b492-3bcbf796fced -Name test
 
id : 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
name : test
precheckOnly : False
hosts : {@{id=8c1b3ae0-fef7-4b36-b492-3bcbf796fced; appServerTypes=System.Object[]}}
state : SCHEDULED
 
Get-PPDMagents_update_sessions -id 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
 
id : 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
name : test
precheckOnly : False
hosts : {@{id=8c1b3ae0-fef7-4b36-b492-3bcbf796fced; appServerTypes=System.Object[]}}
state : IN_PROGRESS
Get-PPDMagents_update_sessions -id 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
 
id : 8fe450b4-59ee-4bd0-9e85-7d024900a1dc
name : test
precheckOnly : False
hosts : {@{id=8c1b3ae0-fef7-4b36-b492-3bcbf796fced; appServerTypes=System.Object[]}}
state : COMPLETED
#>

function Set-PPDMagents_update_sessions {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [string]$hostid,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [ValidateSet('MSSQL',
            'ORACLE',
            'FS',
            'SAP_HANA_DATABASE_SYSTEM',
            'STORAGEGROUP',
            'MICROSOFT_EXCHANGE_DATABASE_SYSTEM')]
        [Alias('appServerTypes')][string[]]$type,
        [String]$Name = "now",
        [switch]$precheckOnly,
        [DateTime]$scheduledAt,
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2"  
    )
    begin {
        $Response = @()
        $METHOD = "POST"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
   
    }     
    Process {
        $updatehost = @{}
        $updatehost.Add('appServerTypes', $type)
        $updatehost.Add('id', $hostid)
        $body = @{}
        $body.Add('hosts', @())
        $body.hosts += $updatehost

        $body.Add('precheckOnly', $precheckOnly.IsPresent)
        $body.Add('name', $Name)
        if ($scheduledAt) {
            $body.Add('scheduledAt', $(Get-DAte $scheduledAt -Format yyyy-MM-ddTHH:mm:ssZ))

        }
        $Uri = $Myself

        $body = $body | ConvertTo-Json -Depth 7

        write-verbose ($body | Out-String)  
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            ContentType      = "application/json"
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                write-output $response
            } 
        }   
    }
}