Skip to content

Commit 56b341a

Browse files
committed
feat: resolve cname recursively
- create sub func to call recursively - update html table view to categorize result by query domains since recursive cname lookup will return A/AAAA of last cname
1 parent 59cdea6 commit 56b341a

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

internal/dnslookup/dnslookup.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ func randomHostname() string {
2323
// GetDNSRecords returns DNS records for a given hostname
2424
func GetDNSRecords(hostname string) []models.DNSRecord {
2525
var records []models.DNSRecord
26+
resolveDNS(hostname, &records)
27+
return records
28+
}
29+
30+
// resolveDNS resolves DNS records for a given hostname. It is a recursive function that resolves CNAME and A/AAAA records.
31+
func resolveDNS(hostname string, records *[]models.DNSRecord) {
2632
currentHost := hostname
2733
isWildcard := false
2834

@@ -47,9 +53,15 @@ func GetDNSRecords(hostname string) []models.DNSRecord {
4753
isWildcard = false // reset the wildcard flag
4854
}
4955

50-
records = append(records, models.DNSRecord{Host: cnameHost, Type: "CNAME", Data: cname})
56+
*records = append(*records, models.DNSRecord{Host: cnameHost, Type: "CNAME", Data: cname})
5157
// replace currentHost with the CNAME
5258
currentHost = cname
59+
60+
// recursively resolve the CNAME
61+
resolveDNS(currentHost, records)
62+
// no need to continue if it is a CNAME
63+
// so that, final CNAME will resolve the A/AAAA records
64+
return
5365
}
5466

5567
// A and AAAA lookup
@@ -63,12 +75,10 @@ func GetDNSRecords(hostname string) []models.DNSRecord {
6375
if err == nil {
6476
for _, ip := range ips {
6577
if ipv4 := ip.To4(); ipv4 != nil {
66-
records = append(records, models.DNSRecord{Host: currentHost, Type: "A", Data: ipv4.String()})
78+
*records = append(*records, models.DNSRecord{Host: currentHost, Type: "A", Data: ipv4.String()})
6779
} else {
68-
records = append(records, models.DNSRecord{Host: currentHost, Type: "AAAA", Data: ip.String()})
80+
*records = append(*records, models.DNSRecord{Host: currentHost, Type: "AAAA", Data: ip.String()})
6981
}
7082
}
7183
}
72-
73-
return records
7484
}

static/assets/js/script.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,30 @@ function displayResults(data) {
1414

1515
// Create header row
1616
const headerRow = document.createElement('tr');
17-
['Host', 'Type', 'Data'].forEach(headerText => {
17+
['Domain', 'Host', 'Type', 'Data'].forEach(headerText => {
1818
const th = document.createElement('th');
1919
th.textContent = headerText;
2020
headerRow.appendChild(th);
2121
});
2222
thead.appendChild(headerRow);
2323

2424
// Create rows for each host
25-
Object.keys(data).forEach(host => {
26-
data[host].forEach(record => {
25+
Object.keys(data).forEach(hostKey => {
26+
const hostRecords = data[hostKey];
27+
28+
// Merge cells for the host key
29+
const hostRowSpan = hostRecords.length;
30+
hostRecords.forEach((record, index) => {
2731
const tr = document.createElement('tr');
32+
33+
// Add host key column only for the first row
34+
if (index === 0) {
35+
const hostKeyTd = document.createElement('td');
36+
hostKeyTd.textContent = hostKey;
37+
hostKeyTd.rowSpan = hostRowSpan;
38+
tr.appendChild(hostKeyTd);
39+
}
40+
2841
const hostTd = document.createElement('td');
2942
hostTd.textContent = record.host;
3043
tr.appendChild(hostTd);

0 commit comments

Comments
 (0)