338 lines
11 KiB
PowerShell
338 lines
11 KiB
PowerShell
<#
|
|
.Synopsis
|
|
Short description
|
|
.DESCRIPTION
|
|
Long description
|
|
.EXAMPLE
|
|
Example of how to use this cmdlet
|
|
.EXAMPLE
|
|
Another example of how to use this cmdlet
|
|
#>
|
|
function Get-ITDIbDNSRecord {
|
|
[CmdletBinding()]
|
|
Param
|
|
(
|
|
[string[]]
|
|
$Hostname,
|
|
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
|
|
Begin {
|
|
If (!($Credential)) {
|
|
$Credential = Get-Credential
|
|
}
|
|
}
|
|
Process {
|
|
$result = @()
|
|
ForEach ($h in $hostname) {
|
|
$x = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.7/record:host?name=$h" -ContentType "application/json" -Credential $Credential
|
|
If ($x) {
|
|
$obj = [PSCustomObject]@{
|
|
'HostName' = $x.ipv4addrs.Host;
|
|
'IPv4Address' = $x.ipv4addrs.ipv4addr
|
|
'DHCP' = $x.ipv4addrs.configure_for_dhcp
|
|
}
|
|
$result += $obj
|
|
}
|
|
}
|
|
}
|
|
End {
|
|
Write-Output $result
|
|
}
|
|
}
|
|
|
|
<#
|
|
.Synopsis
|
|
Short description
|
|
.DESCRIPTION
|
|
Long description
|
|
.EXAMPLE
|
|
Example of how to use this cmdlet
|
|
.EXAMPLE
|
|
Another example of how to use this cmdlet
|
|
#>
|
|
function New-ITDIbDNSRecord {
|
|
[CmdletBinding()]
|
|
Param
|
|
(
|
|
[ipaddress]
|
|
$IPv4Address,
|
|
|
|
[string]
|
|
$Hostname,
|
|
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
|
|
Begin {
|
|
If (!($Credential)) {
|
|
$Credential = Get-Credential
|
|
}
|
|
|
|
$Uri = "https://infoblox-gmv.ns.nd.gov/wapi/v2.7/record:host"
|
|
$IPs = @([PSCustomObject]@{'ipv4addr' = $IPv4Address })
|
|
}
|
|
Process {
|
|
$obj = [PSCustomObject]@{
|
|
'ipv4addrs' = $IPs;
|
|
'name' = $Hostname;
|
|
'view' = "default";
|
|
}
|
|
$postJson = $obj | ConvertTo-Json
|
|
Invoke-RestMethod -Uri $Uri -Method Post -Body $postJson -ContentType "application/json" -Credential $Credential
|
|
}
|
|
End {
|
|
}
|
|
}
|
|
|
|
function Get-IPs {
|
|
|
|
Param
|
|
(
|
|
[Parameter(Mandatory = $true)]
|
|
[array]
|
|
$Subnets
|
|
)
|
|
|
|
foreach ($subnet in $subnets) {
|
|
|
|
#Split IP and subnet
|
|
$IP = ($Subnet -split "\/")[0]
|
|
$SubnetBits = ($Subnet -split "\/")[1]
|
|
|
|
#Convert IP into binary
|
|
#Split IP into different octects and for each one, figure out the binary with leading zeros and add to the total
|
|
$Octets = $IP -split "\."
|
|
$IPInBinary = @()
|
|
foreach ($Octet in $Octets) {
|
|
#convert to binary
|
|
$OctetInBinary = [convert]::ToString($Octet, 2)
|
|
|
|
#get length of binary string add leading zeros to make octet
|
|
$OctetInBinary = ("0" * (8 - ($OctetInBinary).Length) + $OctetInBinary)
|
|
|
|
$IPInBinary = $IPInBinary + $OctetInBinary
|
|
}
|
|
$IPInBinary = $IPInBinary -join ""
|
|
|
|
#Get network ID by subtracting subnet mask
|
|
$HostBits = 32 - $SubnetBits
|
|
$NetworkIDInBinary = $IPInBinary.Substring(0, $SubnetBits)
|
|
|
|
#Get host ID and get the first host ID by converting all 1s into 0s
|
|
$HostIDInBinary = $IPInBinary.Substring($SubnetBits, $HostBits)
|
|
$HostIDInBinary = $HostIDInBinary -replace "1", "0"
|
|
|
|
#Work out all the host IDs in that subnet by cycling through $i from 1 up to max $HostIDInBinary (i.e. 1s stringed up to $HostBits)
|
|
#Work out max $HostIDInBinary
|
|
$imax = [convert]::ToInt32(("1" * $HostBits), 2) - 1
|
|
|
|
$IPs = @()
|
|
|
|
#Next ID is first network ID converted to decimal plus $i then converted to binary
|
|
For ($i = 1 ; $i -le $imax ; $i++) {
|
|
#Convert to decimal and add $i
|
|
$NextHostIDInDecimal = ([convert]::ToInt32($HostIDInBinary, 2) + $i)
|
|
#Convert back to binary
|
|
$NextHostIDInBinary = [convert]::ToString($NextHostIDInDecimal, 2)
|
|
#Add leading zeros
|
|
#Number of zeros to add
|
|
$NoOfZerosToAdd = $HostIDInBinary.Length - $NextHostIDInBinary.Length
|
|
$NextHostIDInBinary = ("0" * $NoOfZerosToAdd) + $NextHostIDInBinary
|
|
|
|
#Work out next IP
|
|
#Add networkID to hostID
|
|
$NextIPInBinary = $NetworkIDInBinary + $NextHostIDInBinary
|
|
#Split into octets and separate by . then join
|
|
$IP = @()
|
|
For ($x = 1 ; $x -le 4 ; $x++) {
|
|
#Work out start character position
|
|
$StartCharNumber = ($x - 1) * 8
|
|
#Get octet in binary
|
|
$IPOctetInBinary = $NextIPInBinary.Substring($StartCharNumber, 8)
|
|
#Convert octet into decimal
|
|
$IPOctetInDecimal = [convert]::ToInt32($IPOctetInBinary, 2)
|
|
#Add octet to IP
|
|
$IP += $IPOctetInDecimal
|
|
}
|
|
|
|
#Separate by .
|
|
$IP = $IP -join "."
|
|
$IPs += $IP
|
|
|
|
|
|
}
|
|
$IPs
|
|
}
|
|
}
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Dynamically creates DNS A records
|
|
.DESCRIPTION
|
|
Dynamically creates DNS A records based on CIDR input
|
|
.EXAMPLE
|
|
New-ITDIbDNSRecordNextAvailableIP -Hostname itdserver1.nd.gov -CIDR 10.11.12.0/23 -Credential $Credential
|
|
.EXAMPLE
|
|
New-ITDIbDNSRecordNextAvailableIP -Hostname itdserver2.nd.gov,itdserver3.nd.gov,itdserver4.nd.gov -CIDR 10.11.12.0/23 -Credential $Credential
|
|
.INPUTS
|
|
Inputs to this cmdlet (if any)
|
|
.OUTPUTS
|
|
Output from this cmdlet (if any)
|
|
.NOTES
|
|
General notes
|
|
.COMPONENT
|
|
The component this cmdlet belongs to
|
|
.ROLE
|
|
The role this cmdlet belongs to
|
|
.FUNCTIONALITY
|
|
The functionality that best describes this cmdlet
|
|
#>
|
|
function New-ITDIbDNSRecordNextAvailableIP {
|
|
[CmdletBinding()]
|
|
Param
|
|
(
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateNotNull()]
|
|
[ValidateNotNullOrEmpty()]
|
|
[string[]]
|
|
$Hostname,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateNotNull()]
|
|
[ValidateNotNullOrEmpty()]
|
|
[ValidatePattern("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(3[0-2]|[1-2][0-9]|[0-9]))$")]
|
|
[string]
|
|
$CIDR,
|
|
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
|
|
begin {
|
|
$NetworkAddress = $CIDR.split('/')[0]
|
|
$IPs = Get-IPs -Subnets $CIDR
|
|
$ExcludeIPs = $IPs | select -First 1
|
|
}
|
|
|
|
process {
|
|
#$ curl -k -u admin:infoblox -X GET https://10.64.41.6/wapi/v1.1/network?ipv4addr=10.144.2.0
|
|
try {
|
|
$networkobj = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.7/network?ipv4addr=$NetworkAddress" -Credential $Credential -ContentType "application/json" -ErrorAction Stop
|
|
$networkobjref = $networkobj._ref
|
|
|
|
#curl -k -u admin:infoblox -X POST https://10.64.41.6/wapi/v1.1/network/ZG5zLm5ldHdvcmskMTAuMTQ0LjIuMC8yNC8w:10.144.2.0/24/default?_function=next_available_ip -H "Content-Type: application/json" -d '{"exclude": ["10.144.2.8", "10.144.2.10"], "num": 6}'
|
|
$bodyjson = @{num = @($Hostname).count; exclude = @($ExcludeIPs) } | ConvertTo-Json
|
|
#Invoke-RestMethod -Method Post -Uri ("https://infoblox-gmv.ns.nd.gov/wapi/v2.7/" + $networkobjref + "?_function=next_available_ip") -ContentType "application/json" -Credential $Credential -Body '{"exclude": ["10.11.12.1", "10.11.12.2"], "num": 6}' #WORKS
|
|
$IPsAvailable = (Invoke-RestMethod -Method Post -Uri ("https://infoblox-gmv.ns.nd.gov/wapi/v2.7/" + $networkobjref + "?_function=next_available_ip") -ContentType "application/json" -Credential $Credential -Body $bodyjson -ErrorAction Stop).Ips
|
|
|
|
$IPCount = 0
|
|
|
|
ForEach ($hn in $hostname) {
|
|
if (Get-ITDIbDNSRecord -Hostname $hn -Credential $Credential) {
|
|
Write-Warning "DNS record already exists"
|
|
}
|
|
else {
|
|
New-ITDIbDNSRecord -IPv4Address $IPsAvailable[$IPCount] -Hostname $hn -Credential $Credential -ErrorAction Stop
|
|
$IPcount++
|
|
}
|
|
}
|
|
}
|
|
catch [System.Net.WebException] {
|
|
Write-Error "webexception error"
|
|
}
|
|
}
|
|
|
|
end {
|
|
}
|
|
}
|
|
|
|
function Get-ITDIbVlan {
|
|
[CmdletBinding()]
|
|
Param(
|
|
[Parameter(
|
|
ParameterSetName = 'VlanLookup')]
|
|
[ValidateRange(0, 4096)]
|
|
[int[]]
|
|
$Vlan,
|
|
|
|
[Parameter(
|
|
ParameterSetName = 'CIDRLookup')]
|
|
[string[]]
|
|
$CIDR,
|
|
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
begin {
|
|
|
|
}
|
|
process {
|
|
$Output = @()
|
|
|
|
switch ($PsCmdlet.ParameterSetName) {
|
|
"VlanLookup" {
|
|
ForEach ($v in $Vlan) {
|
|
$InvokeResult = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.11.3/vlan?id=$v&_return_as_object=1&_return_fields=assigned_to,id,name,parent,comment,description" -ContentType "application/json" -Credential $Credential
|
|
$InvokePSObject = $InvokeResult.result | Select-Object id, Name, Comment, @{n = "AssignedTo"; e = { $_.Assigned_to.split(':')[1] -replace '/default' } }
|
|
$Output += $InvokePSObject
|
|
}
|
|
}
|
|
"CIDRLookup" {
|
|
ForEach ($c in $CIDR) {
|
|
$InvokeResult = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.11.3/vlan?_return_as_object=1&_max_results=-50000&_return_fields=assigned_to,id,name,parent,comment,description" -ContentType "application/json" -Credential $Credential
|
|
$InvokePSObject = $InvokeResult.result | Select-Object id, Name, Comment, @{n = "AssignedTo"; e = { $_.Assigned_to.split(':')[1] -replace '/default' } }
|
|
$Output += $InvokePSObject | Where-Object AssignedTo -EQ $c
|
|
}
|
|
}
|
|
"default" {
|
|
$InvokeResult = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.11.3/vlan?_return_as_object=1&_max_results=-50000&_return_fields=assigned_to,id,name,parent,comment,description" -ContentType "application/json" -Credential $Credential
|
|
$InvokePSObject = $InvokeResult.result | Select-Object id, Name, Comment, @{n = "AssignedTo"; e = { $_.Assigned_to.split(':')[1] -replace '/default' } }
|
|
$Output = $InvokePSObject
|
|
}
|
|
}
|
|
}
|
|
end {
|
|
Write-Output $Output
|
|
}
|
|
}
|
|
|
|
function Remove-ITDIbDnsRecord {
|
|
[CmdletBinding()]
|
|
param (
|
|
[string]
|
|
$ComputerName,
|
|
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
|
|
Begin {
|
|
If (!($Credential)) {
|
|
$Credential = Get-Credential
|
|
}
|
|
|
|
|
|
}
|
|
Process {
|
|
$DNSRecord = Invoke-RestMethod -Method Get -Uri "https://infoblox-gmv.ns.nd.gov/wapi/v2.7/record:host?name=$ComputerName" -ContentType "application/json" -Credential $Credential
|
|
$UriToDelete = ( "https://infoblox-gmv.ns.nd.gov/wapi/v2.7/" + $DNSRecord._ref )
|
|
Invoke-RestMethod -Method Delete -Uri $UriToDelete -ContentType "application/json" -Credential $Credential
|
|
}
|
|
|
|
end {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|