@@ -3,14 +3,65 @@ package checkdns
3
3
import (
4
4
"fmt"
5
5
"net"
6
+ "os"
6
7
"strconv"
8
+
9
+ "github.com/jessevdk/go-flags"
10
+ "github.com/mackerelio/checkers"
11
+ "github.com/miekg/dns"
7
12
)
8
13
14
+ type dnsOpts struct {
15
+ Host string `short:"H" long:"host" required:"true" description:"The name or address you want to query"`
16
+ Server string `short:"s" long:"server" description:"DNS server you want to use for the lookup"`
17
+ Port int `short:"p" long:"port" default:"53" description:"Port number you want to use"`
18
+ }
19
+
20
+ // Do the plugin
9
21
func Do () {
10
- nameserver , err := adapterAddress ()
22
+ Run (os .Args [1 :])
23
+ }
24
+
25
+ func parseArgs (args []string ) (* dnsOpts , error ) {
26
+ opts := & dnsOpts {}
27
+ _ , err := flags .ParseArgs (opts , args )
28
+ return opts , err
29
+ }
30
+
31
+ func Run (args []string ) * checkers.Checker {
32
+ opts , err := parseArgs (args )
33
+ if err != nil {
34
+ os .Exit (1 )
35
+ }
36
+ var nameserver string
37
+ if opts .Server != "" {
38
+ nameserver = opts .Server
39
+ } else {
40
+ nameserver , err = adapterAddress ()
41
+ if err != nil {
42
+ return checkers .Critical (err .Error ())
43
+ }
44
+ }
45
+ nameserver = net .JoinHostPort (nameserver , strconv .Itoa (opts .Port ))
46
+
47
+ c := new (dns.Client )
48
+ m := & dns.Msg {
49
+ MsgHdr : dns.MsgHdr {
50
+ Opcode : dns .OpcodeQuery ,
51
+ },
52
+ Question : []dns.Question {{Name : dns .Fqdn (opts .Host ), Qtype : dns .TypeA , Qclass : uint16 (dns .ClassINET )}},
53
+ }
54
+
55
+ r , _ , err := c .Exchange (m , nameserver )
11
56
if err != nil {
12
- fmt .Println (err )
57
+ return checkers .Critical (err .Error ())
58
+ }
59
+
60
+ checkSt := checkers .OK
61
+ if r .MsgHdr .Rcode != dns .RcodeSuccess {
62
+ checkSt = checkers .CRITICAL
13
63
}
14
- nameserver = net .JoinHostPort (nameserver , strconv .Itoa (53 ))
15
- fmt .Println (nameserver )
64
+ msg := fmt .Sprintf ("%s" , r )
65
+
66
+ return checkers .NewChecker (checkSt , msg )
16
67
}
0 commit comments