1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-01-17 17:44:30 +02:00
go-micro/cmd/cmd.go

636 lines
18 KiB
Go
Raw Normal View History

2016-12-14 15:41:48 +00:00
// Package cmd is an interface for parsing the command line
package cmd
import (
2015-08-30 02:24:16 +01:00
"fmt"
2015-12-05 19:25:36 +00:00
"math/rand"
"strings"
2015-12-05 19:25:36 +00:00
"time"
"github.com/asim/go-micro/v3/auth"
"github.com/asim/go-micro/v3/broker"
"github.com/asim/go-micro/v3/client"
"github.com/asim/go-micro/v3/config"
"github.com/asim/go-micro/v3/debug/profile"
"github.com/asim/go-micro/v3/debug/profile/http"
"github.com/asim/go-micro/v3/debug/profile/pprof"
"github.com/asim/go-micro/v3/debug/trace"
"github.com/asim/go-micro/v3/logger"
"github.com/asim/go-micro/v3/registry"
"github.com/asim/go-micro/v3/runtime"
"github.com/asim/go-micro/v3/selector"
"github.com/asim/go-micro/v3/server"
"github.com/asim/go-micro/v3/store"
"github.com/asim/go-micro/v3/transport"
update etcd version (#2186) Remove missing gRPC example from README.md (#2112) Delete docker.yml Delete Dockerfile update plugins version & remove replace (#2118) * update memory registry plugins version & remove replace * update plugins version & remove replace Co-authored-by: 申法宽 <shenfakuan@163.com> update client/grpc plugins version & remove replace (#2119) * update memory registry plugins version & remove replace * update plugins version & remove replace * update plugins/client/grpc/v3 version Co-authored-by: 申法宽 <shenfakuan@163.com> update etcd version (#2120) update mod version update update pulgin registry mod version (#2121) * update etcd version * update mod version * update fix store delete support for tls on http plugin (#2126) improve code quality (#2128) * Fix inefficient string comparison * Fix unnecessary calls to Printf * Canonicalize header key * Replace `t.Sub(time.Now())` with `time.Until` * Remove unnecessary blank (_) identifier * Remove unnecessary use of slice * Remove unnecessary comparison with bool Update README.md Update README.md remove network package update quic go mod remove indirects update etcd mod version Update registry plugins mod version (#2130) * update etcd version * update mod version * update * update etcd mod version Update README.md Update README.md Update README.md fixing etcd stack in getToken (#2145) when provide username and password, etcd will try to get auth token from server if server is unavailble, etcd client will stack in when dial timeout is set, it will return err instead of stack in Update README.md add http demo; http client can call http server; http client can call rpc server (#2149) Add etcd to default registries when plugin is loaded (#2150) Co-authored-by: Andrew Jones <andrew@gotoblink.com> Update README.md make rpcClient compatible with 32bit arm systems (#2156) On ARM, 386, and 32-bit MIPS, it is the caller's responsibility to arrange for 64-bit alignment of 64-bit words accessed atomically. Only the first word in an allocated struct can be relied upon to be 64-bit aligned. optimize the process of switching grpc error to micro error (#2158) Fix util/log/log.Infof format didn't work (#2160) Co-authored-by: Cui Gang <cuigang@yunpbx.com> fixing string field contains invalid UTF-8 issue (#2164) fix k8s api memory leak (#2166) fix http No release Broker (#2167) * Update http.go Exit before deregister is executed * Create http.go Exit before deregister is executed fix: "Solve the problem that the resources have not been fully released due to early exit" (#2168) * Update http.go Exit before deregister is executed * Create http.go Exit before deregister is executed * Solve the problem that the resources have not been fully released due to early exit * Optimize some code * Optimize some code fix service default logger (#2171) * Update http.go Exit before deregister is executed * Create http.go Exit before deregister is executed * Solve the problem that the resources have not been fully released due to early exit * Optimize some code * Optimize some code * Optimize some code * fix service default logger Update README.md get k8s pod (#2173) Update README.md fix:field (#2176) * get k8s pod * fix: filed * field Update README.md add rmq message properties (#2177) Co-authored-by: dtitov <dtitov@might24.ru> Update README.md grpc server add RegisterCheck (#2178) fix 404 bug (#2179) fix undefined: err (#2181) Add registry and config/source plugins based on nacos/v2 (#2182) * Add registry plugins implement by nacos/v2 * Add config/source plugins implement by nacos/v2 support hystrix fallback (#2183) Windows event log plugin (#2180) * add rmq message properties * eventlog start * start eventlog * windows event logger * readme * readme Co-authored-by: dtitov <dtitov@might24.ru> support etcd auth with env args (#2184) * support etcd auth with env args set default registry address with env arg instead of 127.0.0.1 * fixing MICRO_REGISTRY_ADDRESS may empty issue update mod version
2021-06-29 20:40:54 +08:00
"github.com/micro/cli/v2"
)
2016-01-01 01:16:21 +00:00
type Cmd interface {
// The cli app within this cmd
App() *cli.App
// Adds options, parses flags and initialise
// exits on error
2016-01-02 19:12:17 +00:00
Init(opts ...Option) error
2016-01-01 01:16:21 +00:00
// Options set within this command
Options() Options
}
type cmd struct {
opts Options
app *cli.App
}
type Option func(o *Options)
var (
2016-01-01 01:16:21 +00:00
DefaultCmd = newCmd()
2015-12-23 22:45:40 +00:00
2016-01-01 01:16:21 +00:00
DefaultFlags = []cli.Flag{
&cli.StringFlag{
Name: "client",
EnvVars: []string{"MICRO_CLIENT"},
Usage: "Client for go-micro; rpc",
},
&cli.StringFlag{
Name: "client_request_timeout",
EnvVars: []string{"MICRO_CLIENT_REQUEST_TIMEOUT"},
Usage: "Sets the client request timeout. e.g 500ms, 5s, 1m. Default: 5s",
},
&cli.IntFlag{
Name: "client_retries",
EnvVars: []string{"MICRO_CLIENT_RETRIES"},
Value: client.DefaultRetries,
Usage: "Sets the client retries. Default: 1",
},
&cli.IntFlag{
Name: "client_pool_size",
EnvVars: []string{"MICRO_CLIENT_POOL_SIZE"},
Usage: "Sets the client connection pool size. Default: 1",
2016-06-07 00:46:14 +01:00
},
&cli.StringFlag{
Name: "client_pool_ttl",
EnvVars: []string{"MICRO_CLIENT_POOL_TTL"},
Usage: "Sets the client connection pool ttl. e.g 500ms, 5s, 1m. Default: 1m",
2016-06-07 00:46:14 +01:00
},
&cli.IntFlag{
Name: "register_ttl",
EnvVars: []string{"MICRO_REGISTER_TTL"},
Value: 60,
Usage: "Register TTL in seconds",
},
&cli.IntFlag{
Name: "register_interval",
EnvVars: []string{"MICRO_REGISTER_INTERVAL"},
Value: 30,
Usage: "Register interval in seconds",
},
&cli.StringFlag{
Name: "server",
EnvVars: []string{"MICRO_SERVER"},
Usage: "Server for go-micro; rpc",
},
&cli.StringFlag{
Name: "server_name",
EnvVars: []string{"MICRO_SERVER_NAME"},
Usage: "Name of the server. go.micro.srv.example",
2015-05-26 22:39:48 +01:00
},
&cli.StringFlag{
Name: "server_version",
EnvVars: []string{"MICRO_SERVER_VERSION"},
Usage: "Version of the server. 1.1.0",
2015-11-08 01:48:48 +00:00
},
&cli.StringFlag{
Name: "server_id",
EnvVars: []string{"MICRO_SERVER_ID"},
Usage: "Id of the server. Auto-generated if not specified",
2015-05-26 22:39:48 +01:00
},
&cli.StringFlag{
Name: "server_address",
EnvVars: []string{"MICRO_SERVER_ADDRESS"},
Usage: "Bind address for the server. 127.0.0.1:8080",
},
&cli.StringFlag{
Name: "server_advertise",
EnvVars: []string{"MICRO_SERVER_ADVERTISE"},
Usage: "Used instead of the server_address when registering with discovery. 127.0.0.1:8080",
2015-11-11 18:22:04 +00:00
},
&cli.StringSliceFlag{
Name: "server_metadata",
EnvVars: []string{"MICRO_SERVER_METADATA"},
Value: &cli.StringSlice{},
Usage: "A list of key-value pairs defining metadata. version=1.0.0",
2015-05-26 22:39:48 +01:00
},
&cli.StringFlag{
Name: "broker",
EnvVars: []string{"MICRO_BROKER"},
Usage: "Broker for pub/sub. http, nats, rabbitmq",
},
&cli.StringFlag{
Name: "broker_address",
EnvVars: []string{"MICRO_BROKER_ADDRESS"},
Usage: "Comma-separated list of broker addresses",
},
&cli.StringFlag{
Name: "profile",
Usage: "Debug profiler for cpu and memory stats",
EnvVars: []string{"MICRO_DEBUG_PROFILE"},
},
&cli.StringFlag{
Name: "registry",
EnvVars: []string{"MICRO_REGISTRY"},
Usage: "Registry for discovery. etcd, mdns",
},
&cli.StringFlag{
Name: "registry_address",
EnvVars: []string{"MICRO_REGISTRY_ADDRESS"},
Usage: "Comma-separated list of registry addresses",
},
&cli.StringFlag{
Name: "runtime",
Usage: "Runtime for building and running services e.g local, kubernetes",
EnvVars: []string{"MICRO_RUNTIME"},
},
&cli.StringFlag{
Name: "runtime_source",
Usage: "Runtime source for building and running services e.g github.com/micro/service",
EnvVars: []string{"MICRO_RUNTIME_SOURCE"},
Value: "github.com/micro/services",
},
&cli.StringFlag{
Name: "selector",
EnvVars: []string{"MICRO_SELECTOR"},
Usage: "Selector used to pick nodes for querying",
2015-12-09 19:32:10 +00:00
},
&cli.StringFlag{
Name: "store",
EnvVars: []string{"MICRO_STORE"},
Usage: "Store used for key-value storage",
},
&cli.StringFlag{
Name: "store_address",
EnvVars: []string{"MICRO_STORE_ADDRESS"},
Usage: "Comma-separated list of store addresses",
},
&cli.StringFlag{
Name: "store_database",
EnvVars: []string{"MICRO_STORE_DATABASE"},
Usage: "Database option for the underlying store",
},
&cli.StringFlag{
Name: "store_table",
2020-04-08 19:44:49 +01:00
EnvVars: []string{"MICRO_STORE_TABLE"},
Usage: "Table option for the underlying store",
},
&cli.StringFlag{
Name: "transport",
EnvVars: []string{"MICRO_TRANSPORT"},
Usage: "Transport mechanism used; http",
2015-05-20 22:57:19 +01:00
},
&cli.StringFlag{
Name: "transport_address",
EnvVars: []string{"MICRO_TRANSPORT_ADDRESS"},
Usage: "Comma-separated list of transport addresses",
2015-05-20 22:57:19 +01:00
},
2020-01-29 15:45:11 +00:00
&cli.StringFlag{
Name: "tracer",
EnvVars: []string{"MICRO_TRACER"},
Usage: "Tracer for distributed tracing, e.g. memory, jaeger",
},
&cli.StringFlag{
Name: "tracer_address",
EnvVars: []string{"MICRO_TRACER_ADDRESS"},
Usage: "Comma-separated list of tracer addresses",
},
&cli.StringFlag{
Name: "auth",
EnvVars: []string{"MICRO_AUTH"},
Usage: "Auth for role based access control, e.g. service",
},
&cli.StringFlag{
2020-03-31 12:44:34 +01:00
Name: "auth_id",
EnvVars: []string{"MICRO_AUTH_ID"},
Usage: "Account ID used for client authentication",
},
&cli.StringFlag{
Name: "auth_secret",
EnvVars: []string{"MICRO_AUTH_SECRET"},
Usage: "Account secret used for client authentication",
},
2020-05-12 16:41:29 +01:00
&cli.StringFlag{
Name: "auth_namespace",
EnvVars: []string{"MICRO_AUTH_NAMESPACE"},
Usage: "Namespace for the services auth account",
Value: "go.micro",
2020-05-12 16:41:29 +01:00
},
&cli.StringFlag{
Name: "auth_public_key",
EnvVars: []string{"MICRO_AUTH_PUBLIC_KEY"},
Usage: "Public key for JWT auth (base64 encoded PEM)",
},
&cli.StringFlag{
Name: "auth_private_key",
EnvVars: []string{"MICRO_AUTH_PRIVATE_KEY"},
Usage: "Private key for JWT auth (base64 encoded PEM)",
},
&cli.StringFlag{
Name: "config",
EnvVars: []string{"MICRO_CONFIG"},
Usage: "The source of the config to be used to get configuration",
},
}
2020-12-29 15:49:26 +00:00
DefaultBrokers = map[string]func(...broker.Option) broker.Broker{}
2020-12-29 15:49:26 +00:00
DefaultClients = map[string]func(...client.Option) client.Client{}
2020-12-29 15:49:26 +00:00
DefaultRegistries = map[string]func(...registry.Option) registry.Registry{}
2020-12-29 15:49:26 +00:00
DefaultSelectors = map[string]func(...selector.Option) selector.Selector{}
2015-12-09 19:32:10 +00:00
2020-12-29 15:49:26 +00:00
DefaultServers = map[string]func(...server.Option) server.Server{}
2020-12-29 15:49:26 +00:00
DefaultTransports = map[string]func(...transport.Option) transport.Transport{}
2020-12-29 15:49:26 +00:00
DefaultRuntimes = map[string]func(...runtime.Option) runtime.Runtime{}
2020-12-29 15:49:26 +00:00
DefaultStores = map[string]func(...store.Option) store.Store{}
2020-01-06 17:44:32 +00:00
2020-12-29 15:49:26 +00:00
DefaultTracers = map[string]func(...trace.Option) trace.Tracer{}
2020-01-29 15:45:11 +00:00
2020-12-29 15:49:26 +00:00
DefaultAuths = map[string]func(...auth.Option) auth.Auth{}
DefaultProfiles = map[string]func(...profile.Option) profile.Profile{
"http": http.NewProfile,
"pprof": pprof.NewProfile,
}
2020-12-11 11:12:44 +00:00
DefaultConfigs = map[string]func(...config.Option) (config.Config, error){}
)
2015-12-05 19:25:36 +00:00
func init() {
rand.Seed(time.Now().Unix())
}
2016-01-01 01:16:21 +00:00
func newCmd(opts ...Option) Cmd {
options := Options{
Auth: &auth.DefaultAuth,
2016-01-02 00:38:57 +00:00
Broker: &broker.DefaultBroker,
Client: &client.DefaultClient,
Registry: &registry.DefaultRegistry,
Server: &server.DefaultServer,
Selector: &selector.DefaultSelector,
Transport: &transport.DefaultTransport,
Runtime: &runtime.DefaultRuntime,
2020-01-06 17:44:32 +00:00
Store: &store.DefaultStore,
2020-01-29 15:45:11 +00:00
Tracer: &trace.DefaultTracer,
Profile: &profile.DefaultProfile,
Config: &config.DefaultConfig,
2016-01-02 00:38:57 +00:00
2016-01-01 01:16:21 +00:00
Brokers: DefaultBrokers,
Clients: DefaultClients,
2016-01-01 01:16:21 +00:00
Registries: DefaultRegistries,
Selectors: DefaultSelectors,
Servers: DefaultServers,
2016-01-01 01:16:21 +00:00
Transports: DefaultTransports,
Runtimes: DefaultRuntimes,
2020-01-06 17:44:32 +00:00
Stores: DefaultStores,
2020-01-29 15:45:11 +00:00
Tracers: DefaultTracers,
Auths: DefaultAuths,
Profiles: DefaultProfiles,
Configs: DefaultConfigs,
2016-01-01 01:16:21 +00:00
}
2016-01-01 01:16:21 +00:00
for _, o := range opts {
o(&options)
}
2016-01-01 02:45:15 +00:00
if len(options.Description) == 0 {
options.Description = "a go-micro service"
}
2016-01-01 01:16:21 +00:00
cmd := new(cmd)
cmd.opts = options
cmd.app = cli.NewApp()
cmd.app.Name = cmd.opts.Name
cmd.app.Version = cmd.opts.Version
cmd.app.Usage = cmd.opts.Description
cmd.app.Before = cmd.Before
cmd.app.Flags = DefaultFlags
cmd.app.Action = func(c *cli.Context) error {
return nil
}
2016-01-01 02:45:15 +00:00
if len(options.Version) == 0 {
cmd.app.HideVersion = true
}
2016-01-01 01:16:21 +00:00
return cmd
}
func (c *cmd) App() *cli.App {
return c.app
}
func (c *cmd) Options() Options {
return c.opts
}
func (c *cmd) Before(ctx *cli.Context) error {
2016-01-02 00:38:57 +00:00
// If flags are set then use them otherwise do nothing
var serverOpts []server.Option
var clientOpts []client.Option
2020-12-12 20:14:50 +00:00
// Set the client
if name := ctx.String("client"); len(name) > 0 {
// only change if we have the client and type differs
if cl, ok := c.opts.Clients[name]; ok && (*c.opts.Client).String() != name {
*c.opts.Client = cl()
}
}
// Set the server
if name := ctx.String("server"); len(name) > 0 {
// only change if we have the server and type differs
if s, ok := c.opts.Servers[name]; ok && (*c.opts.Server).String() != name {
*c.opts.Server = s()
}
}
2020-01-29 15:45:11 +00:00
// Set the store
2020-01-06 17:44:32 +00:00
if name := ctx.String("store"); len(name) > 0 {
s, ok := c.opts.Stores[name]
if !ok {
return fmt.Errorf("Unsupported store: %s", name)
}
2020-12-12 20:14:50 +00:00
*c.opts.Store = s(store.WithClient(*c.opts.Client))
2020-01-06 17:44:32 +00:00
}
// Set the runtime
if name := ctx.String("runtime"); len(name) > 0 {
r, ok := c.opts.Runtimes[name]
if !ok {
return fmt.Errorf("Unsupported runtime: %s", name)
}
2020-12-12 20:14:50 +00:00
*c.opts.Runtime = r(runtime.WithClient(*c.opts.Client))
}
2020-01-29 15:45:11 +00:00
// Set the tracer
if name := ctx.String("tracer"); len(name) > 0 {
r, ok := c.opts.Tracers[name]
if !ok {
return fmt.Errorf("Unsupported tracer: %s", name)
}
*c.opts.Tracer = r()
}
// Setup auth
2020-12-29 15:49:26 +00:00
authOpts := []auth.Option{}
if len(ctx.String("auth_id")) > 0 || len(ctx.String("auth_secret")) > 0 {
authOpts = append(authOpts, auth.Credentials(
ctx.String("auth_id"), ctx.String("auth_secret"),
))
}
if len(ctx.String("auth_public_key")) > 0 {
authOpts = append(authOpts, auth.PublicKey(ctx.String("auth_public_key")))
}
if len(ctx.String("auth_private_key")) > 0 {
authOpts = append(authOpts, auth.PrivateKey(ctx.String("auth_private_key")))
}
if len(ctx.String("auth_namespace")) > 0 {
authOpts = append(authOpts, auth.Namespace(ctx.String("auth_namespace")))
}
// Set the registry
if name := ctx.String("registry"); len(name) > 0 && (*c.opts.Registry).String() != name {
r, ok := c.opts.Registries[name]
if !ok {
return fmt.Errorf("Registry %s not found", name)
}
2020-12-11 11:12:44 +00:00
*c.opts.Registry = r()
serverOpts = append(serverOpts, server.Registry(*c.opts.Registry))
clientOpts = append(clientOpts, client.Registry(*c.opts.Registry))
if err := (*c.opts.Selector).Init(selector.Registry(*c.opts.Registry)); err != nil {
logger.Fatalf("Error configuring registry: %v", err)
}
clientOpts = append(clientOpts, client.Selector(*c.opts.Selector))
if err := (*c.opts.Broker).Init(broker.Registry(*c.opts.Registry)); err != nil {
logger.Fatalf("Error configuring broker: %v", err)
}
}
// Set the profile
if name := ctx.String("profile"); len(name) > 0 {
p, ok := c.opts.Profiles[name]
if !ok {
return fmt.Errorf("Unsupported profile: %s", name)
}
*c.opts.Profile = p()
}
2016-01-02 00:38:57 +00:00
// Set the broker
if name := ctx.String("broker"); len(name) > 0 && (*c.opts.Broker).String() != name {
b, ok := c.opts.Brokers[name]
if !ok {
return fmt.Errorf("Broker %s not found", name)
2016-01-02 00:38:57 +00:00
}
*c.opts.Broker = b()
2016-01-02 00:38:57 +00:00
serverOpts = append(serverOpts, server.Broker(*c.opts.Broker))
clientOpts = append(clientOpts, client.Broker(*c.opts.Broker))
}
2016-01-02 00:38:57 +00:00
// Set the selector
if name := ctx.String("selector"); len(name) > 0 && (*c.opts.Selector).String() != name {
s, ok := c.opts.Selectors[name]
if !ok {
return fmt.Errorf("Selector %s not found", name)
2016-01-02 00:38:57 +00:00
}
*c.opts.Selector = s(selector.Registry(*c.opts.Registry))
2016-01-02 00:38:57 +00:00
// No server option here. Should there be?
clientOpts = append(clientOpts, client.Selector(*c.opts.Selector))
2015-12-09 19:32:10 +00:00
}
2016-01-02 00:38:57 +00:00
// Set the transport
if name := ctx.String("transport"); len(name) > 0 && (*c.opts.Transport).String() != name {
t, ok := c.opts.Transports[name]
if !ok {
return fmt.Errorf("Transport %s not found", name)
2016-01-02 00:38:57 +00:00
}
*c.opts.Transport = t()
2016-01-02 00:38:57 +00:00
serverOpts = append(serverOpts, server.Transport(*c.opts.Transport))
clientOpts = append(clientOpts, client.Transport(*c.opts.Transport))
}
2016-01-02 00:38:57 +00:00
// Parse the server options
2015-05-26 22:39:48 +01:00
metadata := make(map[string]string)
2016-01-01 01:16:21 +00:00
for _, d := range ctx.StringSlice("server_metadata") {
2015-05-26 22:39:48 +01:00
var key, val string
parts := strings.Split(d, "=")
key = parts[0]
if len(parts) > 1 {
val = strings.Join(parts[1:], "=")
}
metadata[key] = val
}
2016-01-02 00:38:57 +00:00
if len(metadata) > 0 {
serverOpts = append(serverOpts, server.Metadata(metadata))
}
if len(ctx.String("broker_address")) > 0 {
2018-12-06 18:19:05 +00:00
if err := (*c.opts.Broker).Init(broker.Addrs(strings.Split(ctx.String("broker_address"), ",")...)); err != nil {
logger.Fatalf("Error configuring broker: %v", err)
2018-12-06 18:19:05 +00:00
}
}
if len(ctx.String("registry_address")) > 0 {
2018-12-06 18:19:05 +00:00
if err := (*c.opts.Registry).Init(registry.Addrs(strings.Split(ctx.String("registry_address"), ",")...)); err != nil {
logger.Fatalf("Error configuring registry: %v", err)
2018-12-06 18:19:05 +00:00
}
}
if len(ctx.String("transport_address")) > 0 {
2018-12-06 18:19:05 +00:00
if err := (*c.opts.Transport).Init(transport.Addrs(strings.Split(ctx.String("transport_address"), ",")...)); err != nil {
logger.Fatalf("Error configuring transport: %v", err)
2018-12-06 18:19:05 +00:00
}
}
if len(ctx.String("store_address")) > 0 {
if err := (*c.opts.Store).Init(store.Nodes(strings.Split(ctx.String("store_address"), ",")...)); err != nil {
logger.Fatalf("Error configuring store: %v", err)
}
}
if len(ctx.String("store_database")) > 0 {
if err := (*c.opts.Store).Init(store.Database(ctx.String("store_database"))); err != nil {
logger.Fatalf("Error configuring store database option: %v", err)
}
}
if len(ctx.String("store_table")) > 0 {
if err := (*c.opts.Store).Init(store.Table(ctx.String("store_table"))); err != nil {
logger.Fatalf("Error configuring store table option: %v", err)
}
}
2016-01-02 00:38:57 +00:00
if len(ctx.String("server_name")) > 0 {
serverOpts = append(serverOpts, server.Name(ctx.String("server_name")))
}
2015-05-26 22:39:48 +01:00
2016-01-02 00:38:57 +00:00
if len(ctx.String("server_version")) > 0 {
serverOpts = append(serverOpts, server.Version(ctx.String("server_version")))
}
if len(ctx.String("server_id")) > 0 {
serverOpts = append(serverOpts, server.Id(ctx.String("server_id")))
}
if len(ctx.String("server_address")) > 0 {
serverOpts = append(serverOpts, server.Address(ctx.String("server_address")))
}
if len(ctx.String("server_advertise")) > 0 {
serverOpts = append(serverOpts, server.Advertise(ctx.String("server_advertise")))
}
if ttl := time.Duration(ctx.Int("register_ttl")); ttl >= 0 {
serverOpts = append(serverOpts, server.RegisterTTL(ttl*time.Second))
}
if val := time.Duration(ctx.Int("register_interval")); val >= 0 {
2019-01-24 13:22:17 +00:00
serverOpts = append(serverOpts, server.RegisterInterval(val*time.Second))
}
if len(ctx.String("runtime_source")) > 0 {
if err := (*c.opts.Runtime).Init(runtime.WithSource(ctx.String("runtime_source"))); err != nil {
logger.Fatalf("Error configuring runtime: %v", err)
}
}
// client opts
2018-07-20 14:20:23 +08:00
if r := ctx.Int("client_retries"); r >= 0 {
clientOpts = append(clientOpts, client.Retries(r))
}
if t := ctx.String("client_request_timeout"); len(t) > 0 {
d, err := time.ParseDuration(t)
if err != nil {
return fmt.Errorf("failed to parse client_request_timeout: %v", t)
}
clientOpts = append(clientOpts, client.RequestTimeout(d))
}
2016-06-07 00:46:14 +01:00
if r := ctx.Int("client_pool_size"); r > 0 {
clientOpts = append(clientOpts, client.PoolSize(r))
}
if t := ctx.String("client_pool_ttl"); len(t) > 0 {
d, err := time.ParseDuration(t)
if err != nil {
return fmt.Errorf("failed to parse client_pool_ttl: %v", t)
}
clientOpts = append(clientOpts, client.PoolTTL(d))
}
2016-01-02 00:38:57 +00:00
// We have some command line opts for the server.
// Lets set it up
if len(serverOpts) > 0 {
2018-12-06 18:19:05 +00:00
if err := (*c.opts.Server).Init(serverOpts...); err != nil {
logger.Fatalf("Error configuring server: %v", err)
2018-12-06 18:19:05 +00:00
}
2016-01-02 00:38:57 +00:00
}
// Use an init option?
if len(clientOpts) > 0 {
2018-12-06 18:19:05 +00:00
if err := (*c.opts.Client).Init(clientOpts...); err != nil {
logger.Fatalf("Error configuring client: %v", err)
2018-12-06 18:19:05 +00:00
}
2016-01-02 00:38:57 +00:00
}
2015-08-30 21:22:35 +01:00
return nil
}
2016-01-02 19:12:17 +00:00
func (c *cmd) Init(opts ...Option) error {
2016-01-01 01:16:21 +00:00
for _, o := range opts {
o(&c.opts)
}
2020-01-19 00:55:01 +00:00
if len(c.opts.Name) > 0 {
c.app.Name = c.opts.Name
}
if len(c.opts.Version) > 0 {
c.app.Version = c.opts.Version
}
2017-05-09 15:49:59 +08:00
c.app.HideVersion = len(c.opts.Version) == 0
2016-01-01 01:16:21 +00:00
c.app.Usage = c.opts.Description
c.app.RunAndExitOnError()
2016-01-02 19:12:17 +00:00
return nil
2016-01-01 01:16:21 +00:00
}
func DefaultOptions() Options {
return DefaultCmd.Options()
}
func App() *cli.App {
return DefaultCmd.App()
}
2016-01-02 19:12:17 +00:00
func Init(opts ...Option) error {
return DefaultCmd.Init(opts...)
2016-01-01 01:16:21 +00:00
}
func NewCmd(opts ...Option) Cmd {
return newCmd(opts...)
}