From 12749d8d1c251bd53cab61e82951afd192b7ed48 Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Tue, 26 Nov 2019 13:07:15 -0800 Subject: [PATCH 1/7] BTFS-1081: Migrate status server url to status.btfs.io Update go-btfs-config and allow config migrations to run. --- analytics/analytics.go | 4 ++-- cmd/btfs/daemon.go | 12 +++++++++++- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index c41fcbf2c..392fa6181 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -87,7 +87,7 @@ func Initialize(n *core.IpfsNode, BTFSVersion, hValue string) { return } - statusServerDomain = configuration.StatusServerDomain + statusServerDomain = configuration.Services.StatusServerDomain dc := new(dataCollection) dc.node = n @@ -158,7 +158,7 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e } ctx, cancel := context.WithTimeout(context.Background(), dialTimeout) - conn, err := grpc.DialContext(ctx, config.StatusServerDomain, grpc.WithInsecure(), grpc.WithDisableRetry()) + conn, err := grpc.DialContext(ctx, config.Services.StatusServerDomain, grpc.WithInsecure(), grpc.WithDisableRetry()) if err != nil { return nil, nil, fmt.Errorf("failed to connect to status server: %s", err.Error()) } diff --git a/cmd/btfs/daemon.go b/cmd/btfs/daemon.go index c2a7a0f00..3b9499ad0 100644 --- a/cmd/btfs/daemon.go +++ b/cmd/btfs/daemon.go @@ -30,6 +30,7 @@ import ( migrate "github.com/TRON-US/go-btfs/repo/fsrepo/migrations" cmds "github.com/TRON-US/go-btfs-cmds" + config "github.com/TRON-US/go-btfs-config" "github.com/hashicorp/go-multierror" util "github.com/ipfs/go-ipfs-util" mprome "github.com/ipfs/go-metrics-prometheus" @@ -306,6 +307,15 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment return err } + migrated := config.MigrateConfig(cfg) + if migrated { + // Flush changes if migrated + err = repo.SetConfig(cfg) + if err != nil { + return err + } + } + offline, _ := req.Options[offlineKwd].(bool) ipnsps, _ := req.Options[enableIPNSPubSubKwd].(bool) pubsub, _ := req.Options[enablePubSubKwd].(bool) @@ -442,7 +452,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment // BTFS functional test if runStartupTest { - functest(cfg.StatusServerDomain, cfg.Identity.PeerID, hValue) + functest(cfg.Services.StatusServerDomain, cfg.Identity.PeerID, hValue) } //Begin sending analytics to hosted server diff --git a/go.mod b/go.mod index c2c66e64b..2da9a498d 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705 // indirect github.com/TRON-US/go-btfs-cmds v0.1.2 - github.com/TRON-US/go-btfs-config v0.1.6 + github.com/TRON-US/go-btfs-config v0.2.1 github.com/blang/semver v3.5.1+incompatible github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d github.com/cenkalti/backoff v2.1.1+incompatible diff --git a/go.sum b/go.sum index 221ea5f15..9984f8266 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cB github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/TRON-US/go-btfs-cmds v0.1.2 h1:oAFOYHAfBlxPB+xiewDqOzbyPMmAbLQo63uu6gg61ZA= github.com/TRON-US/go-btfs-cmds v0.1.2/go.mod h1:WxYDXVGY8q907Cz/45KsAwcBsAvkijclkIPbGyVpU9U= -github.com/TRON-US/go-btfs-config v0.1.6 h1:Oh4K+6emXFgqP5aGWhSlvG75m8LB19b9kxdBH6TQ43M= -github.com/TRON-US/go-btfs-config v0.1.6/go.mod h1:GdZW7SmAY3rVqYwcbYkMmKo27IihzezwEQQMDTftlU0= +github.com/TRON-US/go-btfs-config v0.2.1 h1:VEJojgve8JfsbPvKJ882KCn4JO6BthrJOkW6b2tzMg4= +github.com/TRON-US/go-btfs-config v0.2.1/go.mod h1:SdSLMMxOxqLYvMI0eJItYH7mWkG22EX5WaGyUwOq3fU= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= From 4614427eeab33fd91cb0dacb76230431687eff61 Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Tue, 26 Nov 2019 15:40:55 -0800 Subject: [PATCH 2/7] Switch to TLS grpc conn. --- analytics/analytics.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 392fa6181..684a2cd07 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -2,22 +2,24 @@ package analytics import ( "context" + "crypto/tls" "fmt" - "github.com/cenkalti/backoff" - "github.com/dustin/go-humanize" - "github.com/gogo/protobuf/proto" - "github.com/tron-us/go-btfs-common/protos/node" - pb "github.com/tron-us/go-btfs-common/protos/status" - "google.golang.org/grpc" "runtime" "time" "github.com/TRON-US/go-btfs/core" + "github.com/tron-us/go-btfs-common/protos/node" + pb "github.com/tron-us/go-btfs-common/protos/status" + + "github.com/cenkalti/backoff" + "github.com/dustin/go-humanize" + "github.com/gogo/protobuf/proto" "github.com/ipfs/go-bitswap" logging "github.com/ipfs/go-log" ic "github.com/libp2p/go-libp2p-crypto" - "github.com/shirou/gopsutil/cpu" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) type programInfo struct { @@ -158,7 +160,8 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e } ctx, cancel := context.WithTimeout(context.Background(), dialTimeout) - conn, err := grpc.DialContext(ctx, config.Services.StatusServerDomain, grpc.WithInsecure(), grpc.WithDisableRetry()) + c := credentials.NewTLS(&tls.Config{}) + conn, err := grpc.DialContext(ctx, config.Services.StatusServerDomain, grpc.WithTransportCredentials(c)) if err != nil { return nil, nil, fmt.Errorf("failed to connect to status server: %s", err.Error()) } From 84ffd23ea665f2cdf549d27de4d865d74e5881df Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Tue, 26 Nov 2019 16:15:41 -0800 Subject: [PATCH 3/7] Make status server send retries capped exponentially at 10 mins --- analytics/analytics.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 684a2cd07..384db045a 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -55,10 +55,11 @@ var statusServerDomain string const ( kilobyte = 1024 - //HeartBeat is how often we send data to server, at the moment set to 15 Minutes + // HeartBeat is how often we send data to server, at the moment set to 15 Minutes heartBeat = 15 * time.Minute - maxRetryTimes = 3 + // Expotentially delayed retries will be capped at this total time + maxRetryTotal = 10 * time.Minute dialTimeout = time.Minute @@ -274,7 +275,9 @@ func (dc *dataCollection) collectionAgent() { } func retry(f func() error) { - backoff.Retry(f, backoff.WithMaxRetries(backoff.NewExponentialBackOff(), maxRetryTimes)) + bo := backoff.NewExponentialBackOff() + bo.MaxElapsedTime = maxRetryTotal + backoff.Retry(f, bo) } func (dc *dataCollection) reportHealthAlert(failurePoint string) { From f7a5d7cda48b9c2057e2c90f114431fd060098e4 Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Wed, 27 Nov 2019 11:39:42 -0800 Subject: [PATCH 4/7] Use temporary hack to convert status server domain to compatible grpc url. Refactor some logging statements. --- analytics/analytics.go | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 384db045a..2a99e0fef 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -5,6 +5,7 @@ import ( "crypto/tls" "fmt" "runtime" + "strings" "time" "github.com/TRON-US/go-btfs/core" @@ -48,9 +49,6 @@ type dataCollection struct { NumPeers uint64 `json:"peers_connected"` //Number of peers } -//Server URL for data collection -var statusServerDomain string - // other constants const ( kilobyte = 1024 @@ -79,19 +77,19 @@ func durationToSeconds(duration time.Duration) uint64 { return uint64(duration.Nanoseconds() / int64(time.Second/time.Nanosecond)) } +var log = logging.Logger("analytics/analytics") + //Initialize starts the process to collect data and starts the GoRoutine for constant collection func Initialize(n *core.IpfsNode, BTFSVersion, hValue string) { if n == nil { return } - var log = logging.Logger("cmd/btfs") + configuration, err := n.Repo.Config() if err != nil { return } - statusServerDomain = configuration.Services.StatusServerDomain - dc := new(dataCollection) dc.node = n @@ -160,9 +158,28 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e return nil, nil, fmt.Errorf("failed to load config: %s", err.Error()) } + var opts []grpc.DialOption + // TODO: This is a temporary measure to validate grpc-compatible host:port url + // without using the go-btfs-common/utils - it should be replaced soon with a common + // connection and calling utility. + ssd := config.Services.StatusServerDomain + if strings.HasPrefix(ssd, "https://") { + ssd = ssd[len("https://"):] + if !strings.Contains(ssd, ":") { + ssd += ":443" + } + c := credentials.NewTLS(&tls.Config{}) + opts = append(opts, grpc.WithTransportCredentials(c)) + } else if strings.HasPrefix(ssd, "http://") { + ssd = ssd[len("http://"):] + if !strings.Contains(ssd, ":") { + ssd += ":80" + } + opts = append(opts, grpc.WithInsecure()) + } + ctx, cancel := context.WithTimeout(context.Background(), dialTimeout) - c := credentials.NewTLS(&tls.Config{}) - conn, err := grpc.DialContext(ctx, config.Services.StatusServerDomain, grpc.WithTransportCredentials(c)) + conn, err := grpc.DialContext(ctx, ssd, opts...) if err != nil { return nil, nil, fmt.Errorf("failed to connect to status server: %s", err.Error()) } @@ -171,7 +188,11 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e func (dc *dataCollection) sendData() { retry(func() error { - return dc.doSendData() + err := dc.doSendData() + if err != nil { + log.Error("failed to send data to status server: ", err) + } + return err }) } From 367c1ef8283f49c65079dcb2bfe4761f9b25946b Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Wed, 27 Nov 2019 12:55:25 -0800 Subject: [PATCH 5/7] Retry only the grpc connection/call for status server send. --- analytics/analytics.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 2a99e0fef..9e30b69e0 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -187,8 +187,16 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e } func (dc *dataCollection) sendData() { + sm, err := dc.doPrepData() + if err != nil { + log.Error("failed to prepare data for status server: ", err) + dc.reportHealthAlert(err.Error()) + return + } + + // Retry for connections retry(func() error { - err := dc.doSendData() + err := dc.doSendData(sm) if err != nil { log.Error("failed to send data to status server: ", err) } @@ -196,35 +204,34 @@ func (dc *dataCollection) sendData() { }) } -func (dc *dataCollection) doSendData() error { +func (dc *dataCollection) doPrepData() (*pb.SignedMetrics, error) { dc.update() payload, err := dc.getPayload() if err != nil { - dc.reportHealthAlert(fmt.Sprintf("failed to marshal dataCollection object to a byte array: %s", err.Error())) - return err + return nil, fmt.Errorf("failed to marshal dataCollection object to a byte array: %s", err.Error()) } if dc.node.PrivateKey == nil { - dc.reportHealthAlert("node's private key is null") - return err + return nil, fmt.Errorf("node's private key is null") } signature, err := dc.node.PrivateKey.Sign(payload) if err != nil { - dc.reportHealthAlert(fmt.Sprintf("failed to sign raw data with node private key: %s", err.Error())) - return err + return nil, fmt.Errorf("failed to sign raw data with node private key: %s", err.Error()) } publicKey, err := ic.MarshalPublicKey(dc.node.PrivateKey.GetPublic()) if err != nil { - dc.reportHealthAlert(fmt.Sprintf("failed to marshal node public key: %s", err.Error())) - return err + return nil, fmt.Errorf("failed to marshal node public key: %s", err.Error()) } sm := new(pb.SignedMetrics) sm.Payload = payload sm.Signature = signature sm.PublicKey = publicKey + return sm, nil +} +func (dc *dataCollection) doSendData(sm *pb.SignedMetrics) error { conn, cancel, err := dc.getGrpcConn() if err != nil { return err From ba265e26658d5825cade1c6f6c3c0b2a5d0d2ea5 Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Wed, 27 Nov 2019 13:03:06 -0800 Subject: [PATCH 6/7] Update to latest status server Node pb (v0.1.1) --- analytics/analytics.go | 5 ++--- go.mod | 6 +++--- go.sum | 39 ++++++++++++++++++++++++++++++++------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 9e30b69e0..7c94641b2 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -252,7 +252,7 @@ func (dc *dataCollection) doSendData(sm *pb.SignedMetrics) error { func (dc *dataCollection) getPayload() ([]byte, error) { nd := new(node.Node) now := time.Now().UTC() - nd.TimeCreated = &now + nd.TimeCreated = now nd.NodeId = dc.NodeID nd.BtfsVersion = dc.BTFSVersion nd.ArchType = dc.ArchType @@ -274,7 +274,6 @@ func (dc *dataCollection) getPayload() ([]byte, error) { nd.StorageVolumeCap = storageMax } } - nd.Settings = &node.Node_Settings{} bytes, err := proto.Marshal(nd) if err != nil { return nil, err @@ -327,7 +326,7 @@ func (dc *dataCollection) doReportHealthAlert(failurePoint string) error { n.FailurePoint = failurePoint n.NodeId = dc.NodeID now := time.Now().UTC() - n.TimeCreated = &now + n.TimeCreated = now ctx, cancel := context.WithTimeout(context.Background(), callTimeout) defer cancel() diff --git a/go.mod b/go.mod index 2da9a498d..dcb477be0 100644 --- a/go.mod +++ b/go.mod @@ -114,7 +114,7 @@ require ( github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d // indirect github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7 github.com/syndtr/goleveldb v1.0.0 - github.com/tron-us/go-btfs-common v0.0.10 + github.com/tron-us/go-btfs-common v0.1.1 github.com/tyler-smith/go-bip32 v0.0.0-20170922074101-2c9cfd177564 github.com/tyler-smith/go-bip39 v1.0.0 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc @@ -127,12 +127,12 @@ require ( go.uber.org/goleak v0.10.0 // indirect go.uber.org/zap v1.10.0 go4.org v0.0.0-20190313082347-94abd6928b1d // indirect - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb + golang.org/x/sys v0.0.0-20191010194322-b09406accb47 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 // indirect google.golang.org/grpc v1.24.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.4 gotest.tools/gotestsum v0.3.4 launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect ) diff --git a/go.sum b/go.sum index 9984f8266..2e7a78496 100644 --- a/go.sum +++ b/go.sum @@ -113,8 +113,14 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-pg/migrations v6.7.3+incompatible/go.mod h1:DtFiob3rFxsj0He8fye6Ta4eukFW80IfdY10zb2yH1c= -github.com/go-pg/pg v0.0.0-20190627115636-374b7dab11ff/go.mod h1:F0WF9irbhGL3ZeCxAAnjE4SIVk6FyAevdGvqhs8PQdQ= +github.com/go-pg/migrations/v7 v7.1.6/go.mod h1:ycN6RqhOqa3km5KVLvRyESYP+lvqhrGYZxAIQ5HPPMM= +github.com/go-pg/pg/v9 v9.0.0-beta.14/go.mod h1:T2Sr6bpTCOr2lUqOUMiXLMJqZHSUBKk1LdgSqjwhZfA= +github.com/go-pg/pg/v9 v9.0.1/go.mod h1:Tm/Q3Vt6gdQOH6TTN1H/xLlIXc+Qrka7TZ6uREtu/eA= +github.com/go-pg/urlstruct v0.1.0/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0= +github.com/go-pg/urlstruct v0.1.4/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0= +github.com/go-pg/urlstruct v0.2.6/go.mod h1:dxENwVISWSOX+k87hDt0ueEJadD+gZWv3tHzwfmZPu8= +github.com/go-pg/zerochecker v0.1.1/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/go-redis/redis/v7 v7.0.0-beta.4/go.mod h1:xhhSbUMTsleRPur+Vgx9sUHtyN33bdjxY+9/0n9Ig8s= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= @@ -371,7 +377,6 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -671,11 +676,15 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -770,9 +779,11 @@ github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e h1: github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1MEcMzPh+GzOOIA5Znpv6++c7bePPY0= github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tron-us/go-btfs-common v0.0.10 h1:cuIpPoVlqWLLddnzQT39LvT2A+GgWT5OI/sFtdG6KI4= -github.com/tron-us/go-btfs-common v0.0.10/go.mod h1:oikVVmMiavhS/o34SecxBNuZ9xPrdwbE7omRwx4kpxs= -github.com/tron-us/go-common v1.0.1/go.mod h1:jILzJhNCAm1qKRbP7DPw1vPMQ8s2+dfEfP6wgf8I6Eo= +github.com/tron-us/go-btfs-common v0.1.1 h1:tEi9Bj2fvI76mBfK497N851zpqhy67wIpe2B1LYMZvw= +github.com/tron-us/go-btfs-common v0.1.1/go.mod h1:vvz4y9UC2KNJ8srb5xjUWHNNW18h1LDuWd5OR6UAf4s= +github.com/tron-us/go-common/v2 v2.0.4/go.mod h1:JpoNstw8RF4aotepf5R7RjVR0klUjBB94kYZS23TGuA= +github.com/tron-us/protobuf v1.3.4 h1:oqokl6jMAfe1fb/B6t1UMllbw/KtfdJcCn8plxPkHM8= +github.com/tron-us/protobuf v1.3.4/go.mod h1:INMJF54ZV6c8ZMc3imHsMl1kqIpe4VnbCUK4zYcVHqE= github.com/tyler-smith/go-bip32 v0.0.0-20170922074101-2c9cfd177564 h1:NXXyQVeRVLK8Xu27/hkkjwVOZLk5v4ZBEvvMtqMqznM= github.com/tyler-smith/go-bip32 v0.0.0-20170922074101-2c9cfd177564/go.mod h1:0/YuQQF676+d4CMNclTqGUam1EDwz0B8o03K9pQqA3c= github.com/tyler-smith/go-bip39 v1.0.0 h1:FOHg9gaQLeBBRbHE/QrTLfEiBHy5pQ/yXzf9JG5pYFM= @@ -856,6 +867,10 @@ golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443 h1:IcSOAf4PyMp3U3XbIEj1/xJ2BjNN2jWv7JoyOsMxXUU= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss= +golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -880,6 +895,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -902,13 +919,15 @@ golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -939,6 +958,8 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -947,6 +968,8 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -961,6 +984,8 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl 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= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.1.0+incompatible h1:5USw7CrJBYKqjg9R7QlA6jzqZKEAtvW82aNmsxxGPxw= gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.4 h1:LdVJDg3RHrci4MbupUgSkwPCikz4kTzDHWtUahDAleY= From 43024ada6219e2da588a9684b69ac88745bf24a1 Mon Sep 17 00:00:00 2001 From: Eric Chen Date: Wed, 27 Nov 2019 13:07:11 -0800 Subject: [PATCH 7/7] Simply grpc conn logic by using go-btfs-common utils. --- analytics/analytics.go | 31 +++---------------------------- go.sum | 9 +++++++++ 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/analytics/analytics.go b/analytics/analytics.go index 7c94641b2..4ab0e19e8 100644 --- a/analytics/analytics.go +++ b/analytics/analytics.go @@ -2,15 +2,14 @@ package analytics import ( "context" - "crypto/tls" "fmt" "runtime" - "strings" "time" "github.com/TRON-US/go-btfs/core" "github.com/tron-us/go-btfs-common/protos/node" pb "github.com/tron-us/go-btfs-common/protos/status" + cutils "github.com/tron-us/go-btfs-common/utils" "github.com/cenkalti/backoff" "github.com/dustin/go-humanize" @@ -20,7 +19,6 @@ import ( ic "github.com/libp2p/go-libp2p-crypto" "github.com/shirou/gopsutil/cpu" "google.golang.org/grpc" - "google.golang.org/grpc/credentials" ) type programInfo struct { @@ -158,32 +156,9 @@ func (dc *dataCollection) getGrpcConn() (*grpc.ClientConn, context.CancelFunc, e return nil, nil, fmt.Errorf("failed to load config: %s", err.Error()) } - var opts []grpc.DialOption - // TODO: This is a temporary measure to validate grpc-compatible host:port url - // without using the go-btfs-common/utils - it should be replaced soon with a common - // connection and calling utility. - ssd := config.Services.StatusServerDomain - if strings.HasPrefix(ssd, "https://") { - ssd = ssd[len("https://"):] - if !strings.Contains(ssd, ":") { - ssd += ":443" - } - c := credentials.NewTLS(&tls.Config{}) - opts = append(opts, grpc.WithTransportCredentials(c)) - } else if strings.HasPrefix(ssd, "http://") { - ssd = ssd[len("http://"):] - if !strings.Contains(ssd, ":") { - ssd += ":80" - } - opts = append(opts, grpc.WithInsecure()) - } - ctx, cancel := context.WithTimeout(context.Background(), dialTimeout) - conn, err := grpc.DialContext(ctx, ssd, opts...) - if err != nil { - return nil, nil, fmt.Errorf("failed to connect to status server: %s", err.Error()) - } - return conn, cancel, nil + conn, err := cutils.NewGRPCConn(ctx, config.Services.StatusServerDomain) + return conn, cancel, err } func (dc *dataCollection) sendData() { diff --git a/go.sum b/go.sum index 2e7a78496..363ef7d55 100644 --- a/go.sum +++ b/go.sum @@ -113,13 +113,18 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-pg/migrations/v7 v7.1.6 h1:M+mC6qFZaX6bPaj4S3MTcI1rqW/9RxnZ+l3xciCua4Q= github.com/go-pg/migrations/v7 v7.1.6/go.mod h1:ycN6RqhOqa3km5KVLvRyESYP+lvqhrGYZxAIQ5HPPMM= github.com/go-pg/pg/v9 v9.0.0-beta.14/go.mod h1:T2Sr6bpTCOr2lUqOUMiXLMJqZHSUBKk1LdgSqjwhZfA= +github.com/go-pg/pg/v9 v9.0.1 h1:euvT6+PFzq2coNOsE39B3RF4WvUzQYCQ6J4yS8BTdnY= github.com/go-pg/pg/v9 v9.0.1/go.mod h1:Tm/Q3Vt6gdQOH6TTN1H/xLlIXc+Qrka7TZ6uREtu/eA= github.com/go-pg/urlstruct v0.1.0/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0= github.com/go-pg/urlstruct v0.1.4/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0= +github.com/go-pg/urlstruct v0.2.6 h1:TReWM/GETx98RSfxO1mOOVic8tJCeJC5SgdeDpIy0FY= github.com/go-pg/urlstruct v0.2.6/go.mod h1:dxENwVISWSOX+k87hDt0ueEJadD+gZWv3tHzwfmZPu8= +github.com/go-pg/zerochecker v0.1.1 h1:av77Qe7Gs+1oYGGh51k0sbZ0bUaxJEdeP0r8YE64Dco= github.com/go-pg/zerochecker v0.1.1/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/go-redis/redis/v7 v7.0.0-beta.4 h1:p6z7Pde69EGRWvlC++y8aFcaWegyrKHzOBGo0zUACTQ= github.com/go-redis/redis/v7 v7.0.0-beta.4/go.mod h1:xhhSbUMTsleRPur+Vgx9sUHtyN33bdjxY+9/0n9Ig8s= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= @@ -377,6 +382,7 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -781,6 +787,7 @@ github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1 github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tron-us/go-btfs-common v0.1.1 h1:tEi9Bj2fvI76mBfK497N851zpqhy67wIpe2B1LYMZvw= github.com/tron-us/go-btfs-common v0.1.1/go.mod h1:vvz4y9UC2KNJ8srb5xjUWHNNW18h1LDuWd5OR6UAf4s= +github.com/tron-us/go-common/v2 v2.0.4 h1:9NcfOawrRPGnkEuQ1v9k5WtaUzXC1haHBESamMzfwR4= github.com/tron-us/go-common/v2 v2.0.4/go.mod h1:JpoNstw8RF4aotepf5R7RjVR0klUjBB94kYZS23TGuA= github.com/tron-us/protobuf v1.3.4 h1:oqokl6jMAfe1fb/B6t1UMllbw/KtfdJcCn8plxPkHM8= github.com/tron-us/protobuf v1.3.4/go.mod h1:INMJF54ZV6c8ZMc3imHsMl1kqIpe4VnbCUK4zYcVHqE= @@ -799,6 +806,7 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vmihailenco/tagparser v0.1.0 h1:u6yzKTY6gW/KxL/K2NTEQUOSXZipyGiIRarGjJKmQzU= github.com/vmihailenco/tagparser v0.1.0/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= @@ -994,6 +1002,7 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +mellium.im/sasl v0.2.1 h1:nspKSRg7/SyO0cRGY71OkfHab8tf9kCts6a6oTDut0w= mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=