-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb_readers.go
More file actions
170 lines (152 loc) · 4.1 KB
/
db_readers.go
File metadata and controls
170 lines (152 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package main
import (
"database/sql"
"fmt"
"iter"
"github.com/monoidic/dns"
)
func getDbFieldData(qs string, db *sql.DB) iter.Seq[fieldData] {
return func(yield func(fieldData) bool) {
tx := check1(db.Begin())
defer func() { check(tx.Commit()) }()
rows := check1(tx.Query(qs))
defer rows.Close()
for rows.Next() {
var fd fieldData
check(rows.Scan(&fd.name, &fd.id))
if !yield(fd) {
return
}
}
}
}
func getDbNameData(qs string, db *sql.DB) iter.Seq[nameData] {
return func(yield func(nameData) bool) {
for v := range getDbFieldData(qs, db) {
e := nameData{name: mustParseName(v.name), id: v.id}
if !yield(e) {
return
}
}
}
}
// wrapper that prepends `_dmarc.` to the name while keeping the id the same
func getUnqueriedDMARC(db *sql.DB) iter.Seq[nameData] {
return func(yield func(nameData) bool) {
var err error
for fd := range getDbNameData(`
SELECT DISTINCT zone.name, zone.id
FROM name AS zone
WHERE zone.dmarc_tried=FALSE
AND zone.is_zone=TRUE AND zone.registered=TRUE AND zone.valid=TRUE
`, db) {
fd.name, err = dns.NameFromLabels(append([]string{"_dmarc"}, fd.name.SplitRaw()...))
if err == nil && !yield(fd) {
return
}
}
}
}
func getUnqueriedChaosTXT(db *sql.DB) iter.Seq[fieldData] {
var v4Filter string
if !v6 {
v4Filter = `AND ip.address LIKE '%.%'`
}
filter := fmt.Sprintf(`
SELECT address, id
FROM ip
WHERE ch_resolved=FALSE
AND ip.responsive=TRUE
%s
`, v4Filter)
return getDbFieldData(filter, db)
}
func netZoneReader(db *sql.DB, extraFilter string) iter.Seq[nameData] {
qs := fmt.Sprintf(`
SELECT zone.name, zone.id
FROM name AS zone
WHERE zone.is_zone=TRUE AND zone.registered=TRUE AND zone.valid=TRUE
%s
`, extraFilter)
return getDbNameData(qs, db)
}
func zoneNsIpReader(db *sql.DB) iter.Seq[zoneIP] {
return func(yield func(zoneIP) bool) {
qs := `
SELECT DISTINCT zone.name, ip.address, zone.id, ip.id
FROM zone_ns
INNER JOIN name AS zone ON zone_ns.zone_id = zone.id
INNER JOIN name_ip ON zone_ns.ns_id = name_ip.name_id
INNER JOIN ip ON name_ip.ip_id = ip.id
WHERE zone.is_zone=TRUE AND zone.registered=TRUE AND zone.valid=TRUE
`
tx := check1(db.Begin())
defer func() { check(tx.Commit()) }()
rows := check1(tx.Query(qs))
defer rows.Close()
for rows.Next() {
var zip zoneIP
var zoneName string
check(rows.Scan(&zoneName, &zip.ip.name, &zip.zone.id, &zip.ip.id))
zip.zone.name = mustParseName(zoneName)
if !yield(zip) {
return
}
}
}
}
func zoneNsIpParentReader(db *sql.DB) iter.Seq[zoneIP] {
return func(yield func(zoneIP) bool) {
qs := `
SELECT DISTINCT zone.name, ip.address, zone.id, ip.id
FROM name AS zone
INNER JOIN name AS parent ON zone.parent_id=parent.id
INNER JOIN zone_ns ON zone_ns.zone_id=parent.id
INNER JOIN name_ip ON name_ip.name_id=zone_ns.ns_id
INNER JOIN ip ON name_ip.ip_id = ip.id
WHERE zone.is_zone=TRUE AND parent.is_zone=TRUE
AND ip.responsive=TRUE
AND zone.registered=TRUE AND zone.valid=TRUE
AND parent.registered=TRUE AND parent.valid=TRUE
`
tx := check1(db.Begin())
defer func() { check(tx.Commit()) }()
rows := check1(tx.Query(qs))
defer rows.Close()
for rows.Next() {
var zip zoneIP
var zoneName string
check(rows.Scan(&zoneName, &zip.ip.name, &zip.zone.id, &zip.ip.id))
zip.zone.name = mustParseName(zoneName)
if !yield(zip) {
return
}
}
}
}
func parentNSReader(db *sql.DB) iter.Seq[zoneIP] {
return func(yield func(zoneIP) bool) {
qs := `
SELECT DISTINCT zone.name, ip.address, zone.id, ip.id
FROM zone_ns_ip_glue
INNER JOIN name AS zone ON zone_ns_ip_glue.zone_id=zone.id
INNER JOIN ip ON zone_ns_ip_glue.ip_id=ip.id
WHERE zone_ns_ip_glue.fetched=FALSE
AND ip.responsive=TRUE
AND zone.is_zone=TRUE AND zone.registered=TRUE AND zone.valid=TRUE
`
tx := check1(db.Begin())
defer func() { check(tx.Commit()) }()
rows := check1(tx.Query(qs))
defer rows.Close()
for rows.Next() {
var zip zoneIP
var zoneName string
check(rows.Scan(&zoneName, &zip.ip.name, &zip.zone.id, &zip.ip.id))
zip.zone.name = mustParseName(zoneName)
if !yield(zip) {
return
}
}
}
}