mirror of
https://github.com/benclaussen/NetboxPS.git
synced 2025-12-16 11:15:46 +00:00
Compare commits
193 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7129e7d3c7 | ||
|
|
bb43ac490c | ||
|
|
59a28faff5 | ||
|
|
b441e02e2b | ||
|
|
40c7aac059 | ||
|
|
e4eb42a7a3 | ||
|
|
bf01b354bd | ||
|
|
cceb8fe765 | ||
|
|
8326e3eb29 | ||
|
|
26cc2b3c0d | ||
|
|
44dcb252b8 | ||
|
|
88647882cc | ||
|
|
2233de974d | ||
|
|
9e00636fbe | ||
|
|
bb0dfc0aa4 | ||
|
|
4897d6b71f | ||
|
|
6c2d358171 | ||
|
|
383ca2b002 | ||
|
|
985f920900 | ||
|
|
a63478a8d6 | ||
|
|
080d655f8d | ||
|
|
914b245f24 | ||
|
|
58fbbeb0cd | ||
|
|
46068dcc04 | ||
|
|
5b0c2897e0 | ||
|
|
ec5f9e810f | ||
|
|
c2a3dc285b | ||
|
|
bea65f0b06 | ||
|
|
cf1bcb3691 | ||
|
|
0049ba4985 | ||
|
|
7c03023bb8 | ||
|
|
0fd989c82a | ||
|
|
d441a1ddac | ||
|
|
7caf1a1d93 | ||
|
|
29dd7ac038 | ||
|
|
eb4d0eeb3b | ||
|
|
6f4309aa04 | ||
|
|
5421febdd1 | ||
|
|
a4c1886a23 | ||
|
|
441b06eb04 | ||
|
|
5d6fb23e91 | ||
|
|
e2a5157790 | ||
|
|
27209d6917 | ||
|
|
6965f61e6e | ||
|
|
ddf0a081b4 | ||
|
|
d09e20baee | ||
|
|
7925db838f | ||
|
|
3e0d817267 | ||
|
|
010fb0410b | ||
|
|
44dc6c86a2 | ||
|
|
5b7f0c658b | ||
|
|
5333d10ce0 | ||
|
|
f289854ddf | ||
|
|
1fed2d27e6 | ||
|
|
c1a0675b02 | ||
|
|
6654f798b0 | ||
|
|
aa444871a4 | ||
|
|
1f3626f319 | ||
|
|
356bd71ac8 | ||
|
|
f5c94b206f | ||
|
|
35916a5ab7 | ||
|
|
c47d787447 | ||
|
|
1ec38d3da2 | ||
|
|
4a0bd1d2d0 | ||
|
|
8b8ca091b1 | ||
|
|
b720c03851 | ||
|
|
c0e18ec134 | ||
|
|
049745554e | ||
|
|
c91d5fd32c | ||
|
|
458a4ae7c2 | ||
|
|
6dd82ee688 | ||
|
|
d85f675469 | ||
|
|
d7c008871d | ||
|
|
ea75e796ef | ||
|
|
6b8caf0bd7 | ||
|
|
e7a67328bf | ||
|
|
ff0c0127cd | ||
|
|
c3621f237e | ||
|
|
cad361c1b4 | ||
|
|
cd0d6383e6 | ||
|
|
7aedcf8338 | ||
|
|
cb4e2f2f57 | ||
|
|
e29299022e | ||
|
|
9dd6bc2b0e | ||
|
|
3e03e1e3ad | ||
|
|
7edbae953f | ||
|
|
a608d6ebd7 | ||
|
|
e8a5fdf15d | ||
|
|
e162c05900 | ||
|
|
26c7ccfdd0 | ||
|
|
c8e0a96690 | ||
|
|
30ae377493 | ||
|
|
c11680a20e | ||
|
|
f9fc02756c | ||
|
|
48452ce686 | ||
|
|
42b00279cb | ||
|
|
8167b0dbf0 | ||
|
|
ddf1d22e18 | ||
|
|
11ae767a6c | ||
|
|
01335bd225 | ||
|
|
739f5e98e2 | ||
|
|
2b7c1b4be3 | ||
|
|
68161a78b0 | ||
|
|
17c4d9d779 | ||
|
|
ea9f6c41bc | ||
|
|
22607fde48 | ||
|
|
802ab317f6 | ||
|
|
218114d8fe | ||
|
|
c48bfe78ad | ||
|
|
06d758d7b3 | ||
|
|
989c5eaac2 | ||
|
|
6122fd2301 | ||
|
|
1f66348205 | ||
|
|
fcbb25c088 | ||
|
|
4800cc6564 | ||
|
|
1a2484db2c | ||
|
|
254a2798ac | ||
|
|
c8233ab572 | ||
|
|
c8c6d48ee4 | ||
|
|
2bf4ed6f6f | ||
|
|
4ad0562466 | ||
|
|
5b1ee45769 | ||
|
|
b164ffe0b4 | ||
|
|
1f89363cbd | ||
|
|
7436f53f54 | ||
|
|
5921bfee57 | ||
|
|
214d5615e7 | ||
|
|
cd6dad5937 | ||
|
|
ef03cc5467 | ||
|
|
13b00d4fc9 | ||
|
|
5a23e75512 | ||
|
|
5fc0a8e9fa | ||
|
|
83944e0a45 | ||
|
|
2595c58eaa | ||
|
|
cfb53cf933 | ||
|
|
6d00855644 | ||
|
|
ad4c80e4f6 | ||
|
|
e11dfe726b | ||
|
|
af5315d43a | ||
|
|
d087ff8eed | ||
|
|
3a4f8d9152 | ||
|
|
acbbb284d3 | ||
|
|
f29701ad2f | ||
|
|
7badb7cda8 | ||
|
|
55510e5f03 | ||
|
|
3b82f91fc0 | ||
|
|
ae9371e883 | ||
|
|
cc52fdc844 | ||
|
|
b4803a5697 | ||
|
|
c844322e48 | ||
|
|
6636fe74d8 | ||
|
|
de9b616093 | ||
|
|
43b628a736 | ||
|
|
a6b3d31d44 | ||
|
|
18852aa990 | ||
|
|
b72684709a | ||
|
|
9649237394 | ||
|
|
a905a8d598 | ||
|
|
ee7ba72450 | ||
|
|
b36632cb9a | ||
|
|
a98495e5f4 | ||
|
|
657a8405bc | ||
|
|
c9077abd51 | ||
|
|
5a3487b6d4 | ||
|
|
dbee6fbf97 | ||
|
|
bf8cbb41cc | ||
|
|
909cd73327 | ||
|
|
4fdc9bb833 | ||
|
|
0b095e7280 | ||
|
|
d6b4e69f69 | ||
|
|
9f543b8f2d | ||
|
|
002feadb4a | ||
|
|
8194acb5eb | ||
|
|
32b7db1eb7 | ||
|
|
bb9ff77e5c | ||
|
|
ecad4ab499 | ||
|
|
113eb3585d | ||
|
|
839fe3e1e5 | ||
|
|
ea05aef908 | ||
|
|
8ec7c97890 | ||
|
|
b73bbcb8dc | ||
|
|
3b33bcecce | ||
|
|
1f98253f12 | ||
|
|
5550d29864 | ||
|
|
856a51e187 | ||
|
|
bac691c196 | ||
|
|
9a91803014 | ||
|
|
3c30d37fd2 | ||
|
|
6f26627fcb | ||
|
|
0d70d51a3a | ||
|
|
b8bfcf33e3 | ||
|
|
b50375722e | ||
|
|
462357646e |
141 changed files with 79724 additions and 6240 deletions
16
.github/workflows/pssa.yml
vendored
Normal file
16
.github/workflows/pssa.yml
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
name: CI
|
||||||
|
on: [pull_request]
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Run PSSA
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: lint
|
||||||
|
uses: docker://devblackops/github-action-psscriptanalyzer:2.3.0
|
||||||
|
with:
|
||||||
|
settingsPath: .vscode/PSScriptAnalyzerSettings.psd1
|
||||||
|
sendComment: false
|
||||||
|
failOnInfos: true
|
||||||
|
failOnErrors: true
|
||||||
|
failOnWarnings: true
|
||||||
16
.github/workflows/release.yml
vendored
Normal file
16
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Publish
|
||||||
|
run: |
|
||||||
|
pwsh -Command "Publish-Module -Path ./NetboxPS -NuGetApiKey ${{ secrets.PSGALLERY_API_KEY }}"
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -8,3 +8,4 @@
|
||||||
CustomMenu.inf
|
CustomMenu.inf
|
||||||
Test-Module.ps1
|
Test-Module.ps1
|
||||||
Staging/
|
Staging/
|
||||||
|
concatenated.ps1
|
||||||
5
.vscode/PSScriptAnalyzerSettings.psd1
vendored
Normal file
5
.vscode/PSScriptAnalyzerSettings.psd1
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
@{
|
||||||
|
ExcludeRules = @(
|
||||||
|
'PSUseToExportFieldsInManifest'
|
||||||
|
)
|
||||||
|
}
|
||||||
22
.vscode/settings.json
vendored
Normal file
22
.vscode/settings.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Place your settings in this file to overwrite default and user settings.
|
||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"files.trimTrailingWhitespace": true,
|
||||||
|
"powershell.scriptAnalysis.settingsPath": ".vscode/PSScriptAnalyzerSettings.psd1",
|
||||||
|
"powershell.codeFormatting.newLineAfterCloseBrace": false,
|
||||||
|
"powershell.codeFormatting.useCorrectCasing": true,
|
||||||
|
"powershell.codeFormatting.preset": "OTBS",
|
||||||
|
"powershell.codeFormatting.addWhitespaceAroundPipe": true,
|
||||||
|
"powershell.codeFormatting.autoCorrectAliases": true,
|
||||||
|
"powershell.codeFormatting.newLineAfterCloseBrace": true,
|
||||||
|
"powershell.codeFormatting.newLineAfterOpenBrace": true,
|
||||||
|
"powershell.codeFormatting.openBraceOnSameLine": true,
|
||||||
|
"powershell.codeFormatting.whitespaceAfterSeparator": true,
|
||||||
|
"powershell.codeFormatting.whitespaceAroundOperator": true,
|
||||||
|
"powershell.codeFormatting.whitespaceBeforeOpenBrace": true,
|
||||||
|
"powershell.codeFormatting.whitespaceBeforeOpenParen": true,
|
||||||
|
"powershell.codeFormatting.trimWhitespaceAroundPipe": true,
|
||||||
|
"[markdown]": {
|
||||||
|
"files.trimTrailingWhitespace": false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
<#
|
|
||||||
.NOTES
|
|
||||||
===========================================================================
|
|
||||||
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148
|
|
||||||
Created on: 2/28/2018 4:06 PM
|
|
||||||
Created by: Ben Claussen
|
|
||||||
Organization: NEOnet
|
|
||||||
Filename: Circuits.ps1
|
|
||||||
===========================================================================
|
|
||||||
.DESCRIPTION
|
|
||||||
Circuit object functions
|
|
||||||
#>
|
|
||||||
|
|
||||||
function Get-NetboxCircuitsChoices {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Gets the choices associated with circuits
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
A detailed description of the Get-NetboxCircuitsChoices function.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Get-NetboxCircuitsChoices
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
$uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices'))
|
|
||||||
$uri = BuildNewURI -Segments $uriSegments
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxCircuit {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Gets one or more circuits
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
A detailed description of the Get-NetboxCircuit function.
|
|
||||||
|
|
||||||
.PARAMETER CID
|
|
||||||
Circuit ID
|
|
||||||
|
|
||||||
.PARAMETER InstallDate
|
|
||||||
Date of installation
|
|
||||||
|
|
||||||
.PARAMETER CommitRate
|
|
||||||
Committed rate in Kbps
|
|
||||||
|
|
||||||
.PARAMETER Query
|
|
||||||
A raw search query... As if you were searching the web site
|
|
||||||
|
|
||||||
.PARAMETER Provider
|
|
||||||
The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs
|
|
||||||
|
|
||||||
.PARAMETER Type
|
|
||||||
Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs
|
|
||||||
|
|
||||||
.PARAMETER Site
|
|
||||||
Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs
|
|
||||||
|
|
||||||
.PARAMETER Tenant
|
|
||||||
Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs
|
|
||||||
|
|
||||||
.PARAMETER Id
|
|
||||||
Database ID of circuit. This will query for exactly the IDs provided
|
|
||||||
|
|
||||||
.PARAMETER ID__IN
|
|
||||||
Multiple unique DB IDs to retrieve
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Get-NetboxCircuit
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[string]$CID,
|
|
||||||
|
|
||||||
[datetime]$InstallDate,
|
|
||||||
|
|
||||||
[uint32]$CommitRate,
|
|
||||||
|
|
||||||
[string]$Query,
|
|
||||||
|
|
||||||
[object]$Provider,
|
|
||||||
|
|
||||||
[object]$Type,
|
|
||||||
|
|
||||||
[string]$Site,
|
|
||||||
|
|
||||||
[string]$Tenant,
|
|
||||||
|
|
||||||
[uint16[]]$Id
|
|
||||||
)
|
|
||||||
|
|
||||||
#TODO: Place script here
|
|
||||||
}
|
|
||||||
120
Functions/Circuits/Circuits/Get-NetboxCircuit.ps1
Normal file
120
Functions/Circuits/Circuits/Get-NetboxCircuit.ps1
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
|
||||||
|
function Get-NetboxCircuit {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Gets one or more circuits
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A detailed description of the Get-NetboxCircuit function.
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
Database ID of circuit. This will query for exactly the IDs provided
|
||||||
|
|
||||||
|
.PARAMETER CID
|
||||||
|
Circuit ID
|
||||||
|
|
||||||
|
.PARAMETER InstallDate
|
||||||
|
Date of installation
|
||||||
|
|
||||||
|
.PARAMETER CommitRate
|
||||||
|
Committed rate in Kbps
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
A raw search query... As if you were searching the web site
|
||||||
|
|
||||||
|
.PARAMETER Provider
|
||||||
|
The name or ID of the provider. Provide either [string] or [uint64]. String will search provider names, integer will search database IDs
|
||||||
|
|
||||||
|
.PARAMETER Type
|
||||||
|
Type of circuit. Provide either [string] or [uint64]. String will search provider type names, integer will search database IDs
|
||||||
|
|
||||||
|
.PARAMETER Site
|
||||||
|
Location/site of circuit. Provide either [string] or [uint64]. String will search site names, integer will search database IDs
|
||||||
|
|
||||||
|
.PARAMETER Tenant
|
||||||
|
Tenant assigned to circuit. Provide either [string] or [uint64]. String will search tenant names, integer will search database IDs
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
A description of the Limit parameter.
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
A description of the Offset parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.PARAMETER ID__IN
|
||||||
|
Multiple unique DB IDs to retrieve
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxCircuit
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ById')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$CID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[datetime]$InstallDate,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$CommitRate,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Provider,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Type,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Site,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($i in $ID) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits', $i))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id"
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Functions/Circuits/Circuits/New-NetboxCircuit.ps1
Normal file
55
Functions/Circuits/Circuits/New-NetboxCircuit.ps1
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
function New-NetboxCircuit {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[string]$CID,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Provider,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Type,
|
||||||
|
|
||||||
|
#[ValidateSet('Active', 'Planned', 'Provisioning', 'Offline', 'Deprovisioning', 'Decommissioned ')]
|
||||||
|
[uint16]$Status = 'Active',
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[string]$Termination_A,
|
||||||
|
|
||||||
|
[datetime]$Install_Date,
|
||||||
|
|
||||||
|
[string]$Termination_Z,
|
||||||
|
|
||||||
|
[ValidateRange(0, 2147483647)]
|
||||||
|
[uint64]$Commit_Rate,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Force,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess($CID, 'Create new circuit')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1
Normal file
58
Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
|
||||||
|
function Get-NetboxCircuitProvider {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ById',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Mandatory = $false)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$ASN,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Account,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($i in $ID) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers', $i))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id"
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
|
||||||
|
function Get-NetboxCircuitTermination {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ById',
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Circuit_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Term_Side,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Port_Speed,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Site_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Site,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$XConnect_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($i in $ID) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations', $i))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id"
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
50
Functions/Circuits/Types/Get-NetboxCircuitType.ps1
Normal file
50
Functions/Circuits/Types/Get-NetboxCircuitType.ps1
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
function Get-NetboxCircuitType {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ById')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($i in $ID) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit_types', $i))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id"
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-types'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
function Get-NetboxDCIMCableTermination {
|
||||||
|
[CmdletBinding()]
|
||||||
|
#region Parameters
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[uint64]$Cable,
|
||||||
|
|
||||||
|
[string]$Cable_End,
|
||||||
|
|
||||||
|
[string]$Termination_Type,
|
||||||
|
|
||||||
|
[uint64]$Termination_ID,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
#endregion Parameters
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'cable-terminations'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Functions/DCIM/Cables/Get-NetboxDCIMCable.ps1
Normal file
55
Functions/DCIM/Cables/Get-NetboxDCIMCable.ps1
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
function Get-NetboxDCIMCable {
|
||||||
|
[CmdletBinding()]
|
||||||
|
#region Parameters
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Label,
|
||||||
|
|
||||||
|
[string]$Termination_A_Type,
|
||||||
|
|
||||||
|
[uint64]$Termination_A_ID,
|
||||||
|
|
||||||
|
[string]$Termination_B_Type,
|
||||||
|
|
||||||
|
[uint64]$Termination_B_ID,
|
||||||
|
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[string]$Status,
|
||||||
|
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[uint64]$Device_ID,
|
||||||
|
|
||||||
|
[string]$Device,
|
||||||
|
|
||||||
|
[uint64]$Rack_Id,
|
||||||
|
|
||||||
|
[string]$Rack,
|
||||||
|
|
||||||
|
[uint64]$Location_ID,
|
||||||
|
|
||||||
|
[string]$Location,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
#endregion Parameters
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'cables'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
84
Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1
Normal file
84
Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMDevice {
|
||||||
|
[CmdletBinding()]
|
||||||
|
#region Parameters
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[uint64]$Manufacturer_Id,
|
||||||
|
|
||||||
|
[string]$Manufacturer,
|
||||||
|
|
||||||
|
[uint64]$Device_Type_Id,
|
||||||
|
|
||||||
|
[uint64]$Role_Id,
|
||||||
|
|
||||||
|
[string]$Role,
|
||||||
|
|
||||||
|
[uint64]$Tenant_Id,
|
||||||
|
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$Platform_Id,
|
||||||
|
|
||||||
|
[string]$Platform,
|
||||||
|
|
||||||
|
[string]$Asset_Tag,
|
||||||
|
|
||||||
|
[uint64]$Site_Id,
|
||||||
|
|
||||||
|
[string]$Site,
|
||||||
|
|
||||||
|
[uint64]$Rack_Group_Id,
|
||||||
|
|
||||||
|
[uint64]$Rack_Id,
|
||||||
|
|
||||||
|
[uint64]$Cluster_Id,
|
||||||
|
|
||||||
|
[uint64]$Model,
|
||||||
|
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[bool]$Is_Full_Depth,
|
||||||
|
|
||||||
|
[bool]$Is_Console_Server,
|
||||||
|
|
||||||
|
[bool]$Is_PDU,
|
||||||
|
|
||||||
|
[bool]$Is_Network_Device,
|
||||||
|
|
||||||
|
[string]$MAC_Address,
|
||||||
|
|
||||||
|
[bool]$Has_Primary_IP,
|
||||||
|
|
||||||
|
[uint64]$Virtual_Chassis_Id,
|
||||||
|
|
||||||
|
[uint16]$Position,
|
||||||
|
|
||||||
|
[string]$Serial,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
#endregion Parameters
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
49
Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1
Normal file
49
Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMDeviceRole {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ById')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[bool]$VM_Role,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($DRId in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles', $DRId))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1
Normal file
48
Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMDeviceType {
|
||||||
|
[CmdletBinding()]
|
||||||
|
#region Parameters
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[string]$Manufacturer,
|
||||||
|
|
||||||
|
[uint64]$Manufacturer_Id,
|
||||||
|
|
||||||
|
[string]$Model,
|
||||||
|
|
||||||
|
[string]$Part_Number,
|
||||||
|
|
||||||
|
[uint16]$U_Height,
|
||||||
|
|
||||||
|
[bool]$Is_Full_Depth,
|
||||||
|
|
||||||
|
[bool]$Is_Console_Server,
|
||||||
|
|
||||||
|
[bool]$Is_PDU,
|
||||||
|
|
||||||
|
[bool]$Is_Network_Device,
|
||||||
|
|
||||||
|
[uint16]$Subdevice_Role,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
#endregion Parameters
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-types'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
64
Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1
Normal file
64
Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
|
||||||
|
function New-NetboxDCIMDevice {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
#region Parameters
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[object]$Device_Role,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[object]$Device_Type,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Site,
|
||||||
|
|
||||||
|
[object]$Status = 'Active',
|
||||||
|
|
||||||
|
[uint64]$Platform,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$Cluster,
|
||||||
|
|
||||||
|
[uint64]$Rack,
|
||||||
|
|
||||||
|
[uint16]$Position,
|
||||||
|
|
||||||
|
[object]$Face,
|
||||||
|
|
||||||
|
[string]$Serial,
|
||||||
|
|
||||||
|
[string]$Asset_Tag,
|
||||||
|
|
||||||
|
[uint64]$Virtual_Chassis,
|
||||||
|
|
||||||
|
[uint64]$VC_Priority,
|
||||||
|
|
||||||
|
[uint64]$VC_Position,
|
||||||
|
|
||||||
|
[uint64]$Primary_IP4,
|
||||||
|
|
||||||
|
[uint64]$Primary_IP6,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields
|
||||||
|
)
|
||||||
|
#endregion Parameters
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Name, 'Create new Device')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1
Normal file
55
Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
function Remove-NetboxDCIMDevice {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Delete a device
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Deletes a device from Netbox by ID
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
Database ID of the device
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
Force deletion without any prompts
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Remove-NetboxDCIMDevice -Id $value1
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($DeviceID in $Id) {
|
||||||
|
$CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentDevice.Name) | ID: $($CurrentDevice.Id)", "Remove")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id))
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
76
Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1
Normal file
76
Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
function Set-NetboxDCIMDevice {
|
||||||
|
[CmdletBinding(SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[object]$Device_Role,
|
||||||
|
|
||||||
|
[object]$Device_Type,
|
||||||
|
|
||||||
|
[uint64]$Site,
|
||||||
|
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[uint64]$Platform,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$Cluster,
|
||||||
|
|
||||||
|
[uint64]$Rack,
|
||||||
|
|
||||||
|
[uint16]$Position,
|
||||||
|
|
||||||
|
[object]$Face,
|
||||||
|
|
||||||
|
[string]$Serial,
|
||||||
|
|
||||||
|
[string]$Asset_Tag,
|
||||||
|
|
||||||
|
[uint64]$Virtual_Chassis,
|
||||||
|
|
||||||
|
[uint64]$VC_Priority,
|
||||||
|
|
||||||
|
[uint64]$VC_Position,
|
||||||
|
|
||||||
|
[uint64]$Primary_IP4,
|
||||||
|
|
||||||
|
[uint64]$Primary_IP6,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($DeviceID in $Id) {
|
||||||
|
$CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("$($CurrentDevice.Name)", "Set")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
42
Functions/DCIM/FrontPorts/Add-NetboxDCIMFrontPort.ps1
Normal file
42
Functions/DCIM/FrontPorts/Add-NetboxDCIMFrontPort.ps1
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
function Add-NetboxDCIMFrontPort {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[uint64]$Module,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Label,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[ValidatePattern('^[0-9a-f]{6}$')]
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Rear_Port,
|
||||||
|
|
||||||
|
[uint64]$Rear_Port_Position,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[bool]$Mark_Connected,
|
||||||
|
|
||||||
|
[uint16[]]$Tags
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'front-ports'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST
|
||||||
|
}
|
||||||
34
Functions/DCIM/FrontPorts/Get-NetboxDCIMFrontPort.ps1
Normal file
34
Functions/DCIM/FrontPorts/Get-NetboxDCIMFrontPort.ps1
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
function Get-NetboxDCIMFrontPort {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Device,
|
||||||
|
|
||||||
|
[uint64]$Device_Id,
|
||||||
|
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'front-ports'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
35
Functions/DCIM/FrontPorts/Remove-NetboxDCIMFrontPort.ps1
Normal file
35
Functions/DCIM/FrontPorts/Remove-NetboxDCIMFrontPort.ps1
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
function Remove-NetboxDCIMFrontPort {
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($FrontPortID in $Id) {
|
||||||
|
$CurrentPort = Get-NetboxDCIMFrontPort -Id $FrontPortID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentPort.Name) | ID: $($CurrentPort.Id)", "Remove")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'front-ports', $CurrentPort.Id))
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
60
Functions/DCIM/FrontPorts/Set-NetboxDCIMFrontPort.ps1
Normal file
60
Functions/DCIM/FrontPorts/Set-NetboxDCIMFrontPort.ps1
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
function Set-NetboxDCIMFrontPort {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[uint16]$Device,
|
||||||
|
|
||||||
|
[uint16]$Module,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Label,
|
||||||
|
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[ValidatePattern('^[0-9a-f]{6}$')]
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[uint64]$Rear_Port,
|
||||||
|
|
||||||
|
[uint16]$Rear_Port_Position,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[bool]$Mark_Connected,
|
||||||
|
|
||||||
|
[uint64[]]$Tags,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($FrontPortID in $Id) {
|
||||||
|
$CurrentPort = Get-NetboxDCIMFrontPort -Id $FrontPortID -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'front-ports', $CurrentPort.Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Front Port ID $($CurrentPort.Id)", "Set")) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
50
Functions/DCIM/Get-NetboxDCIMPlatform.ps1
Normal file
50
Functions/DCIM/Get-NetboxDCIMPlatform.ps1
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMPlatform {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ById')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[uint64]$Manufacturer_Id,
|
||||||
|
|
||||||
|
[string]$Manufacturer,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($PlatformID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms', $PlatformID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
70
Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1
Normal file
70
Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
|
||||||
|
function Add-NetboxDCIMInterface {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[ValidateSet('virtual', 'bridge', 'lag', '100base-tx', '1000base-t', '2.5gbase-t', '5gbase-t', '10gbase-t', '10gbase-cx4', '1000base-x-gbic', '1000base-x-sfp', '10gbase-x-sfpp', '10gbase-x-xfp', '10gbase-x-xenpak', '10gbase-x-x2', '25gbase-x-sfp28', '50gbase-x-sfp56', '40gbase-x-qsfpp', '50gbase-x-sfp28', '100gbase-x-cfp', '100gbase-x-cfp2', '200gbase-x-cfp2', '100gbase-x-cfp4', '100gbase-x-cpak', '100gbase-x-qsfp28', '200gbase-x-qsfp56', '400gbase-x-qsfpdd', '400gbase-x-osfp', '1000base-kx', '10gbase-kr', '10gbase-kx4', '25gbase-kr', '40gbase-kr4', '50gbase-kr', '100gbase-kp4', '100gbase-kr2', '100gbase-kr4', 'ieee802.11a', 'ieee802.11g', 'ieee802.11n', 'ieee802.11ac', 'ieee802.11ad', 'ieee802.11ax', 'ieee802.11ay', 'ieee802.15.1', 'other-wireless', 'gsm', 'cdma', 'lte', 'sonet-oc3', 'sonet-oc12', 'sonet-oc48', 'sonet-oc192', 'sonet-oc768', 'sonet-oc1920', 'sonet-oc3840', '1gfc-sfp', '2gfc-sfp', '4gfc-sfp', '8gfc-sfpp', '16gfc-sfpp', '32gfc-sfp28', '64gfc-qsfpp', '128gfc-qsfp28', 'infiniband-sdr', 'infiniband-ddr', 'infiniband-qdr', 'infiniband-fdr10', 'infiniband-fdr', 'infiniband-edr', 'infiniband-hdr', 'infiniband-ndr', 'infiniband-xdr', 't1', 'e1', 't3', 'e3', 'xdsl', 'docsis', 'gpon', 'xg-pon', 'xgs-pon', 'ng-pon2', 'epon', '10g-epon', 'cisco-stackwise', 'cisco-stackwise-plus', 'cisco-flexstack', 'cisco-flexstack-plus', 'cisco-stackwise-80', 'cisco-stackwise-160', 'cisco-stackwise-320', 'cisco-stackwise-480', 'juniper-vcp', 'extreme-summitstack', 'extreme-summitstack-128', 'extreme-summitstack-256', 'extreme-summitstack-512', 'other', IgnoreCase = $true)]
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[bool]$Enabled,
|
||||||
|
|
||||||
|
[object]$Form_Factor,
|
||||||
|
|
||||||
|
[uint16]$MTU,
|
||||||
|
|
||||||
|
[string]$MAC_Address,
|
||||||
|
|
||||||
|
[bool]$MGMT_Only,
|
||||||
|
|
||||||
|
[uint64]$LAG,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)]
|
||||||
|
[string]$Mode,
|
||||||
|
|
||||||
|
[ValidateRange(1, 4094)]
|
||||||
|
[uint16]$Untagged_VLAN,
|
||||||
|
|
||||||
|
[ValidateRange(1, 4094)]
|
||||||
|
[uint16[]]$Tagged_VLANs
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-not [System.String]::IsNullOrWhiteSpace($Mode)) {
|
||||||
|
$PSBoundParameters.Mode = switch ($Mode) {
|
||||||
|
'Access' {
|
||||||
|
100
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'Tagged' {
|
||||||
|
200
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'Tagged All' {
|
||||||
|
300
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
function Add-NetboxDCIMInterfaceConnection {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new connection between two interfaces
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Create a new connection between two interfaces
|
||||||
|
|
||||||
|
.PARAMETER Connection_Status
|
||||||
|
Is it connected or planned?
|
||||||
|
|
||||||
|
.PARAMETER Interface_A
|
||||||
|
Database ID of interface A
|
||||||
|
|
||||||
|
.PARAMETER Interface_B
|
||||||
|
Database ID of interface B
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Add-NetboxDCIMInterfaceConnection -Interface_A $value1 -Interface_B $value2
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[object]$Connection_Status,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Interface_A,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Interface_B
|
||||||
|
)
|
||||||
|
|
||||||
|
# Verify if both Interfaces exist
|
||||||
|
Get-NetboxDCIMInterface -Id $Interface_A -ErrorAction Stop | Out-null
|
||||||
|
Get-NetboxDCIMInterface -Id $Interface_B -ErrorAction Stop | Out-null
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST
|
||||||
|
}
|
||||||
46
Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1
Normal file
46
Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
function Get-NetboxDCIMInterface {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[uint64]$Name,
|
||||||
|
|
||||||
|
[object]$Form_Factor,
|
||||||
|
|
||||||
|
[bool]$Enabled,
|
||||||
|
|
||||||
|
[uint16]$MTU,
|
||||||
|
|
||||||
|
[bool]$MGMT_Only,
|
||||||
|
|
||||||
|
[string]$Device,
|
||||||
|
|
||||||
|
[uint64]$Device_Id,
|
||||||
|
|
||||||
|
[ValidateSet('virtual', 'bridge', 'lag', '100base-tx', '1000base-t', '2.5gbase-t', '5gbase-t', '10gbase-t', '10gbase-cx4', '1000base-x-gbic', '1000base-x-sfp', '10gbase-x-sfpp', '10gbase-x-xfp', '10gbase-x-xenpak', '10gbase-x-x2', '25gbase-x-sfp28', '50gbase-x-sfp56', '40gbase-x-qsfpp', '50gbase-x-sfp28', '100gbase-x-cfp', '100gbase-x-cfp2', '200gbase-x-cfp2', '100gbase-x-cfp4', '100gbase-x-cpak', '100gbase-x-qsfp28', '200gbase-x-qsfp56', '400gbase-x-qsfpdd', '400gbase-x-osfp', '1000base-kx', '10gbase-kr', '10gbase-kx4', '25gbase-kr', '40gbase-kr4', '50gbase-kr', '100gbase-kp4', '100gbase-kr2', '100gbase-kr4', 'ieee802.11a', 'ieee802.11g', 'ieee802.11n', 'ieee802.11ac', 'ieee802.11ad', 'ieee802.11ax', 'ieee802.11ay', 'ieee802.15.1', 'other-wireless', 'gsm', 'cdma', 'lte', 'sonet-oc3', 'sonet-oc12', 'sonet-oc48', 'sonet-oc192', 'sonet-oc768', 'sonet-oc1920', 'sonet-oc3840', '1gfc-sfp', '2gfc-sfp', '4gfc-sfp', '8gfc-sfpp', '16gfc-sfpp', '32gfc-sfp28', '64gfc-qsfpp', '128gfc-qsfp28', 'infiniband-sdr', 'infiniband-ddr', 'infiniband-qdr', 'infiniband-fdr10', 'infiniband-fdr', 'infiniband-edr', 'infiniband-hdr', 'infiniband-ndr', 'infiniband-xdr', 't1', 'e1', 't3', 'e3', 'xdsl', 'docsis', 'gpon', 'xg-pon', 'xgs-pon', 'ng-pon2', 'epon', '10g-epon', 'cisco-stackwise', 'cisco-stackwise-plus', 'cisco-flexstack', 'cisco-flexstack-plus', 'cisco-stackwise-80', 'cisco-stackwise-160', 'cisco-stackwise-320', 'cisco-stackwise-480', 'juniper-vcp', 'extreme-summitstack', 'extreme-summitstack-128', 'extreme-summitstack-256', 'extreme-summitstack-512', 'other', IgnoreCase = $true)]
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[uint64]$LAG_Id,
|
||||||
|
|
||||||
|
[string]$MAC_Address,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMInterfaceConnection {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[object]$Connection_Status,
|
||||||
|
|
||||||
|
[uint64]$Site,
|
||||||
|
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
54
Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1
Normal file
54
Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
function Remove-NetboxDCIMInterface {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Removes an interface
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Removes an interface by ID from a device
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
A description of the Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
A description of the Force parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Remove-NetboxDCIMInterface -Id $value1
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($InterfaceId in $Id) {
|
||||||
|
$CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentInterface.Name) | ID: $($CurrentInterface.Id)", "Remove")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id))
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
function Remove-NetboxDCIMInterfaceConnection {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([void])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($ConnectionID in $Id) {
|
||||||
|
$CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($ConnectionID.Id)", "REMOVE")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
88
Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1
Normal file
88
Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
function Set-NetboxDCIMInterface {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[bool]$Enabled,
|
||||||
|
|
||||||
|
[object]$Form_Factor,
|
||||||
|
|
||||||
|
[ValidateSet('virtual', 'bridge', 'lag', '100base-tx', '1000base-t', '2.5gbase-t', '5gbase-t', '10gbase-t', '10gbase-cx4', '1000base-x-gbic', '1000base-x-sfp', '10gbase-x-sfpp', '10gbase-x-xfp', '10gbase-x-xenpak', '10gbase-x-x2', '25gbase-x-sfp28', '50gbase-x-sfp56', '40gbase-x-qsfpp', '50gbase-x-sfp28', '100gbase-x-cfp', '100gbase-x-cfp2', '200gbase-x-cfp2', '100gbase-x-cfp4', '100gbase-x-cpak', '100gbase-x-qsfp28', '200gbase-x-qsfp56', '400gbase-x-qsfpdd', '400gbase-x-osfp', '1000base-kx', '10gbase-kr', '10gbase-kx4', '25gbase-kr', '40gbase-kr4', '50gbase-kr', '100gbase-kp4', '100gbase-kr2', '100gbase-kr4', 'ieee802.11a', 'ieee802.11g', 'ieee802.11n', 'ieee802.11ac', 'ieee802.11ad', 'ieee802.11ax', 'ieee802.11ay', 'ieee802.15.1', 'other-wireless', 'gsm', 'cdma', 'lte', 'sonet-oc3', 'sonet-oc12', 'sonet-oc48', 'sonet-oc192', 'sonet-oc768', 'sonet-oc1920', 'sonet-oc3840', '1gfc-sfp', '2gfc-sfp', '4gfc-sfp', '8gfc-sfpp', '16gfc-sfpp', '32gfc-sfp28', '64gfc-qsfpp', '128gfc-qsfp28', 'infiniband-sdr', 'infiniband-ddr', 'infiniband-qdr', 'infiniband-fdr10', 'infiniband-fdr', 'infiniband-edr', 'infiniband-hdr', 'infiniband-ndr', 'infiniband-xdr', 't1', 'e1', 't3', 'e3', 'xdsl', 'docsis', 'gpon', 'xg-pon', 'xgs-pon', 'ng-pon2', 'epon', '10g-epon', 'cisco-stackwise', 'cisco-stackwise-plus', 'cisco-flexstack', 'cisco-flexstack-plus', 'cisco-stackwise-80', 'cisco-stackwise-160', 'cisco-stackwise-320', 'cisco-stackwise-480', 'juniper-vcp', 'extreme-summitstack', 'extreme-summitstack-128', 'extreme-summitstack-256', 'extreme-summitstack-512', 'other', IgnoreCase = $true)]
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[uint16]$MTU,
|
||||||
|
|
||||||
|
[string]$MAC_Address,
|
||||||
|
|
||||||
|
[bool]$MGMT_Only,
|
||||||
|
|
||||||
|
[uint64]$LAG,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)]
|
||||||
|
[string]$Mode,
|
||||||
|
|
||||||
|
[ValidateRange(1, 4094)]
|
||||||
|
[uint16]$Untagged_VLAN,
|
||||||
|
|
||||||
|
[ValidateRange(1, 4094)]
|
||||||
|
[uint16[]]$Tagged_VLANs,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
if (-not [System.String]::IsNullOrWhiteSpace($Mode)) {
|
||||||
|
$PSBoundParameters.Mode = switch ($Mode) {
|
||||||
|
'Access' {
|
||||||
|
100
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'Tagged' {
|
||||||
|
200
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'Tagged All' {
|
||||||
|
300
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($InterfaceId in $Id) {
|
||||||
|
$CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Interface ID $($CurrentInterface.Id)", "Set")) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
function Set-NetboxDCIMInterfaceConnection {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Update an interface connection
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Update an interface connection
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
A description of the Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Connection_Status
|
||||||
|
A description of the Connection_Status parameter.
|
||||||
|
|
||||||
|
.PARAMETER Interface_A
|
||||||
|
A description of the Interface_A parameter.
|
||||||
|
|
||||||
|
.PARAMETER Interface_B
|
||||||
|
A description of the Interface_B parameter.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
A description of the Force parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Set-NetboxDCIMInterfaceConnection -Id $value1
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[object]$Connection_Status,
|
||||||
|
|
||||||
|
[uint64]$Interface_A,
|
||||||
|
|
||||||
|
[uint64]$Interface_B,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
if ((@($ID).Count -gt 1) -and ($Interface_A -or $Interface_B)) {
|
||||||
|
throw "Cannot set multiple connections to the same interface"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($ConnectionID in $Id) {
|
||||||
|
$CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id))
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($CurrentConnection.Id)", "Set")) {
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Functions/DCIM/RearPorts/Add-NetboxDCIMRearPort.ps1
Normal file
48
Functions/DCIM/RearPorts/Add-NetboxDCIMRearPort.ps1
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
function Add-NetboxDCIMRearPort {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[uint64]$Module,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Label,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[ValidatePattern('^[0-9a-f]{6}$')]
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[uint16]$Positions = 1,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[bool]$Mark_Connected,
|
||||||
|
|
||||||
|
[uint16[]]$Tags
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'rear-ports'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
34
Functions/DCIM/RearPorts/Get-NetboxDCIMRearPort.ps1
Normal file
34
Functions/DCIM/RearPorts/Get-NetboxDCIMRearPort.ps1
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
function Get-NetboxDCIMRearPort {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Device,
|
||||||
|
|
||||||
|
[uint64]$Device_Id,
|
||||||
|
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'rear-ports'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
35
Functions/DCIM/RearPorts/Remove-NetboxDCIMRearPort.ps1
Normal file
35
Functions/DCIM/RearPorts/Remove-NetboxDCIMRearPort.ps1
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
function Remove-NetboxDCIMRearPort {
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($RearPortID in $Id) {
|
||||||
|
$CurrentPort = Get-NetboxDCIMRearPort -Id $RearPortID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentPort.Name) | ID: $($CurrentPort.Id)", "Remove")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'rear-ports', $CurrentPort.Id))
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
59
Functions/DCIM/RearPorts/Set-NetboxDCIMRearPort.ps1
Normal file
59
Functions/DCIM/RearPorts/Set-NetboxDCIMRearPort.ps1
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
|
||||||
|
function Set-NetboxDCIMRearPort {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[uint64]$Device,
|
||||||
|
|
||||||
|
[uint64]$Module,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Label,
|
||||||
|
|
||||||
|
[string]$Type,
|
||||||
|
|
||||||
|
[ValidatePattern('^[0-9a-f]{6}$')]
|
||||||
|
[string]$Color,
|
||||||
|
|
||||||
|
[uint16]$Positions,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[bool]$Mark_Connected,
|
||||||
|
|
||||||
|
[uint16[]]$Tags,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($RearPortID in $Id) {
|
||||||
|
$CurrentPort = Get-NetboxDCIMRearPort -Id $RearPortID -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'rear-ports', $CurrentPort.Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess("Rear Port ID $($CurrentPort.Id)", "Set")) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
95
Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1
Normal file
95
Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
|
||||||
|
function Get-NetboxDCIMSite {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ByID', ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Facility,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$ASN,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[decimal]$Latitude,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[decimal]$Longitude,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Contact_Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Contact_Phone,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Contact_Email,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Tenant_Group_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant_Group,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Tenant_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Status,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Region_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Region,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($Site_ID in $ID) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites', $Site_Id))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id"
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
86
Functions/DCIM/Sites/New-NetboxDCIMSite.ps1
Normal file
86
Functions/DCIM/Sites/New-NetboxDCIMSite.ps1
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
<#
|
||||||
|
.NOTES
|
||||||
|
===========================================================================
|
||||||
|
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181
|
||||||
|
Created on: 2020-10-02 15:52
|
||||||
|
Created by: Claussen
|
||||||
|
Organization: NEOnet
|
||||||
|
Filename: New-NetboxDCIMSite.ps1
|
||||||
|
===========================================================================
|
||||||
|
.DESCRIPTION
|
||||||
|
A description of the file.
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function New-NetboxDCIMSite {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new Site to Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Create a new Site to Netbox
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-NetboxDCIMSite -name MySite
|
||||||
|
|
||||||
|
Add new Site MySite on Netbox
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[string]$Facility,
|
||||||
|
|
||||||
|
[uint64]$ASN,
|
||||||
|
|
||||||
|
[decimal]$Latitude,
|
||||||
|
|
||||||
|
[decimal]$Longitude,
|
||||||
|
|
||||||
|
[string]$Contact_Name,
|
||||||
|
|
||||||
|
[string]$Contact_Phone,
|
||||||
|
|
||||||
|
[string]$Contact_Email,
|
||||||
|
|
||||||
|
[uint64]$Tenant_Group,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[string]$Status,
|
||||||
|
|
||||||
|
[uint64]$Region,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
if (-not $PSBoundParameters.ContainsKey('slug')) {
|
||||||
|
$PSBoundParameters.Add('slug', $name)
|
||||||
|
}
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($name, 'Create new Site')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
64
Functions/DCIM/Sites/Remove-NetboxDCIMSite.ps1
Normal file
64
Functions/DCIM/Sites/Remove-NetboxDCIMSite.ps1
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
<#
|
||||||
|
.NOTES
|
||||||
|
===========================================================================
|
||||||
|
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181
|
||||||
|
Created on: 2020-10-02 15:52
|
||||||
|
Created by: Claussen
|
||||||
|
Organization: NEOnet
|
||||||
|
Filename: New-NetboxDCIMSite.ps1
|
||||||
|
===========================================================================
|
||||||
|
.DESCRIPTION
|
||||||
|
A description of the file.
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
function Remove-NetboxDCIMSite {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Remove a Site
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Remove a DCIM Site from Netbox
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Remove-NetboxDCIMSite -Id 1
|
||||||
|
|
||||||
|
Remove DCM Site with id 1
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Get-NetboxDCIMSite -name My Site | Remove-NetboxDCIMSite -confirm:$false
|
||||||
|
|
||||||
|
Remove DCM Site with name My Site without confirmation
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint]$Id
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$CurrentSite = Get-NetboxDCIMSite -Id $Id -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($pscmdlet.ShouldProcess("$($CurrentSite.Name)/$($CurrentSite.Id)", "Remove Site")) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites', $CurrentSite.Id))
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
<#
|
|
||||||
.NOTES
|
|
||||||
===========================================================================
|
|
||||||
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148
|
|
||||||
Created on: 2/28/2018 3:43 PM
|
|
||||||
Created by: Ben Claussen
|
|
||||||
Organization: NEOnet
|
|
||||||
Filename: Extras.ps1
|
|
||||||
===========================================================================
|
|
||||||
.DESCRIPTION
|
|
||||||
Extras objects functions
|
|
||||||
#>
|
|
||||||
|
|
||||||
function Get-NetboxExtrasChoices {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
$uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices'))
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $uriSegments
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri
|
|
||||||
}
|
|
||||||
31
Functions/Extras/Tags/Get-NetboxTag.ps1
Normal file
31
Functions/Extras/Tags/Get-NetboxTag.ps1
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
function Get-NetboxTag {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64]$Id,
|
||||||
|
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('extras', 'tags'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,407 +0,0 @@
|
||||||
<#
|
|
||||||
.NOTES
|
|
||||||
===========================================================================
|
|
||||||
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148
|
|
||||||
Created on: 2/28/2018 3:33 PM
|
|
||||||
Created by: Ben Claussen
|
|
||||||
Organization: NEOnet
|
|
||||||
Filename: Helpers.ps1
|
|
||||||
===========================================================================
|
|
||||||
.DESCRIPTION
|
|
||||||
These function are internal functions and generally are not
|
|
||||||
exposed to the end user
|
|
||||||
#>
|
|
||||||
|
|
||||||
function CheckNetboxIsConnected {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
Write-Verbose "Checking connection status"
|
|
||||||
if (-not $script:NetboxConfig.Connected) {
|
|
||||||
throw "Not connected to a Netbox API! Please run 'Connect-NetboxAPI'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function BuildNewURI {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Create a new URI for Netbox
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
A detailed description of the BuildNewURI function.
|
|
||||||
|
|
||||||
.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]$Hostname,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[string[]]$Segments,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[hashtable]$Parameters,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[boolean]$HTTPS = $true,
|
|
||||||
|
|
||||||
[ValidateRange(1, 65535)]
|
|
||||||
[uint16]$Port = 443,
|
|
||||||
|
|
||||||
[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
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-not $Hostname) {
|
|
||||||
$Hostname = Get-NetboxHostname
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($HTTPS) {
|
|
||||||
Write-Verbose " Setting scheme to HTTPS"
|
|
||||||
$Scheme = 'https'
|
|
||||||
} else {
|
|
||||||
Write-Warning " Connecting via non-secure HTTP is not-recommended"
|
|
||||||
|
|
||||||
Write-Verbose " Setting scheme to HTTP"
|
|
||||||
$Scheme = 'http'
|
|
||||||
|
|
||||||
if (-not $PSBoundParameters.ContainsKey('Port')) {
|
|
||||||
# Set the port to 80 if the user did not supply it
|
|
||||||
Write-Verbose " Setting port to 80 as default because it was not supplied by the user"
|
|
||||||
$Port = 80
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Begin a URI builder with HTTP/HTTPS and the provided hostname
|
|
||||||
$uriBuilder = [System.UriBuilder]::new($Scheme, $Hostname, $Port)
|
|
||||||
|
|
||||||
# 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) {
|
|
||||||
# Loop through the parameters and use the HttpUtility to create a Query string
|
|
||||||
[System.Collections.Specialized.NameValueCollection]$URIParams = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
|
|
||||||
|
|
||||||
foreach ($param in $Parameters.GetEnumerator()) {
|
|
||||||
Write-Verbose " Adding URI parameter $($param.Key):$($param.Value)"
|
|
||||||
$URIParams[$param.Key] = $param.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
$uriBuilder.Query = $URIParams.ToString()
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose " Completed building URIBuilder"
|
|
||||||
# Return the entire UriBuilder object
|
|
||||||
$uriBuilder
|
|
||||||
}
|
|
||||||
|
|
||||||
function BuildURIComponents {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[OutputType([hashtable])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[System.Collections.ArrayList]$URISegments,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[object]$ParametersDictionary,
|
|
||||||
|
|
||||||
[string[]]$SkipParameterByName
|
|
||||||
)
|
|
||||||
|
|
||||||
Write-Verbose "Building URI components"
|
|
||||||
|
|
||||||
$URIParameters = @{}
|
|
||||||
|
|
||||||
foreach ($CmdletParameterName in $ParametersDictionary.Keys) {
|
|
||||||
if ($CmdletParameterName -in $CommonParameterNames) {
|
|
||||||
# These are common parameters and should not be appended to the URI
|
|
||||||
Write-Debug "Skipping parameter $CmdletParameterName"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($CmdletParameterName -in $SkipParameterByName) {
|
|
||||||
Write-Debug "Skipping parameter $CmdletParameterName"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($CmdletParameterName -eq 'Id') {
|
|
||||||
# Check if there is one or more values for Id and build a URI or query as appropriate
|
|
||||||
if (@($ParametersDictionary[$CmdletParameterName]).Count -gt 1) {
|
|
||||||
Write-Verbose " Joining IDs for parameter"
|
|
||||||
$URIParameters['id__in'] = $ParametersDictionary[$CmdletParameterName] -join ','
|
|
||||||
} else {
|
|
||||||
Write-Verbose " Adding ID to segments"
|
|
||||||
[void]$uriSegments.Add($ParametersDictionary[$CmdletParameterName])
|
|
||||||
}
|
|
||||||
} elseif ($CmdletParameterName -eq 'Query') {
|
|
||||||
Write-Verbose " Adding query parameter"
|
|
||||||
$URIParameters['q'] = $ParametersDictionary[$CmdletParameterName]
|
|
||||||
} else {
|
|
||||||
Write-Verbose " Adding $($CmdletParameterName.ToLower()) parameter"
|
|
||||||
$URIParameters[$CmdletParameterName.ToLower()] = $ParametersDictionary[$CmdletParameterName]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return @{
|
|
||||||
'Segments' = [System.Collections.ArrayList]$URISegments
|
|
||||||
'Parameters' = $URIParameters
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function GetChoiceValidValues {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[OutputType([System.Collections.ArrayList])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$MajorObject,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[object]$Choice
|
|
||||||
)
|
|
||||||
|
|
||||||
$ValidValues = New-Object System.Collections.ArrayList
|
|
||||||
|
|
||||||
if (-not $script:NetboxConfig.Choices.$MajorObject.$Choice) {
|
|
||||||
throw "Missing choices for $Choice"
|
|
||||||
}
|
|
||||||
|
|
||||||
[void]$ValidValues.AddRange($script:NetboxConfig.Choices.$MajorObject.$Choice.value)
|
|
||||||
[void]$ValidValues.AddRange($script:NetboxConfig.Choices.$MajorObject.$Choice.label)
|
|
||||||
|
|
||||||
if ($ValidValues.Count -eq 0) {
|
|
||||||
throw "Missing valid values for $MajorObject.$Choice"
|
|
||||||
}
|
|
||||||
|
|
||||||
return [System.Collections.ArrayList]$ValidValues
|
|
||||||
}
|
|
||||||
|
|
||||||
function ValidateChoice {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[OutputType([uint16])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[ValidateSet('Circuits', 'Extras', 'IPAM', 'Virtualization', IgnoreCase = $true)]
|
|
||||||
[string]$MajorObject,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$ChoiceName,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[object]$ProvidedValue
|
|
||||||
)
|
|
||||||
|
|
||||||
$ValidValues = GetChoiceValidValues -MajorObject $MajorObject -Choice $ChoiceName
|
|
||||||
|
|
||||||
Write-Verbose "Validating $ChoiceName"
|
|
||||||
Write-Verbose "Checking '$ProvidedValue' against [$($ValidValues -join ', ')]"
|
|
||||||
|
|
||||||
if ($ValidValues -inotcontains $ProvidedValue) {
|
|
||||||
throw "Invalid value '$ProvidedValue' for '$ChoiceName'. Must be one of: $($ValidValues -join ', ')"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert the ProvidedValue to the integer value
|
|
||||||
try {
|
|
||||||
$intVal = [uint16]"$ProvidedValue"
|
|
||||||
} catch {
|
|
||||||
# It must not be a number, get the value from the label
|
|
||||||
$intVal = [uint16]$script:NetboxConfig.Choices.$MajorObject.$ChoiceName.Where({
|
|
||||||
$_.Label -eq $ProvidedValue
|
|
||||||
}).Value
|
|
||||||
}
|
|
||||||
|
|
||||||
return $intVal
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function GetNetboxAPIErrorBody {
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[System.Net.HttpWebResponse]$Response
|
|
||||||
)
|
|
||||||
|
|
||||||
# This takes the $Response stream and turns it into a useable object... generally a string.
|
|
||||||
# If the body is JSON, you should be able to use ConvertFrom-Json
|
|
||||||
|
|
||||||
$reader = New-Object System.IO.StreamReader($Response.GetResponseStream())
|
|
||||||
$reader.BaseStream.Position = 0
|
|
||||||
$reader.DiscardBufferedData()
|
|
||||||
$reader.ReadToEnd()
|
|
||||||
}
|
|
||||||
|
|
||||||
function InvokeNetboxRequest {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[System.UriBuilder]$URI,
|
|
||||||
|
|
||||||
[Hashtable]$Headers = @{},
|
|
||||||
|
|
||||||
[pscustomobject]$Body = $null,
|
|
||||||
|
|
||||||
[ValidateRange(0, 60)]
|
|
||||||
[uint16]$Timeout = 5,
|
|
||||||
|
|
||||||
[ValidateSet('GET', 'PATCH', 'PUT', 'POST', 'DELETE', IgnoreCase = $true)]
|
|
||||||
[string]$Method = 'GET',
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
$creds = Get-NetboxCredential
|
|
||||||
|
|
||||||
$Headers.Authorization = "Token {0}" -f $creds.GetNetworkCredential().Password
|
|
||||||
|
|
||||||
$splat = @{
|
|
||||||
'Method' = $Method
|
|
||||||
'Uri' = $URI.Uri.AbsoluteUri # This property auto generates the scheme, hostname, path, and query
|
|
||||||
'Headers' = $Headers
|
|
||||||
'TimeoutSec' = $Timeout
|
|
||||||
'ContentType' = 'application/json'
|
|
||||||
'ErrorAction' = 'Stop'
|
|
||||||
'Verbose' = $VerbosePreference
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Body) {
|
|
||||||
Write-Verbose "BODY: $($Body | ConvertTo-Json -Compress)"
|
|
||||||
$null = $splat.Add('Body', ($Body | ConvertTo-Json -Compress))
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = Invoke-RestMethod @splat
|
|
||||||
|
|
||||||
#region TODO: Handle errors a little more gracefully...
|
|
||||||
|
|
||||||
<#
|
|
||||||
try {
|
|
||||||
Write-Verbose "Sending request..."
|
|
||||||
$result = Invoke-RestMethod @splat
|
|
||||||
Write-Verbose $result
|
|
||||||
} catch {
|
|
||||||
Write-Verbose "Caught exception"
|
|
||||||
if ($_.Exception.psobject.properties.Name.contains('Response')) {
|
|
||||||
Write-Verbose "Exception contains a response property"
|
|
||||||
if ($Raw) {
|
|
||||||
Write-Verbose "RAW provided...throwing raw exception"
|
|
||||||
throw $_
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose "Converting response to object"
|
|
||||||
$myError = GetNetboxAPIErrorBody -Response $_.Exception.Response | ConvertFrom-Json
|
|
||||||
} else {
|
|
||||||
Write-Verbose "No response property found"
|
|
||||||
$myError = $_
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose "MyError is $($myError.GetType().FullName)"
|
|
||||||
|
|
||||||
if ($myError -is [Exception]) {
|
|
||||||
throw $_
|
|
||||||
} elseif ($myError -is [pscustomobject]) {
|
|
||||||
throw $myError.detail
|
|
||||||
}
|
|
||||||
#>
|
|
||||||
|
|
||||||
#endregion TODO: Handle errors a little more gracefully...
|
|
||||||
|
|
||||||
# If the user wants the raw value from the API... otherwise return only the actual result
|
|
||||||
if ($Raw) {
|
|
||||||
Write-Verbose "Returning raw result by choice"
|
|
||||||
return $result
|
|
||||||
} else {
|
|
||||||
if ($result.psobject.Properties.Name.Contains('results')) {
|
|
||||||
Write-Verbose "Found Results property on data, returning results directly"
|
|
||||||
return $result.Results
|
|
||||||
} else {
|
|
||||||
Write-Verbose "Did NOT find results property on data, returning raw result"
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region Troubleshooting commands
|
|
||||||
|
|
||||||
function ThrowNetboxRESTError {
|
|
||||||
$uriSegments = [System.Collections.ArrayList]::new(@('fake', 'url'))
|
|
||||||
|
|
||||||
$URIParameters = @{}
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri -Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function CreateEnum {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$EnumName,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[pscustomobject]$Values,
|
|
||||||
|
|
||||||
[switch]$PassThru
|
|
||||||
)
|
|
||||||
|
|
||||||
$definition = @"
|
|
||||||
public enum $EnumName
|
|
||||||
{`n$(foreach ($value in $values) {"`t$($value.label) = $($value.value),`n"})
|
|
||||||
}
|
|
||||||
"@
|
|
||||||
if (-not ([System.Management.Automation.PSTypeName]"$EnumName").Type) {
|
|
||||||
#Write-Host $definition -ForegroundColor Green
|
|
||||||
Add-Type -TypeDefinition $definition -PassThru:$PassThru
|
|
||||||
} else {
|
|
||||||
Write-Warning "EnumType $EnumName already exists."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Troubleshooting commands
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
80
Functions/Helpers/BuildNewURI.ps1
Normal file
80
Functions/Helpers/BuildNewURI.ps1
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
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.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[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) {
|
||||||
|
# Loop through the parameters and use the HttpUtility to create a Query string
|
||||||
|
[System.Collections.Specialized.NameValueCollection]$URIParams = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
|
||||||
|
|
||||||
|
foreach ($param in $Parameters.GetEnumerator()) {
|
||||||
|
Write-Verbose " Adding URI parameter $($param.Key):$($param.Value)"
|
||||||
|
$URIParams[$param.Key] = $param.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
$uriBuilder.Query = $URIParams.ToString()
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose " Completed building URIBuilder"
|
||||||
|
# Return the entire UriBuilder object
|
||||||
|
$uriBuilder
|
||||||
|
}
|
||||||
75
Functions/Helpers/BuildURIComponents.ps1
Normal file
75
Functions/Helpers/BuildURIComponents.ps1
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
function BuildURIComponents {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([hashtable])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[System.Collections.ArrayList]$URISegments,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[object]$ParametersDictionary,
|
||||||
|
|
||||||
|
[string[]]$SkipParameterByName
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Verbose "Building URI components"
|
||||||
|
|
||||||
|
$URIParameters = @{
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($CmdletParameterName in $ParametersDictionary.Keys) {
|
||||||
|
if ($CmdletParameterName -in $script:CommonParameterNames) {
|
||||||
|
# These are common parameters and should not be appended to the URI
|
||||||
|
Write-Debug "Skipping common parameter $CmdletParameterName"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($CmdletParameterName -in $SkipParameterByName) {
|
||||||
|
Write-Debug "Skipping parameter $CmdletParameterName by SkipParameterByName"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($CmdletParameterName) {
|
||||||
|
"id" {
|
||||||
|
# Check if there is one or more values for Id and build a URI or query as appropriate
|
||||||
|
if (@($ParametersDictionary[$CmdletParameterName]).Count -gt 1) {
|
||||||
|
Write-Verbose " Joining IDs for parameter"
|
||||||
|
$URIParameters['id__in'] = $ParametersDictionary[$CmdletParameterName] -join ','
|
||||||
|
} else {
|
||||||
|
Write-Verbose " Adding ID to segments"
|
||||||
|
[void]$uriSegments.Add($ParametersDictionary[$CmdletParameterName])
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'Query' {
|
||||||
|
Write-Verbose " Adding query parameter"
|
||||||
|
$URIParameters['q'] = $ParametersDictionary[$CmdletParameterName]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'CustomFields' {
|
||||||
|
Write-Verbose " Adding custom field query parameters"
|
||||||
|
foreach ($field in $ParametersDictionary[$CmdletParameterName].GetEnumerator()) {
|
||||||
|
Write-Verbose " Adding parameter 'cf_$($field.Key) = $($field.Value)"
|
||||||
|
$URIParameters["cf_$($field.Key.ToLower())"] = $field.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
Write-Verbose " Adding $($CmdletParameterName.ToLower()) parameter"
|
||||||
|
$URIParameters[$CmdletParameterName.ToLower()] = $ParametersDictionary[$CmdletParameterName]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return @{
|
||||||
|
'Segments' = [System.Collections.ArrayList]$URISegments
|
||||||
|
'Parameters' = $URIParameters
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Functions/Helpers/CheckNetboxIsConnected.ps1
Normal file
10
Functions/Helpers/CheckNetboxIsConnected.ps1
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
function CheckNetboxIsConnected {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Checking connection status"
|
||||||
|
if (-not $script:NetboxConfig.Connected) {
|
||||||
|
throw "Not connected to a Netbox API! Please run 'Connect-NetboxAPI'"
|
||||||
|
}
|
||||||
|
}
|
||||||
28
Functions/Helpers/CreateEnum.ps1
Normal file
28
Functions/Helpers/CreateEnum.ps1
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
function CreateEnum {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$EnumName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[pscustomobject]$Values,
|
||||||
|
|
||||||
|
[switch]$PassThru
|
||||||
|
)
|
||||||
|
|
||||||
|
$definition = @"
|
||||||
|
public enum $EnumName
|
||||||
|
{`n$(foreach ($value in $values) {
|
||||||
|
"`t$($value.label) = $($value.value),`n"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
"@
|
||||||
|
if (-not ([System.Management.Automation.PSTypeName]"$EnumName").Type) {
|
||||||
|
#Write-Host $definition -ForegroundColor Green
|
||||||
|
Add-Type -TypeDefinition $definition -PassThru:$PassThru
|
||||||
|
} else {
|
||||||
|
Write-Warning "EnumType $EnumName already exists."
|
||||||
|
}
|
||||||
|
}
|
||||||
50
Functions/Helpers/Get-ModelDefinition.ps1
Normal file
50
Functions/Helpers/Get-ModelDefinition.ps1
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
function Get-ModelDefinition {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'ByName')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'ByName',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[string]$ModelName,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByPath',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[string]$URIPath,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByPath')]
|
||||||
|
[string]$Method = "post"
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PsCmdlet.ParameterSetName) {
|
||||||
|
'ByName' {
|
||||||
|
$script:NetboxConfig.APIDefinition.definitions.$ModelName
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'ByPath' {
|
||||||
|
switch ($Method) {
|
||||||
|
"get" {
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
"post" {
|
||||||
|
if (-not $URIPath.StartsWith('/')) {
|
||||||
|
$URIPath = "/$URIPath"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $URIPath.EndsWith('/')) {
|
||||||
|
$URIPath = "$URIPath/"
|
||||||
|
}
|
||||||
|
|
||||||
|
$ModelName = $script:NetboxConfig.APIDefinition.paths.$URIPath.post.parameters.schema.'$ref'.split('/')[-1]
|
||||||
|
$script:NetboxConfig.APIDefinition.definitions.$ModelName
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
Functions/Helpers/GetNetboxAPIErrorBody.ps1
Normal file
16
Functions/Helpers/GetNetboxAPIErrorBody.ps1
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
function GetNetboxAPIErrorBody {
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[System.Net.HttpWebResponse]$Response
|
||||||
|
)
|
||||||
|
|
||||||
|
# This takes the $Response stream and turns it into a useable object... generally a string.
|
||||||
|
# If the body is JSON, you should be able to use ConvertFrom-Json
|
||||||
|
|
||||||
|
$reader = New-Object System.IO.StreamReader($Response.GetResponseStream())
|
||||||
|
$reader.BaseStream.Position = 0
|
||||||
|
$reader.DiscardBufferedData()
|
||||||
|
$reader.ReadToEnd()
|
||||||
|
}
|
||||||
94
Functions/Helpers/InvokeNetboxRequest.ps1
Normal file
94
Functions/Helpers/InvokeNetboxRequest.ps1
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
|
||||||
|
function InvokeNetboxRequest {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[System.UriBuilder]$URI,
|
||||||
|
|
||||||
|
[Hashtable]$Headers = @{
|
||||||
|
},
|
||||||
|
|
||||||
|
[pscustomobject]$Body = $null,
|
||||||
|
|
||||||
|
[ValidateRange(1, 65535)]
|
||||||
|
[uint16]$Timeout = (Get-NetboxTimeout),
|
||||||
|
|
||||||
|
[ValidateSet('GET', 'PATCH', 'PUT', 'POST', 'DELETE', 'OPTIONS', IgnoreCase = $true)]
|
||||||
|
[string]$Method = 'GET',
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
$creds = Get-NetboxCredential
|
||||||
|
|
||||||
|
$Headers.Authorization = "Token {0}" -f $creds.GetNetworkCredential().Password
|
||||||
|
|
||||||
|
$splat = @{
|
||||||
|
'Method' = $Method
|
||||||
|
'Uri' = $URI.Uri.AbsoluteUri # This property auto generates the scheme, hostname, path, and query
|
||||||
|
'Headers' = $Headers
|
||||||
|
'TimeoutSec' = $Timeout
|
||||||
|
'ContentType' = 'application/json'
|
||||||
|
'ErrorAction' = 'Stop'
|
||||||
|
'Verbose' = $VerbosePreference
|
||||||
|
}
|
||||||
|
|
||||||
|
$splat += Get-NetboxInvokeParams
|
||||||
|
|
||||||
|
if ($Body) {
|
||||||
|
Write-Verbose "BODY: $($Body | ConvertTo-Json -Compress)"
|
||||||
|
$null = $splat.Add('Body', ($Body | ConvertTo-Json -Compress))
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = Invoke-RestMethod @splat
|
||||||
|
|
||||||
|
#region TODO: Handle errors a little more gracefully...
|
||||||
|
|
||||||
|
<#
|
||||||
|
try {
|
||||||
|
Write-Verbose "Sending request..."
|
||||||
|
$result = Invoke-RestMethod @splat
|
||||||
|
Write-Verbose $result
|
||||||
|
} catch {
|
||||||
|
Write-Verbose "Caught exception"
|
||||||
|
if ($_.Exception.psobject.properties.Name.contains('Response')) {
|
||||||
|
Write-Verbose "Exception contains a response property"
|
||||||
|
if ($Raw) {
|
||||||
|
Write-Verbose "RAW provided...throwing raw exception"
|
||||||
|
throw $_
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "Converting response to object"
|
||||||
|
$myError = GetNetboxAPIErrorBody -Response $_.Exception.Response | ConvertFrom-Json
|
||||||
|
} else {
|
||||||
|
Write-Verbose "No response property found"
|
||||||
|
$myError = $_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "MyError is $($myError.GetType().FullName)"
|
||||||
|
|
||||||
|
if ($myError -is [Exception]) {
|
||||||
|
throw $_
|
||||||
|
} elseif ($myError -is [pscustomobject]) {
|
||||||
|
throw $myError.detail
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
|
||||||
|
#endregion TODO: Handle errors a little more gracefully...
|
||||||
|
|
||||||
|
# If the user wants the raw value from the API... otherwise return only the actual result
|
||||||
|
if ($Raw) {
|
||||||
|
Write-Verbose "Returning raw result by choice"
|
||||||
|
return $result
|
||||||
|
} else {
|
||||||
|
if ($result.psobject.Properties.Name.Contains('results')) {
|
||||||
|
Write-Verbose "Found Results property on data, returning results directly"
|
||||||
|
return $result.Results
|
||||||
|
} else {
|
||||||
|
Write-Verbose "Did NOT find results property on data, returning raw result"
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Functions/Helpers/ThrowNetboxRESTError.ps1
Normal file
11
Functions/Helpers/ThrowNetboxRESTError.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
function ThrowNetboxRESTError {
|
||||||
|
$uriSegments = [System.Collections.ArrayList]::new(@('fake', 'url'))
|
||||||
|
|
||||||
|
$URIParameters = @{
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw
|
||||||
|
}
|
||||||
93
Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1
Normal file
93
Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
function Get-NetboxIPAMAddress {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Family,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Parent,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[byte]$Mask_Length,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$VRF,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$VRF_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Tenant_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Device,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Device_ID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Virtual_Machine,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Virtual_Machine_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Interface_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($IP_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IP_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
60
Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1
Normal file
60
Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMAvailableIP {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
A convenience method for returning available IP addresses within a prefix
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
By default, the number of IPs returned will be equivalent to PAGINATE_COUNT. An arbitrary limit
|
||||||
|
(up to MAX_PAGE_SIZE, if set) may be passed, however results will not be paginated
|
||||||
|
|
||||||
|
.PARAMETER Prefix_ID
|
||||||
|
A description of the Prefix_ID parameter.
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
A description of the Limit parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.PARAMETER NumberOfIPs
|
||||||
|
A description of the NumberOfIPs parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Get-NetboxIPAMAvailableIP -Prefix_ID (Get-NetboxIPAMPrefix -Prefix 192.0.2.0/24).id
|
||||||
|
|
||||||
|
Get (Next) Available IP on the Prefix 192.0.2.0/24
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Get-NetboxIPAMAvailableIP -Prefix_ID 2 -NumberOfIPs 3
|
||||||
|
|
||||||
|
Get 3 (Next) Available IP on the Prefix 192.0.2.0/24
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[Alias('Id')]
|
||||||
|
[uint64]$Prefix_ID,
|
||||||
|
|
||||||
|
[Alias('NumberOfIPs')]
|
||||||
|
[uint64]$Limit,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID, 'available-ips'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'prefix_id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
110
Functions/IPAM/Address/New-NetboxIPAMAddress.ps1
Normal file
110
Functions/IPAM/Address/New-NetboxIPAMAddress.ps1
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
|
||||||
|
function New-NetboxIPAMAddress {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new IP address to Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Create a new IP address to Netbox with a status of Active by default.
|
||||||
|
|
||||||
|
.PARAMETER Address
|
||||||
|
IP address in CIDR notation: 192.168.1.1/24
|
||||||
|
|
||||||
|
.PARAMETER Status
|
||||||
|
Status of the IP. Defaults to Active
|
||||||
|
|
||||||
|
.PARAMETER Tenant
|
||||||
|
Tenant ID
|
||||||
|
|
||||||
|
.PARAMETER VRF
|
||||||
|
VRF ID
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
Role such as anycast, loopback, etc... Defaults to nothing
|
||||||
|
|
||||||
|
.PARAMETER NAT_Inside
|
||||||
|
ID of IP for NAT
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
Custom field hash table. Will be validated by the API service
|
||||||
|
|
||||||
|
.PARAMETER Interface
|
||||||
|
ID of interface to apply IP
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Description of IP address
|
||||||
|
|
||||||
|
.PARAMETER Dns_name
|
||||||
|
DNS Name of IP address (example : netbox.example.com)
|
||||||
|
|
||||||
|
.PARAMETER Assigned_Object_Type
|
||||||
|
Assigned Object Type dcim.interface or virtualization.vminterface
|
||||||
|
|
||||||
|
.PARAMETER Assigned_Object_Id
|
||||||
|
Assigned Object ID
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return raw results from API service
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-NetboxIPAMAddress -Address 192.0.2.1/32
|
||||||
|
|
||||||
|
Add new IP Address 192.0.2.1/32 with status active
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[object]$Status = 'Active',
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[uint64]$NAT_Inside,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[uint64]$Interface,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Dns_name,
|
||||||
|
|
||||||
|
[ValidateSet('dcim.interface', 'virtualization.vminterface', IgnoreCase = $true)]
|
||||||
|
[string]$Assigned_Object_Type,
|
||||||
|
|
||||||
|
[uint64]$Assigned_Object_Id,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Address, 'Create new IP address')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
47
Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1
Normal file
47
Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
function Remove-NetboxIPAMAddress {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Remove an IP address from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Removes/deletes an IP address from Netbox by ID and optional other filters
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
Database ID of the IP address object.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
Do not confirm.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Remove-NetboxIPAMAddress -Id $value1
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($IPId in $Id) {
|
||||||
|
$CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId))
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) {
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
83
Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1
Normal file
83
Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
|
||||||
|
function Set-NetboxIPAMAddress {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[string]$Status,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[uint64]$NAT_Inside,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[ValidateSet('dcim.interface', 'virtualization.vminterface', IgnoreCase = $true)]
|
||||||
|
[string]$Assigned_Object_Type,
|
||||||
|
|
||||||
|
[uint64]$Assigned_Object_Id,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Dns_name,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
# Write-Verbose "Validating enum properties"
|
||||||
|
# $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0))
|
||||||
|
$Method = 'PATCH'
|
||||||
|
#
|
||||||
|
# # Value validation
|
||||||
|
# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method
|
||||||
|
# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition
|
||||||
|
#
|
||||||
|
# foreach ($Property in $EnumProperties.Keys) {
|
||||||
|
# if ($PSBoundParameters.ContainsKey($Property)) {
|
||||||
|
# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]"
|
||||||
|
# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property
|
||||||
|
# } else {
|
||||||
|
# Write-Verbose "User did not provide a value for [$Property]"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# Write-Verbose "Finished enum validation"
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($IPId in $Id) {
|
||||||
|
if ($PSBoundParameters.ContainsKey('Assigned_Object_Type') -or $PSBoundParameters.ContainsKey('Assigned_Object_Id')) {
|
||||||
|
if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) {
|
||||||
|
throw "Assigned_Object_Type is required when specifying Assigned_Object_Id"
|
||||||
|
}
|
||||||
|
elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) {
|
||||||
|
throw "Assigned_Object_Id is required when specifying Assigned_Object_Type"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId))
|
||||||
|
|
||||||
|
Write-Verbose "Obtaining IP from ID $IPId"
|
||||||
|
$CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) {
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
66
Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1
Normal file
66
Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMAggregate {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Prefix,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Family,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$RIR_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$RIR,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[datetime]$Date_Added,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
# if ($null -ne $Family) {
|
||||||
|
# $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily
|
||||||
|
# }
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($IP_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates', $IP_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,612 +0,0 @@
|
||||||
<#
|
|
||||||
.NOTES
|
|
||||||
===========================================================================
|
|
||||||
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150
|
|
||||||
Created on: 5/10/2018 3:41 PM
|
|
||||||
Created by: Ben Claussen
|
|
||||||
Organization: NEOnet
|
|
||||||
Filename: IPAM.ps1
|
|
||||||
===========================================================================
|
|
||||||
.DESCRIPTION
|
|
||||||
IPAM Object functions
|
|
||||||
#>
|
|
||||||
|
|
||||||
function Get-NetboxIPAMChoices {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
$uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices'))
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri
|
|
||||||
}
|
|
||||||
|
|
||||||
function VerifyIPAMChoices {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Internal function to verify provided values for static choices
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
When users connect to the API, choices for each major object are cached to the config variable.
|
|
||||||
These values are then utilized to verify if the provided value from a user is valid.
|
|
||||||
|
|
||||||
.PARAMETER ProvidedValue
|
|
||||||
The value to validate against static choices
|
|
||||||
|
|
||||||
.PARAMETER AggregateFamily
|
|
||||||
Verify against aggregate family values
|
|
||||||
|
|
||||||
.PARAMETER PrefixFamily
|
|
||||||
Verify against prefix family values
|
|
||||||
|
|
||||||
.PARAMETER PrefixStatus
|
|
||||||
Verify against prefix status values
|
|
||||||
|
|
||||||
.PARAMETER IPAddressFamily
|
|
||||||
Verify against ip-address family values
|
|
||||||
|
|
||||||
.PARAMETER IPAddressStatus
|
|
||||||
Verify against ip-address status values
|
|
||||||
|
|
||||||
.PARAMETER IPAddressRole
|
|
||||||
Verify against ip-address role values
|
|
||||||
|
|
||||||
.PARAMETER VLANStatus
|
|
||||||
Verify against VLAN status values
|
|
||||||
|
|
||||||
.PARAMETER ServiceProtocol
|
|
||||||
Verify against service protocol values
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> VerifyIPAMChoices -ProvidedValue 'loopback' -IPAddressRole
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> VerifyIPAMChoices -ProvidedValue 'Loopback' -IPAddressFamily
|
|
||||||
>> Invalid value Loopback for ip-address:family. Must be one of: 4, 6, IPv4, IPv6
|
|
||||||
|
|
||||||
.OUTPUTS
|
|
||||||
This function returns the integer value if valid. Otherwise, it will throw an error.
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
|
|
||||||
.FUNCTIONALITY
|
|
||||||
This cmdlet is intended to be used internally and not exposed to the user
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding(DefaultParameterSetName = 'service:protocol')]
|
|
||||||
[OutputType([uint16])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[object]$ProvidedValue,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'aggregate:family',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$AggregateFamily,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'prefix:family',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$PrefixFamily,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'prefix:status',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$PrefixStatus,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'ip-address:family',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$IPAddressFamily,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'ip-address:status',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$IPAddressStatus,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'ip-address:role',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$IPAddressRole,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'vlan:status',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$VLANStatus,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'service:protocol',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[switch]$ServiceProtocol
|
|
||||||
)
|
|
||||||
|
|
||||||
ValidateChoice -MajorObject 'IPAM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function Get-NetboxIPAMAggregate {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[uint16]$Limit,
|
|
||||||
|
|
||||||
[uint16]$Offset,
|
|
||||||
|
|
||||||
[object]$Family,
|
|
||||||
|
|
||||||
[datetime]$Date_Added,
|
|
||||||
|
|
||||||
[uint16[]]$Id,
|
|
||||||
|
|
||||||
[string]$Query,
|
|
||||||
|
|
||||||
[uint16]$RIR_Id,
|
|
||||||
|
|
||||||
[string]$RIR,
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($null -ne $Family) {
|
|
||||||
$PSBoundParameters.Family = VerifyIPAMChoices -ProvidedValue $Family -AggregateFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates'))
|
|
||||||
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxIPAMAddress {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[uint16]$Limit,
|
|
||||||
|
|
||||||
[uint16]$Offset,
|
|
||||||
|
|
||||||
[object]$Family,
|
|
||||||
|
|
||||||
[uint16[]]$Id,
|
|
||||||
|
|
||||||
[string]$Query,
|
|
||||||
|
|
||||||
[uint16]$Parent,
|
|
||||||
|
|
||||||
[byte]$Mask_Length,
|
|
||||||
|
|
||||||
[string]$VRF,
|
|
||||||
|
|
||||||
[uint16]$VRF_Id,
|
|
||||||
|
|
||||||
[string]$Tenant,
|
|
||||||
|
|
||||||
[uint16]$Tenant_Id,
|
|
||||||
|
|
||||||
[string]$Device,
|
|
||||||
|
|
||||||
[uint16]$Device_ID,
|
|
||||||
|
|
||||||
[string]$Virtual_Machine,
|
|
||||||
|
|
||||||
[uint16]$Virtual_Machine_Id,
|
|
||||||
|
|
||||||
[uint16]$Interface_Id,
|
|
||||||
|
|
||||||
[object]$Status,
|
|
||||||
|
|
||||||
[object]$Role,
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($null -ne $Family) {
|
|
||||||
$PSBoundParameters.Family = VerifyIPAMChoices -ProvidedValue $Family -IPAddressFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($null -ne $Status) {
|
|
||||||
$PSBoundParameters.Status = VerifyIPAMChoices -ProvidedValue $Status -IPAddressStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($null -ne $Role) {
|
|
||||||
$PSBoundParameters.Role = VerifyIPAMChoices -ProvidedValue $Role -IPAddressRole
|
|
||||||
}
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses'))
|
|
||||||
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxIPAMAvailableIP {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
A convenience method for returning available IP addresses within a prefix
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
By default, the number of IPs returned will be equivalent to PAGINATE_COUNT. An arbitrary limit
|
|
||||||
(up to MAX_PAGE_SIZE, if set) may be passed, however results will not be paginated
|
|
||||||
|
|
||||||
.PARAMETER Prefix_ID
|
|
||||||
A description of the Prefix_ID parameter.
|
|
||||||
|
|
||||||
.PARAMETER NumberOfIPs
|
|
||||||
A description of the NumberOfIPs parameter.
|
|
||||||
|
|
||||||
.PARAMETER Raw
|
|
||||||
A description of the Raw parameter.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Get-NetboxIPAMAvaiableIP -Prefix_ID $value1
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[uint16]$Prefix_ID,
|
|
||||||
|
|
||||||
[Alias('NumberOfIPs')]
|
|
||||||
[uint16]$Limit,
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID, 'available-ips'))
|
|
||||||
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'prefix_id'
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxIPAMPrefix {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
A brief description of the Get-NetboxIPAMPrefix function.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
A detailed description of the Get-NetboxIPAMPrefix function.
|
|
||||||
|
|
||||||
.PARAMETER Limit
|
|
||||||
A description of the Limit parameter.
|
|
||||||
|
|
||||||
.PARAMETER Offset
|
|
||||||
A description of the Offset parameter.
|
|
||||||
|
|
||||||
.PARAMETER Family
|
|
||||||
A description of the Family parameter.
|
|
||||||
|
|
||||||
.PARAMETER Is_Pool
|
|
||||||
A description of the Is_Pool parameter.
|
|
||||||
|
|
||||||
.PARAMETER Id
|
|
||||||
A description of the Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Query
|
|
||||||
A description of the Query parameter.
|
|
||||||
|
|
||||||
.PARAMETER Within
|
|
||||||
Should be a CIDR notation prefix such as '10.0.0.0/16'
|
|
||||||
|
|
||||||
.PARAMETER Within_Include
|
|
||||||
Should be a CIDR notation prefix such as '10.0.0.0/16'
|
|
||||||
|
|
||||||
.PARAMETER Contains
|
|
||||||
A description of the Contains parameter.
|
|
||||||
|
|
||||||
.PARAMETER Mask_Length
|
|
||||||
CIDR mask length value
|
|
||||||
|
|
||||||
.PARAMETER VRF
|
|
||||||
A description of the VRF parameter.
|
|
||||||
|
|
||||||
.PARAMETER VRF_Id
|
|
||||||
A description of the VRF_Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Tenant
|
|
||||||
A description of the Tenant parameter.
|
|
||||||
|
|
||||||
.PARAMETER Tenant_Id
|
|
||||||
A description of the Tenant_Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Site
|
|
||||||
A description of the Site parameter.
|
|
||||||
|
|
||||||
.PARAMETER Site_Id
|
|
||||||
A description of the Site_Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Vlan_VId
|
|
||||||
A description of the Vlan_VId parameter.
|
|
||||||
|
|
||||||
.PARAMETER Vlan_Id
|
|
||||||
A description of the Vlan_Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Status
|
|
||||||
A description of the Status parameter.
|
|
||||||
|
|
||||||
.PARAMETER Role
|
|
||||||
A description of the Role parameter.
|
|
||||||
|
|
||||||
.PARAMETER Role_Id
|
|
||||||
A description of the Role_Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Raw
|
|
||||||
A description of the Raw parameter.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Get-NetboxIPAMPrefix
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[uint16]$Limit,
|
|
||||||
|
|
||||||
[uint16]$Offset,
|
|
||||||
|
|
||||||
[object]$Family,
|
|
||||||
|
|
||||||
[boolean]$Is_Pool,
|
|
||||||
|
|
||||||
[uint16[]]$Id,
|
|
||||||
|
|
||||||
[string]$Query,
|
|
||||||
|
|
||||||
[string]$Within,
|
|
||||||
|
|
||||||
[string]$Within_Include,
|
|
||||||
|
|
||||||
[string]$Contains,
|
|
||||||
|
|
||||||
[ValidateRange(0, 127)]
|
|
||||||
[byte]$Mask_Length,
|
|
||||||
|
|
||||||
[string]$VRF,
|
|
||||||
|
|
||||||
[uint16]$VRF_Id,
|
|
||||||
|
|
||||||
[string]$Tenant,
|
|
||||||
|
|
||||||
[uint16]$Tenant_Id,
|
|
||||||
|
|
||||||
[string]$Site,
|
|
||||||
|
|
||||||
[uint16]$Site_Id,
|
|
||||||
|
|
||||||
[string]$Vlan_VId,
|
|
||||||
|
|
||||||
[uint16]$Vlan_Id,
|
|
||||||
|
|
||||||
[object]$Status,
|
|
||||||
|
|
||||||
[string]$Role,
|
|
||||||
|
|
||||||
[uint16]$Role_Id,
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($null -ne $Family) {
|
|
||||||
$PSBoundParameters.Family = VerifyIPAMChoices -ProvidedValue $Family -PrefixFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($null -ne $Status) {
|
|
||||||
$PSBoundParameters.Status = VerifyIPAMChoices -ProvidedValue $Status -PrefixStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes'))
|
|
||||||
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function New-NetboxIPAMAddress {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Create a new IP address to Netbox
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Create a new IP address to Netbox with a status of Active by default.
|
|
||||||
|
|
||||||
.PARAMETER Address
|
|
||||||
IP address in CIDR notation: 192.168.1.1/24
|
|
||||||
|
|
||||||
.PARAMETER Status
|
|
||||||
Status of the IP. Defaults to Active
|
|
||||||
|
|
||||||
.PARAMETER Tenant
|
|
||||||
Tenant ID
|
|
||||||
|
|
||||||
.PARAMETER VRF
|
|
||||||
VRF ID
|
|
||||||
|
|
||||||
.PARAMETER Role
|
|
||||||
Role such as anycast, loopback, etc... Defaults to nothing
|
|
||||||
|
|
||||||
.PARAMETER NAT_Inside
|
|
||||||
ID of IP for NAT
|
|
||||||
|
|
||||||
.PARAMETER Custom_Fields
|
|
||||||
Custom field hash table. Will be validated by the API service
|
|
||||||
|
|
||||||
.PARAMETER Interface
|
|
||||||
ID of interface to apply IP
|
|
||||||
|
|
||||||
.PARAMETER Description
|
|
||||||
Description of IP address
|
|
||||||
|
|
||||||
.PARAMETER Raw
|
|
||||||
Return raw results from API service
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Create-NetboxIPAMAddress
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
[OutputType([pscustomobject])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$Address,
|
|
||||||
|
|
||||||
[object]$Status = 'Active',
|
|
||||||
|
|
||||||
[uint16]$Tenant,
|
|
||||||
|
|
||||||
[uint16]$VRF,
|
|
||||||
|
|
||||||
[object]$Role,
|
|
||||||
|
|
||||||
[uint16]$NAT_Inside,
|
|
||||||
|
|
||||||
[hashtable]$Custom_Fields,
|
|
||||||
|
|
||||||
[uint16]$Interface,
|
|
||||||
|
|
||||||
[string]$Description,
|
|
||||||
|
|
||||||
[switch]$Raw
|
|
||||||
)
|
|
||||||
|
|
||||||
$PSBoundParameters.Status = VerifyIPAMChoices -ProvidedValue $Status -IPAddressStatus
|
|
||||||
|
|
||||||
if ($null -ne $Role) {
|
|
||||||
$PSBoundParameters.Role = VerifyIPAMChoices -ProvidedValue $Role -IPAddressRole
|
|
||||||
}
|
|
||||||
|
|
||||||
$segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses'))
|
|
||||||
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters
|
|
||||||
|
|
||||||
$URI = BuildNewURI -Segments $URIComponents.Segments
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw
|
|
||||||
}
|
|
||||||
|
|
||||||
function Remove-NetboxIPAMAddress {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Remove an IP address from Netbox
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Removes/deletes an IP address from Netbox by ID and optional other filters
|
|
||||||
|
|
||||||
.PARAMETER Id
|
|
||||||
A description of the Id parameter.
|
|
||||||
|
|
||||||
.PARAMETER Force
|
|
||||||
A description of the Force parameter.
|
|
||||||
|
|
||||||
.PARAMETER Query
|
|
||||||
A description of the Query parameter.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Remove-NetboxIPAMAddress -Id $value1
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding(ConfirmImpact = 'High',
|
|
||||||
SupportsShouldProcess = $true)]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[uint16[]]$Id,
|
|
||||||
|
|
||||||
[switch]$Force
|
|
||||||
)
|
|
||||||
|
|
||||||
$CurrentIPs = @(Get-NetboxIPAMAddress -Id $Id -ErrorAction Stop)
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses'))
|
|
||||||
|
|
||||||
foreach ($IP in $CurrentIPs) {
|
|
||||||
if ($Force -or $pscmdlet.ShouldProcess($IP.Address, "Delete")) {
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary @{'id' = $IP.Id}
|
|
||||||
|
|
||||||
$URI = BuildNewURI -Segments $URIComponents.Segments
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $URI -Method DELETE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Set-NetboxIPAMAddress {
|
|
||||||
[CmdletBinding(ConfirmImpact = 'High',
|
|
||||||
SupportsShouldProcess = $true)]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true,
|
|
||||||
ValueFromPipelineByPropertyName = $true)]
|
|
||||||
[uint16]$Id,
|
|
||||||
|
|
||||||
[string]$Address,
|
|
||||||
|
|
||||||
[object]$Status,
|
|
||||||
|
|
||||||
[uint16]$Tenant,
|
|
||||||
|
|
||||||
[uint16]$VRF,
|
|
||||||
|
|
||||||
[object]$Role,
|
|
||||||
|
|
||||||
[uint16]$NAT_Inside,
|
|
||||||
|
|
||||||
[hashtable]$Custom_Fields,
|
|
||||||
|
|
||||||
[uint16]$Interface,
|
|
||||||
|
|
||||||
[string]$Description,
|
|
||||||
|
|
||||||
[switch]$Force
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($Status) {
|
|
||||||
$PSBoundParameters.Status = VerifyIPAMChoices -ProvidedValue $Status -IPAddressStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Role) {
|
|
||||||
$PSBoundParameters.Role = VerifyIPAMChoices -ProvidedValue $Role -IPAddressRole
|
|
||||||
}
|
|
||||||
|
|
||||||
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $Id))
|
|
||||||
|
|
||||||
Write-Verbose "Obtaining IPs from ID $Id"
|
|
||||||
$CurrentIP = Get-NetboxIPAMAddress -Id $Id -ErrorAction Stop
|
|
||||||
|
|
||||||
if ($Force -or $PSCmdlet.ShouldProcess($($CurrentIP | Select-Object -ExpandProperty 'Address'), 'Set')) {
|
|
||||||
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
|
||||||
|
|
||||||
$URI = BuildNewURI -Segments $URIComponents.Segments
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
192
Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1
Normal file
192
Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1
Normal file
|
|
@ -0,0 +1,192 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMPrefix {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
A brief description of the Get-NetboxIPAMPrefix function.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A detailed description of the Get-NetboxIPAMPrefix function.
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
A description of the Query parameter.
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
A description of the Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
A description of the Limit parameter.
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
A description of the Offset parameter.
|
||||||
|
|
||||||
|
.PARAMETER Family
|
||||||
|
A description of the Family parameter.
|
||||||
|
|
||||||
|
.PARAMETER Is_Pool
|
||||||
|
A description of the Is_Pool parameter.
|
||||||
|
|
||||||
|
.PARAMETER Within
|
||||||
|
Should be a CIDR notation prefix such as '10.0.0.0/16'
|
||||||
|
|
||||||
|
.PARAMETER Within_Include
|
||||||
|
Should be a CIDR notation prefix such as '10.0.0.0/16'
|
||||||
|
|
||||||
|
.PARAMETER Contains
|
||||||
|
A description of the Contains parameter.
|
||||||
|
|
||||||
|
.PARAMETER Mask_Length
|
||||||
|
CIDR mask length value
|
||||||
|
|
||||||
|
.PARAMETER VRF
|
||||||
|
A description of the VRF parameter.
|
||||||
|
|
||||||
|
.PARAMETER VRF_Id
|
||||||
|
A description of the VRF_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Tenant
|
||||||
|
A description of the Tenant parameter.
|
||||||
|
|
||||||
|
.PARAMETER Tenant_Id
|
||||||
|
A description of the Tenant_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Site
|
||||||
|
A description of the Site parameter.
|
||||||
|
|
||||||
|
.PARAMETER Site_Id
|
||||||
|
A description of the Site_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Vlan_VId
|
||||||
|
A description of the Vlan_VId parameter.
|
||||||
|
|
||||||
|
.PARAMETER Vlan_Id
|
||||||
|
A description of the Vlan_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Status
|
||||||
|
A description of the Status parameter.
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
A description of the Role parameter.
|
||||||
|
|
||||||
|
.PARAMETER Role_Id
|
||||||
|
A description of the Role_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxIPAMPrefix
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Prefix,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Family,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[boolean]$Is_Pool,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Within,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Within_Include,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Contains,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[ValidateRange(0, 127)]
|
||||||
|
[byte]$Mask_Length,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$VRF,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$VRF_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Tenant_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Site,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Site_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Vlan_VId,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Vlan_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Role,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Role_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
# if ($null -ne $Family) {
|
||||||
|
# $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# if ($null -ne $Status) {
|
||||||
|
# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus
|
||||||
|
# }
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($Prefix_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
50
Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1
Normal file
50
Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
function New-NetboxIPAMPrefix {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Prefix,
|
||||||
|
|
||||||
|
[object]$Status = 'Active',
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[bool]$IsPool,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[uint64]$Site,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[uint64]$VLAN,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus
|
||||||
|
|
||||||
|
<#
|
||||||
|
# As of 2018/10/18, this does not appear to be a validated IPAM choice
|
||||||
|
if ($null -ne $Role) {
|
||||||
|
$PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
|
||||||
|
$segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Prefix, 'Create new Prefix')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
79
Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1
Normal file
79
Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
|
||||||
|
function Set-NetboxIPAMPrefix {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Prefix,
|
||||||
|
|
||||||
|
[string]$Status,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$Site,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[uint64]$VLAN,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[switch]$Is_Pool,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
# Write-Verbose "Validating enum properties"
|
||||||
|
# $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0))
|
||||||
|
$Method = 'PATCH'
|
||||||
|
#
|
||||||
|
# # Value validation
|
||||||
|
# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method
|
||||||
|
# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition
|
||||||
|
#
|
||||||
|
# foreach ($Property in $EnumProperties.Keys) {
|
||||||
|
# if ($PSBoundParameters.ContainsKey($Property)) {
|
||||||
|
# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]"
|
||||||
|
# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property
|
||||||
|
# } else {
|
||||||
|
# Write-Verbose "User did not provide a value for [$Property]"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# Write-Verbose "Finished enum validation"
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($PrefixId in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $PrefixId))
|
||||||
|
|
||||||
|
Write-Verbose "Obtaining Prefix from ID $PrefixId"
|
||||||
|
$CurrentPrefix = Get-NetboxIPAMPrefix -Id $PrefixId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess($CurrentPrefix.Prefix, 'Set')) {
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
73
Functions/IPAM/Range/Get-NetboxIPAMAddressRange.ps1
Normal file
73
Functions/IPAM/Range/Get-NetboxIPAMAddressRange.ps1
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMAddressRange {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Range,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Family,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$VRF,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint32]$VRF_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint32]$Tenant_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($Range_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-ranges', $Range_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-ranges'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
106
Functions/IPAM/Range/New-NetboxIPAMAddressRange.ps1
Normal file
106
Functions/IPAM/Range/New-NetboxIPAMAddressRange.ps1
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
|
||||||
|
|
||||||
|
function New-NetboxIPAMAddressRange {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new IP address range to Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Create a new IP address range to Netbox with a status of Active by default. The maximum supported
|
||||||
|
size of an IP range is 2^32 - 1.
|
||||||
|
|
||||||
|
.PARAMETER Start_Address
|
||||||
|
Starting IPv4 or IPv6 address (with mask). The maximum supported size of an IP range is 2^32 - 1.
|
||||||
|
|
||||||
|
.PARAMETER End_Address
|
||||||
|
Ending IPv4 or IPv6 address (with mask). The maximum supported size of an IP range is 2^32 - 1.
|
||||||
|
|
||||||
|
.PARAMETER Status
|
||||||
|
Operational status of this range. Defaults to Active
|
||||||
|
|
||||||
|
.PARAMETER Tenant
|
||||||
|
Tenant ID
|
||||||
|
|
||||||
|
.PARAMETER VRF
|
||||||
|
VRF ID
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
Role such as backup, customer, development, etc... Defaults to nothing
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
Custom field hash table. Will be validated by the API service
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Description of IP address range
|
||||||
|
|
||||||
|
.PARAMETER Comments
|
||||||
|
Extra comments (markdown supported).
|
||||||
|
|
||||||
|
.PARAMETER Tags
|
||||||
|
One or more tags.
|
||||||
|
|
||||||
|
.PARAMETER Mark_Utilized
|
||||||
|
Treat as 100% utilized
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return raw results from API service
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-NetboxIPAMAddressRange -Start_Address 192.0.2.20/24 -End_Address 192.0.2.20/24
|
||||||
|
|
||||||
|
Add new IP Address range from 192.0.2.20/24 to 192.0.2.20/24 with status active
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
https://netbox.neonet.org/static/docs/models/ipam/iprange/
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Start_Address,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$End_Address,
|
||||||
|
|
||||||
|
[object]$Status = 'Active',
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[object[]]$Tags,
|
||||||
|
|
||||||
|
[switch]$Mark_Utilized,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-ranges'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Start_Address, 'Create new IP address range')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
47
Functions/IPAM/Range/Remove-NetboxIPAMAddressRange.ps1
Normal file
47
Functions/IPAM/Range/Remove-NetboxIPAMAddressRange.ps1
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
function Remove-NetboxIPAMAddressRange {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Remove an IP address range from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Removes/deletes an IP address range from Netbox by ID
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
Database ID of the IP address range object.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
Do not confirm.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Remove-NetboxIPAMAddressRange -Id 1234
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'High',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($Range_Id in $Id) {
|
||||||
|
$CurrentRange = Get-NetboxIPAMAddressRange -Id $Range_Id -ErrorAction Stop
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-ranges', $Range_Id))
|
||||||
|
|
||||||
|
if ($Force -or $pscmdlet.ShouldProcess($CurrentRange.start_address, "Delete")) {
|
||||||
|
$URI = BuildNewURI -Segments $Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Method DELETE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
Functions/IPAM/Range/Set-NetboxIPAMAddressRange.ps1
Normal file
58
Functions/IPAM/Range/Set-NetboxIPAMAddressRange.ps1
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
|
||||||
|
function Set-NetboxIPAMAddressRange {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[string]$Start_Address,
|
||||||
|
|
||||||
|
[string]$End_Address,
|
||||||
|
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[uint64]$VRF,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[object[]]$Tags,
|
||||||
|
|
||||||
|
[switch]$Mark_Utilized,
|
||||||
|
|
||||||
|
[switch]$Force,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
$Method = 'PATCH'
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($RangeID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-ranges', $RangeID))
|
||||||
|
|
||||||
|
Write-Verbose "Obtaining IP range from ID $RangeID"
|
||||||
|
$CurrentRange = Get-NetboxIPAMAddressRange -Id $RangeID -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess("$($CurrentRange.Start_Address) - $($CurrentRange.End_Address)", 'Set')) {
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
96
Functions/IPAM/Role/Get-NetboxIPAMRole.ps1
Normal file
96
Functions/IPAM/Role/Get-NetboxIPAMRole.ps1
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMRole {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get IPAM Prefix/VLAN roles
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A role indicates the function of a prefix or VLAN. For example, you might define Data, Voice, and Security roles. Generally, a prefix will be assigned the same functional role as the VLAN to which it is assigned (if any).
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
Unique ID
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
Search query
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
Role name
|
||||||
|
|
||||||
|
.PARAMETER Slug
|
||||||
|
Role URL slug
|
||||||
|
|
||||||
|
.PARAMETER Brief
|
||||||
|
Brief format
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
Result limit
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
Result offset
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxIPAMRole
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[switch]$Brief,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($Role_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles', $Role_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
96
Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1
Normal file
96
Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
|
||||||
|
function Get-NetboxIPAMVLAN {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[ValidateRange(1, 4096)]
|
||||||
|
[uint16]$VID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Tenant,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Tenant_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$TenantGroup,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$TenantGroup_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[object]$Status,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Region,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Site,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Site_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Group,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Group_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Role,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Role_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($VLAN_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans', $VLAN_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
82
Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1
Normal file
82
Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
function New-NetboxIPAMVLAN {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new VLAN
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Create a new VLAN in Netbox with a status of Active by default.
|
||||||
|
|
||||||
|
.PARAMETER VID
|
||||||
|
The VLAN ID.
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The name of the VLAN.
|
||||||
|
|
||||||
|
.PARAMETER Status
|
||||||
|
Status of the VLAN. Defaults to Active
|
||||||
|
|
||||||
|
.PARAMETER Tenant
|
||||||
|
Tenant ID
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
Role such as anycast, loopback, etc... Defaults to nothing
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Description of IP address
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
Custom field hash table. Will be validated by the API service
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return raw results from API service
|
||||||
|
|
||||||
|
.PARAMETER Address
|
||||||
|
IP address in CIDR notation: 192.168.1.1/24
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Create-NetboxIPAMAddress
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint16]$VID,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[object]$Status = 'Active',
|
||||||
|
|
||||||
|
[uint64]$Tenant,
|
||||||
|
|
||||||
|
[object]$Role,
|
||||||
|
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus
|
||||||
|
|
||||||
|
# if ($null -ne $Role) {
|
||||||
|
# $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole
|
||||||
|
# }
|
||||||
|
|
||||||
|
$segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($nae, 'Create new Vlan $($vid)')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,203 +0,0 @@
|
||||||
<#
|
|
||||||
.NOTES
|
|
||||||
===========================================================================
|
|
||||||
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148
|
|
||||||
Created on: 2/28/2018 3:33 PM
|
|
||||||
Created by: Ben Claussen
|
|
||||||
Organization: NEOnet
|
|
||||||
Filename: Setup.ps1
|
|
||||||
===========================================================================
|
|
||||||
.DESCRIPTION
|
|
||||||
These are the function used to setup the environment for connecting
|
|
||||||
to a Netbox API
|
|
||||||
#>
|
|
||||||
|
|
||||||
function SetupNetboxConfigVariable {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[switch]$Overwrite
|
|
||||||
)
|
|
||||||
|
|
||||||
Write-Verbose "Checking for NetboxConfig hashtable"
|
|
||||||
if ((-not ($script:NetboxConfig)) -or $Overwrite) {
|
|
||||||
Write-Verbose "Creating NetboxConfig hashtable"
|
|
||||||
$script:NetboxConfig = @{
|
|
||||||
'Connected' = $false
|
|
||||||
'Choices' = @{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose "NetboxConfig hashtable already exists"
|
|
||||||
}
|
|
||||||
|
|
||||||
function GetNetboxConfigVariable {
|
|
||||||
return $script:NetboxConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
function Set-NetboxHostName {
|
|
||||||
[CmdletBinding(ConfirmImpact = 'Low',
|
|
||||||
SupportsShouldProcess = $true)]
|
|
||||||
[OutputType([string])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$Hostname
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($PSCmdlet.ShouldProcess('Netbox Hostname', 'Set')) {
|
|
||||||
$script:NetboxConfig.Hostname = $Hostname.Trim()
|
|
||||||
$script:NetboxConfig.Hostname
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxHostname {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
Write-Verbose "Getting Netbox hostname"
|
|
||||||
if ($null -eq $script:NetboxConfig.Hostname) {
|
|
||||||
throw "Netbox Hostname is not set! You may set it with Set-NetboxHostname -Hostname 'hostname.domain.tld'"
|
|
||||||
}
|
|
||||||
|
|
||||||
$script:NetboxConfig.Hostname
|
|
||||||
}
|
|
||||||
|
|
||||||
function Set-NetboxCredential {
|
|
||||||
[CmdletBinding(DefaultParameterSetName = 'CredsObject',
|
|
||||||
ConfirmImpact = 'Low',
|
|
||||||
SupportsShouldProcess = $true)]
|
|
||||||
[OutputType([pscredential])]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(ParameterSetName = 'CredsObject',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[pscredential]$Credential,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = 'UserPass',
|
|
||||||
Mandatory = $true)]
|
|
||||||
[securestring]$Token
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($PSCmdlet.ShouldProcess('Netbox Credentials', 'Set')) {
|
|
||||||
switch ($PsCmdlet.ParameterSetName) {
|
|
||||||
'CredsObject' {
|
|
||||||
$script:NetboxConfig.Credential = $Credential
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
'UserPass' {
|
|
||||||
$script:NetboxConfig.Credential = [System.Management.Automation.PSCredential]::new('notapplicable', $Token)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$script:NetboxConfig.Credential
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-NetboxCredential {
|
|
||||||
[CmdletBinding()]
|
|
||||||
[OutputType([pscredential])]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
if (-not $script:NetboxConfig.Credential) {
|
|
||||||
throw "Netbox Credentials not set! You may set with Set-NetboxCredential"
|
|
||||||
}
|
|
||||||
|
|
||||||
$script:NetboxConfig.Credential
|
|
||||||
}
|
|
||||||
|
|
||||||
function VerifyAPIConnectivity {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param ()
|
|
||||||
|
|
||||||
$uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices'))
|
|
||||||
|
|
||||||
$uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck
|
|
||||||
|
|
||||||
InvokeNetboxRequest -URI $uri
|
|
||||||
}
|
|
||||||
|
|
||||||
function Connect-NetboxAPI {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Connects to the Netbox API and ensures Credential work properly
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
A detailed description of the Connect-NetboxAPI function.
|
|
||||||
|
|
||||||
.PARAMETER Hostname
|
|
||||||
A description of the Hostname parameter.
|
|
||||||
|
|
||||||
.PARAMETER Credential
|
|
||||||
A description of the Credential parameter.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS C:\> Connect-NetboxAPI -Hostname "netbox.domain.com"
|
|
||||||
|
|
||||||
This will prompt for Credential, then proceed to attempt a connection to Netbox
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
Additional information about the function.
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$Hostname,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[pscredential]$Credential
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not $Credential) {
|
|
||||||
try {
|
|
||||||
$Credential = Get-NetboxCredential -ErrorAction Stop
|
|
||||||
} catch {
|
|
||||||
# Credentials are not set... Try to obtain from the user
|
|
||||||
if (-not ($Credential = Get-Credential -UserName 'username-not-applicable' -Message "Enter token for Netbox")) {
|
|
||||||
throw "Token is necessary to connect to a Netbox API."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$null = Set-NetboxHostName -Hostname $Hostname
|
|
||||||
$null = Set-NetboxCredential -Credential $Credential
|
|
||||||
|
|
||||||
try {
|
|
||||||
Write-Verbose "Verifying API connectivity..."
|
|
||||||
$null = VerifyAPIConnectivity
|
|
||||||
$script:NetboxConfig.Connected = $true
|
|
||||||
Write-Verbose "Successfully connected!"
|
|
||||||
} catch {
|
|
||||||
Write-Verbose "Failed to connect. Generating error"
|
|
||||||
Write-Verbose $_.Exception.Message
|
|
||||||
if (($_.Exception.Response) -and ($_.Exception.Response.StatusCode -eq 403)) {
|
|
||||||
throw "Invalid token"
|
|
||||||
} else {
|
|
||||||
throw $_
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose "Caching static choices"
|
|
||||||
$script:NetboxConfig.Choices.Circuits = Get-NetboxCircuitsChoices
|
|
||||||
#$script:NetboxConfig.Choices.DCIM = Get-NetboxDCIMChoices # Not completed yet
|
|
||||||
$script:NetboxConfig.Choices.Extras = Get-NetboxExtrasChoices
|
|
||||||
$script:NetboxConfig.Choices.IPAM = Get-NetboxIPAMChoices
|
|
||||||
#$script:NetboxConfig.Choices.Secrets = Get-NetboxSecretsChoices # Not completed yet
|
|
||||||
#$script:NetboxConfig.Choices.Tenancy = Get-NetboxTenancyChoices # Not completed yet
|
|
||||||
$script:NetboxConfig.Choices.Virtualization = Get-NetboxVirtualizationChoices
|
|
||||||
|
|
||||||
Write-Verbose "Connection process completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
11
Functions/Setup/Clear-NetboxCredential.ps1
Normal file
11
Functions/Setup/Clear-NetboxCredential.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Clear-NetboxCredential {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Medium', SupportsShouldProcess = $true)]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($Force -or ($PSCmdlet.ShouldProcess('Netbox Credentials', 'Clear'))) {
|
||||||
|
$script:NetboxConfig.Credential = $null
|
||||||
|
}
|
||||||
|
}
|
||||||
154
Functions/Setup/Connect-NetboxAPI.ps1
Normal file
154
Functions/Setup/Connect-NetboxAPI.ps1
Normal file
|
|
@ -0,0 +1,154 @@
|
||||||
|
function Connect-NetboxAPI {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Connects to the Netbox API and ensures Credential work properly
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Connects to the Netbox API and ensures Credential work properly
|
||||||
|
|
||||||
|
.PARAMETER Hostname
|
||||||
|
The hostname for the resource such as netbox.domain.com
|
||||||
|
|
||||||
|
.PARAMETER Credential
|
||||||
|
Credential object containing the API key in the password. Username is not applicable
|
||||||
|
|
||||||
|
.PARAMETER Scheme
|
||||||
|
Scheme for the URI such as HTTP or HTTPS. Defaults to HTTPS
|
||||||
|
|
||||||
|
.PARAMETER Port
|
||||||
|
Port for the resource. Value between 1-65535
|
||||||
|
|
||||||
|
.PARAMETER URI
|
||||||
|
The full URI for the resource such as "https://netbox.domain.com:8443"
|
||||||
|
|
||||||
|
.PARAMETER SkipCertificateCheck
|
||||||
|
A description of the SkipCertificateCheck parameter.
|
||||||
|
|
||||||
|
.PARAMETER TimeoutSeconds
|
||||||
|
The number of seconds before the HTTP call times out. Defaults to 30 seconds
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Connect-NetboxAPI -Hostname "netbox.domain.com"
|
||||||
|
|
||||||
|
This will prompt for Credential, then proceed to attempt a connection to Netbox
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Manual')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Manual',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[string]$Hostname,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false)]
|
||||||
|
[pscredential]$Credential,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Manual')]
|
||||||
|
[ValidateSet('https', 'http', IgnoreCase = $true)]
|
||||||
|
[string]$Scheme = 'https',
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Manual')]
|
||||||
|
[uint16]$Port = 443,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'URI',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[string]$URI,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false)]
|
||||||
|
[switch]$SkipCertificateCheck = $false,
|
||||||
|
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[ValidateRange(1, 65535)]
|
||||||
|
[uint16]$TimeoutSeconds = 30
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-not $Credential) {
|
||||||
|
try {
|
||||||
|
$Credential = Get-NetboxCredential -ErrorAction Stop
|
||||||
|
} catch {
|
||||||
|
# Credentials are not set... Try to obtain from the user
|
||||||
|
if (-not ($Credential = Get-Credential -UserName 'username-not-applicable' -Message "Enter token for Netbox")) {
|
||||||
|
throw "Token is necessary to connect to a Netbox API."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$invokeParams = @{ SkipCertificateCheck = $SkipCertificateCheck; }
|
||||||
|
|
||||||
|
if ("Desktop" -eq $PSVersionTable.PsEdition) {
|
||||||
|
#Remove -SkipCertificateCheck from Invoke Parameter (not supported <= PS 5)
|
||||||
|
$invokeParams.remove("SkipCertificateCheck")
|
||||||
|
}
|
||||||
|
|
||||||
|
#for PowerShell (<=) 5 (Desktop), Enable TLS 1.1, 1.2 and Disable SSL chain trust
|
||||||
|
if ("Desktop" -eq $PSVersionTable.PsEdition) {
|
||||||
|
#Add System.web (Need for ParseQueryString)
|
||||||
|
Add-Type -AssemblyName System.Web
|
||||||
|
#Enable TLS 1.1 and 1.2
|
||||||
|
Set-NetboxCipherSSL
|
||||||
|
if ($SkipCertificateCheck) {
|
||||||
|
#Disable SSL chain trust...
|
||||||
|
Set-NetboxuntrustedSSL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'Manual' {
|
||||||
|
$uriBuilder = [System.UriBuilder]::new($Scheme, $Hostname, $Port)
|
||||||
|
}
|
||||||
|
|
||||||
|
'URI' {
|
||||||
|
$uriBuilder = [System.UriBuilder]::new($URI)
|
||||||
|
if ([string]::IsNullOrWhiteSpace($uriBuilder.Host)) {
|
||||||
|
throw "URI appears to be invalid. Must be in format [host.name], [scheme://host.name], or [scheme://host.name:port]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$null = Set-NetboxHostName -Hostname $uriBuilder.Host
|
||||||
|
$null = Set-NetboxCredential -Credential $Credential
|
||||||
|
$null = Set-NetboxHostScheme -Scheme $uriBuilder.Scheme
|
||||||
|
$null = Set-NetboxHostPort -Port $uriBuilder.Port
|
||||||
|
$null = Set-NetboxInvokeParams -invokeParams $invokeParams
|
||||||
|
$null = Set-NetboxTimeout -TimeoutSeconds $TimeoutSeconds
|
||||||
|
|
||||||
|
try {
|
||||||
|
Write-Verbose "Verifying API connectivity..."
|
||||||
|
$null = VerifyAPIConnectivity
|
||||||
|
} catch {
|
||||||
|
Write-Verbose "Failed to connect. Generating error"
|
||||||
|
Write-Verbose $_.Exception.Message
|
||||||
|
if (($_.Exception.Response) -and ($_.Exception.Response.StatusCode -eq 403)) {
|
||||||
|
throw "Invalid token"
|
||||||
|
} else {
|
||||||
|
throw $_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Write-Verbose "Caching API definition"
|
||||||
|
# $script:NetboxConfig.APIDefinition = Get-NetboxAPIDefinition
|
||||||
|
#
|
||||||
|
# if ([version]$script:NetboxConfig.APIDefinition.info.version -lt 2.8) {
|
||||||
|
# $Script:NetboxConfig.Connected = $false
|
||||||
|
# throw "Netbox version is incompatible with this PS module. Requires >=2.8.*, found version $($script:NetboxConfig.APIDefinition.info.version)"
|
||||||
|
# }
|
||||||
|
|
||||||
|
Write-Verbose "Checking Netbox version compatibility"
|
||||||
|
$script:NetboxConfig.NetboxVersion = Get-NetboxVersion
|
||||||
|
if ([version]$script:NetboxConfig.NetboxVersion.'netbox-version' -lt 2.8) {
|
||||||
|
$Script:NetboxConfig.Connected = $false
|
||||||
|
throw "Netbox version is incompatible with this PS module. Requires >=2.8.*, found version $($script:NetboxConfig.NetboxVersion.'netbox-version')"
|
||||||
|
} else {
|
||||||
|
Write-Verbose "Found compatible version [$($script:NetboxConfig.NetboxVersion.'netbox-version')]!"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.Connected = $true
|
||||||
|
Write-Verbose "Successfully connected!"
|
||||||
|
|
||||||
|
$script:NetboxConfig.ContentTypes = Get-NetboxContentType -Limit 500
|
||||||
|
|
||||||
|
Write-Verbose "Connection process completed"
|
||||||
|
}
|
||||||
11
Functions/Setup/Get-NetboxCredential.ps1
Normal file
11
Functions/Setup/Get-NetboxCredential.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Get-NetboxCredential {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([pscredential])]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
if (-not $script:NetboxConfig.Credential) {
|
||||||
|
throw "Netbox Credentials not set! You may set with Set-NetboxCredential"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.Credential
|
||||||
|
}
|
||||||
11
Functions/Setup/Get-NetboxHostPort.ps1
Normal file
11
Functions/Setup/Get-NetboxHostPort.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Get-NetboxHostPort {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Getting Netbox host port"
|
||||||
|
if ($null -eq $script:NetboxConfig.HostPort) {
|
||||||
|
throw "Netbox host port is not set! You may set it with Set-NetboxHostPort -Port 'https'"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.HostPort
|
||||||
|
}
|
||||||
11
Functions/Setup/Get-NetboxHostScheme.ps1
Normal file
11
Functions/Setup/Get-NetboxHostScheme.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Get-NetboxHostScheme {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Getting Netbox host scheme"
|
||||||
|
if ($null -eq $script:NetboxConfig.Hostscheme) {
|
||||||
|
throw "Netbox host sceme is not set! You may set it with Set-NetboxHostScheme -Scheme 'https'"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.HostScheme
|
||||||
|
}
|
||||||
11
Functions/Setup/Get-NetboxHostname.ps1
Normal file
11
Functions/Setup/Get-NetboxHostname.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Get-NetboxHostname {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Getting Netbox hostname"
|
||||||
|
if ($null -eq $script:NetboxConfig.Hostname) {
|
||||||
|
throw "Netbox Hostname is not set! You may set it with Set-NetboxHostname -Hostname 'hostname.domain.tld'"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.Hostname
|
||||||
|
}
|
||||||
11
Functions/Setup/Get-NetboxInvokeParams.ps1
Normal file
11
Functions/Setup/Get-NetboxInvokeParams.ps1
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
function Get-NetboxInvokeParams {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Getting Netbox InvokeParams"
|
||||||
|
if ($null -eq $script:NetboxConfig.InvokeParams) {
|
||||||
|
throw "Netbox Invoke Params is not set! You may set it with Set-NetboxInvokeParams -InvokeParams ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.InvokeParams
|
||||||
|
}
|
||||||
13
Functions/Setup/Get-NetboxTimeout.ps1
Normal file
13
Functions/Setup/Get-NetboxTimeout.ps1
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
function Get-NetboxTimeout {
|
||||||
|
[CmdletBinding()]
|
||||||
|
[OutputType([uint16])]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
Write-Verbose "Getting Netbox Timeout"
|
||||||
|
if ($null -eq $script:NetboxConfig.Timeout) {
|
||||||
|
throw "Netbox Timeout is not set! You may set it with Set-NetboxTimeout -TimeoutSeconds [uint16]"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.Timeout
|
||||||
|
}
|
||||||
15
Functions/Setup/Get-NetboxVersion.ps1
Normal file
15
Functions/Setup/Get-NetboxVersion.ps1
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
function Get-NetboxVersion {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('status'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary @{
|
||||||
|
'format' = 'json'
|
||||||
|
}
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters -SkipConnectedCheck
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI
|
||||||
|
}
|
||||||
8
Functions/Setup/Set-NetboxCipherSSL.ps1
Normal file
8
Functions/Setup/Set-NetboxCipherSSL.ps1
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
Function Set-NetboxCipherSSL {
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessforStateChangingFunctions", "")]
|
||||||
|
Param( )
|
||||||
|
# Hack for allowing TLS 1.1 and TLS 1.2 (by default it is only SSL3 and TLS (1.0))
|
||||||
|
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
|
||||||
|
|
||||||
|
}
|
||||||
32
Functions/Setup/Set-NetboxCredential.ps1
Normal file
32
Functions/Setup/Set-NetboxCredential.ps1
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
function Set-NetboxCredential {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'CredsObject',
|
||||||
|
ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscredential])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'CredsObject',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[pscredential]$Credential,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'UserPass',
|
||||||
|
Mandatory = $true)]
|
||||||
|
[securestring]$Token
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Credentials', 'Set')) {
|
||||||
|
switch ($PsCmdlet.ParameterSetName) {
|
||||||
|
'CredsObject' {
|
||||||
|
$script:NetboxConfig.Credential = $Credential
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
'UserPass' {
|
||||||
|
$script:NetboxConfig.Credential = [System.Management.Automation.PSCredential]::new('notapplicable', $Token)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.Credential
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Functions/Setup/Set-NetboxHostName.ps1
Normal file
15
Functions/Setup/Set-NetboxHostName.ps1
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
function Set-NetboxHostName {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([string])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Hostname
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Hostname', 'Set')) {
|
||||||
|
$script:NetboxConfig.Hostname = $Hostname.Trim()
|
||||||
|
$script:NetboxConfig.Hostname
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Functions/Setup/Set-NetboxHostPort.ps1
Normal file
15
Functions/Setup/Set-NetboxHostPort.ps1
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
function Set-NetboxHostPort {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([string])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint16]$Port
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Port', 'Set')) {
|
||||||
|
$script:NetboxConfig.HostPort = $Port
|
||||||
|
$script:NetboxConfig.HostPort
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Functions/Setup/Set-NetboxHostScheme.ps1
Normal file
20
Functions/Setup/Set-NetboxHostScheme.ps1
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
function Set-NetboxHostScheme {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([string])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $false)]
|
||||||
|
[ValidateSet('https', 'http', IgnoreCase = $true)]
|
||||||
|
[string]$Scheme = 'https'
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Host Scheme', 'Set')) {
|
||||||
|
if ($Scheme -eq 'http') {
|
||||||
|
Write-Warning "Connecting via non-secure HTTP is not-recommended"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:NetboxConfig.HostScheme = $Scheme
|
||||||
|
$script:NetboxConfig.HostScheme
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Functions/Setup/Set-NetboxInvokeParams.ps1
Normal file
14
Functions/Setup/Set-NetboxInvokeParams.ps1
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
function Set-NetboxInvokeParams {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([string])]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[array]$InvokeParams
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Invoke Params', 'Set')) {
|
||||||
|
$script:NetboxConfig.InvokeParams = $InvokeParams
|
||||||
|
$script:NetboxConfig.InvokeParams
|
||||||
|
}
|
||||||
|
}
|
||||||
17
Functions/Setup/Set-NetboxTimeout.ps1
Normal file
17
Functions/Setup/Set-NetboxTimeout.ps1
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
function Set-NetboxTimeout {
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([uint16])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $false)]
|
||||||
|
[ValidateRange(1, 65535)]
|
||||||
|
[uint16]$TimeoutSeconds = 30
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess('Netbox Timeout', 'Set')) {
|
||||||
|
$script:NetboxConfig.Timeout = $TimeoutSeconds
|
||||||
|
$script:NetboxConfig.Timeout
|
||||||
|
}
|
||||||
|
}
|
||||||
19
Functions/Setup/Set-NetboxUnstrustedSSL.ps1
Normal file
19
Functions/Setup/Set-NetboxUnstrustedSSL.ps1
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Function Set-NetboxUntrustedSSL {
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessforStateChangingFunctions", "")]
|
||||||
|
Param( )
|
||||||
|
# Hack for allowing untrusted SSL certs with https connections
|
||||||
|
Add-Type -TypeDefinition @"
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
public class TrustAllCertsPolicy : ICertificatePolicy {
|
||||||
|
public bool CheckValidationResult(
|
||||||
|
ServicePoint srvPoint, X509Certificate certificate,
|
||||||
|
WebRequest request, int certificateProblem) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"@
|
||||||
|
|
||||||
|
[System.Net.ServicePointManager]::CertificatePolicy = New-Object -TypeName TrustAllCertsPolicy
|
||||||
|
|
||||||
|
}
|
||||||
21
Functions/Setup/Support/Get-NetboxAPIDefinition.ps1
Normal file
21
Functions/Setup/Support/Get-NetboxAPIDefinition.ps1
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
function Get-NetboxAPIDefinition {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[ValidateSet('json', 'yaml', IgnoreCase = $true)]
|
||||||
|
[string]$Format = 'json'
|
||||||
|
)
|
||||||
|
|
||||||
|
#$URI = "https://netbox.neonet.org/api/schema/?format=json"
|
||||||
|
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('schema'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary @{
|
||||||
|
'format' = $Format.ToLower()
|
||||||
|
}
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters -SkipConnectedCheck
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $URI
|
||||||
|
}
|
||||||
89
Functions/Setup/Support/Get-NetboxContentType.ps1
Normal file
89
Functions/Setup/Support/Get-NetboxContentType.ps1
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
function Get-NetboxContentType {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get a content type definition from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A detailed description of the Get-NetboxContentType function.
|
||||||
|
|
||||||
|
.PARAMETER Model
|
||||||
|
A description of the Model parameter.
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
The database ID of the contact role
|
||||||
|
|
||||||
|
.PARAMETER App_Label
|
||||||
|
A description of the App_Label parameter.
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
A standard search query that will match one or more contact roles.
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
Limit the number of results to this number
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
Start the search at this index in results
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxContentType
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Model,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$App_Label,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($ContentType_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('extras', 'content-types', $ContentType_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('extras', 'content-types'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Functions/Setup/Support/GetNetboxConfigVariable.ps1
Normal file
3
Functions/Setup/Support/GetNetboxConfigVariable.ps1
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
function GetNetboxConfigVariable {
|
||||||
|
return $script:NetboxConfig
|
||||||
|
}
|
||||||
21
Functions/Setup/Support/SetupNetboxConfigVariable.ps1
Normal file
21
Functions/Setup/Support/SetupNetboxConfigVariable.ps1
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
function SetupNetboxConfigVariable {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[switch]$Overwrite
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Verbose "Checking for NetboxConfig hashtable"
|
||||||
|
if ((-not ($script:NetboxConfig)) -or $Overwrite) {
|
||||||
|
Write-Verbose "Creating NetboxConfig hashtable"
|
||||||
|
$script:NetboxConfig = @{
|
||||||
|
'Connected' = $false
|
||||||
|
'Choices' = @{
|
||||||
|
}
|
||||||
|
'APIDefinition' = $null
|
||||||
|
'ContentTypes' = $null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "NetboxConfig hashtable already exists"
|
||||||
|
}
|
||||||
7
Functions/Setup/Support/Test-NetboxAPIConnected.ps1
Normal file
7
Functions/Setup/Support/Test-NetboxAPIConnected.ps1
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
function Test-NetboxAPIConnected {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
$script:NetboxConfig.Connected
|
||||||
|
}
|
||||||
10
Functions/Setup/Support/VerifyAPIConnectivity.ps1
Normal file
10
Functions/Setup/Support/VerifyAPIConnectivity.ps1
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
function VerifyAPIConnectivity {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param ()
|
||||||
|
|
||||||
|
$uriSegments = [System.Collections.ArrayList]::new(@('extras'))
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $uriSegments -Parameters @{'format' = 'json' } -SkipConnectedCheck
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
|
||||||
|
function Get-NetboxContactAssignment {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get a contact Assignment from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A detailed description of the Get-NetboxContactAssignment function.
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The specific name of the contact Assignment. Must match exactly as is defined in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
The database ID of the contact Assignment
|
||||||
|
|
||||||
|
.PARAMETER Content_Type_Id
|
||||||
|
A description of the Content_Type_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Content_Type
|
||||||
|
A description of the Content_Type parameter.
|
||||||
|
|
||||||
|
.PARAMETER Object_Id
|
||||||
|
A description of the Object_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Contact_Id
|
||||||
|
A description of the Contact_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Role_Id
|
||||||
|
A description of the Role_Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
Limit the number of results to this number
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
Start the search at this index in results
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxContactAssignment
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Content_Type_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Content_Type,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Object_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Contact_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$Role_Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($ContactAssignment_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-assignments', $ContactAssignment_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-assignments'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
|
||||||
|
function New-NetboxContactAssignment {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new contact role assignment in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Creates a new contact role assignment in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Content_Type
|
||||||
|
The content type for this assignment.
|
||||||
|
|
||||||
|
.PARAMETER Object_Id
|
||||||
|
ID of the object to assign.
|
||||||
|
|
||||||
|
.PARAMETER Contact
|
||||||
|
ID of the contact to assign.
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
ID of the contact role to assign.
|
||||||
|
|
||||||
|
.PARAMETER Priority
|
||||||
|
Piority of the contact assignment.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> New-NetboxContactAssignment -Content_Type 'dcim.location' -Object_id 10 -Contact 15 -Role 10 -Priority 'Primary'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Valid content types: https://docs.netbox.dev/en/stable/features/contacts/#contacts_1
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[ValidateSet('circuits.circuit', 'circuits.provider', 'circuits.provideraccount', 'dcim.device', 'dcim.location', 'dcim.manufacturer', 'dcim.powerpanel', 'dcim.rack', 'dcim.region', 'dcim.site', 'dcim.sitegroup', 'tenancy.tenant', 'virtualization.cluster', 'virtualization.clustergroup', 'virtualization.virtualmachine', IgnoreCase = $true)]
|
||||||
|
[string]$Content_Type,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Object_Id,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Contact,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[uint64]$Role,
|
||||||
|
|
||||||
|
[ValidateSet('primary', 'secondary', 'tertiary', 'inactive', IgnoreCase = $true)]
|
||||||
|
[string]$Priority,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
$Method = 'POST'
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-assignments'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Content_Type, 'Create new contact assignment')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
|
||||||
|
|
||||||
|
function Set-NetboxContactAssignment {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Update a contact role assignment in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Updates a contact role assignment in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Content_Type
|
||||||
|
The content type for this assignment.
|
||||||
|
|
||||||
|
.PARAMETER Object_Id
|
||||||
|
ID of the object to assign.
|
||||||
|
|
||||||
|
.PARAMETER Contact
|
||||||
|
ID of the contact to assign.
|
||||||
|
|
||||||
|
.PARAMETER Role
|
||||||
|
ID of the contact role to assign.
|
||||||
|
|
||||||
|
.PARAMETER Priority
|
||||||
|
Priority of the contact assignment.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Set-NetboxContactAssignment -Id 11 -Content_Type 'dcim.location' -Object_id 10 -Contact 15 -Role 10 -Priority 'Primary'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Valid content types: https://docs.netbox.dev/en/stable/features/contacts/#contacts_1
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[ValidateSet('circuits.circuit', 'circuits.provider', 'circuits.provideraccount', 'dcim.device', 'dcim.location', 'dcim.manufacturer', 'dcim.powerpanel', 'dcim.rack', 'dcim.region', 'dcim.site', 'dcim.sitegroup', 'tenancy.tenant', 'virtualization.cluster', 'virtualization.clustergroup', 'virtualization.virtualmachine', IgnoreCase = $true)]
|
||||||
|
[string]$Content_Type,
|
||||||
|
|
||||||
|
[uint64]$Object_Id,
|
||||||
|
|
||||||
|
[uint64]$Contact,
|
||||||
|
|
||||||
|
[uint64]$Role,
|
||||||
|
|
||||||
|
[ValidateSet('primary', 'secondary', 'tertiary', 'inactive', IgnoreCase = $true)]
|
||||||
|
[string]$Priority,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
$Method = 'Patch'
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($ContactAssignmentId in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-assignments', $ContactAssignmentId))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
$CurrentContactAssignment = Get-NetboxContactAssignment -Id $ContactAssignmentId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($CurrentContactAssignment.Id, 'Update contact assignment')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
90
Functions/Tenancy/ContactRoles/Get-NetboxContactRole.ps1
Normal file
90
Functions/Tenancy/ContactRoles/Get-NetboxContactRole.ps1
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
|
||||||
|
function Get-NetboxContactRole {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get a contact role from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
A detailed description of the Get-NetboxContactRole function.
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The specific name of the contact role. Must match exactly as is defined in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
The database ID of the contact role
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
A standard search query that will match one or more contact roles.
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
Limit the number of results to this number
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
Start the search at this index in results
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxContactRole
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($ContactRole_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-roles', $ContactRole_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contact-roles'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
71
Functions/Tenancy/ContactRoles/New-NetboxContactRole.ps1
Normal file
71
Functions/Tenancy/ContactRoles/New-NetboxContactRole.ps1
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
|
||||||
|
function New-NetboxContactRole {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new contact role in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Creates a new contact role object in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The contact role name, e.g "Network Support"
|
||||||
|
|
||||||
|
.PARAMETER Slug
|
||||||
|
The unique URL for the role. Can only contain hypens, A-Z, a-z, 0-9, and underscores
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Short description of the contact role
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
A description of the Custom_Fields parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> New-NetboxContact -Name 'Leroy Jenkins' -Email 'leroy.jenkins@example.com'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[ValidatePattern('^[-a-zA-Z0-9_]+$')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Name, 'Create new contact')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
80
Functions/Tenancy/ContactRoles/Set-NetboxContactRole.ps1
Normal file
80
Functions/Tenancy/ContactRoles/Set-NetboxContactRole.ps1
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
function Set-NetboxContactRole {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Update a contact role in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Updates a contact role in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The contact role name, e.g "Network Support"
|
||||||
|
|
||||||
|
.PARAMETER Slug
|
||||||
|
The unique URL for the role. Can only contain hypens, A-Z, a-z, 0-9, and underscores
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Short description of the contact role
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
A description of the Custom_Fields parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> New-NetboxContact -Name 'Leroy Jenkins' -Email 'leroy.jenkins@example.com'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[ValidatePattern('^[-a-zA-Z0-9_]+$')]
|
||||||
|
[string]$Slug,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
$Method = 'PATCH'
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($ContactRoleId in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts', $ContactRoleId))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
$CurrentContactRole = Get-NetboxContactRole -Id $ContactRoleId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess($CurrentContactRole.Name, 'Update contact role')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
120
Functions/Tenancy/Contacts/Get-NetboxContact.ps1
Normal file
120
Functions/Tenancy/Contacts/Get-NetboxContact.ps1
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
|
||||||
|
function Get-NetboxContact {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get a contact from Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Obtain a contact or contacts from Netbox by ID or query
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The specific name of the Contact. Must match exactly as is defined in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
The database ID of the Contact
|
||||||
|
|
||||||
|
.PARAMETER Query
|
||||||
|
A standard search query that will match one or more Contacts.
|
||||||
|
|
||||||
|
.PARAMETER Email
|
||||||
|
Email address of the contact
|
||||||
|
|
||||||
|
.PARAMETER Title
|
||||||
|
Title of the contact
|
||||||
|
|
||||||
|
.PARAMETER Phone
|
||||||
|
Telephone number of the contact
|
||||||
|
|
||||||
|
.PARAMETER Address
|
||||||
|
Physical address of the contact
|
||||||
|
|
||||||
|
.PARAMETER Group
|
||||||
|
The specific group as defined in Netbox.
|
||||||
|
|
||||||
|
.PARAMETER GroupID
|
||||||
|
The database ID of the group in Netbox
|
||||||
|
|
||||||
|
.PARAMETER Limit
|
||||||
|
Limit the number of results to this number
|
||||||
|
|
||||||
|
.PARAMETER Offset
|
||||||
|
Start the search at this index in results
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
Return the unparsed data from the HTTP request
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-NetboxContact
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Query')]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(ParameterSetName = 'Query',
|
||||||
|
Position = 0)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'ByID')]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Query,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Email,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Title,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Phone,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[string]$Group,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint64]$GroupID,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Limit,
|
||||||
|
|
||||||
|
[Parameter(ParameterSetName = 'Query')]
|
||||||
|
[uint16]$Offset,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
|
'ById' {
|
||||||
|
foreach ($Contact_ID in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts', $Contact_ID))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id'
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts'))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters
|
||||||
|
|
||||||
|
InvokeNetboxRequest -URI $uri -Raw:$Raw
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
99
Functions/Tenancy/Contacts/New-NetboxContact.ps1
Normal file
99
Functions/Tenancy/Contacts/New-NetboxContact.ps1
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
|
||||||
|
function New-NetboxContact {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Create a new contact in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Creates a new contact object in Netbox which can be linked to other objects
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The contacts full name, e.g "Leroy Jenkins"
|
||||||
|
|
||||||
|
.PARAMETER Email
|
||||||
|
Email address of the contact
|
||||||
|
|
||||||
|
.PARAMETER Title
|
||||||
|
Job title or other title related to the contact
|
||||||
|
|
||||||
|
.PARAMETER Phone
|
||||||
|
Telephone number
|
||||||
|
|
||||||
|
.PARAMETER Address
|
||||||
|
Physical address, usually mailing address
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Short description of the contact
|
||||||
|
|
||||||
|
.PARAMETER Comments
|
||||||
|
Detailed comments. Markdown supported.
|
||||||
|
|
||||||
|
.PARAMETER Link
|
||||||
|
URI related to the contact
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
A description of the Custom_Fields parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> New-NetboxContact -Name 'Leroy Jenkins' -Email 'leroy.jenkins@example.com'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[ValidateLength(0, 254)]
|
||||||
|
[string]$Email,
|
||||||
|
|
||||||
|
[ValidateLength(0, 100)]
|
||||||
|
[string]$Title,
|
||||||
|
|
||||||
|
[ValidateLength(0, 50)]
|
||||||
|
[string]$Phone,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Link,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts'))
|
||||||
|
$Method = 'POST'
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
if ($PSCmdlet.ShouldProcess($Name, 'Create new contact')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
120
Functions/Tenancy/Contacts/Set-NetboxContact.ps1
Normal file
120
Functions/Tenancy/Contacts/Set-NetboxContact.ps1
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
|
||||||
|
function Set-NetboxContact {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Update a contact in Netbox
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Updates a contact object in Netbox which can be linked to other objects
|
||||||
|
|
||||||
|
.PARAMETER Id
|
||||||
|
A description of the Id parameter.
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
The contacts full name, e.g "Leroy Jenkins"
|
||||||
|
|
||||||
|
.PARAMETER Email
|
||||||
|
Email address of the contact
|
||||||
|
|
||||||
|
.PARAMETER Group
|
||||||
|
Database ID of assigned group
|
||||||
|
|
||||||
|
.PARAMETER Title
|
||||||
|
Job title or other title related to the contact
|
||||||
|
|
||||||
|
.PARAMETER Phone
|
||||||
|
Telephone number
|
||||||
|
|
||||||
|
.PARAMETER Address
|
||||||
|
Physical address, usually mailing address
|
||||||
|
|
||||||
|
.PARAMETER Description
|
||||||
|
Short description of the contact
|
||||||
|
|
||||||
|
.PARAMETER Comments
|
||||||
|
Detailed comments. Markdown supported.
|
||||||
|
|
||||||
|
.PARAMETER Link
|
||||||
|
URI related to the contact
|
||||||
|
|
||||||
|
.PARAMETER Custom_Fields
|
||||||
|
A description of the Custom_Fields parameter.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
A description of the Force parameter.
|
||||||
|
|
||||||
|
.PARAMETER Raw
|
||||||
|
A description of the Raw parameter.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Set-NetboxContact -Id 10 -Name 'Leroy Jenkins' -Email 'leroy.jenkins@example.com'
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
Additional information about the function.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(ConfirmImpact = 'Low',
|
||||||
|
SupportsShouldProcess = $true)]
|
||||||
|
[OutputType([pscustomobject])]
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory = $true,
|
||||||
|
ValueFromPipelineByPropertyName = $true)]
|
||||||
|
[uint64[]]$Id,
|
||||||
|
|
||||||
|
[ValidateLength(1, 100)]
|
||||||
|
[string]$Name,
|
||||||
|
|
||||||
|
[ValidateLength(0, 254)]
|
||||||
|
[string]$Email,
|
||||||
|
|
||||||
|
[uint64]$Group,
|
||||||
|
|
||||||
|
[ValidateLength(0, 100)]
|
||||||
|
[string]$Title,
|
||||||
|
|
||||||
|
[ValidateLength(0, 50)]
|
||||||
|
[string]$Phone,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Address,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Description,
|
||||||
|
|
||||||
|
[string]$Comments,
|
||||||
|
|
||||||
|
[ValidateLength(0, 200)]
|
||||||
|
[string]$Link,
|
||||||
|
|
||||||
|
[hashtable]$Custom_Fields,
|
||||||
|
|
||||||
|
[switch]$Force,
|
||||||
|
|
||||||
|
[switch]$Raw
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
$Method = 'PATCH'
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
foreach ($ContactId in $Id) {
|
||||||
|
$Segments = [System.Collections.ArrayList]::new(@('tenancy', 'contacts', $ContactId))
|
||||||
|
|
||||||
|
$URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force'
|
||||||
|
|
||||||
|
$URI = BuildNewURI -Segments $URIComponents.Segments
|
||||||
|
|
||||||
|
$CurrentContact = Get-NetboxContact -Id $ContactId -ErrorAction Stop
|
||||||
|
|
||||||
|
if ($Force -or $PSCmdlet.ShouldProcess($CurrentContact.Name, 'Update contact')) {
|
||||||
|
InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue