forked from tenta-browser/tenta-dns
/
loader.go
75 lines (69 loc) · 2.19 KB
/
loader.go
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
package zones
import (
"github.com/tenta-browser/tenta-dns/log"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"github.com/miekg/dns"
)
func LoadZones(path string) (ZoneSet, error) {
lg := log.GetLogger("zone-parser")
ret := NewZoneSet()
files, err := ioutil.ReadDir(path)
if err != nil {
lg.Errorf("Unable to open zones path %s: %s", path, err.Error())
return ret, err
}
for _, file := range files {
lg.Debugf("Found file %s", file.Name())
match, err := regexp.MatchString("^.*\\.tdns$", file.Name())
if err == nil && match {
origin := file.Name()[0 : len(file.Name())-4]
lg.Infof("Loading zone %s", origin)
path := filepath.Join(path, file.Name())
reader, err := os.Open(path)
if err != nil {
lg.Errorf("Failed to open file %s: %s", path, err.Error())
return ret, err
}
// defer reader.Close()
dns.PrivateHandle("GROUP", TypeGROUP, NewGROUP(lg))
dns.PrivateHandle("DYNA", TypeDYNA, NewDYNA)
for tkn := range dns.ParseZone(reader, origin, path) {
if tkn.Error != nil {
lg.Errorf("Zone %s: %s", origin, tkn.Error.Error())
return ret, err
} else {
switch tkn.RR.Header().Rrtype {
case TypeGROUP:
fallthrough
case TypeDYNA:
lg.Debugf("Skipping custom type")
lg.Debugf("Zone %s: %s [%s]", origin, tkn.RR.String(), tkn.Comment)
break
default:
if len(tkn.Header().Name) < 1 {
lg.Warnf("Got back a token with an empty name: %s", tkn.RR.String())
break
}
if _, ok := ret[tkn.Header().Name]; !ok {
ret[tkn.Header().Name] = NewZoneSetItem()
}
if _, ok := ret[tkn.Header().Name][tkn.Header().Rrtype]; !ok {
ret[tkn.Header().Name][tkn.Header().Rrtype] = make([]ZoneEntry, 0)
}
ret[tkn.Header().Name][tkn.Header().Rrtype] = append(ret[tkn.Header().Name][tkn.Header().Rrtype], ZoneEntry{ZoneEntryTypeRR, &tkn.RR})
break
}
}
}
// It's impossible to exit this loop without going through this finalizer. In the event this changes,
// care will need to be taken to ensure that the reader is closed and the types are removed.
dns.PrivateHandleRemove(TypeDYNA)
dns.PrivateHandleRemove(TypeGROUP)
reader.Close()
}
}
return ret, nil
}