Functions/NIOS/Copy-NIOSSubzoneToBloxOne.ps1
function Copy-NIOSSubzoneToBloxOne { <# .SYNOPSIS Used to copy/migrate Authoritative Zone data from NIOS to BloxOneDDI .DESCRIPTION This function is used to copy/migrate Authoritative Zone data from NIOS to BloxOneDDI .PARAMETER Server The NIOS Grid Master FQDN .PARAMETER Subzone The name of the subzone to copy/migrate .PARAMETER NIOSView The DNS View within NIOS where the subzone is located .PARAMETER B1View The DNS View within BloxOne where the subzone is to be copied/migrated to .PARAMETER RecordTypes A list of one or more record types to copy. If not specified, all supported record types will be copied. .PARAMETER Confirm Set this parameter to false to ignore confirmation prompts .PARAMETER IncludeDHCP Use this option to include DHCP addresses when copying/migrating the subzone. This is not recommended as these records will be created as static A records, not dynamic. .PARAMETER Test Specify -Test to verify what will be created, without actually creating it .PARAMETER CreateZones Use the -CreateZones parameter to indicate if missing zones should be first created in BloxOne. This required either -DNSHosts or -AuthNSGs to be specified. .PARAMETER DNSHosts Used in combination with -CreateZones to specify which DNS Host(s) the zone should be assigned to. .PARAMETER AuthNSGs Used in combination with -CreateZones to specify which Authoriative Name Server Group(s) the zone should be assigned to. .PARAMETER Creds Used when specifying NIOS credentials explicitly, if they have not been pre-defined using Store-NIOSCredentials .PARAMETER SkipCertificateCheck If this parameter is set, SSL Certificates Checks will be ignored .EXAMPLE Copy-NIOSSubzoneToBloxOne -Server gridmaster.domain.corp -Subzone my-dns.zone -NIOSView External -B1View my-b1dnsview -Test .EXAMPLE Copy-NIOSSubzoneToBloxOne -Server gridmaster.domain.corp -Subzone my-dns.zone -NIOSView External -B1View my-b1dnsview -Confirm:$false .EXAMPLE Copy-NIOSSubzoneToBloxOne -Server gridmaster.domain.corp -Subzone my-dns.zone -NIOSView External -B1View my-b1dnsview -CreateZones -AuthNSGs "Core DNS Group" .FUNCTIONALITY NIOS .FUNCTIONALITY Migration #> [Alias("Migrate-NIOSSubzoneToBloxOne")] param( [String]$Server, [Parameter(Mandatory=$true)] [String]$Subzone, [Parameter(Mandatory=$true)] [String]$NIOSView, [Parameter(Mandatory=$true)] [String]$B1View, [ValidateSet("A","CNAME","PTR","TXT","SRV","MX","AAAA","CAA","NS")] ## To be added "NAPTR" [String[]]$RecordTypes, [Bool]$Confirm = $true, [Switch]$IncludeDHCP = $false, [Switch]$Test = $false, [Switch]$CreateZones = $false, [System.Object]$DNSHosts, [System.Object]$AuthNSGs, [PSCredential]$Creds, [Switch]$SkipCertificateCheck ) $Export = @() $SubzoneData = @() if (!(Get-NIOSAuthoritativeZone -Server $Server -Creds $Creds -FQDN $Subzone -View $NIOSView -SkipCertificateCheck:$SkipCertificateCheck)) { Write-Host "Error. Authorative zone does not exist in NIOS." -ForegroundColor Red } else { Write-Host "Obtaining list of records from $Subzone..." -ForegroundColor Cyan if (!$RecordTypes) { [String[]]$RecordTypes = "host","a","cname","srv","txt","mx","aaaa","caa","ns" } foreach ($RT in $RecordTypes.toLower()) { Write-Host "Querying $RT records" -ForegroundColor Cyan $ReturnFields = "&_return_fields%2b=" if ($RT -notin ("ns")) { $ReturnFields = $ReturnFields + "comment" } if ($RT -in ("a","cname")) { $ReturnFields = $ReturnFields + ",creator" } if ($RT -in "caa") { $ReturnFields = $ReturnFields + ",ca_flag,ca_tag,ca_value" } $SubzoneData += Query-NIOS -Method GET -Server $Server -Uri "record:$($RT)?zone=$($Subzone)&view=$($NIOSView)&_return_as_object=1$ReturnFields" -Creds $Creds -SkipCertificateCheck:$SkipCertificateCheck | Select-Object -ExpandProperty results -ErrorAction SilentlyContinue } if (!$IncludeDHCP) { $SubzoneData = $SubzoneData | Where-Object {$_.Creator -eq "STATIC" -or (!$_.Creator)} } foreach ($SubzoneItem in $SubzoneData) { $SubzoneItem._ref -match "(record\:\w+)\/.*" | Out-Null $RecordType = $Matches[1] if ($Debug) {Write-Host "$($RecordType)?name=$($SubzoneItem.name+"."+$SubzoneItem.zone)&_return_as_object=1"} switch ($RecordType) { "record:host" { $HostData = $SubzoneItem.ipv4addrs.ipv4addr } "record:a" { $HostData = $SubzoneItem.ipv4addr } "record:aaaa" { $HostData = $SubzoneItem.ipv6addr } "record:cname" { $HostData = $SubzoneItem.canonical+"." } "record:srv" { $HostData = "$($SubzoneItem.target):$($SubzoneItem.port):$($SubzoneItem.priority):$($SubzoneItem.weight)" } "record:txt" { $HostData = $SubzoneItem.text } "record:mx" { $HostData = "$($SubzoneItem.mail_exchanger):$($SubzoneItem.preference)" } "record:caa" { $HostData = "$($SubzoneItem.ca_flag):$($SubzoneItem.ca_tag):$($SubzoneItem.ca_value)" } "record:ns" { $HostData = $SubzoneItem.nameserver } "default" { $HostData = $null } } if (($SubzoneItem.name -split ("\.$($Subzone)") | Select-Object -First 1) -eq $Subzone) { $SubzoneItem.name = "" } $splat = @{ "Type" = $RecordType "Name" = $SubzoneItem.name -split ("\.$($Subzone)") | Select-Object -First 1 "Comment" = $SubzoneItem.comment "Data" = $HostData } $Export += $splat } Write-Host "The following records are ready to copy." -ForegroundColor Green $Export | ConvertTo-Json | ConvertFrom-Json | Format-Table -AutoSize } if ($Confirm -and -not $Test) { Write-Host "Review Information" -ForegroundColor Yellow Write-Warning "Are you sure you want to continue with copying this DNS Zone to BloxOne?" -WarningAction Inquire } if (!(Get-B1AuthoritativeZone -FQDN $Subzone -View $B1View)) { if ($CreateZones) { if ($DNSHosts -or $AuthNSGs) { New-B1AuthoritativeZone -FQDN $Subzone -View $B1View -DNSHosts $DNSHosts -AuthNSGs $AuthNSGs Wait-Event -Timeout 10 } else { Write-Host "Error. You must specify -DNSHosts or -AuthNSGs when -CreateZones is $true" -ForegroundColor Red break } } else { Write-Host "Error. Authorative Zone $Subzone not found in BloxOne." -ForegroundColor Red break } } if (!($Test)) { Write-Host "Syncing $($Subzone) to BloxOneDDI in View $B1View.." -ForegroundColor Magenta $Records = Get-B1Record -Zone $Subzone -View $B1View foreach ($ExportedItem in $Export) { switch ($ExportedItem.type) { "record:host" { $FoundRecords = $Records | Where-Object {$_.type -eq "A" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?"} if ($FoundRecords) { Write-Host "A Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "A" -Name $ExportedItem.name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -CreatePTR:$true -SkipExistsErrors -Description $ExportedItem.Comment if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as A Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:a" { $FoundRecords = $Records | Where-Object {$_.type -eq "A" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?"} if ($FoundRecords) { Write-Host "A Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "A" -Name $ExportedItem.name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -CreatePTR:$true -SkipExistsErrors -Description $ExportedItem.Comment if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as A Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:aaaa" { $FoundRecords = $Records | Where-Object {$_.type -eq "AAAA" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?"} if ($FoundRecords) { Write-Host "AAAA Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "AAAA" -Name $ExportedItem.Name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -Description $ExportedItem.Comment if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as AAAA Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:cname" { $FoundRecords = $Records | Where-Object {$_.type -eq "CNAME" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?"} if ($FoundRecords) { Write-Host "A Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "CNAME" -Name $ExportedItem.name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -CreatePTR:$false -SkipExistsErrors -Description $ExportedItem.Comment if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as CNAME Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:srv" { $FoundRecords = $Records | Where-Object {$_.type -eq "SRV" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?"} if ($FoundRecords) { Write-Host "SRV Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $ExportedData = $ExportedItem.data.split(":") $CreateResult = New-B1Record -Type "SRV" -Name $ExportedItem.Name -Zone $Subzone -rdata $ExportedData[0] -Port $ExportedData[1] -Priority $ExportedData[2] -Weight $ExportedData[3] -view $B1View -CreatePTR:$false -SkipExistsErrors if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as SRV Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:txt" { $FoundRecords = $Records | Where-Object {$_.type -eq "TXT" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?" -and $_.rdata.text -eq $ExportedItem.data} if ($FoundRecords) { Write-Host "TXT Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "TXT" -Name $ExportedItem.Name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -CreatePTR:$false -SkipExistsErrors -Description $ExportedItem.Comment if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as TXT Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:mx" { $ExportedData = $ExportedItem.data.split(":") $FoundRecords = $Records | Where-Object {$_.type -eq "MX" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?" -and $_.rdata.exchange -match "$($ExportedData[0])(\.)?"} if ($FoundRecords) { Write-Host "MX Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "MX" -Name $ExportedItem.Name -Zone $Subzone -Exchange $ExportedData[0] -Preference $ExportedData[1] -view $B1View -Description $ExportedItem.Comment -SkipExistsErrors -IgnoreExists if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as MX Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:caa" { $ExportedData = $ExportedItem.data.split(":") $FoundRecords = $Records | Where-Object {$_.type -eq "CAA" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?" -and $_.rdata.value -eq $ExportedData[2]} if ($FoundRecords) { Write-Host "CAA Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "CAA" -Name $ExportedItem.Name -Zone $Subzone -CAFlag $ExportedData[0] -CATag $ExportedData[1] -CAValue $ExportedData[2] -view $B1View -Description $ExportedItem.Comment -IgnoreExists if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as CAA Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } "record:ns" { $FoundRecords = $Records | Where-Object {$_.type -eq "NS" -and $_.name_in_zone -eq $ExportedItem.name -and $_.absolute_zone_name -match "$Subzone(\.)?" -and $_.rdata.dname -match "$($ExportedItem.data)(\.)?"} if ($FoundRecords) { Write-Host "NS Record already exists: $($FoundRecords.absolute_name_spec)" -ForegroundColor DarkYellow } else { $CreateResult = New-B1Record -Type "NS" -Name $ExportedItem.Name -Zone $Subzone -rdata $ExportedItem.data -view $B1View -Description $ExportedItem.Comment -IgnoreExists if ($CreateResult) { Write-Host "Created $($ExportedItem.name) as NS Record with data $($ExportedItem.data) in View $B1View." -ForegroundColor Green } } } } } Write-Host "Completed Syncing $($Subzone) to BloxOneDDI in View $B1View.." -ForegroundColor Green } } |