Browse Source

querylog: Add software version, answer data and IsTCP fields

Ask Bjørn Hansen 2 years ago
parent
commit
e1626e2c1b
4 changed files with 81 additions and 37 deletions
  1. 2 1
      geodns-logs/stats.go
  2. 35 0
      querylog/file.go
  3. 4 31
      querylog/querylog.go
  4. 40 5
      server/serve.go

+ 2 - 1
geodns-logs/stats.go

@@ -6,9 +6,10 @@ import (
 	"strings"
 	"time"
 
-	"github.com/abh/geodns/v3/querylog"
 	"github.com/miekg/dns"
 	"github.com/prometheus/client_golang/prometheus"
+
+	"github.com/abh/geodns/v3/querylog"
 )
 
 type statsEntry struct {

+ 35 - 0
querylog/file.go

@@ -0,0 +1,35 @@
+package querylog
+
+import (
+	"encoding/json"
+
+	"gopkg.in/natefinch/lumberjack.v2"
+)
+
+type FileLogger struct {
+	logger lumberjack.Logger
+}
+
+func NewFileLogger(filename string, maxsize int, keep int) (*FileLogger, error) {
+	fl := &FileLogger{}
+	fl.logger = lumberjack.Logger{
+		Filename:   filename,
+		MaxSize:    maxsize, // megabytes
+		MaxBackups: keep,
+	}
+	return fl, nil
+}
+
+func (l *FileLogger) Write(e *Entry) error {
+	js, err := json.Marshal(e)
+	if err != nil {
+		return err
+	}
+	js = append(js, []byte("\n")...)
+	_, err = l.logger.Write(js)
+	return err
+}
+
+func (l *FileLogger) Close() error {
+	return l.logger.Close()
+}

+ 4 - 31
querylog/querylog.go

@@ -1,16 +1,10 @@
 package querylog
 
-import (
-	"encoding/json"
-
-	"gopkg.in/natefinch/lumberjack.v2"
-)
-
 type QueryLogger interface {
 	Write(*Entry) error
+	Close() error
 }
 
-// easyjson:json
 type Entry struct {
 	Time       int64
 	Hostname   string `json:",omitempty"` // not filled in by geodns
@@ -20,37 +14,16 @@ type Entry struct {
 	Rcode      int
 	Answers    int
 	Targets    []string
+	AnswerData []string
 	LabelName  string
 	RemoteAddr string
 	ClientAddr string
 	HasECS     bool
+	IsTCP      bool
+	Version    string
 
 	// todo:
 	// - GeoDNS version
 	// - TCP?
 	// - log the answer data
 }
-
-type FileLogger struct {
-	logger lumberjack.Logger
-}
-
-func NewFileLogger(filename string, maxsize int, keep int) (*FileLogger, error) {
-	fl := &FileLogger{}
-	fl.logger = lumberjack.Logger{
-		Filename:   filename,
-		MaxSize:    maxsize, // megabytes
-		MaxBackups: keep,
-	}
-	return fl, nil
-}
-
-func (l *FileLogger) Write(e *Entry) error {
-	js, err := json.Marshal(e)
-	if err != nil {
-		return err
-	}
-	js = append(js, []byte("\n")...)
-	_, err = l.logger.Write(js)
-	return err
-}

+ 40 - 5
server/serve.go

@@ -4,6 +4,7 @@ import (
 	"encoding/hex"
 	"encoding/json"
 	"fmt"
+	"log"
 	"net"
 	"os"
 	"strconv"
@@ -33,11 +34,19 @@ func (srv *Server) serve(w dns.ResponseWriter, req *dns.Msg, z *zones.Zone) {
 	var qle *querylog.Entry
 
 	if srv.queryLogger != nil {
+
+		var isTcp bool
+		if net := w.LocalAddr().Network(); net == "tcp" {
+			isTcp = true
+		}
+
 		qle = &querylog.Entry{
-			Time:   time.Now().UnixNano(),
-			Origin: z.Origin,
-			Name:   strings.ToLower(qnamefqdn),
-			Qtype:  qtype,
+			Time:    time.Now().UnixNano(),
+			Origin:  z.Origin,
+			Name:    strings.ToLower(qnamefqdn),
+			Qtype:   qtype,
+			Version: srv.info.Version,
+			IsTCP:   isTcp,
 		}
 		defer srv.queryLogger.Write(qle)
 	}
@@ -106,6 +115,29 @@ func (srv *Server) serve(w dns.ResponseWriter, req *dns.Msg, z *zones.Zone) {
 		defer func() {
 			qle.Rcode = m.Rcode
 			qle.Answers = len(m.Answer)
+
+			for _, rr := range m.Answer {
+				var s string
+				switch a := rr.(type) {
+				case *dns.A:
+					s = a.A.String()
+				case *dns.AAAA:
+					s = a.AAAA.String()
+				case *dns.CNAME:
+					s = a.Target
+				case *dns.MX:
+					s = a.Mx
+				case *dns.NS:
+					s = a.Ns
+				case *dns.SRV:
+					s = a.Target
+				case *dns.TXT:
+					s = strings.Join(a.Txt, " ")
+				}
+				if len(s) > 0 {
+					qle.AnswerData = append(qle.AnswerData, s)
+				}
+			}
 		}()
 	}
 
@@ -285,7 +317,7 @@ func (srv *Server) serve(w dns.ResponseWriter, req *dns.Msg, z *zones.Zone) {
 		applog.Printf("Error writing packet: %q, %s", err, m)
 		dns.HandleFailed(w, req)
 	}
-	return
+
 }
 
 func (srv *Server) statusRR(label string) []dns.RR {
@@ -302,6 +334,9 @@ func (srv *Server) statusRR(label string) []dns.RR {
 	status["up"] = strconv.Itoa(int(time.Since(srv.info.Started).Seconds()))
 
 	js, err := json.Marshal(status)
+	if err != nil {
+		log.Printf("error marshaling json status: %s", err)
+	}
 
 	return []dns.RR{&dns.TXT{Hdr: h, Txt: []string{string(js)}}}
 }