| 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 | } |