functions/Invoke-CucmAxl.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
function Invoke-CucmAxl {
    <#
    .SYNOPSIS
    Invoke AXL request against a CUCM server
     
    .DESCRIPTION
    Invoke AXL request against a CUCM server.
     
    .PARAMETER entity
    AXL entity to request
     
    .PARAMETER parameters
    Parameters for the AXL request
     
    .PARAMETER AXLVersion
    Version of AXL
     
    .PARAMETER server
    Server to query
     
    .PARAMETER Credential
    Credential to use for API access
     
    .PARAMETER EnableException
    Replaces user friendly yellow warnings with bloody red exceptions of doom!
    Use this if you want the function to throw terminating errors you want to catch.
     
    .PARAMETER OutputXml
    Enable the output of the XML instead of the processing of the entity.
     
    .EXAMPLE
    Invoke-CucmAxl -entity 'getPhone' -parameters @{ name = 'SEP000000000000' } -server 'Cucm-Pub.example.com' -Credential (Get-Credential)
     
    Invoke getPhone Entity with parameters...
    #>

    
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $entity,
        [Parameter(Mandatory = $true)]
        [hashtable]
        $parameters,
        [string]
        $AXLVersion = '11.5',
        [Parameter(Mandatory = $true)]
        [string]
        $server,
        [Parameter(Mandatory = $true)]
        [pscredential]
        $Credential,
        [switch]
        $EnableException,
        [switch]
        $OutputXml
    )
    $params = ''
    foreach ($paramKey in $parameters.Keys) {
        $inner = ''
        if ($parameters[$paramKey].GetType() -eq [System.Collections.Hashtable]) {
            $innerHash = $parameters[$paramKey]
            foreach ($innerKey in $innerHash.Keys) {
                $inner += '<{0}>{1}</{0}>' -f $innerKey, $innerHash[$innerKey]
            }
        }
        else {
            $inner = $parameters[$paramKey]
        }
        $params += '<{0}>{1}</{0}>' -f $paramKey, $inner
    }
    $body = @'
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/{0}">
        <soapenv:Header/>
        <soapenv:Body>
            <ns:{1}>
                {2}
            </ns:{1}>
        </soapenv:Body>
    </soapenv:Envelope>
'@
 -f $AXLVersion, $entity, $params
    
    if (-not $OutputXml) {
        if($PSCmdlet.ShouldProcess($server, "Execute AXL query $entity")) {
        
        $CUCMURL = "https://$server/axl/"
        $headers = @{
            'Content-Type' = 'text/xml; charset=utf-8'
        }
        $IRMParams = @{
            Headers    = $headers
            Body       = $body
            Uri        = $CUCMURL
            Method     = 'Post'
            Credential = $Credential
        }
        if ($PSVersionTable.PSVersion.Major -ge 6) {
            $IRMParams.SkipCertificateCheck = $true
        }
        else {
            [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
        }
        try {
            Invoke-WebRequest @IRMParams |
                Select-XML -XPath '//return' |
                Select-Object -ExpandProperty Node
        }
        catch {
            $ErrorMessage = $_.ErrorDetails.message
            $PSFMessage = "Failed to execute AXL entity $entity."
            if (($null -ne $ErrorMessage) -and ($_.Exception.Response.StatusCode -eq 'InternalServerError')) {
                $axlcode = ($ErrorMessage | select-xml -XPath '//axlcode' | Select-Object -ExpandProperty Node).'#text'
                $axlMessage = ($ErrorMessage | select-xml -XPath '//axlmessage' | Select-Object -ExpandProperty Node).'#text'
                $PSFMessage += " AXL Error: $axlMessage ($axlcode)"
            }
            Stop-PSFFunction -Message $PSFMessage -ErrorRecord $_ -EnableException $EnableException
            return
        }
        }
    }
    else {
        $body
    }
}