Skip to content

Commit 6f17b17

Browse files
committed
Start using slog in library code, closes #26
1 parent b9be48c commit 6f17b17

File tree

9 files changed

+108
-55
lines changed

9 files changed

+108
-55
lines changed

.github/workflows/lint.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ jobs:
2323
with:
2424
# This field is required. Dont set the patch version to always use
2525
# the latest patch version.
26-
version: v1.56.2
26+
version: 1.64.7

client.go

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import (
44
"crypto/ed25519"
55
"encoding/binary"
66
"fmt"
7+
"log/slog"
78
"net"
89
"strings"
910
"time"
1011

1112
"github.com/AdguardTeam/golibs/errors"
12-
"github.com/AdguardTeam/golibs/log"
13+
"github.com/AdguardTeam/golibs/logutil/slogutil"
1314
"github.com/ameshkov/dnsstamps"
1415
"github.com/miekg/dns"
1516
)
@@ -19,8 +20,12 @@ type Client struct {
1920
Net string // protocol (can be "udp" or "tcp", by default - "udp")
2021
Timeout time.Duration // read/write timeout
2122

23+
// Logger is a logger instance for Client. If not set, slog.Default() will
24+
// be used.
25+
Logger *slog.Logger
26+
2227
// UDPSize is the maximum size of a DNS response (or query) this client can
23-
// sent or receive. If not set, we use dns.MinMsgSize by default.
28+
// send or receive. If not set, we use dns.MinMsgSize by default.
2429
UDPSize int
2530
}
2631

@@ -250,9 +255,9 @@ func (c *Client) fetchCert(stamp dnsstamps.ServerStamp) (cert *Cert, err error)
250255
continue
251256
}
252257

