From 00cdedbbabe50f42112906b012a6dfc868ced9ad Mon Sep 17 00:00:00 2001 From: Wago Louage Date: Wed, 28 Aug 2024 16:52:24 +0200 Subject: [PATCH] Updated BuildNewURI to be compatible with new version of netbox The way the parameters are done for the API has changed. `Get-NetboxIPAMAddress -Status 'dhcp' -Query 'dns_name__ic=example.org'` Used to return `/api/ipam/ip-addresses/?q=dns_name__ic=example.org&status=dhcp` Now it returns `/api/ipam/ip-addresses/?dns_name__ic=bel082224&status=dhcp` --- NetboxPS/NetboxPS.psm1 | 103 ++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/NetboxPS/NetboxPS.psm1 b/NetboxPS/NetboxPS.psm1 index 6c8d7e2..69ed725 100644 --- a/NetboxPS/NetboxPS.psm1 +++ b/NetboxPS/NetboxPS.psm1 @@ -271,80 +271,89 @@ function Add-NetboxVirtualMachineInterface { function BuildNewURI { -<# - .SYNOPSIS - Create a new URI for Netbox - - .DESCRIPTION - Internal function used to build a URIBuilder object. - - .PARAMETER Hostname - Hostname of the Netbox API - - .PARAMETER Segments - Array of strings for each segment in the URL path - - .PARAMETER Parameters - Hashtable of query parameters to include - - .PARAMETER HTTPS - Whether to use HTTPS or HTTP - - .PARAMETER Port - A description of the Port parameter. - - .PARAMETER APIInfo - A description of the APIInfo parameter. - - .EXAMPLE - PS C:\> BuildNewURI - - .NOTES - Additional information about the function. -#> - + <# + .SYNOPSIS + Create a new URI for Netbox + + .DESCRIPTION + Internal function used to build a URIBuilder object. + + .PARAMETER Hostname + Hostname of the Netbox API + + .PARAMETER Segments + Array of strings for each segment in the URL path + + .PARAMETER Parameters + Hashtable of query parameters to include + + .PARAMETER HTTPS + Whether to use HTTPS or HTTP + + .PARAMETER Port + A description of the Port parameter. + + .PARAMETER APIInfo + A description of the APIInfo parameter. + + .EXAMPLE + PS C:\> BuildNewURI + + .NOTES + Additional information about the function. + #> + [CmdletBinding()] [OutputType([System.UriBuilder])] param ( [Parameter(Mandatory = $false)] [string[]]$Segments, - + [Parameter(Mandatory = $false)] [hashtable]$Parameters, - + [switch]$SkipConnectedCheck ) - + Write-Verbose "Building URI" - + if (-not $SkipConnectedCheck) { # There is no point in continuing if we have not successfully connected to an API $null = CheckNetboxIsConnected } - + # Begin a URI builder with HTTP/HTTPS and the provided hostname $uriBuilder = [System.UriBuilder]::new($script:NetboxConfig.HostScheme, $script:NetboxConfig.Hostname, $script:NetboxConfig.HostPort) - + # Generate the path by trimming excess slashes and whitespace from the $segments[] and joining together $uriBuilder.Path = "api/{0}/" -f ($Segments.ForEach({ $_.trim('/').trim() }) -join '/') - + Write-Verbose " URIPath: $($uriBuilder.Path)" - - if ($parameters) { + + if ($Parameters) { # Loop through the parameters and use the HttpUtility to create a Query string - [System.Collections.Specialized.NameValueCollection]$URIParams = [System.Web.HttpUtility]::ParseQueryString([String]::Empty) - + [System.Collections.Specialized.NameValueCollection]$URIParams = [System.Web.HttpUtility]::ParseQueryString($uriBuilder.Query) + foreach ($param in $Parameters.GetEnumerator()) { Write-Verbose " Adding URI parameter $($param.Key):$($param.Value)" - $URIParams[$param.Key] = $param.Value + if ($param.Key -eq 'q') { + # Append the query string directly + $uriBuilder.Query = $uriBuilder.Query.TrimStart('?') + '&' + $param.Value + } + else { + $URIParams[$param.Key] = $param.Value + } } - - $uriBuilder.Query = $URIParams.ToString() + + # Combine the existing query with new parameters + $existingQuery = $uriBuilder.Query.TrimStart('?') + $newQuery = $URIParams.ToString() + $uriBuilder.Query = ($existingQuery + '&' + $newQuery).Trim('&') } - + Write-Verbose " Completed building URIBuilder" # Return the entire UriBuilder object $uriBuilder