master
go 115 lines 2.14 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package dnsquery
4
5 import (
6 "errors"
7 "fmt"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10
11 "github.com/miekg/dns"
12 )
13
14 func (c *Collector) verifyConfig() error {
15 if len(c.Domains) == 0 {
16 return errors.New("no domains specified")
17 }
18
19 switch c.Network {
20 case "", "udp", "tcp", "tcp-tls":
21 default:
22 return fmt.Errorf("wrong network transport : %s", c.Network)
23 }
24
25 if c.RecordType != "" {
26 c.Warning("'record_type' config option is deprecated, use 'record_types' instead")
27 c.RecordTypes = append(c.RecordTypes, c.RecordType)
28 }
29
30 if len(c.RecordTypes) == 0 {
31 return errors.New("no record types specified")
32 }
33
34 return nil
35 }
36
37 func (c *Collector) initServers() error {
38 if len(c.Servers) != 0 {
39 return nil
40 }
41 servers, err := getResolvConfNameservers()
42 if err != nil {
43 return err
44 }
45 if len(servers) == 0 {
46 return errors.New("no resolv conf nameservers")
47 }
48
49 c.Debugf("resolv conf nameservers: %v", servers)
50 c.Servers = servers
51
52 return nil
53 }
54
55 func (c *Collector) initRecordTypes() (map[string]uint16, error) {
56 types := make(map[string]uint16)
57 for _, v := range c.RecordTypes {
58 rtype, err := parseRecordType(v)
59 if err != nil {
60 return nil, err
61 }
62 types[v] = rtype
63
64 }
65
66 return types, nil
67 }
68
69 func (c *Collector) initCharts() (*collectorapi.Charts, error) {
70 charts := collectorapi.Charts{}
71
72 for _, srv := range c.Servers {
73 for _, rtype := range c.RecordTypes {
74 cs := newDNSServerCharts(srv, c.Network, rtype)
75 if err := charts.Add(*cs...); err != nil {
76 return nil, err
77 }
78 }
79 }
80
81 return &charts, nil
82 }
83
84 func parseRecordType(recordType string) (uint16, error) {
85 var rtype uint16
86
87 switch recordType {
88 case "A":
89 rtype = dns.TypeA
90 case "AAAA":
91 rtype = dns.TypeAAAA
92 case "ANY":
93 rtype = dns.TypeANY
94 case "CNAME":
95 rtype = dns.TypeCNAME
96 case "MX":
97 rtype = dns.TypeMX
98 case "NS":
99 rtype = dns.TypeNS
100 case "PTR":
101 rtype = dns.TypePTR
102 case "SOA":
103 rtype = dns.TypeSOA
104 case "SPF":
105 rtype = dns.TypeSPF
106 case "SRV":
107 rtype = dns.TypeSRV
108 case "TXT":
109 rtype = dns.TypeTXT
110 default:
111 return 0, fmt.Errorf("unknown record type : %s", recordType)
112 }
113
114 return rtype, nil
115 }