feature/featuretags: make CLI connection error diagnostics modular

Updates #12614

Change-Id: I09b8944166ee00910b402bcd5725cd7969e2c82c
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/17316/head
Brad Fitzpatrick 2 months ago committed by Brad Fitzpatrick
parent 11b770fbc9
commit 7bcab4ab28

@ -87,7 +87,7 @@ tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depawa
tailscale.com/disco from tailscale.com/derp/derpserver tailscale.com/disco from tailscale.com/derp/derpserver
tailscale.com/drive from tailscale.com/client/local+ tailscale.com/drive from tailscale.com/client/local+
tailscale.com/envknob from tailscale.com/client/local+ tailscale.com/envknob from tailscale.com/client/local+
tailscale.com/feature from tailscale.com/tsweb tailscale.com/feature from tailscale.com/tsweb+
tailscale.com/health from tailscale.com/net/tlsdial+ tailscale.com/health from tailscale.com/net/tlsdial+
tailscale.com/hostinfo from tailscale.com/net/netmon+ tailscale.com/hostinfo from tailscale.com/net/netmon+
tailscale.com/ipn from tailscale.com/client/local tailscale.com/ipn from tailscale.com/client/local

@ -26,6 +26,7 @@ import (
"tailscale.com/client/local" "tailscale.com/client/local"
"tailscale.com/cmd/tailscale/cli/ffcomplete" "tailscale.com/cmd/tailscale/cli/ffcomplete"
"tailscale.com/envknob" "tailscale.com/envknob"
"tailscale.com/feature"
"tailscale.com/paths" "tailscale.com/paths"
"tailscale.com/util/slicesx" "tailscale.com/util/slicesx"
"tailscale.com/version/distro" "tailscale.com/version/distro"
@ -555,3 +556,12 @@ func lastSeenFmt(t time.Time) string {
return fmt.Sprintf(", last seen %dd ago", int(d.Hours()/24)) return fmt.Sprintf(", last seen %dd ago", int(d.Hours()/24))
} }
} }
var hookFixTailscaledConnectError feature.Hook[func(error) error] // for cliconndiag
func fixTailscaledConnectError(origErr error) error {
if f, ok := hookFixTailscaledConnectError.GetOk(); ok {
return f(origErr)
}
return origErr
}

