Public/cmdb/firewall/proxy/proxy-address.ps1
# # Copyright 2020, Alexis La Goutte <alexis dot lagoutte at gmail dot com> # Copyright 2020, Arthur Heijnen <arthur dot heijnen at live dot nl> # # SPDX-License-Identifier: Apache-2.0 # function Add-FGTFirewallProxyAddress { <# .SYNOPSIS Add a FortiGate ProxyAddress .DESCRIPTION Add a FortiGate ProxyAddress (host-regex, url ...) .EXAMPLE Add-FGTFirewallProxyAddress -name FGT -hostregex '.*\.fortinet\.com' Add ProxyAddress object type host-regex with name FGT and value '.*\.fortinet\.com' .EXAMPLE Add-FGTFirewallProxyAddress -Name FGT -method get -hostObjectName MyFGTAddress -comment "Get-only allowed to MyFGTAddress" Add ProxyAddress object type method with name FGT, only allow method GET to MyHost and a comment .EXAMPLE Add-FGTFirewallProxyAddress -name FGT -hostObjectName fortipower.github.io -path '/PowerFGT' -visibility:$false Add ProxyAddress object type url with name FGT, only allow path '/PowerFGT' to fortipower.github.io and disabled visibility Todo: add the Category, UA and Header types #> [CmdletBinding(DefaultParameterSetName = "default")] Param( [Parameter (Mandatory = $true)] [ValidateLength(0, 35)] [string]$name, [Parameter (Mandatory = $false, ParameterSetName = "host-regex")] [string]$hostregex, [Parameter (Mandatory = $false, ParameterSetName = "url")] [string]$path, [Parameter (Mandatory = $false, ParameterSetName = "method")] [ValidateSet("connect", "delete", "get", "head", "options", "post", "put", "trace", IgnoreCase = $false)] [string]$method, [Parameter (Mandatory = $false, ParameterSetName = "url")] [Parameter (ParameterSetName = "method")] [string]$hostObjectName, [Parameter (Mandatory = $false)] [ValidateLength(0, 255)] [string]$comment, [Parameter (Mandatory = $false)] [boolean]$visibility, [Parameter(Mandatory = $false)] [String[]]$vdom, [Parameter(Mandatory = $false)] [psobject]$connection = $DefaultFGTConnection ) Begin { } Process { $invokeParams = @{ } if ( $PsBoundParameters.ContainsKey('vdom') ) { $invokeParams.add( 'vdom', $vdom ) } if ( Get-FGTFirewallProxyAddress @invokeParams -name $name -connection $connection) { Throw "Already a ProxyAddress object using the same name" } $uri = "api/v2/cmdb/firewall/proxy-address" $proxyaddress = new-Object -TypeName PSObject $proxyaddress | add-member -name "type" -membertype NoteProperty -Value $PSCmdlet.ParameterSetName $proxyaddress | add-member -name "name" -membertype NoteProperty -Value $name if ( $PSCmdlet.ParameterSetName -eq 'host-regex' ) { $proxyaddress | add-member "host-regex" -membertype NoteProperty -Value $hostregex } if ( $PSCmdlet.ParameterSetName -eq 'url' ) { if (!(Get-FGTFirewallAddress @invokeParams -name $hostObjectName -connection $connection) -and ` !(Get-FGTFirewallProxyAddress @invokeParams -name $hostObjectName -connection $connection) ` ) { Throw "FirewallAddress or FirewallProxyAddress $hostObjectName not Found" } $proxyaddress | add-member -name "host" -membertype NoteProperty -Value $hostObjectName $proxyaddress | add-member -name "path" -membertype NoteProperty -Value $path } if ( $PSCmdlet.ParameterSetName -eq 'method' ) { if (!(Get-FGTFirewallAddress @invokeParams -name $hostObjectName -connection $connection) ` ) { Throw "FirewallAddress $hostObjectName not Found" } $proxyaddress | add-member -name "host" -membertype NoteProperty -Value $hostObjectName $proxyaddress | add-member -name "method" -membertype NoteProperty -Value $method } if ( $PsBoundParameters.ContainsKey('comment') ) { $proxyaddress | add-member -name "comment" -membertype NoteProperty -Value $comment } if ( $PsBoundParameters.ContainsKey('visibility') ) { #with 6.4.x, there is no longer visibility parameter if ($connection.version -ge "6.4.0") { Write-Warning "-visibility parameter is no longer available with FortiOS 6.4.x and after" } else { if ( $visibility ) { $proxyaddress | add-member -name "visibility" -membertype NoteProperty -Value "enable" } else { $proxyaddress | add-member -name "visibility" -membertype NoteProperty -Value "disable" } } } Invoke-FGTRestMethod -method "POST" -body $proxyaddress -uri $uri -connection $connection @invokeParams | out-Null Get-FGTFirewallProxyAddress -connection $connection @invokeParams -name $name } End { } } function Copy-FGTFirewallProxyAddress { <# .SYNOPSIS Copy/Clone a FortiGate ProxyAddress .DESCRIPTION Copy/Clone a FortiGate ProxyAddress (host-regex, url ...) .EXAMPLE $MyFGTProxyAddress = Get-FGTFirewallProxyAddress -name MyFGTProxyAddress PS C:\>$MyFGTProxyAddress | Copy-FGTFirewallProxyAddress -name MyFGTProxyAddress_copy Copy / Clone MyFGTProxyAddress and name MyFGTProxyAddress_copy #> Param( [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1)] [ValidateScript( { Confirm-FGTProxyAddress $_ })] [psobject]$address, [Parameter (Mandatory = $true)] [ValidateLength(0, 35)] [string]$name, [Parameter(Mandatory = $false)] [String[]]$vdom, [Parameter(Mandatory = $false)] [psobject]$connection = $DefaultFGTConnection ) Begin { } Process { $invokeParams = @{ } if ( $PsBoundParameters.ContainsKey('vdom') ) { $invokeParams.add( 'vdom', $vdom ) } $uri = "api/v2/cmdb/firewall/proxy-address" $extra = "action=clone&nkey=$($name)" Invoke-FGTRestMethod -method "POST" -uri $uri -uri_escape $address.name -extra $extra -connection $connection @invokeParams | out-Null Get-FGTFirewallproxyAddress -connection $connection @invokeParams -name $name } End { } } function Get-FGTFirewallProxyAddress { <# .SYNOPSIS Get list of all "proxy-address" .DESCRIPTION Get list of all "proxy-address" (host-regex, url ...) .EXAMPLE Get-FGTFirewallProxyAddress Get list of all proxy-address object .EXAMPLE Get-FGTFirewallProxyAddress -name myFGTPoxyAddress Get proxy-address named myFGTProxyAddress .EXAMPLE Get-FGTFirewallProxyAddress -name FGT -filter_type contains Get proxy-address contains with *FGT* .EXAMPLE Get-FGTFirewallProxyAddress -uuid 9e73a10e-1772-51ea-a8d7-297686fd7702 Get proxy-address with uuid 9e73a10e-1772-51ea-a8d7-297686fd7702 .EXAMPLE Get-FGTFirewallProxyAddress -skip Get list of all proxy-address object (but only relevant attributes) .EXAMPLE Get-FGTFirewallProxyAddress -meta Get list of all proxy-address object with metadata (q_...) like usage (q_ref) .EXAMPLE Get-FGTFirewallProxyAddress -vdom vdomX Get list of all proxy-address on VdomX #> [CmdletBinding(DefaultParameterSetName = "default")] Param( [Parameter (Mandatory = $false, Position = 1, ParameterSetName = "name")] [string]$name, [Parameter (Mandatory = $false, ParameterSetName = "uuid")] [string]$uuid, [Parameter (Mandatory = $false, ParameterSetName = "filter_build")] [string]$filter_attribute, [Parameter (Mandatory = $false, ParameterSetName = "name")] [Parameter (ParameterSetName = "uuid")] [Parameter (ParameterSetName = "filter_build")] [ValidateSet('equal', 'notequal', 'contains', 'notcontains', 'less', 'lessorequal', 'greater', 'greaterorequal')] [string]$filter_type = "equal", [Parameter (Mandatory = $false, ParameterSetName = "filter_build")] [psobject]$filter_value, [Parameter(Mandatory = $false)] [switch]$meta, [Parameter(Mandatory = $false)] [switch]$skip, [Parameter(Mandatory = $false)] [String[]]$vdom, [Parameter(Mandatory = $false)] [psobject]$connection = $DefaultFGTConnection ) Begin { } Process { $invokeParams = @{ } if ( $PsBoundParameters.ContainsKey('meta') ) { $invokeParams.add( 'meta', $meta ) } if ( $PsBoundParameters.ContainsKey('skip') ) { $invokeParams.add( 'skip', $skip ) } if ( $PsBoundParameters.ContainsKey('vdom') ) { $invokeParams.add( 'vdom', $vdom ) } $uri = "api/v2/cmdb/firewall/proxy-address" switch ( $PSCmdlet.ParameterSetName ) { "name" { $filter_value = $name $filter_attribute = "name" } "uuid" { $filter_value = $uuid $filter_attribute = "uuid" } default { } } #if filter value and filter_attribute, add filter (by default filter_type is equal) if ( $filter_value -and $filter_attribute ) { $invokeParams.add( 'filter_value', $filter_value ) $invokeParams.add( 'filter_attribute', $filter_attribute ) $invokeParams.add( 'filter_type', $filter_type ) } $response = Invoke-FGTRestMethod -uri $uri -method 'GET' -connection $connection @invokeParams $response.results } End { } } function Remove-FGTFirewallProxyAddress { <# .SYNOPSIS Remove a FortiGate ProxyAddress .DESCRIPTION Remove a Proxyaddress object on the FortiGate .EXAMPLE $MyFGTProxyAddress = Get-FGTFirewallProxyAddress -name MyFGTProxyAddress PS C:\>$MyFGTproxyAddress | Remove-FGTFirewallProxyAddress Remove address object $MyFGTProxyAddress .EXAMPLE $MyFGTproxyAddress = Get-FGTFirewallProxyAddress -name MyFGTProxyAddress PS C:\>$MyFGTproxyAddress | Remove-FGTFirewallProxyAddress -confirm:$false Remove address object $MyFGTProxyAddress with no confirmation #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'high')] Param( [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1)] [ValidateScript( { Confirm-FGTProxyAddress $_ })] [psobject]$address, [Parameter(Mandatory = $false)] [String[]]$vdom, [Parameter(Mandatory = $false)] [psobject]$connection = $DefaultFGTConnection ) Begin { } Process { $invokeParams = @{ } if ( $PsBoundParameters.ContainsKey('vdom') ) { $invokeParams.add( 'vdom', $vdom ) } $uri = "api/v2/cmdb/firewall/proxy-address" if ($PSCmdlet.ShouldProcess($address.name, 'Remove Firewall Proxy Address')) { $null = Invoke-FGTRestMethod -method "DELETE" -uri $uri -uri_escape $address.name -connection $connection @invokeParams } } End { } } |