Skip to content

Commit 92d8cba

Browse files
committed
Improve interactive tunnel add UX and fix multiple issues
- Remove DNS resolution section from diagnostics screen - Fix VayDNS record type not exported in client config URI - Show defaults in brackets for all tunnel add prompts (MTU, idle timeout, keep alive, client ID size, queue size, port) - Mark default record type in VayDNS select menus across all wizards - Skip WARP prompt on re-run when already enabled
1 parent 94de447 commit 92d8cba

5 files changed

Lines changed: 95 additions & 48 deletions

File tree

internal/clientcfg/generate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ func GenerateURI(tunnel *config.TunnelConfig, backend *config.BackendConfig, cfg
7878
case config.TransportVayDNS:
7979
if tunnel.VayDNS != nil {
8080
fields[FPublicKey] = tunnel.VayDNS.PublicKey
81+
if tunnel.VayDNS.RecordType != "" {
82+
fields[FDNSTransport] = tunnel.VayDNS.RecordType
83+
}
8184
}
8285

8386
case config.TransportSlipstream:

internal/handlers/quick_wizard.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ func handleQuickWizard(ctx *actions.Context) error {
118118
if tr == config.TransportVayDNS {
119119
rtOpts := make([]actions.SelectOption, len(config.ValidVayDNSRecordTypes))
120120
for i, rt := range config.ValidVayDNSRecordTypes {
121-
rtOpts[i] = actions.SelectOption{Value: rt, Label: rt}
121+
label := rt
122+
if i == 0 {
123+
label = rt + " (default)"
124+
}
125+
rtOpts[i] = actions.SelectOption{Value: rt, Label: label}
122126
}
123127
recordType, err = prompt.Select("DNS record type", rtOpts)
124128
if err != nil {

internal/handlers/system_diag.go

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -208,44 +208,6 @@ func handleSystemDiag(ctx *actions.Context) error {
208208
}
209209
}
210210

211-
// ── DNS Resolution ──────────────────────────────────────
212-
domainsChecked := false
213-
for _, t := range cfg.Tunnels {
214-
if t.Domain == "" || t.IsDirectTransport() {
215-
continue
216-
}
217-
if !domainsChecked {
218-
out.Print("")
219-
out.Print(" DNS Resolution")
220-
out.Print(" ──────────────")
221-
domainsChecked = true
222-
}
223-
if t.IsDNSTunnel() {
224-
// DNS tunnels use NS records, not A records
225-
nss, err := net.LookupNS(t.Domain)
226-
if err != nil || len(nss) == 0 {
227-
check(fmt.Sprintf("[%s] %s NS", t.Tag, t.Domain), false, "NS record not found")
228-
} else {
229-
nsHost := nss[0].Host
230-
check(fmt.Sprintf("[%s] %s NS", t.Tag, t.Domain), true, nsHost)
231-
// Verify the nameserver resolves to an IP
232-
addrs, err := net.LookupHost(strings.TrimSuffix(nsHost, "."))
233-
if err != nil {
234-
check(fmt.Sprintf("[%s] %s A", t.Tag, strings.TrimSuffix(nsHost, ".")), false, "not resolving")
235-
} else {
236-
check(fmt.Sprintf("[%s] %s A", t.Tag, strings.TrimSuffix(nsHost, ".")), true, strings.Join(addrs, ", "))
237-
}
238-
}
239-
} else {
240-
addrs, err := net.LookupHost(t.Domain)
241-
if err != nil {
242-
check(fmt.Sprintf("[%s] %s", t.Tag, t.Domain), false, "not resolving")
243-
} else {
244-
check(fmt.Sprintf("[%s] %s", t.Tag, t.Domain), true, strings.Join(addrs, ", "))
245-
}
246-
}
247-
}
248-
249211
// ── Orphaned Services ───────────────────────────────────
250212
allSvc := service.ListSlipgateServices()
251213
knownSvc := map[string]bool{

internal/handlers/system_install.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,11 @@ func handleSystemInstall(ctx *actions.Context) error {
273273
if selectedTransport == config.TransportVayDNS {
274274
rtOpts := make([]actions.SelectOption, len(config.ValidVayDNSRecordTypes))
275275
for i, rt := range config.ValidVayDNSRecordTypes {
276-
rtOpts[i] = actions.SelectOption{Value: rt, Label: rt}
276+
label := rt
277+
if i == 0 {
278+
label = rt + " (default)"
279+
}
280+
rtOpts[i] = actions.SelectOption{Value: rt, Label: label}
277281
}
278282
var err error
279283
sharedRecordType, err = prompt.Select("DNS record type", rtOpts)
@@ -560,11 +564,17 @@ func handleSystemInstall(ctx *actions.Context) error {
560564

561565
// ── Step 6b: WARP outbound (default off) ──────────────────────
562566
out.Print("")
563-
enableWarp, err := prompt.Confirm("Enable WARP outbound (Cloudflare)?")
564-
if err != nil {
565-
return err
567+
enableWarp := cfg.Warp.Enabled
568+
if !enableWarp {
569+
var err error
570+
enableWarp, err = prompt.Confirm("Enable WARP outbound (Cloudflare)?")
571+
if err != nil {
572+
return err
573+
}
574+
} else {
575+
out.Info("WARP outbound already enabled — skipping")
566576
}
567-
if enableWarp {
577+
if enableWarp && !cfg.Warp.Enabled {
568578
out.Info("Setting up Cloudflare WARP...")
569579
if err := warp.Setup(cfg, func(msg string) { out.Info(msg) }); err != nil {
570580
out.Warning("WARP setup failed: " + err.Error())

internal/handlers/tunnel_add.go

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,17 @@ func addSingleTunnel(ctx *actions.Context, cfg *config.Config, transport_, backe
193193
return actions.NewError(actions.TunnelAdd, "key setup failed", err)
194194
}
195195

196+
mtuStr, err := prompt.String("MTU", fmt.Sprintf("%d", config.DefaultMTU))
197+
if err != nil {
198+
return err
199+
}
200+
mtu := config.DefaultMTU
201+
if n, e := fmt.Sscanf(mtuStr, "%d", &mtu); n != 1 || e != nil {
202+
mtu = config.DefaultMTU
203+
}
204+
196205
tunnel.DNSTT = &config.DNSTTConfig{
197-
MTU: config.DefaultMTU,
206+
MTU: mtu,
198207
PrivateKey: privKeyPath,
199208
PublicKey: pubKey,
200209
}
@@ -254,7 +263,11 @@ func addSingleTunnel(ctx *actions.Context, cfg *config.Config, transport_, backe
254263
if recordType == "" {
255264
rtOpts := make([]actions.SelectOption, len(config.ValidVayDNSRecordTypes))
256265
for i, rt := range config.ValidVayDNSRecordTypes {
257-
rtOpts[i] = actions.SelectOption{Value: rt, Label: rt}
266+
label := rt
267+
if i == 0 {
268+
label = rt + " (default)"
269+
}
270+
rtOpts[i] = actions.SelectOption{Value: rt, Label: label}
258271
}
259272
var err error
260273
recordType, err = prompt.Select("DNS record type", rtOpts)
@@ -263,29 +276,75 @@ func addSingleTunnel(ctx *actions.Context, cfg *config.Config, transport_, backe
263276
}
264277
}
265278

279+
mtuStr, err := prompt.String("MTU", fmt.Sprintf("%d", config.DefaultMTU))
280+
if err != nil {
281+
return err
282+
}
283+
mtu := config.DefaultMTU
284+
if n, e := fmt.Sscanf(mtuStr, "%d", &mtu); n != 1 || e != nil {
285+
mtu = config.DefaultMTU
286+
}
287+
266288
vayCfg := &config.VayDNSConfig{
267-
MTU: config.DefaultMTU,
289+
MTU: mtu,
268290
PrivateKey: privKeyPath,
269291
PublicKey: pubKey,
270292
RecordType: recordType,
271293
}
294+
272295
if v := ctx.GetArg("idle-timeout"); v != "" {
273296
vayCfg.IdleTimeout = v
297+
} else {
298+
v, err := prompt.String("Idle timeout", vayCfg.ResolvedIdleTimeout())
299+
if err != nil {
300+
return err
301+
}
302+
if v != "" {
303+
vayCfg.IdleTimeout = v
304+
}
274305
}
306+
275307
if v := ctx.GetArg("keep-alive"); v != "" {
276308
vayCfg.KeepAlive = v
309+
} else {
310+
v, err := prompt.String("Keep alive", vayCfg.ResolvedKeepAlive())
311+
if err != nil {
312+
return err
313+
}
314+
if v != "" {
315+
vayCfg.KeepAlive = v
316+
}
277317
}
318+
278319
if v := ctx.GetArg("clientid-size"); v != "" {
279320
var n int
280321
if _, e := fmt.Sscanf(v, "%d", &n); e == nil {
281322
vayCfg.ClientIDSize = n
282323
}
324+
} else {
325+
v, err := prompt.String("Client ID size", fmt.Sprintf("%d", vayCfg.ResolvedClientIDSize()))
326+
if err != nil {
327+
return err
328+
}
329+
if n, e := fmt.Sscanf(v, "%d", &vayCfg.ClientIDSize); n != 1 || e != nil {
330+
vayCfg.ClientIDSize = 0
331+
}
283332
}
333+
284334
if v := ctx.GetArg("queue-size"); v != "" {
285335
var n int
286336
if _, e := fmt.Sscanf(v, "%d", &n); e == nil {
287337
vayCfg.QueueSize = n
288338
}
339+
} else {
340+
defQS := 512
341+
v, err := prompt.String("Queue size", fmt.Sprintf("%d", defQS))
342+
if err != nil {
343+
return err
344+
}
345+
if n, e := fmt.Sscanf(v, "%d", &vayCfg.QueueSize); n != 1 || e != nil {
346+
vayCfg.QueueSize = 0
347+
}
289348
}
290349
tunnel.VayDNS = vayCfg
291350
out.Success(fmt.Sprintf("Public key: %s", pubKey))
@@ -307,10 +366,19 @@ func addSingleTunnel(ctx *actions.Context, cfg *config.Config, transport_, backe
307366
return err
308367
}
309368
}
369+
portStr, err := prompt.String("Port", "443")
370+
if err != nil {
371+
return err
372+
}
373+
naivePort := 443
374+
if n, e := fmt.Sscanf(portStr, "%d", &naivePort); n != 1 || e != nil {
375+
naivePort = 443
376+
}
377+
310378
tunnel.Naive = &config.NaiveConfig{
311379
Email: email,
312380
DecoyURL: decoyURL,
313-
Port: 443,
381+
Port: naivePort,
314382
}
315383

316384
}

0 commit comments

Comments
 (0)