Switch Open Data .ch and .li Domains
Hi All,
Switch the Swiss Registrar for .ch and .li Domains has published the Domains on a Open Data Policy.
You can download the top 1'000 Domains or use a Zone Transfer
Switch Open Data
You need to create the TSIG Key
# filename ch_zonedata.key
key tsig-zonedata-ch-public-21-01 { algorithm hmac-sha512; secret "stZwEGApYumtXkh73qMLPqfbIDozWKZLkqRvcjKSpRnsor6A6MxixRL6C2HeSVBQNfMW4wer+qjS0ZSfiWiJ3Q=="; };
then use dig to initiate the Zone Transfer
dig -k ch_zonedata.key @zonedata.switch.ch +noall +answer +noidnout +onesoa AXFR ch. > ch.txt
Looks like this
I have used psftp.exe to transfer the ch.txt File to my Computer
open 172.21.175.80
cd /var/tmp
lcd E:\
get ch.txt
The Zone File looks like "TAB" separated. But is not consistent in any way.
It took me quite a while to write a performant PowerShell Script that fixes all these "issues" in the .ch Zone File.
###############################################################################
# Fix Tab in .ch Zone File
# 30.08.2022 Andres Bohren / https://blog.icewolf.ch
###############################################################################
$INfile = "E:\ch.txt"
$OUTfile = "E:\ch_psedit.txt"
$reader = new-object system.IO.StreamReader($INfile)
$writer = new-object system.IO.StreamWriter($OUTfile, 0)
$Start = Get-Date
$ArrayDomains = New-Object System.Collections.ArrayList
#$ArrayDomains = @()
$Int = 0
while ($line = $reader.ReadLine())
{
# do your thing
$Int = $Int + 1
$Line = $Line.Replace("`t`t`t","`t")
$Line = $Line.Replace("`t`t","`t")
$Line = $Line.Replace(".ch. 3600",".ch.`t3600")
$Line = $Line.Replace(".ch. 3600",".ch.`t3600")
$Line = $Line.Replace("3600 IN RRSIG","3600`tIN`tRRSIG")
$Line = $Line.Replace("3600 IN DS","3600`tIN`tDS")
$Line = $Line.Replace("3600 IN NS","3600`tIN`tNS")
$Line = $Line.Replace("3600 IN","3600`tIN")
$Line = $Line.Replace("IN`tDS ","IN`tDS`t")
$Line = $Line.Replace("IN`tNS ","IN`tNS`t")
$Line = $Line.Replace("IN RRSIG","IN`tRRSIG")
$Line = $Line.Replace("IN DS","IN`tDS")
$Line = $Line.Replace("IN NS","IN`tNS")
$Line = $Line.Replace("IN`tDS ","IN`tDS`t")
$Line = $Line.Replace(".ch. 900 IN NSEC3",".ch.`t900`tIN`tNSEC3")
$Line = $Line.Replace(".ch. 900 IN RRSIG",".ch.`t900`tIN`tRRSIG")
$Line = $Line.Replace("IN`tNSEC3 ","IN`tNSEC3`t")
$Line = $Line.Replace("IN`tRRSIG ","IN`tRRSIG`t")
$Line = $Line.Replace(".ch. 900 IN",".ch.`t900`tIN")
$Line = $Line.Replace("IN`tRRSIG DS","IN`tRRSIG`tDS")
$Writer.WriteLine("$Line")
$Domain = $Line.Split("`t")[0]
$Domain = $Domain.Substring(0,$Domain.Length -1)
If ($Int%10000 -eq 0)
{
Write-Host "Domain: $Domain [$int]"
}
}
$End = Get-Date
$Timespan = New-TimeSpan -Start $Start -End $End
$Timespan
Write-Host "Lines processed: $INT" -ForegroundColor Green
$reader.close()
$writer.Close()
# Fix Tab in .ch Zone File
# 30.08.2022 Andres Bohren / https://blog.icewolf.ch
###############################################################################
$INfile = "E:\ch.txt"
$OUTfile = "E:\ch_psedit.txt"
$reader = new-object system.IO.StreamReader($INfile)
$writer = new-object system.IO.StreamWriter($OUTfile, 0)
$Start = Get-Date
$ArrayDomains = New-Object System.Collections.ArrayList
#$ArrayDomains = @()
$Int = 0
while ($line = $reader.ReadLine())
{
# do your thing
$Int = $Int + 1
$Line = $Line.Replace("`t`t`t","`t")
$Line = $Line.Replace("`t`t","`t")
$Line = $Line.Replace(".ch. 3600",".ch.`t3600")
$Line = $Line.Replace(".ch. 3600",".ch.`t3600")
$Line = $Line.Replace("3600 IN RRSIG","3600`tIN`tRRSIG")
$Line = $Line.Replace("3600 IN DS","3600`tIN`tDS")
$Line = $Line.Replace("3600 IN NS","3600`tIN`tNS")
$Line = $Line.Replace("3600 IN","3600`tIN")
$Line = $Line.Replace("IN`tDS ","IN`tDS`t")
$Line = $Line.Replace("IN`tNS ","IN`tNS`t")
$Line = $Line.Replace("IN RRSIG","IN`tRRSIG")
$Line = $Line.Replace("IN DS","IN`tDS")
$Line = $Line.Replace("IN NS","IN`tNS")
$Line = $Line.Replace("IN`tDS ","IN`tDS`t")
$Line = $Line.Replace(".ch. 900 IN NSEC3",".ch.`t900`tIN`tNSEC3")
$Line = $Line.Replace(".ch. 900 IN RRSIG",".ch.`t900`tIN`tRRSIG")
$Line = $Line.Replace("IN`tNSEC3 ","IN`tNSEC3`t")
$Line = $Line.Replace("IN`tRRSIG ","IN`tRRSIG`t")
$Line = $Line.Replace(".ch. 900 IN",".ch.`t900`tIN")
$Line = $Line.Replace("IN`tRRSIG DS","IN`tRRSIG`tDS")
$Writer.WriteLine("$Line")
$Domain = $Line.Split("`t")[0]
$Domain = $Domain.Substring(0,$Domain.Length -1)
If ($Int%10000 -eq 0)
{
Write-Host "Domain: $Domain [$int]"
}
}
$End = Get-Date
$Timespan = New-TimeSpan -Start $Start -End $End
$Timespan
Write-Host "Lines processed: $INT" -ForegroundColor Green
$reader.close()
$writer.Close()
This Script converts the File in TAB Separated Columns and adds CRLF at the end of the Line.
The File still has over 10'000'000 Lines. As you can see there are multiple Lines for the same Domain.
We need to find a way to make them Unique.
I use the "SQL Server Import and Export Wizard" to import the File into a SQL Database
Source: Flat File Source
Set the Names of the Columns
Preview looks fine
Destination: SQL Server Express
Create new Database: db_domain_raw
Now i can use the "Select Distinct" to find out Unique Domains
USE db_domain_raw
GO
SELECT DISTINCT RTRIM(Domain) as Domain FROM ch_psedit WHERE RecordType = 'NS'
ORDER BY Domain ASC
GO
SELECT DISTINCT RTRIM(Domain) as Domain FROM ch_psedit WHERE RecordType = 'NS'
ORDER BY Domain ASC
After two Minutes it's clear that there are about 2.4 Mio .ch Domains
Regards
Andres Bohren