diff --git a/cmd/cloudflared/flags/flags.go b/cmd/cloudflared/flags/flags.go index 6d2ca3ef..d53f40cb 100644 --- a/cmd/cloudflared/flags/flags.go +++ b/cmd/cloudflared/flags/flags.go @@ -120,6 +120,9 @@ const ( // NoAutoUpdate is the command line flag to disable cloudflared from checking for updates NoAutoUpdate = "no-autoupdate" + // NoPrechecks is the command line flag to skip connectivity pre-checks at startup. + NoPrechecks = "no-prechecks" + // LogLevel is the command line flag for the cloudflared logging level LogLevel = "loglevel" diff --git a/cmd/cloudflared/tunnel/cmd.go b/cmd/cloudflared/tunnel/cmd.go index 6878eefa..bffac0b4 100644 --- a/cmd/cloudflared/tunnel/cmd.go +++ b/cmd/cloudflared/tunnel/cmd.go @@ -77,6 +77,7 @@ var ( "config", cfdflags.AutoUpdateFreq, cfdflags.NoAutoUpdate, + cfdflags.NoPrechecks, cfdflags.Metrics, "pidfile", "url", @@ -881,6 +882,13 @@ func configureCloudflaredFlags(shouldHide bool) []cli.Flag { Value: false, Hidden: shouldHide, }), + altsrc.NewBoolFlag(&cli.BoolFlag{ + Name: cfdflags.NoPrechecks, + Usage: "Skip connectivity pre-checks at startup.", + EnvVars: []string{"TUNNEL_NO_PRECHECKS"}, + Value: false, + Hidden: shouldHide, + }), altsrc.NewStringFlag(&cli.StringFlag{ Name: cfdflags.Metrics, Value: metrics.GetMetricsDefaultAddress(metrics.Runtime), diff --git a/cmd/cloudflared/tunnel/configuration.go b/cmd/cloudflared/tunnel/configuration.go index 9356673e..d3c31f6c 100644 --- a/cmd/cloudflared/tunnel/configuration.go +++ b/cmd/cloudflared/tunnel/configuration.go @@ -261,6 +261,7 @@ func prepareTunnelConfig( DisableQUICPathMTUDiscovery: c.Bool(flags.QuicDisablePathMTUDiscovery), QUICConnectionLevelFlowControlLimit: c.Uint64(flags.QuicConnLevelFlowControlLimit), QUICStreamLevelFlowControlLimit: c.Uint64(flags.QuicStreamLevelFlowControlLimit), + NoPrechecks: c.Bool(flags.NoPrechecks), OriginDNSService: dnsService, OriginDialerService: originDialerService, } @@ -300,7 +301,7 @@ func gracePeriod(c *cli.Context) (time.Duration, error) { } func isRunningFromTerminal() bool { - return term.IsTerminal(int(os.Stdout.Fd())) + return term.IsTerminal(int(os.Stdout.Fd())) // nolint:gosec } // ParseConfigIPVersion returns the IP version from possible expected values from config @@ -341,7 +342,7 @@ func testIPBindable(ip net.IP) error { if err != nil { return err } - listener.Close() + _ = listener.Close() return nil } @@ -503,7 +504,7 @@ func findLocalAddr(dst net.IP, port int) (netip.Addr, error) { if err != nil { return netip.Addr{}, err } - defer udpConn.Close() + defer func() { _ = udpConn.Close() }() localAddrPort, err := netip.ParseAddrPort(udpConn.LocalAddr().String()) if err != nil { return netip.Addr{}, err diff --git a/supervisor/tunnel.go b/supervisor/tunnel.go index 97013f5a..d672488d 100644 --- a/supervisor/tunnel.go +++ b/supervisor/tunnel.go @@ -61,6 +61,9 @@ type TunnelConfig struct { NeedPQ bool + // NoPrechecks disables connectivity pre-checks at startup. + NoPrechecks bool + NamedTunnel *connection.TunnelProperties ProtocolSelector connection.ProtocolSelector EdgeTLSConfigs map[connection.Protocol]*tls.Config