253-
cert, err = parseCert(stamp, currentCert, providerName, strings.Join(txt.Txt, ""))
258+
cert, err = c.parseCert(stamp, currentCert, providerName, strings.Join(txt.Txt, ""))
254259
if err != nil {
255-
log.Debug("[%s] bad cert: %s", providerName, err)
260+
c.logger().Debug("bad cert", "provider", providerName, slogutil.KeyError, err)
256261

257262
continue
258263
} else if cert == nil {
@@ -275,7 +280,7 @@ func (c *Client) fetchCert(stamp dnsstamps.ServerStamp) (cert *Cert, err error)
275280

276281
// parseCert parses a certificate from its string form and returns it if it has
277282
// priority over currentCert.
278-
func parseCert(
283+
func (c *Client) parseCert(
279284
stamp dnsstamps.ServerStamp,
280285
currentCert *Cert,
281286
providerName string,
@@ -292,7 +297,13 @@ func parseCert(
292297
return nil, fmt.Errorf("deserializing cert for: %w", err)
293298
}
294299

295-
log.Debug("[%s] fetched certificate %d", providerName, cert.Serial)
300+
c.logger().Debug(
301+
"fetched certificate",
302+
"provider",
303+
providerName,
304+
"cert_serial",
305+
cert.Serial,
306+
)
296307

297308
if !cert.VerifyDate() {
298309
return nil, ErrInvalidDate
@@ -303,7 +314,13 @@ func parseCert(
303314
}
304315

305316
if cert.Serial < currentCert.Serial {
306-
log.Debug("[%v] cert %d superseded by a previous certificate", providerName, cert.Serial)
317+
c.logger().Debug(
318+
"cert superseded by a previous certificate",
319+
"provider",
320+
providerName,
321+
"cert_serial",
322+
cert.Serial,
323+
)
307324

308325
return nil, nil
309326
}
@@ -313,15 +330,22 @@ func parseCert(
313330
}
314331

315332
if cert.EsVersion <= currentCert.EsVersion {
316-
log.Debug("[%v] keeping the previous, preferred crypto construction", providerName)
333+
c.logger().Debug(
334+
"keeping the current cert es version",
335+
"provider",
336+
providerName,
337+
)
317338

318339
return nil, nil
319340
}
320341

321-
log.Debug(
322-
"[%v] upgrading the construction from %v to %v",
342+
c.logger().Debug(
343+
"upgrading the construction",
344+
"provider",
323345
providerName,
346+
"es_version",
324347
currentCert.EsVersion,
348+
"new_es_version",
325349
cert.EsVersion,
326350
)
327351

@@ -339,3 +363,11 @@ func (c *Client) maxQuerySize() int {
339363

340364
return dns.MinMsgSize
341365
}
366+
367+
func (c *Client) logger() (l *slog.Logger) {
368+
if c.Logger == nil {
369+
return slog.Default()
370+
}
371+
372+
return c.Logger
373+
}

cmd/convert_dnscrypt_wrapper.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ type ConvertWrapperArgs struct {
2323

2424
// convertWrapper generates DNSCrypt configuration from both dnscrypt and server private keys
2525
func convertWrapper(args ConvertWrapperArgs) {
26-
2726
log.Info("Generating configuration for %s", args.ProviderName)
2827

2928
var rc = dnscrypt.ResolverConfig{

generate.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"strings"
88
"time"
99

10-
"github.com/AdguardTeam/golibs/log"
1110
"github.com/ameshkov/dnsstamps"
1211
"golang.org/x/crypto/curve25519"
1312
)
@@ -46,8 +45,6 @@ type ResolverConfig struct {
4645

4746
// CreateCert generates a signed Cert to be used by Server
4847
func (rc *ResolverConfig) CreateCert() (*Cert, error) {
49-
log.Printf("Creating signed DNSCrypt certificate")
50-
5148
notAfter := time.Now()
5249
if rc.CertificateTTL > 0 {
5350
notAfter = notAfter.Add(rc.CertificateTTL)
@@ -75,7 +72,6 @@ func (rc *ResolverConfig) CreateCert() (*Cert, error) {
7572
}
7673

7774
if len(resolverPk) != keySize || len(resolverSk) != keySize {
78-
log.Printf("Short-term keys are not set, generating random ones")
7975
sk, pk := generateRandomKeyPair()
8076
resolverSk = sk[:]
8177
resolverPk = pk[:]
@@ -93,8 +89,6 @@ func (rc *ResolverConfig) CreateCert() (*Cert, error) {
9389
// sign the data
9490
cert.Sign(privateKey)
9591

96-
log.Info("Signed cert: %s", cert.String())
97-
9892
// done
9993
return cert, nil
10094
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ require (
1818
require (
1919
github.com/davecgh/go-spew v1.1.1 // indirect
2020
github.com/pmezard/go-difflib v1.0.0 // indirect
21+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect
2122
golang.org/x/mod v0.16.0 // indirect
2223
golang.org/x/sys v0.18.0 // indirect
2324
golang.org/x/tools v0.19.0 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
1414
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
1515
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
1616
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
17+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo=
18+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
1719
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
1820
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
1921
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=

server.go

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package dnscrypt
22

33
import (
44
"context"
5+
"log/slog"
56
"net"
67
"strings"
78
"sync"
89
"time"
910

10-
"github.com/AdguardTeam/golibs/log"
11+
"github.com/AdguardTeam/golibs/errors"
12+
"github.com/AdguardTeam/golibs/logutil/slogutil"
1113
"github.com/miekg/dns"
1214
)
1315

@@ -63,6 +65,10 @@ type Server struct {
6365
// Handler to invoke. If nil, uses DefaultHandler.
6466
Handler Handler
6567

68+
// Logger is a logger instance for Server. If not set, slog.Default() will
69+
// be used.
70+
Logger *slog.Logger
71+
6672
// make sure init is called only once
6773
initOnce sync.Once
6874

@@ -88,7 +94,8 @@ func (s *Server) prepareShutdown() error {
8894
defer s.lock.Unlock()
8995

9096
if !s.started {
91-
log.Info("Server is not started")
97+
s.Logger.Info("server is not started")
98+
9299
return ErrServerNotStarted
93100
}
94101

@@ -126,7 +133,7 @@ func (s *Server) prepareShutdown() error {
126133
// connections are processed and only after that it leaves the method.
127134
// If context deadline is specified, it will exit earlier.
128135
func (s *Server) Shutdown(ctx context.Context) error {
129-
log.Info("Shutting down the DNSCrypt server")
136+
s.Logger.Info("shutting down the DNSCrypt server")
130137

131138
err := s.prepareShutdown()
132139
if err != nil {
@@ -137,17 +144,17 @@ func (s *Server) Shutdown(ctx context.Context) error {
137144
closed := make(chan struct{})
138145
go func() {
139146
s.wg.Wait()
140-
log.Info("Serve goroutines finished their work")
147+
s.Logger.Info("serve goroutines finished their work")
141148
close(closed)
142149
}()
143150

144151
// Wait for either all goroutines finish their work
145152
// Or for the context deadline
146153
select {
147154
case <-closed:
148-
log.Info("DNSCrypt server has been stopped")
155+
s.Logger.Info("DNSCrypt server has been stopped")
149156
case <-ctx.Done():
150-
log.Info("DNSCrypt server shutdown has timed out")
157+
s.Logger.Info("DNSCrypt server shutdown has timed out")
151158
err = ctx.Err()
152159
}
153160

@@ -164,6 +171,10 @@ func (s *Server) init() {
164171
if s.UDPSize == 0 {
165172
s.UDPSize = defaultUDPSize
166173
}
174+
175+
if s.Logger == nil {
176+
s.Logger = slog.Default()
177+
}
167178
}
168179

169180
// isStarted returns true if the server is processing queries right now
@@ -181,7 +192,7 @@ func (s *Server) serveDNS(rw ResponseWriter, r *dns.Msg) error {
181192
return ErrInvalidQuery
182193
}
183194

184-
log.Tracef("Handling a DNS query: %s", r.Question[0].Name)
195+
s.Logger.Debug("handling a DNS query", "question", r.Question[0].Name)
185196

186197
handler := s.Handler
187198
if handler == nil {
@@ -190,7 +201,7 @@ func (s *Server) serveDNS(rw ResponseWriter, r *dns.Msg) error {
190201

191202
err := handler.ServeDNS(rw, r)
192203
if err != nil {
193-
log.Tracef("Error while handing a DNS query: %v", err)
204+
s.Logger.Debug("error while handling a DNS query", slogutil.KeyError, err)
194205

195206
reply := &dns.Msg{}
196207
reply.SetRcode(r, dns.RcodeServerFailure)
@@ -285,23 +296,20 @@ func (s *Server) handleHandshake(b []byte, certTxt string) ([]byte, error) {
285296
}
286297

287298
// validate checks if the Server config is properly set
288-
func (s *Server) validate() bool {
299+
func (s *Server) validate() (err error) {
289300
if s.ResolverCert == nil {
290-
log.Error("ResolverCert must be set")
291-
return false
301+
return errors.Annotate(ErrServerConfig, "ResolverCert is required")
292302
}
293303

294304
if !s.ResolverCert.VerifyDate() {
295-
log.Error("ResolverCert date is not valid")
296-
return false
305+
return errors.Annotate(ErrServerConfig, "ResolverCert date is not valid")
297306
}
298307

299308
if s.ProviderName == "" {
300-
log.Error("ProviderName must be set")
301-
return false
309+
return errors.Annotate(ErrServerConfig, "ProviderName must be set")
302310
}
303311

304-
return true
312+
return nil
305313
}
306314

307315
// getCertTXT serializes the cert TXT record that are to be sent to the client

server_tcp.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"bytes"
55
"errors"
66
"fmt"
7+
"log/slog"
78
"net"
89
"sync"
910
"time"
1011

11-
"github.com/AdguardTeam/golibs/log"
12+
"github.com/AdguardTeam/golibs/logutil/slogutil"
1213
"github.com/miekg/dns"
1314
)
1415

@@ -18,6 +19,7 @@ type TCPResponseWriter struct {
1819
encrypt encryptionFunc
1920
req *dns.Msg
2021
query EncryptedQuery
22+
logger *slog.Logger
2123
}
2224

2325
// type check
@@ -39,7 +41,8 @@ func (w *TCPResponseWriter) WriteMsg(m *dns.Msg) error {
3941

4042
res, err := w.encrypt(m, w.query)
4143
if err != nil {
42-
log.Tracef("Failed to encrypt the DNS query: %v", err)
44+
w.logger.Debug("failed to encrypt the DNS query", slogutil.KeyError, err)
45+
4346
return err
4447
}
4548

@@ -55,7 +58,7 @@ func (s *Server) ServeTCP(l net.Listener) error {
5558
return err
5659
}
5760

58-
log.Info("Entering DNSCrypt TCP listening loop tcp://%s", l.Addr())
61+
s.Logger.Info("entering DNSCrypt TCP listening loop", "listenAddr", l.Addr())
5962

6063
// Tracks TCP connection handling goroutines
6164
tcpWg := &sync.WaitGroup{}
@@ -85,9 +88,9 @@ func (s *Server) ServeTCP(l net.Listener) error {
8588
continue
8689
}
8790
if isConnClosed(err) {
88-
log.Info("udpListen.ReadFrom() returned because we're reading from a closed connection, exiting loop")
91+
s.Logger.Info("TCP listener closed, exiting loop")
8992
} else {
90-
log.Info("got error when reading from UDP listen: %s", err)
93+
s.Logger.Info("got error when reading from UDP listen", slogutil.KeyError, err)
9194
}
9295
break
9396
}
@@ -117,10 +120,11 @@ func (s *Server) ServeTCP(l net.Listener) error {
117120
}
118121

119122
// prepareServeTCP prepares the server and listener to serving DNSCrypt
120-
func (s *Server) prepareServeTCP(l net.Listener) error {
123+
func (s *Server) prepareServeTCP(l net.Listener) (err error) {
121124
// Check that server is properly configured
122-
if !s.validate() {
123-
return ErrServerConfig
125+
err = s.validate()
126+
if err != nil {
127+
return err
124128
}
125129

126130
// Protect shutdown-related fields
@@ -184,6 +188,7 @@ func (s *Server) handleTCPMsg(b []byte, conn net.Conn, certTxt string) error {
184188
encrypt: s.encrypt,
185189
req: m,
186190
query: q,
191+
logger: s.Logger,
187192
}
188193
err = s.serveDNS(rw, m)
189194
if err != nil {
@@ -208,7 +213,8 @@ func (s *Server) handleTCPConnection(conn net.Conn, certTxt string) error {
208213

209214
err = s.handleTCPMsg(b, conn, certTxt)
210215
if err != nil {
211-
log.Debug("failed to process DNS query: %v", err)
216+
s.Logger.Debug("failed to process a DNS query", slogutil.KeyError, err)
217+
212218
return err
213219
}
214220

0 commit comments

Comments
 (0)