@ -1,7 +1,7 @@
// Copyright (c) Tailscale Inc & AUTHORS // Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
//go:build linux || windows || darwin //go:build (linux || windows || darwin) && !ts_omit_cliconndiag
package cli package cli
@ -16,11 +16,15 @@ import (
"tailscale.com/version/distro" "tailscale.com/version/distro"
) )
// fixTailscaledConnectError is called when the local tailscaled has func init() {
hookFixTailscaledConnectError.Set(fixTailscaledConnectErrorImpl)
}
// fixTailscaledConnectErrorImpl is called when the local tailscaled has
// been determined unreachable due to the provided origErr value. It // been determined unreachable due to the provided origErr value. It
// returns either the same error or a better one to help the user // returns either the same error or a better one to help the user
// understand why tailscaled isn't running for their platform. // understand why tailscaled isn't running for their platform.
func fixTailscaledConnectError(origErr error) error { func fixTailscaledConnectErrorImpl(origErr error) error {
procs, err := ps.Processes() procs, err := ps.Processes()
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to local Tailscaled process and failed to enumerate processes while looking for it") return fmt.Errorf("failed to connect to local Tailscaled process and failed to enumerate processes while looking for it")

@ -1,15 +0,0 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
//go:build !linux && !windows && !darwin
package cli
import "fmt"
// The github.com/mitchellh/go-ps package doesn't work on all platforms,
// so just don't diagnose connect failures.
func fixTailscaledConnectError(origErr error) error {
return fmt.Errorf("failed to connect to local tailscaled process (is it running?); got: %w", origErr)
}

@ -35,7 +35,6 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
github.com/mdlayher/netlink/nltest from github.com/google/nftables github.com/mdlayher/netlink/nltest from github.com/google/nftables
github.com/mdlayher/sdnotify from tailscale.com/util/systemd github.com/mdlayher/sdnotify from tailscale.com/util/systemd
💣 github.com/mdlayher/socket from github.com/mdlayher/netlink+ 💣 github.com/mdlayher/socket from github.com/mdlayher/netlink+
github.com/mitchellh/go-ps from tailscale.com/safesocket
💣 github.com/safchain/ethtool from tailscale.com/net/netkernelconf 💣 github.com/safchain/ethtool from tailscale.com/net/netkernelconf
github.com/tailscale/hujson from tailscale.com/ipn/conffile github.com/tailscale/hujson from tailscale.com/ipn/conffile
💣 github.com/tailscale/netlink from tailscale.com/util/linuxfw+ 💣 github.com/tailscale/netlink from tailscale.com/util/linuxfw+

@ -0,0 +1,13 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by gen.go; DO NOT EDIT.
//go:build ts_omit_cliconndiag
package buildfeatures
// HasCLIConnDiag is whether the binary was built with support for modular feature "CLI connection error diagnostics".
// Specifically, it's whether the binary was NOT built with the "ts_omit_cliconndiag" build tag.
// It's a const so it can be used for dead code elimination.
const HasCLIConnDiag = false

@ -0,0 +1,13 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by gen.go; DO NOT EDIT.
//go:build !ts_omit_cliconndiag
package buildfeatures
// HasCLIConnDiag is whether the binary was built with support for modular feature "CLI connection error diagnostics".
// Specifically, it's whether the binary was NOT built with the "ts_omit_cliconndiag" build tag.
// It's a const so it can be used for dead code elimination.
const HasCLIConnDiag = true

@ -96,6 +96,7 @@ var Features = map[FeatureTag]FeatureMeta{
"captiveportal": {"CaptivePortal", "Captive portal detection", nil}, "captiveportal": {"CaptivePortal", "Captive portal detection", nil},
"capture": {"Capture", "Packet capture", nil}, "capture": {"Capture", "Packet capture", nil},
"cli": {"CLI", "embed the CLI into the tailscaled binary", nil}, "cli": {"CLI", "embed the CLI into the tailscaled binary", nil},
"cliconndiag": {"CLIConnDiag", "CLI connection error diagnostics", nil},
"completion": {"Completion", "CLI shell completion", nil}, "completion": {"Completion", "CLI shell completion", nil},
"dbus": {"DBus", "Linux DBus support", nil}, "dbus": {"DBus", "Linux DBus support", nil},
"debugeventbus": {"DebugEventBus", "eventbus debug support", nil}, "debugeventbus": {"DebugEventBus", "eventbus debug support", nil},

@ -11,6 +11,8 @@ import (
"net" "net"
"runtime" "runtime"
"time" "time"
"tailscale.com/feature"
) )
type closeable interface { type closeable interface {
@ -31,7 +33,8 @@ func ConnCloseWrite(c net.Conn) error {
} }
var processStartTime = time.Now() var processStartTime = time.Now()
var tailscaledProcExists = func() bool { return false } // set by safesocket_ps.go
var tailscaledProcExists feature.Hook[func() bool]
// tailscaledStillStarting reports whether tailscaled is probably // tailscaledStillStarting reports whether tailscaled is probably
// still starting up. That is, it reports whether the caller should // still starting up. That is, it reports whether the caller should
@ -50,7 +53,8 @@ func tailscaledStillStarting() bool {
if d > 5*time.Second { if d > 5*time.Second {
return false return false
} }
return tailscaledProcExists() f, ok := tailscaledProcExists.GetOk()
return ok && f()
} }
// ConnectContext connects to tailscaled using a unix socket or named pipe. // ConnectContext connects to tailscaled using a unix socket or named pipe.

@ -1,7 +1,7 @@
// Copyright (c) Tailscale Inc & AUTHORS // Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
//go:build (linux && !android) || windows || (darwin && !ios) || freebsd //go:build ((linux && !android) || windows || (darwin && !ios) || freebsd) && !ts_omit_cliconndiag
package safesocket package safesocket
@ -12,7 +12,7 @@ import (
) )
func init() { func init() {
tailscaledProcExists = func() bool { tailscaledProcExists.Set(func() bool {
procs, err := ps.Processes() procs, err := ps.Processes()
if err != nil { if err != nil {
return false return false
@ -30,5 +30,5 @@ func init() {
} }
} }
return false return false
} })
} }

Loading…
Cancel
Save