Skip to content

Commit 1077846

Browse files
authored
Merge pull request #381 from AkihiroSuda/fix-380
pkg/hostagent/dns: truncate messages
2 parents 0f9483b + 347a0bf commit 1077846

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

cmd/limactl/debug.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package main
2+
3+
import (
4+
"strconv"
5+
6+
"github.com/lima-vm/lima/pkg/hostagent/dns"
7+
"github.com/sirupsen/logrus"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
func newDebugCommand() *cobra.Command {
12+
cmd := &cobra.Command{
13+
Use: "debug",
14+
Short: "Debug utilities",
15+
Long: "DO NOT USE! THE COMMAND SYNTAX IS SUBJECT TO CHANGE!",
16+
Hidden: true,
17+
}
18+
cmd.AddCommand(newDebugDNSCommand())
19+
return cmd
20+
}
21+
22+
func newDebugDNSCommand() *cobra.Command {
23+
var cmd = &cobra.Command{
24+
Use: "dns UDPPORT [TCPPORT]",
25+
Short: "Debug built-in DNS",
26+
Long: "DO NOT USE! THE COMMAND SYNTAX IS SUBJECT TO CHANGE!",
27+
Args: cobra.RangeArgs(1, 2),
28+
RunE: debugDNSAction,
29+
}
30+
return cmd
31+
}
32+
33+
func debugDNSAction(cmd *cobra.Command, args []string) error {
34+
udpLocalPort, err := strconv.Atoi(args[0])
35+
if err != nil {
36+
return err
37+
}
38+
tcpLocalPort := 0
39+
if len(args) > 2 {
40+
tcpLocalPort, err = strconv.Atoi(args[1])
41+
if err != nil {
42+
return err
43+
}
44+
}
45+
srv, err := dns.Start(udpLocalPort, tcpLocalPort)
46+
if err != nil {
47+
return err
48+
}
49+
logrus.Infof("Started srv %+v (UDP %d, TCP %d)", srv, udpLocalPort, tcpLocalPort)
50+
for {
51+
}
52+
}

cmd/limactl/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ func newApp() *cobra.Command {
8181
newHostagentCommand(),
8282
newInfoCommand(),
8383
newShowSSHCommand(),
84+
newDebugCommand(),
8485
)
8586
return rootCmd
8687
}

pkg/hostagent/dns.go renamed to pkg/hostagent/dns/dns.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file has been adapted from https://github.com/norouter/norouter/blob/v0.6.4/pkg/agent/dns/dns.go
22

3-
package hostagent
3+
package dns
44

55
import (
66
"fmt"
@@ -11,6 +11,10 @@ import (
1111
"github.com/sirupsen/logrus"
1212
)
1313

14+
// Truncate for avoiding "Parse error" from `busybox nslookup`
15+
// https://github.com/lima-vm/lima/issues/380
16+
const truncateSize = 512
17+
1418
type Handler struct {
1519
clientConfig *dns.ClientConfig
1620
clients []*dns.Client
@@ -174,6 +178,7 @@ func (h *Handler) handleQuery(w dns.ResponseWriter, req *dns.Msg) {
174178
}
175179
}
176180
if handled {
181+
reply.Truncate(truncateSize)
177182
_ = w.WriteMsg(&reply)
178183
return
179184
}
@@ -186,13 +191,15 @@ func (h *Handler) handleDefault(w dns.ResponseWriter, req *dns.Msg) {
186191
addr := fmt.Sprintf("%s:%s", srv, h.clientConfig.Port)
187192
reply, _, err := client.Exchange(req, addr)
188193
if err == nil {
194+
reply.Truncate(truncateSize)
189195
_ = w.WriteMsg(reply)
190196
return
191197
}
192198
}
193199
}
194200
var reply dns.Msg
195201
reply.SetReply(req)
202+
reply.Truncate(truncateSize)
196203
_ = w.WriteMsg(&reply)
197204
}
198205

@@ -205,14 +212,14 @@ func (h *Handler) ServeDNS(w dns.ResponseWriter, req *dns.Msg) {
205212
}
206213
}
207214

208-
func (a *HostAgent) StartDNS() (*Server, error) {
215+
func Start(udpLocalPort, tcpLocalPort int) (*Server, error) {
209216
h, err := newHandler()
210217
if err != nil {
211-
panic(err)
218+
return nil, err
212219
}
213220
server := &Server{}
214-
if a.udpDNSLocalPort > 0 {
215-
addr := fmt.Sprintf("127.0.0.1:%d", a.udpDNSLocalPort)
221+
if udpLocalPort > 0 {
222+
addr := fmt.Sprintf("127.0.0.1:%d", udpLocalPort)
216223
s := &dns.Server{Net: "udp", Addr: addr, Handler: h}
217224
server.udp = s
218225
go func() {
@@ -221,8 +228,8 @@ func (a *HostAgent) StartDNS() (*Server, error) {
221228
}
222229
}()
223230
}
224-
if a.tcpDNSLocalPort > 0 {
225-
addr := fmt.Sprintf("127.0.0.1:%d", a.tcpDNSLocalPort)
231+
if tcpLocalPort > 0 {
232+
addr := fmt.Sprintf("127.0.0.1:%d", tcpLocalPort)
226233
s := &dns.Server{Net: "tcp", Addr: addr, Handler: h}
227234
server.tcp = s
228235
go func() {

pkg/hostagent/hostagent.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
guestagentapi "github.com/lima-vm/lima/pkg/guestagent/api"
2424
guestagentclient "github.com/lima-vm/lima/pkg/guestagent/api/client"
2525
hostagentapi "github.com/lima-vm/lima/pkg/hostagent/api"
26+
"github.com/lima-vm/lima/pkg/hostagent/dns"
2627
"github.com/lima-vm/lima/pkg/hostagent/events"
2728
"github.com/lima-vm/lima/pkg/limayaml"
2829
"github.com/lima-vm/lima/pkg/qemu"
@@ -248,7 +249,7 @@ func (a *HostAgent) Run(ctx context.Context) error {
248249
}()
249250

250251
if *a.y.UseHostResolver {
251-
dnsServer, err := a.StartDNS()
252+
dnsServer, err := dns.Start(a.udpDNSLocalPort, a.tcpDNSLocalPort)
252253
if err != nil {
253254
return fmt.Errorf("cannot start DNS server: %w", err)
254255
}

0 commit comments

Comments
 (0)