func init() { // Change the logging defaults for the main cockroach binary. if err := flag.Lookup(logflags.LogToStderrName).Value.Set("false"); err != nil { panic(err) } // Map any flags registered in the standard "flag" package into the // top-level cockroach command. pf := cockroachCmd.PersistentFlags() flag.VisitAll(func(f *flag.Flag) { flag := pflag.PFlagFromGoFlag(f) // TODO(peter): Decide if we want to make the lightstep flags visible. if strings.HasPrefix(flag.Name, "lightstep_") { flag.Hidden = true } pf.AddFlag(flag) }) // The --log-dir default changes depending on the command. Avoid confusion by // simply clearing it. pf.Lookup(logflags.LogDirName).DefValue = "" // If no value is specified for --alsologtostderr output everything. pf.Lookup(logflags.AlsoLogToStderrName).NoOptDefVal = "INFO" // Security flags. baseCtx.Insecure = true insecure = newInsecureValue(baseCtx) { f := startCmd.Flags() // Server flags. f.StringVar(&connHost, cliflags.HostName, "", usageNoEnv(forServer(cliflags.HostName))) f.StringVarP(&connPort, cliflags.PortName, "p", base.DefaultPort, usageNoEnv(forServer(cliflags.PortName))) f.StringVar(&httpPort, cliflags.HTTPPortName, base.DefaultHTTPPort, usageNoEnv(forServer(cliflags.HTTPPortName))) f.StringVar(&serverCtx.Attrs, cliflags.AttrsName, serverCtx.Attrs, usageNoEnv(cliflags.AttrsName)) f.VarP(&serverCtx.Stores, cliflags.StoreName, "s", usageNoEnv(cliflags.StoreName)) f.DurationVar(&serverCtx.RaftTickInterval, cliflags.RaftTickIntervalName, base.DefaultRaftTickInterval, usageNoEnv(cliflags.RaftTickIntervalName)) f.BoolVar(&startBackground, cliflags.BackgroundName, false, usageNoEnv(cliflags.BackgroundName)) // Usage for the unix socket is odd as we use a real file, whereas // postgresql and clients consider it a directory and build a filename // inside it using the port. // Thus, we keep it hidden and use it for testing only. f.StringVar(&serverCtx.SocketFile, cliflags.SocketName, "", usageEnv(cliflags.SocketName)) _ = f.MarkHidden(cliflags.SocketName) insecureF := f.VarPF(insecure, cliflags.InsecureName, "", usageEnv(cliflags.InsecureName)) insecureF.NoOptDefVal = envutil.EnvOrDefaultString(cliflags.InsecureName, "true") // Certificate flags. f.StringVar(&baseCtx.SSLCA, cliflags.CACertName, baseCtx.SSLCA, usageNoEnv(cliflags.CACertName)) f.StringVar(&baseCtx.SSLCert, cliflags.CertName, baseCtx.SSLCert, usageNoEnv(cliflags.CertName)) f.StringVar(&baseCtx.SSLCertKey, cliflags.KeyName, baseCtx.SSLCertKey, usageNoEnv(cliflags.KeyName)) // Cluster joining flags. f.StringVar(&serverCtx.JoinUsing, cliflags.JoinName, serverCtx.JoinUsing, usageNoEnv(cliflags.JoinName)) // Engine flags. setDefaultCacheSize(&serverCtx) cacheSize = newBytesValue(&serverCtx.CacheSize) f.Var(cacheSize, cliflags.CacheName, usageNoEnv(cliflags.CacheName)) } for _, cmd := range certCmds { f := cmd.Flags() // Certificate flags. f.StringVar(&baseCtx.SSLCA, cliflags.CACertName, baseCtx.SSLCA, usageNoEnv(cliflags.CACertName)) f.StringVar(&baseCtx.SSLCAKey, cliflags.CAKeyName, baseCtx.SSLCAKey, usageNoEnv(cliflags.CAKeyName)) f.StringVar(&baseCtx.SSLCert, cliflags.CertName, baseCtx.SSLCert, usageNoEnv(cliflags.CertName)) f.StringVar(&baseCtx.SSLCertKey, cliflags.KeyName, baseCtx.SSLCertKey, usageNoEnv(cliflags.KeyName)) f.IntVar(&keySize, cliflags.KeySizeName, defaultKeySize, usageNoEnv(cliflags.KeySizeName)) } setUserCmd.Flags().StringVar(&password, cliflags.PasswordName, envutil.EnvOrDefaultString(cliflags.PasswordName, ""), usageEnv(cliflags.PasswordName)) clientCmds := []*cobra.Command{ sqlShellCmd, quitCmd, freezeClusterCmd, dumpCmd, /* startCmd is covered above */ } clientCmds = append(clientCmds, kvCmds...) clientCmds = append(clientCmds, rangeCmds...) clientCmds = append(clientCmds, userCmds...) clientCmds = append(clientCmds, zoneCmds...) clientCmds = append(clientCmds, nodeCmds...) for _, cmd := range clientCmds { f := cmd.PersistentFlags() f.StringVar(&connHost, cliflags.HostName, envutil.EnvOrDefaultString(cliflags.HostName, ""), usageEnv(forClient(cliflags.HostName))) insecureF := f.VarPF(insecure, cliflags.InsecureName, "", usageEnv(cliflags.InsecureName)) insecureF.NoOptDefVal = envutil.EnvOrDefaultString(cliflags.InsecureName, "true") // Certificate flags. f.StringVar(&baseCtx.SSLCA, cliflags.CACertName, envutil.EnvOrDefaultString(cliflags.CACertName, baseCtx.SSLCA), usageEnv(cliflags.CACertName)) f.StringVar(&baseCtx.SSLCert, cliflags.CertName, envutil.EnvOrDefaultString(cliflags.CertName, baseCtx.SSLCert), usageEnv(cliflags.CertName)) f.StringVar(&baseCtx.SSLCertKey, cliflags.KeyName, envutil.EnvOrDefaultString(cliflags.KeyName, baseCtx.SSLCertKey), usageEnv(cliflags.KeyName)) // By default, client commands print their output as // pretty-formatted tables on terminals, and TSV when redirected // to a file. The user can override with --pretty. f.BoolVar(&cliCtx.prettyFmt, cliflags.PrettyName, isInteractive, usageNoEnv(cliflags.PrettyName)) } { f := sqlShellCmd.Flags() f.VarP(&sqlCtx.execStmts, cliflags.ExecuteName, "e", usageNoEnv(cliflags.ExecuteName)) } { f := freezeClusterCmd.PersistentFlags() f.BoolVar(&undoFreezeCluster, cliflags.UndoFreezeClusterName, false, usageNoEnv(cliflags.UndoFreezeClusterName)) } // Commands that need the cockroach port. simpleCmds := []*cobra.Command{quitCmd, freezeClusterCmd} simpleCmds = append(simpleCmds, kvCmds...) simpleCmds = append(simpleCmds, rangeCmds...) simpleCmds = append(simpleCmds, nodeCmds...) for _, cmd := range simpleCmds { f := cmd.PersistentFlags() f.StringVarP(&connPort, cliflags.PortName, "p", envutil.EnvOrDefaultString(cliflags.PortName, base.DefaultPort), usageEnv(forClient(cliflags.PortName))) } // Commands that establish a SQL connection. sqlCmds := []*cobra.Command{sqlShellCmd, dumpCmd} sqlCmds = append(sqlCmds, zoneCmds...) sqlCmds = append(sqlCmds, userCmds...) for _, cmd := range sqlCmds { f := cmd.PersistentFlags() f.StringVar(&connURL, cliflags.URLName, envutil.EnvOrDefaultString(cliflags.URLName, ""), usageEnv(cliflags.URLName)) f.StringVarP(&connUser, cliflags.UserName, "u", envutil.EnvOrDefaultString(cliflags.UserName, security.RootUser), usageEnv(cliflags.UserName)) f.StringVarP(&connPort, cliflags.PortName, "p", envutil.EnvOrDefaultString(cliflags.PortName, base.DefaultPort), usageEnv(forClient(cliflags.PortName))) f.StringVarP(&connDBName, cliflags.DatabaseName, "d", envutil.EnvOrDefaultString(cliflags.DatabaseName, ""), usageEnv(cliflags.DatabaseName)) } // Max results flag for scan, reverse scan, and range list. for _, cmd := range []*cobra.Command{scanCmd, reverseScanCmd, lsRangesCmd} { f := cmd.Flags() f.Int64Var(&maxResults, cliflags.MaxResultsName, 1000, usageNoEnv(cliflags.MaxResultsName)) } // Debug commands. { f := debugKeysCmd.Flags() f.Var((*mvccKey)(&debugCtx.startKey), cliflags.FromName, usageNoEnv(cliflags.FromName)) f.Var((*mvccKey)(&debugCtx.endKey), cliflags.ToName, usageNoEnv(cliflags.ToName)) f.BoolVar(&debugCtx.values, cliflags.ValuesName, false, usageNoEnv(cliflags.ValuesName)) f.BoolVar(&debugCtx.sizes, cliflags.SizesName, false, usageNoEnv(cliflags.SizesName)) } { f := versionCmd.Flags() f.BoolVar(&versionIncludesDeps, cliflags.DepsName, false, usageNoEnv(cliflags.DepsName)) } cobra.OnInitialize(func() { // If any of the security flags have been set, clear the insecure // setting. Note that we do the inverse when the --insecure flag is // set. See insecureValue.Set(). if baseCtx.SSLCA != "" || baseCtx.SSLCAKey != "" || baseCtx.SSLCert != "" || baseCtx.SSLCertKey != "" { baseCtx.Insecure = false } serverCtx.Addr = net.JoinHostPort(connHost, connPort) serverCtx.HTTPAddr = net.JoinHostPort(connHost, httpPort) }) }
sp.SetBaggageItem(Snowball, "1") } return sp, err } func defaultOptions(recorder func(basictracer.RawSpan)) basictracer.Options { opts := basictracer.DefaultOptions() opts.ShouldSample = func(traceID uint64) bool { return false } opts.TrimUnsampledSpans = true opts.Recorder = CallbackRecorder(recorder) opts.NewSpanEventListener = events.NetTraceIntegrator opts.DebugAssertUseAfterFinish = true // provoke crash on use-after-Finish return opts } var lightstepToken = envutil.EnvOrDefaultString("lightstep_token", "") // newTracer implements NewTracer and allows that function to be mocked out via Disable(). var newTracer = func() opentracing.Tracer { if lightstepToken != "" { return lightstep.NewTracer(lightstep.Options{ AccessToken: lightstepToken, }) } return basictracer.NewWithOptions(defaultOptions(func(_ basictracer.RawSpan) {})) } // NewTracer creates a Tracer which records to the net/trace // endpoint. func NewTracer() opentracing.Tracer { return newTracer()
// initFlags sets the cli.Context values to flag values. // Keep in sync with "server/context.go". Values in Context should be // settable here. func initFlags(ctx *Context) { // Change the logging defaults for the main cockroach binary. if err := flag.Lookup(logflags.LogToStderrName).Value.Set("false"); err != nil { panic(err) } // Map any flags registered in the standard "flag" package into the // top-level cockroach command. pf := cockroachCmd.PersistentFlags() flag.VisitAll(func(f *flag.Flag) { pf.AddFlag(pflag.PFlagFromGoFlag(f)) }) // The --log-dir default changes depending on the command. Avoid confusion by // simply clearing it. pf.Lookup(logflags.LogDirName).DefValue = "" // If no value is specified for --alsologtostderr output everything. pf.Lookup(logflags.AlsoLogToStderrName).NoOptDefVal = "INFO" { f := startCmd.Flags() // Server flags. f.StringVar(&connHost, cliflags.HostName, "", usageNoEnv(forServer(cliflags.HostName))) f.StringVarP(&connPort, cliflags.PortName, "p", base.DefaultPort, usageNoEnv(forServer(cliflags.PortName))) f.StringVar(&httpPort, cliflags.HTTPPortName, base.DefaultHTTPPort, usageNoEnv(forServer(cliflags.HTTPPortName))) f.StringVar(&ctx.Attrs, cliflags.AttrsName, ctx.Attrs, usageNoEnv(cliflags.AttrsName)) f.VarP(&ctx.Stores, cliflags.StoreName, "s", usageNoEnv(cliflags.StoreName)) // Usage for the unix socket is odd as we use a real file, whereas // postgresql and clients consider it a directory and build a filename // inside it using the port. // Thus, we keep it hidden and use it for testing only. f.StringVar(&ctx.SocketFile, cliflags.SocketName, "", usageEnv(cliflags.SocketName)) _ = f.MarkHidden(cliflags.SocketName) // Security flags. ctx.Insecure = true insecure = newInsecureValue(&ctx.Insecure) insecureF := f.VarPF(insecure, cliflags.InsecureName, "", usageNoEnv(cliflags.InsecureName)) insecureF.NoOptDefVal = "true" // Certificates. f.StringVar(&ctx.SSLCA, cliflags.CACertName, ctx.SSLCA, usageNoEnv(cliflags.CACertName)) f.StringVar(&ctx.SSLCert, cliflags.CertName, ctx.SSLCert, usageNoEnv(cliflags.CertName)) f.StringVar(&ctx.SSLCertKey, cliflags.KeyName, ctx.SSLCertKey, usageNoEnv(cliflags.KeyName)) // Cluster joining flags. f.StringVar(&ctx.JoinUsing, cliflags.JoinName, ctx.JoinUsing, usageNoEnv(cliflags.JoinName)) // Engine flags. setDefaultCacheSize(&ctx.Context) cacheSize = newBytesValue(&ctx.CacheSize) f.Var(cacheSize, cliflags.CacheName, usageNoEnv(cliflags.CacheName)) if err := startCmd.MarkFlagRequired(cliflags.StoreName); err != nil { panic(err) } } { f := exterminateCmd.Flags() f.Var(&ctx.Stores, cliflags.StoreName, usageNoEnv(cliflags.StoreName)) if err := exterminateCmd.MarkFlagRequired(cliflags.StoreName); err != nil { panic(err) } } for _, cmd := range certCmds { f := cmd.Flags() // Certificate flags. f.StringVar(&ctx.SSLCA, cliflags.CACertName, ctx.SSLCA, usageNoEnv(cliflags.CACertName)) f.StringVar(&ctx.SSLCAKey, cliflags.CAKeyName, ctx.SSLCAKey, usageNoEnv(cliflags.CAKeyName)) f.StringVar(&ctx.SSLCert, cliflags.CertName, ctx.SSLCert, usageNoEnv(cliflags.CertName)) f.StringVar(&ctx.SSLCertKey, cliflags.KeyName, ctx.SSLCertKey, usageNoEnv(cliflags.KeyName)) f.IntVar(&keySize, cliflags.KeySizeName, defaultKeySize, usageNoEnv(cliflags.KeySizeName)) if err := cmd.MarkFlagRequired(cliflags.KeySizeName); err != nil { panic(err) } } setUserCmd.Flags().StringVar(&password, cliflags.PasswordName, envutil.EnvOrDefaultString(cliflags.PasswordName, ""), usageEnv(cliflags.PasswordName)) clientCmds := []*cobra.Command{ sqlShellCmd, exterminateCmd, quitCmd, /* startCmd is covered above */ } clientCmds = append(clientCmds, kvCmds...) clientCmds = append(clientCmds, rangeCmds...) clientCmds = append(clientCmds, userCmds...) clientCmds = append(clientCmds, zoneCmds...) clientCmds = append(clientCmds, nodeCmds...) for _, cmd := range clientCmds { f := cmd.PersistentFlags() insecureF := f.VarPF(insecure, cliflags.InsecureName, "", usageEnv(cliflags.InsecureName)) insecureF.NoOptDefVal = envutil.EnvOrDefaultString(cliflags.InsecureName, "true") f.StringVar(&connHost, cliflags.HostName, envutil.EnvOrDefaultString(cliflags.HostName, ""), usageEnv(forClient(cliflags.HostName))) // Certificate flags. f.StringVar(&ctx.SSLCA, cliflags.CACertName, envutil.EnvOrDefaultString(cliflags.CACertName, ctx.SSLCA), usageEnv(cliflags.CACertName)) f.StringVar(&ctx.SSLCert, cliflags.CertName, envutil.EnvOrDefaultString(cliflags.CertName, ctx.SSLCert), usageEnv(cliflags.CertName)) f.StringVar(&ctx.SSLCertKey, cliflags.KeyName, envutil.EnvOrDefaultString(cliflags.KeyName, ctx.SSLCertKey), usageEnv(cliflags.KeyName)) } { f := sqlShellCmd.Flags() f.VarP(&ctx.execStmts, cliflags.ExecuteName, "e", usageNoEnv(cliflags.ExecuteName)) } // Commands that need the cockroach port. simpleCmds := []*cobra.Command{exterminateCmd} simpleCmds = append(simpleCmds, kvCmds...) simpleCmds = append(simpleCmds, rangeCmds...) for _, cmd := range simpleCmds { f := cmd.PersistentFlags() f.StringVarP(&connPort, cliflags.PortName, "p", envutil.EnvOrDefaultString(cliflags.PortName, base.DefaultPort), usageEnv(forClient(cliflags.PortName))) } // Commands that need an http port. httpCmds := []*cobra.Command{quitCmd} httpCmds = append(httpCmds, nodeCmds...) for _, cmd := range httpCmds { f := cmd.PersistentFlags() f.StringVar(&httpPort, cliflags.HTTPPortName, envutil.EnvOrDefaultString(cliflags.HTTPPortName, base.DefaultHTTPPort), usageEnv(forClient(cliflags.HTTPPortName))) } // Commands that establish a SQL connection. sqlCmds := []*cobra.Command{sqlShellCmd} sqlCmds = append(sqlCmds, zoneCmds...) sqlCmds = append(sqlCmds, userCmds...) for _, cmd := range sqlCmds { f := cmd.PersistentFlags() f.StringVar(&connURL, cliflags.URLName, envutil.EnvOrDefaultString(cliflags.URLName, ""), usageEnv(cliflags.URLName)) f.StringVarP(&connUser, cliflags.UserName, "u", envutil.EnvOrDefaultString(cliflags.UserName, security.RootUser), usageEnv(cliflags.UserName)) f.StringVarP(&connPort, cliflags.PortName, "p", envutil.EnvOrDefaultString(cliflags.PortName, base.DefaultPort), usageEnv(forClient(cliflags.PortName))) f.StringVarP(&connDBName, cliflags.DatabaseName, "d", envutil.EnvOrDefaultString(cliflags.DatabaseName, ""), usageEnv(cliflags.DatabaseName)) } // Max results flag for scan, reverse scan, and range list. for _, cmd := range []*cobra.Command{scanCmd, reverseScanCmd, lsRangesCmd} { f := cmd.Flags() f.Int64Var(&maxResults, cliflags.MaxResultsName, 1000, usageNoEnv(cliflags.MaxResultsName)) } // Debug commands. { f := debugKeysCmd.Flags() f.StringVar(&cliContext.debug.startKey, cliflags.FromName, "", usageEnv(cliflags.FromName)) f.StringVar(&cliContext.debug.endKey, cliflags.ToName, "", usageEnv(cliflags.ToName)) f.BoolVar(&cliContext.debug.raw, cliflags.RawName, false, usageEnv(cliflags.RawName)) f.BoolVar(&cliContext.debug.values, cliflags.ValuesName, false, usageEnv(cliflags.ValuesName)) } { f := versionCmd.Flags() f.BoolVar(&versionIncludesDeps, cliflags.DepsName, false, usageEnv(cliflags.DepsName)) } }
sp.SetBaggageItem(Snowball, "1") } return sp, err } func defaultOptions(recorder func(basictracer.RawSpan)) basictracer.Options { opts := basictracer.DefaultOptions() opts.ShouldSample = func(traceID uint64) bool { return false } opts.TrimUnsampledSpans = true opts.Recorder = CallbackRecorder(recorder) opts.NewSpanEventListener = events.NetTraceIntegrator opts.DebugAssertUseAfterFinish = true // provoke crash on use-after-Finish return opts } var lightstepToken = envutil.EnvOrDefaultString("COCKROACH_LIGHTSTEP_TOKEN", "") // newTracer implements NewTracer and allows that function to be mocked out via Disable(). var newTracer = func() opentracing.Tracer { if lightstepToken != "" { return lightstep.NewTracer(lightstep.Options{ AccessToken: lightstepToken, }) } return basictracer.NewWithOptions(defaultOptions(func(_ basictracer.RawSpan) {})) } // NewTracer creates a Tracer which records to the net/trace // endpoint. func NewTracer() opentracing.Tracer { return newTracer()