diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..2c6d5293 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Daemon", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceRoot}/cmd/bifrost", + "env": {}, + "args": ["daemon", "--udp-listen", ":5112"] + } + ] +} \ No newline at end of file diff --git a/cli/client_dial.go b/cli/client_dial.go index 75ad0d07..7b46c077 100644 --- a/cli/client_dial.go +++ b/cli/client_dial.go @@ -3,8 +3,8 @@ package cli import ( "os" - "github.com/aperturerobotics/bifrost/stream/grpc" - "github.com/aperturerobotics/bifrost/stream/grpc/rpc" + stream_grpc "github.com/aperturerobotics/bifrost/stream/grpc" + stream_grpc_rpc "github.com/aperturerobotics/bifrost/stream/grpc/rpc" "github.com/aperturerobotics/bifrost/util/rwc" "github.com/urfave/cli" ) @@ -17,7 +17,7 @@ func (a *ClientArgs) RunDial(*cli.Context) error { return err } - client, err := c.AcceptStream(ctx) + client, err := c.DialStream(ctx) if err != nil { return err } @@ -25,19 +25,17 @@ func (a *ClientArgs) RunDial(*cli.Context) error { if len(a.RemotePeerIdsCsv) != 0 { a.AcceptConf.RemotePeerIds = a.ParseRemotePeerIdsCsv() } - err = client.Send(&stream_grpc.AcceptStreamRequest{ - Config: &a.AcceptConf, + err = client.Send(&stream_grpc.DialStreamRequest{ + Config: &a.DialConf, }) if err != nil { return err } - drpc := stream_grpc.NewAcceptStreamClientRPC(client) + drpc := stream_grpc.NewDialStreamClientRPC(client) return stream_grpc_rpc.AttachRPCToStream( drpc, rwc.NewReadWriteCloser(os.Stdin, os.Stdout), nil, ) - - return nil } diff --git a/cmd/bifrost/cmd_daemon.go b/cmd/bifrost/cmd_daemon.go index cc80de73..bd89d338 100644 --- a/cmd/bifrost/cmd_daemon.go +++ b/cmd/bifrost/cmd_daemon.go @@ -14,16 +14,19 @@ import ( api_controller "github.com/aperturerobotics/bifrost/daemon/api/controller" egctr "github.com/aperturerobotics/bifrost/entitygraph" "github.com/aperturerobotics/bifrost/keypem" - "github.com/aperturerobotics/bifrost/stream/forwarding" - "github.com/aperturerobotics/bifrost/stream/grpc/accept" - "github.com/aperturerobotics/bifrost/stream/listening" + stream_forwarding "github.com/aperturerobotics/bifrost/stream/forwarding" + stream_grpc_accept "github.com/aperturerobotics/bifrost/stream/grpc/accept" + stream_listening "github.com/aperturerobotics/bifrost/stream/listening" xbtpt "github.com/aperturerobotics/bifrost/transport/xbee" "github.com/aperturerobotics/controllerbus/bus" + configset "github.com/aperturerobotics/controllerbus/controller/configset" + configset_controller "github.com/aperturerobotics/controllerbus/controller/configset/controller" + configset_json "github.com/aperturerobotics/controllerbus/controller/configset/json" "github.com/aperturerobotics/controllerbus/controller/resolver" "github.com/aperturerobotics/controllerbus/directive" egc "github.com/aperturerobotics/entitygraph/controller" - "github.com/aperturerobotics/entitygraph/logger" - "github.com/libp2p/go-libp2p-crypto" + entitygraph_logger "github.com/aperturerobotics/entitygraph/logger" + crypto "github.com/libp2p/go-libp2p-crypto" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -36,6 +39,8 @@ import _ "net/http/pprof" var daemonFlags struct { bcli.DaemonArgs + WriteConfig bool + ConfigPath string PeerPrivPath string APIListen string ProfListen string @@ -50,11 +55,24 @@ func init() { Action: runDaemon, Flags: append( (&daemonFlags.DaemonArgs).BuildFlags(), + cli.StringFlag{ + Name: "config, c", + Usage: "path to configuration yaml file", + EnvVar: "BIFROST_CONFIG", + Value: "bifrost_daemon.yaml", + Destination: &daemonFlags.ConfigPath, + }, + cli.BoolFlag{ + Name: "write-config", + Usage: "write the daemon config file on startup", + EnvVar: "BIFROST_WRITE_CONFIG", + Destination: &daemonFlags.WriteConfig, + }, cli.StringFlag{ Name: "node-priv", Usage: "path to node private key, will be generated if doesn't exist", EnvVar: "BIFROST_NODE_PRIV", - Value: "daemon_node_priv.pem", + Value: "bifrost_daemon.pem", Destination: &daemonFlags.PeerPrivPath, }, cli.StringFlag{ @@ -160,6 +178,35 @@ func runDaemon(c *cli.Context) error { return errors.Wrap(err, "start entitygraph logger") } + // Construct config set. + confSet := configset.ConfigSet{} + + // Load config file + configLe := le.WithField("config", daemonFlags.ConfigPath) + if confPath := daemonFlags.ConfigPath; confPath != "" { + confDat, err := ioutil.ReadFile(confPath) + if err != nil { + if os.IsNotExist(err) { + if daemonFlags.WriteConfig { + configLe.Info("cannot find config but write-config is set, continuing") + } else { + return errors.Wrapf( + err, + "cannot find config at %s", + daemonFlags.ConfigPath, + ) + } + } else { + return errors.Wrap(err, "load config") + } + } + + err = configset_json.UnmarshalYAML(ctx, b, confDat, confSet, true) + if err != nil { + return errors.Wrap(err, "unmarshal config yaml") + } + } + // Daemon API if daemonFlags.APIListen != "" { _, apiRef, err := b.AddDirective( @@ -176,22 +223,46 @@ func runDaemon(c *cli.Context) error { defer apiRef.Release() } + // ConfigSet controller + _, csRef, err := b.AddDirective( + resolver.NewLoadControllerWithConfig(&configset_controller.Config{}), + nil, + ) + if err != nil { + return errors.Wrap(err, "construct configset controller") + } + defer csRef.Release() + // TODO: Load these from CLI/yaml configuration. // For now, hardcode it. confs, err := daemonFlags.BuildControllerConfigs() if err != nil { return err } + for id, conf := range confs { - _, confRef, err := b.AddDirective( - resolver.NewLoadControllerWithConfig(conf), - nil, - ) + confSet[id] = configset.NewControllerConfig(1, conf) + } + + if daemonFlags.ConfigPath != "" && daemonFlags.WriteConfig { + confDat, err := configset_json.MarshalYAML(confSet) if err != nil { - return errors.Wrap(err, id+" controller") + return errors.Wrap(err, "marshal config") } - defer confRef.Release() + err = ioutil.WriteFile(daemonFlags.ConfigPath, confDat, 0644) + if err != nil { + return errors.Wrap(err, "write config file") + } + } + + _, bdbRef, err := b.AddDirective( + configset.NewApplyConfigSet(confSet), + nil, + ) + if err != nil { + return err } + defer bdbRef.Release() if daemonFlags.ProfListen != "" { runtime.SetBlockProfileRate(1) diff --git a/go.mod b/go.mod index c3bd3ac3..214761b9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ replace github.com/multiformats/go-multihash => github.com/paralin/go-multihash replace github.com/libp2p/go-libp2p-crypto => github.com/paralin/go-libp2p-crypto v0.0.0-20181130162722-b150863d61f7 require ( - github.com/aperturerobotics/controllerbus v0.0.0-20190412141224-a86f75f58cec + github.com/aperturerobotics/controllerbus v0.0.0-20190820025710-22efcef818fb github.com/aperturerobotics/entitygraph v0.0.0-20190314052401-c4dff866fe8f github.com/aperturerobotics/timestamp v0.2.2-0.20190226083629-0175fc7d961e github.com/blang/semver v3.5.1+incompatible @@ -33,7 +33,7 @@ require ( github.com/pauleyj/gobee v0.0.0-20190212035730-6270c53072a4 github.com/pierrec/lz4 v2.0.5+incompatible github.com/pkg/errors v0.8.2-0.20190227000051-27936f6d90f9 - github.com/sirupsen/logrus v1.4.0 + github.com/sirupsen/logrus v1.4.1 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 // indirect github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect @@ -42,5 +42,5 @@ require ( github.com/urfave/cli v1.20.1-0.20190203184040-693af58b4d51 github.com/xtaci/smux v1.1.1 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 - google.golang.org/grpc v1.19.0 + google.golang.org/grpc v1.23.0 ) diff --git a/go.sum b/go.sum index 5f34c2b6..936842ad 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,12 @@ github.com/aperturerobotics/controllerbus v0.0.0-20190314041023-9288fa0e12c9 h1: github.com/aperturerobotics/controllerbus v0.0.0-20190314041023-9288fa0e12c9/go.mod h1:lWgkdt/EVFeV1N7nNA895276svmon1Wj7CR95FBeif0= github.com/aperturerobotics/controllerbus v0.0.0-20190412141224-a86f75f58cec h1:cY50NpUURx3euFUezKWbJ1u6Ac+9kXeSlSOmW7PRbjM= github.com/aperturerobotics/controllerbus v0.0.0-20190412141224-a86f75f58cec/go.mod h1:lWgkdt/EVFeV1N7nNA895276svmon1Wj7CR95FBeif0= +github.com/aperturerobotics/controllerbus v0.0.0-20190820015919-244c78093e70 h1:gjgiY+Q2ijec4c2jSfRlo+Gvt1UkYw8qM/Y64GCgRDo= +github.com/aperturerobotics/controllerbus v0.0.0-20190820015919-244c78093e70/go.mod h1:s9ELCbtHCGXyu7ztijT/U09wi4De1OgJdsE8f3kDRQ0= +github.com/aperturerobotics/controllerbus v0.0.0-20190820023906-1b1fb349602a h1:4h7wvqArxg/nMq5zRGCqE3xIJ4UW9R1t82JO0A0s6kA= +github.com/aperturerobotics/controllerbus v0.0.0-20190820023906-1b1fb349602a/go.mod h1:s9ELCbtHCGXyu7ztijT/U09wi4De1OgJdsE8f3kDRQ0= +github.com/aperturerobotics/controllerbus v0.0.0-20190820025710-22efcef818fb h1:wRPy1RasoIMpE5TNvSn+hFjJD5LKNXOXS/n70SMICyw= +github.com/aperturerobotics/controllerbus v0.0.0-20190820025710-22efcef818fb/go.mod h1:s9ELCbtHCGXyu7ztijT/U09wi4De1OgJdsE8f3kDRQ0= github.com/aperturerobotics/entitygraph v0.0.0-20190314052401-c4dff866fe8f h1:CeatIaQ+q2akgnaUmU5SZmClaxYTHfyweGODOqv1Cik= github.com/aperturerobotics/entitygraph v0.0.0-20190314052401-c4dff866fe8f/go.mod h1:kwXRXbNyQIjylr7WmwL0zxTzu6SQUl6ShLlk2v3pF2o= github.com/aperturerobotics/timestamp v0.2.2-0.20190226083629-0175fc7d961e h1:B6jBrRLChnQhCaF+AL55fAUVQp2xxHE+DFWN+uTGz5E= @@ -24,11 +30,14 @@ github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1q github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/djherbis/buffer v1.0.1-0.20181027144806-3c732ee9b562 h1:srKOrjxdE9Ld+rDdLlpS7OPmtGpOLYBYjPktiYvSHVo= github.com/djherbis/buffer v1.0.1-0.20181027144806-3c732ee9b562/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gogo/protobuf v1.2.2-0.20190611061853-dadb62585089 h1:raOeh+DEb2K79TKYcitwQUJOc4xdEOEJsgm8zQ6q1IU= github.com/gogo/protobuf v1.2.2-0.20190611061853-dadb62585089/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -41,6 +50,7 @@ github.com/golang/protobuf v1.3.3-0.20190805180045-4c88cc3f1a34 h1:lOqqfn77CiAxt github.com/golang/protobuf v1.3.3-0.20190805180045-4c88cc3f1a34/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/websocket v0.0.0-20170522004412-87ee47603f13 h1:3TcZe31zyrteCrSU2+4QSSx9N6sQC6PjXwrHjfX3USM= @@ -66,6 +76,8 @@ github.com/klauspost/reedsolomon v1.9.3-0.20190625143044-789068412913 h1:qzAosvI github.com/klauspost/reedsolomon v1.9.3-0.20190625143044-789068412913/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -101,11 +113,15 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.4.0 h1:yKenngtzGh+cUSSh6GWbxW2abRqhYUSR/t/6+2QqNvE= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 h1:89CEmDvlq/F7SJEOqkIdNDGJXrQIhuIx9D2DBXjavSU= @@ -124,14 +140,19 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977 h1:actzWV6iWn3GLqN8dZjzsB+CLt+gaV2+wsxroxiQI8I= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= @@ -140,10 +161,14 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -151,8 +176,13 @@ google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXt google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=