diff --git a/.golangci.yml b/.golangci.yml
index b24a070ba..424345ab8 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -9,6 +9,7 @@ run:
- bindata.go
- .*_mock.go
- jail/doc.go
+ - contracts/
output:
format: colored-line-number
diff --git a/Makefile b/Makefile
index 4d09787d6..47d2bc0b1 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,10 @@ BUILD_FLAGS ?= $(shell echo "-ldflags '\
-X github.com/status-im/status-go/params.Version=$(RELEASE_TAG) \
-X github.com/status-im/status-go/params.GitCommit=$(GIT_COMMIT) \
-X github.com/status-im/status-go/vendor/github.com/ethereum/go-ethereum/metrics.EnabledStr=$(ENABLE_METRICS)'")
+BUILD_FLAGS_MOBILE ?= $(shell echo "-ldflags '\
+ -X main.buildStamp=`date -u '+%Y-%m-%d.%H:%M:%S'` \
+ -X github.com/status-im/status-go/params.Version=$(RELEASE_TAG) \
+ -X github.com/status-im/status-go/params.GitCommit=$(GIT_COMMIT)'")
networkid ?= StatusChain
gotest_extraflags =
@@ -92,13 +96,13 @@ statusgo-cross: statusgo-android statusgo-ios
statusgo-android: ##@cross-compile Build status-go for Android
@echo "Building status-go for Android..."
gomobile init
- gomobile bind -target=android -ldflags="-s -w" $(BUILD_FLAGS) -o build/bin/statusgo.aar github.com/status-im/status-go/mobile
+ gomobile bind -target=android -ldflags="-s -w" $(BUILD_FLAGS_MOBILE) -o build/bin/statusgo.aar github.com/status-im/status-go/mobile
@echo "Android cross compilation done in build/bin/statusgo.aar"
statusgo-ios: ##@cross-compile Build status-go for iOS
@echo "Building status-go for iOS..."
gomobile init
- gomobile bind -v -target=ios -ldflags="-s -w" $(BUILD_FLAGS) -o build/bin/Statusgo.framework github.com/status-im/status-go/mobile
+ gomobile bind -v -target=ios -ldflags="-s -w" $(BUILD_FLAGS_MOBILE) -o build/bin/Statusgo.framework github.com/status-im/status-go/mobile
@echo "iOS framework cross compilation done in build/bin/Statusgo.framework"
statusgo-xgo: xgo-install ##@cross-compile Build status-go for xgo targets
diff --git a/VERSION b/VERSION
index 1e7ef49af..3b316bcd3 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.33.0-beta.1
+0.34.0-beta.0
diff --git a/account/accounts_test.go b/account/accounts_test.go
index b5db22677..848fa381e 100644
--- a/account/accounts_test.go
+++ b/account/accounts_test.go
@@ -9,10 +9,11 @@ import (
"reflect"
"testing"
+ "github.com/status-im/status-go/t/utils"
+
"github.com/ethereum/go-ethereum/common"
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
- . "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
)
@@ -28,10 +29,11 @@ func TestVerifyAccountPassword(t *testing.T) {
defer os.RemoveAll(emptyKeyStoreDir) //nolint: errcheck
// import account keys
- require.NoError(t, ImportTestAccount(keyStoreDir, GetAccount1PKFile()))
- require.NoError(t, ImportTestAccount(keyStoreDir, GetAccount2PKFile()))
+ utils.Init()
+ require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount1PKFile()))
+ require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount2PKFile()))
- account1Address := gethcommon.BytesToAddress(gethcommon.FromHex(TestConfig.Account1.WalletAddress))
+ account1Address := gethcommon.BytesToAddress(gethcommon.FromHex(utils.TestConfig.Account1.WalletAddress))
testCases := []struct {
name string
@@ -43,37 +45,37 @@ func TestVerifyAccountPassword(t *testing.T) {
{
"correct address, correct password (decrypt should succeed)",
keyStoreDir,
- TestConfig.Account1.WalletAddress,
- TestConfig.Account1.Password,
+ utils.TestConfig.Account1.WalletAddress,
+ utils.TestConfig.Account1.Password,
nil,
},
{
"correct address, correct password, non-existent key store",
filepath.Join(keyStoreDir, "non-existent-folder"),
- TestConfig.Account1.WalletAddress,
- TestConfig.Account1.Password,
+ utils.TestConfig.Account1.WalletAddress,
+ utils.TestConfig.Account1.Password,
fmt.Errorf("cannot traverse key store folder: lstat %s/non-existent-folder: no such file or directory", keyStoreDir),
},
{
"correct address, correct password, empty key store (pk is not there)",
emptyKeyStoreDir,
- TestConfig.Account1.WalletAddress,
- TestConfig.Account1.Password,
+ utils.TestConfig.Account1.WalletAddress,
+ utils.TestConfig.Account1.Password,
fmt.Errorf("cannot locate account for address: %s", account1Address.Hex()),
},
{
"wrong address, correct password",
keyStoreDir,
"0x79791d3e8f2daa1f7fec29649d152c0ada3cc535",
- TestConfig.Account1.Password,
+ utils.TestConfig.Account1.Password,
fmt.Errorf("cannot locate account for address: %s", "0x79791d3E8F2dAa1F7FeC29649d152c0aDA3cc535"),
},
{
"correct address, wrong password",
keyStoreDir,
- TestConfig.Account1.WalletAddress,
+ utils.TestConfig.Account1.WalletAddress,
"wrong password", // wrong password
- errors.New("could not decrypt key with given passphrase"),
+ errors.New("could not decrypt key with given password"),
},
}
for _, testCase := range testCases {
@@ -101,13 +103,14 @@ func TestVerifyAccountPasswordWithAccountBeforeEIP55(t *testing.T) {
defer os.RemoveAll(keyStoreDir) //nolint: errcheck
// Import keys and make sure one was created before EIP55 introduction.
- err = ImportTestAccount(keyStoreDir, "test-account3-before-eip55.pk")
+ utils.Init()
+ err = utils.ImportTestAccount(keyStoreDir, "test-account3-before-eip55.pk")
require.NoError(t, err)
accManager := NewManager()
- address := gethcommon.HexToAddress(TestConfig.Account3.WalletAddress)
- _, err = accManager.VerifyAccountPassword(keyStoreDir, address.Hex(), TestConfig.Account3.Password)
+ address := gethcommon.HexToAddress(utils.TestConfig.Account3.WalletAddress)
+ _, err = accManager.VerifyAccountPassword(keyStoreDir, address.Hex(), utils.TestConfig.Account3.Password)
require.NoError(t, err)
}
@@ -226,7 +229,7 @@ func (s *ManagerTestSuite) TestSelectAccountWrongAddress() {
}
func (s *ManagerTestSuite) TestSelectAccountWrongPassword() {
- s.testSelectAccount(common.HexToAddress(s.testAccount.chatAddress), common.HexToAddress(s.testAccount.walletAddress), "wrong", errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given passphrase"))
+ s.testSelectAccount(common.HexToAddress(s.testAccount.chatAddress), common.HexToAddress(s.testAccount.walletAddress), "wrong", errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given password"))
}
func (s *ManagerTestSuite) testSelectAccount(chat, wallet common.Address, password string, expErr error) {
@@ -314,7 +317,7 @@ func (s *ManagerTestSuite) TestAddressToDecryptedAccountWrongAddress() {
}
func (s *ManagerTestSuite) TestAddressToDecryptedAccountWrongPassword() {
- s.testAddressToDecryptedAccount(s.walletAddress, "wrong", errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given passphrase"))
+ s.testAddressToDecryptedAccount(s.walletAddress, "wrong", errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given password"))
}
func (s *ManagerTestSuite) testAddressToDecryptedAccount(wallet, password string, expErr error) {
diff --git a/account/keystore.go b/account/keystore.go
index 40e4f8971..aab648471 100644
--- a/account/keystore.go
+++ b/account/keystore.go
@@ -21,5 +21,6 @@ func makeAccountManager(keydir string) (manager *accounts.Manager, err error) {
if err := os.MkdirAll(keydir, 0700); err != nil {
return nil, err
}
- return accounts.NewManager(keystore.NewKeyStore(keydir, keystore.LightScryptN, keystore.LightScryptP)), nil
+ config := accounts.Config{InsecureUnlockAllowed: false}
+ return accounts.NewManager(&config, keystore.NewKeyStore(keydir, keystore.LightScryptN, keystore.LightScryptP)), nil
}
diff --git a/api/backend_subs_test.go b/api/backend_subs_test.go
index a776e5dd5..6e1142b5d 100644
--- a/api/backend_subs_test.go
+++ b/api/backend_subs_test.go
@@ -233,6 +233,8 @@ func createSubscription(t *testing.T, backend *StatusBackend, params string) str
}
func initNodeAndLogin(t *testing.T, backend *StatusBackend) (string, string) {
+ utils.Init()
+
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
diff --git a/api/backend_test.go b/api/backend_test.go
index 436a71b80..cf093fcc3 100644
--- a/api/backend_test.go
+++ b/api/backend_test.go
@@ -28,6 +28,8 @@ import (
)
func TestBackendStartNodeConcurrently(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -61,6 +63,8 @@ func TestBackendStartNodeConcurrently(t *testing.T) {
}
func TestBackendRestartNodeConcurrently(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -87,6 +91,8 @@ func TestBackendRestartNodeConcurrently(t *testing.T) {
// TODO(adam): add concurrent tests for ResetChainData()
func TestBackendGettersConcurrently(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -139,6 +145,8 @@ func TestBackendGettersConcurrently(t *testing.T) {
}
func TestBackendAccountsConcurrently(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -199,6 +207,8 @@ func TestBackendAccountsConcurrently(t *testing.T) {
}
func TestBackendInjectChatAccount(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -273,6 +283,8 @@ func TestBackendConnectionChangesToOffline(t *testing.T) {
}
func TestBackendCallRPCConcurrently(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -347,6 +359,8 @@ func TestAppStateChange(t *testing.T) {
}
func TestBlockedRPCMethods(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -385,6 +399,8 @@ func TestCallRPCWithStoppedNode(t *testing.T) {
// TODO(adam): add concurrent tests for: SendTransaction
func TestStartStopMultipleTimes(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -402,6 +418,8 @@ func TestStartStopMultipleTimes(t *testing.T) {
}
func TestSignHash(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -440,6 +458,8 @@ func TestSignHash(t *testing.T) {
}
func TestHashTypedData(t *testing.T) {
+ utils.Init()
+
backend := NewStatusBackend()
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
@@ -486,6 +506,8 @@ func TestHashTypedData(t *testing.T) {
}
func TestBackendGetVerifiedAccount(t *testing.T) {
+ utils.Init()
+
password := "test"
tmpdir, err := ioutil.TempDir("", "verified-account-test-")
require.NoError(t, err)
@@ -520,7 +542,7 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
require.NoError(t, err)
require.NoError(t, db.SaveAccounts([]accounts.Account{{Address: address}}))
key, err := backend.getVerifiedWalletAccount(address.String(), "wrong-password")
- require.EqualError(t, err, "could not decrypt key with given passphrase")
+ require.EqualError(t, err, "could not decrypt key with given password")
require.Nil(t, key)
})
@@ -539,6 +561,8 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
}
func TestLoginWithKey(t *testing.T) {
+ utils.Init()
+
b := NewStatusBackend()
pkey, err := crypto.GenerateKey()
require.NoError(t, err)
diff --git a/cmd/statusd/main.go b/cmd/statusd/main.go
index c9e1ca47e..b157a2747 100644
--- a/cmd/statusd/main.go
+++ b/cmd/statusd/main.go
@@ -65,7 +65,10 @@ var logger = log.New("package", "status-go/cmd/statusd")
func init() {
flag.Var(&configFiles, "c", "JSON configuration file(s). Multiple configuration files can be specified, and will be merged in occurrence order")
+}
+// nolint:gocyclo
+func main() {
colors := terminal.IsTerminal(int(os.Stdin.Fd()))
if err := logutils.OverrideRootLog(true, "ERROR", logutils.FileOptions{}, colors); err != nil {
stdlog.Fatalf("Error initializing logger: %v", err)
@@ -78,10 +81,7 @@ func init() {
logger.Error("Extra args in command line: %v", flag.Args())
os.Exit(1)
}
-}
-// nolint:gocyclo
-func main() {
opts := []params.Option{params.WithFleet(params.FleetBeta)}
if *mailserver {
opts = append(opts, params.WithMailserver())
@@ -275,7 +275,7 @@ Examples:
Options:
`
- fmt.Fprintf(os.Stderr, usage)
+ fmt.Fprint(os.Stderr, usage)
flag.PrintDefaults()
}
diff --git a/contracts/ens/README.md b/contracts/ens/README.md
new file mode 100644
index 000000000..c09b47e39
--- /dev/null
+++ b/contracts/ens/README.md
@@ -0,0 +1,20 @@
+# Swarm ENS interface
+
+## Usage
+
+Full documentation for the Ethereum Name Service [can be found as EIP 137](https://github.com/ethereum/EIPs/issues/137).
+This package offers a simple binding that streamlines the registration of arbitrary UTF8 domain names to swarm content hashes.
+
+## Development
+
+The SOL file in contract subdirectory implements the ENS root registry, a simple
+first-in, first-served registrar for the root namespace, and a simple resolver contract;
+they're used in tests, and can be used to deploy these contracts for your own purposes.
+
+The solidity source code can be found at [github.com/arachnid/ens/](https://github.com/arachnid/ens/).
+
+The go bindings for ENS contracts are generated using `abigen` via the go generator:
+
+```shell
+go generate ./contracts/ens
+```
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/AbstractENS.sol b/contracts/ens/contract/AbstractENS.sol
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/AbstractENS.sol
rename to contracts/ens/contract/AbstractENS.sol
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol b/contracts/ens/contract/ENS.sol
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol
rename to contracts/ens/contract/ENS.sol
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol b/contracts/ens/contract/FIFSRegistrar.sol
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol
rename to contracts/ens/contract/FIFSRegistrar.sol
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol b/contracts/ens/contract/PublicResolver.sol
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol
rename to contracts/ens/contract/PublicResolver.sol
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go b/contracts/ens/contract/ens.go
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go
rename to contracts/ens/contract/ens.go
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go b/contracts/ens/contract/fifsregistrar.go
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go
rename to contracts/ens/contract/fifsregistrar.go
diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go b/contracts/ens/contract/publicresolver.go
similarity index 100%
rename from vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go
rename to contracts/ens/contract/publicresolver.go
diff --git a/contracts/ens/ens.go b/contracts/ens/ens.go
new file mode 100644
index 000000000..b40427144
--- /dev/null
+++ b/contracts/ens/ens.go
@@ -0,0 +1,195 @@
+// Copyright 2016 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package ens
+
+//go:generate abigen --sol contract/ENS.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/ens.go
+//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/fifsregistrar.go
+//go:generate abigen --sol contract/PublicResolver.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/publicresolver.go
+
+import (
+ "strings"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/status-im/status-go/contracts/ens/contract"
+)
+
+var (
+ MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b")
+ TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010")
+)
+
+// ENS is the swarm domain name registry and resolver
+type ENS struct {
+ *contract.ENSSession
+ contractBackend bind.ContractBackend
+}
+
+// NewENS creates a struct exposing convenient high-level operations for interacting with
+// the Ethereum Name Service.
+func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*ENS, error) {
+ ens, err := contract.NewENS(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+ return &ENS{
+ &contract.ENSSession{
+ Contract: ens,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar.
+func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) {
+ // Deploy the ENS registry
+ ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend)
+ if err != nil {
+ return ensAddr, nil, err
+ }
+ ens, err := NewENS(transactOpts, ensAddr, contractBackend)
+ if err != nil {
+ return ensAddr, nil, err
+ }
+ // Deploy the registrar
+ regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{})
+ if err != nil {
+ return ensAddr, nil, err
+ }
+ // Set the registrar as owner of the ENS root
+ if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil {
+ return ensAddr, nil, err
+ }
+ return ensAddr, ens, nil
+}
+
+func ensParentNode(name string) (common.Hash, common.Hash) {
+ parts := strings.SplitN(name, ".", 2)
+ label := crypto.Keccak256Hash([]byte(parts[0]))
+ if len(parts) == 1 {
+ return [32]byte{}, label
+ }
+ parentNode, parentLabel := ensParentNode(parts[1])
+ return crypto.Keccak256Hash(parentNode[:], parentLabel[:]), label
+}
+
+func EnsNode(name string) common.Hash {
+ parentNode, parentLabel := ensParentNode(name)
+ return crypto.Keccak256Hash(parentNode[:], parentLabel[:])
+}
+
+func (ens *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) {
+ resolverAddr, err := ens.Resolver(node)
+ if err != nil {
+ return nil, err
+ }
+ resolver, err := contract.NewPublicResolver(resolverAddr, ens.contractBackend)
+ if err != nil {
+ return nil, err
+ }
+ return &contract.PublicResolverSession{
+ Contract: resolver,
+ TransactOpts: ens.TransactOpts,
+ }, nil
+}
+
+func (ens *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) {
+ registrarAddr, err := ens.Owner(node)
+ if err != nil {
+ return nil, err
+ }
+ registrar, err := contract.NewFIFSRegistrar(registrarAddr, ens.contractBackend)
+ if err != nil {
+ return nil, err
+ }
+ return &contract.FIFSRegistrarSession{
+ Contract: registrar,
+ TransactOpts: ens.TransactOpts,
+ }, nil
+}
+
+// Resolve is a non-transactional call that returns the content hash associated with a name.
+func (ens *ENS) Resolve(name string) (common.Hash, error) {
+ node := EnsNode(name)
+
+ resolver, err := ens.getResolver(node)
+ if err != nil {
+ return common.Hash{}, err
+ }
+ ret, err := resolver.Content(node)
+ if err != nil {
+ return common.Hash{}, err
+ }
+ return common.BytesToHash(ret[:]), nil
+}
+
+// Addr is a non-transactional call that returns the address associated with a name.
+func (ens *ENS) Addr(name string) (common.Address, error) {
+ node := EnsNode(name)
+
+ resolver, err := ens.getResolver(node)
+ if err != nil {
+ return common.Address{}, err
+ }
+ ret, err := resolver.Addr(node)
+ if err != nil {
+ return common.Address{}, err
+ }
+ return common.BytesToAddress(ret[:]), nil
+}
+
+// SetAddress sets the address associated with a name. Only works if the caller
+// owns the name, and the associated resolver implements a `setAddress` function.
+func (ens *ENS) SetAddr(name string, addr common.Address) (*types.Transaction, error) {
+ node := EnsNode(name)
+
+ resolver, err := ens.getResolver(node)
+ if err != nil {
+ return nil, err
+ }
+ opts := ens.TransactOpts
+ opts.GasLimit = 200000
+ return resolver.Contract.SetAddr(&opts, node, addr)
+}
+
+// Register registers a new domain name for the caller, making them the owner of the new name.
+// Only works if the registrar for the parent domain implements the FIFS registrar protocol.
+func (ens *ENS) Register(name string) (*types.Transaction, error) {
+ parentNode, label := ensParentNode(name)
+ registrar, err := ens.getRegistrar(parentNode)
+ if err != nil {
+ return nil, err
+ }
+ return registrar.Contract.Register(&ens.TransactOpts, label, ens.TransactOpts.From)
+}
+
+// SetContentHash sets the content hash associated with a name. Only works if the caller
+// owns the name, and the associated resolver implements a `setContent` function.
+func (ens *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) {
+ node := EnsNode(name)
+
+ resolver, err := ens.getResolver(node)
+ if err != nil {
+ return nil, err
+ }
+ opts := ens.TransactOpts
+ opts.GasLimit = 200000
+ return resolver.Contract.SetContent(&opts, node, hash)
+}
diff --git a/contracts/ens/ens_test.go b/contracts/ens/ens_test.go
new file mode 100644
index 000000000..641c4437f
--- /dev/null
+++ b/contracts/ens/ens_test.go
@@ -0,0 +1,94 @@
+// Copyright 2016 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package ens
+
+import (
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/status-im/status-go/contracts/ens/contract"
+)
+
+var (
+ key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ name = "my name on ENS"
+ hash = crypto.Keccak256Hash([]byte("my content"))
+ addr = crypto.PubkeyToAddress(key.PublicKey)
+ testAddr = common.HexToAddress("0x1234123412341234123412341234123412341234")
+)
+
+func TestENS(t *testing.T) {
+ contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000)
+ transactOpts := bind.NewKeyedTransactor(key)
+
+ ensAddr, ens, err := DeployENS(transactOpts, contractBackend)
+ if err != nil {
+ t.Fatalf("can't deploy root registry: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Set ourself as the owner of the name.
+ if _, err := ens.Register(name); err != nil {
+ t.Fatalf("can't register: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Deploy a resolver and make it responsible for the name.
+ resolverAddr, _, _, err := contract.DeployPublicResolver(transactOpts, contractBackend, ensAddr)
+ if err != nil {
+ t.Fatalf("can't deploy resolver: %v", err)
+ }
+ if _, err := ens.SetResolver(EnsNode(name), resolverAddr); err != nil {
+ t.Fatalf("can't set resolver: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Set the content hash for the name.
+ if _, err = ens.SetContentHash(name, hash); err != nil {
+ t.Fatalf("can't set content hash: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Try to resolve the name.
+ vhost, err := ens.Resolve(name)
+ if err != nil {
+ t.Fatalf("expected no error, got %v", err)
+ }
+ if vhost != hash {
+ t.Fatalf("resolve error, expected %v, got %v", hash.Hex(), vhost.Hex())
+ }
+
+ // set the address for the name
+ if _, err = ens.SetAddr(name, testAddr); err != nil {
+ t.Fatalf("can't set address: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Try to resolve the name to an address
+ recoveredAddr, err := ens.Addr(name)
+ if err != nil {
+ t.Fatalf("expected no error, got %v", err)
+ }
+ if vhost != hash {
+ t.Fatalf("resolve error, expected %v, got %v", testAddr.Hex(), recoveredAddr.Hex())
+ }
+}
diff --git a/discovery/rendezvous.go b/discovery/rendezvous.go
index 0e1c37610..2a88ff588 100644
--- a/discovery/rendezvous.go
+++ b/discovery/rendezvous.go
@@ -208,11 +208,10 @@ func (r *Rendezvous) Discover(
} else {
for i := range records {
n, err := enrToNode(records[i])
- log.Debug("converted enr to", "ENODE", n.String())
if err != nil {
log.Warn("error converting enr record to node", "err", err)
-
} else {
+ log.Debug("converted enr to", "ENODE", n.String())
select {
case found <- n:
case newPeriod, ok := <-period:
@@ -233,7 +232,7 @@ func (r *Rendezvous) Discover(
func enrToNode(record enr.Record) (*discv5.Node, error) {
var (
key enode.Secp256k1
- ip enr.IP
+ ip enr.IPv4
tport enr.TCP
uport enr.UDP
nodeID discv5.NodeID
diff --git a/exportlogs/logs_test.go b/exportlogs/logs_test.go
index 08dc0dfc7..0fb3aa007 100644
--- a/exportlogs/logs_test.go
+++ b/exportlogs/logs_test.go
@@ -12,7 +12,7 @@ func TestExportLogs(t *testing.T) {
tempf, err := ioutil.TempFile("", "test-dump-logs")
require.NoError(t, err)
logs := "first line\nsecond line\n"
- n, err := fmt.Fprintf(tempf, logs)
+ n, err := fmt.Fprint(tempf, logs)
require.NoError(t, err)
require.Equal(t, len(logs), n)
response := ExportFromBaseFile(tempf.Name())
diff --git a/go.mod b/go.mod
index ebfa2b740..e72fe8611 100644
--- a/go.mod
+++ b/go.mod
@@ -2,37 +2,49 @@ module github.com/status-im/status-go
go 1.12
-require (
- github.com/NaySoftware/go-fcm v0.0.0-20190516140123-808e978ddcd2
- github.com/beevik/ntp v0.2.0
- github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c
- github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
- github.com/ethereum/go-ethereum v1.8.27
- github.com/go-playground/locales v0.12.1 // indirect
- github.com/go-playground/universal-translator v0.16.0 // indirect
- github.com/golang/mock v1.2.0
- github.com/leodido/go-urn v1.1.0 // indirect
- github.com/lib/pq v1.0.0
- github.com/libp2p/go-libp2p-core v0.0.3
- github.com/multiformats/go-multiaddr v0.0.4
- github.com/mutecomm/go-sqlcipher v0.0.0-20190227152316-55dbde17881f
- github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222
- github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a
- github.com/status-im/doubleratchet v2.0.0+incompatible
- github.com/status-im/migrate/v4 v4.0.0-20190821140204-a9d340ec8fb76af4afda06acf01740d45d2661ed
- github.com/status-im/rendezvous v1.3.0
- github.com/status-im/status-protocol-go v0.0.0-20190926081215-cc44ddb7ce44
- github.com/status-im/whisper v1.4.14
- github.com/stretchr/testify v1.3.1-0.20190712000136-221dbe5ed467
- github.com/syndtr/goleveldb v1.0.0
- go.uber.org/zap v1.10.0
- golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
- golang.org/x/text v0.3.2
- gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
- gopkg.in/go-playground/validator.v9 v9.29.0
- gopkg.in/natefinch/lumberjack.v2 v2.0.0
-)
-
-replace github.com/ethereum/go-ethereum v1.8.27 => github.com/status-im/go-ethereum v1.8.27-status.5
+replace github.com/ethereum/go-ethereum v1.9.5 => github.com/status-im/go-ethereum v1.9.5-status.4
replace github.com/NaySoftware/go-fcm => github.com/status-im/go-fcm v1.0.0-status
+
+require (
+ github.com/NaySoftware/go-fcm v0.0.0-00010101000000-000000000000
+ github.com/beevik/ntp v0.2.0
+ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3
+ github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
+ github.com/ethereum/go-ethereum v1.9.5
+ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
+ github.com/go-playground/locales v0.12.1 // indirect
+ github.com/go-playground/universal-translator v0.16.0 // indirect
+ github.com/golang/mock v1.3.1
+ github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 // indirect
+ github.com/leodido/go-urn v1.1.0 // indirect
+ github.com/lib/pq v1.2.0
+ github.com/libp2p/go-libp2p v0.4.0 // indirect
+ github.com/libp2p/go-libp2p-core v0.2.3
+ github.com/multiformats/go-multiaddr v0.1.1
+ github.com/mutecomm/go-sqlcipher v0.0.0-20190227152316-55dbde17881f
+ github.com/pborman/uuid v1.2.0
+ github.com/prometheus/tsdb v0.10.0 // indirect
+ github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a
+ github.com/status-im/doubleratchet v2.0.0+incompatible
+ github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 // indirect
+ github.com/status-im/migrate/v4 v4.3.1-status.0.20190822050738-a9d340ec8fb7
+ github.com/status-im/rendezvous v1.3.0
+ github.com/status-im/status-protocol-go v0.2.3-0.20190926081215-cc44ddb7ce44
+ github.com/status-im/whisper v1.4.14
+ github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 // indirect
+ github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect
+ github.com/stretchr/testify v1.4.0
+ github.com/syndtr/goleveldb v1.0.0
+ github.com/tyler-smith/go-bip39 v1.0.2 // indirect
+ github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 // indirect
+ go.uber.org/zap v1.10.0
+ golang.org/x/crypto v0.0.0-20191001141032-4663e185863a
+ golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 // indirect
+ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect
+ golang.org/x/sys v0.0.0-20190927073244-c990c680b611 // indirect
+ golang.org/x/text v0.3.2
+ gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
+ gopkg.in/go-playground/validator.v9 v9.29.1
+ gopkg.in/natefinch/lumberjack.v2 v2.0.0
+)
diff --git a/go.sum b/go.sum
index 933cbd6ec..5c2dde804 100644
--- a/go.sum
+++ b/go.sum
@@ -3,6 +3,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
+github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/Azure/azure-pipeline-go v0.0.0-20180607212504-7571e8eb0876/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg=
github.com/Azure/azure-storage-blob-go v0.0.0-20180712005634-eaae161d9d5e/go.mod h1:x2mtS6O3mnMEZOJp7d7oldh8IvatBrMfReiyQ+cKgKY=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
@@ -16,6 +17,7 @@ github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
@@ -27,44 +29,46 @@ github.com/allegro/bigcache v0.0.0-20190218064605-e24eb225f156 h1:hh7BAWFHv41r0g
github.com/allegro/bigcache v0.0.0-20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
-github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708 h1:tS7jSmwRqSxTnonTRlDD1oHo6Q9YOK4xHS9/v4L56eg=
github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
github.com/aristanetworks/goarista v0.0.0-20190704150520-f44d68189fd7 h1:fKnuvQ/O22ZpD7HaJjGQXn/GxOdDJOQFL8bpM8Xe3X8=
github.com/aristanetworks/goarista v0.0.0-20190704150520-f44d68189fd7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw=
github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ=
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
-github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q=
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
-github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
+github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 h1:A/EVblehb75cUgXA5njHPn0kLAsykn6mJGz7rnmW5W0=
+github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
-github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
-github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd h1:qdGvebPBDuYDPGi1WCPjy1tGyMpmDK8IEapSsszn7HE=
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
-github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723 h1:ZA/jbKoGcVAnER6pCHPEkGdZOV7U1oLUedErBHCUMs0=
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
-github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c=
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg=
github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
@@ -79,14 +83,16 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2
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/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0=
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
+github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgrijalva/jwt-go v0.0.0-20170201225849-2268707a8f08/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I=
github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
github.com/docker/distribution v2.7.0+incompatible h1:neUDAlf3wX6Ml4HdqTrbcOHXtfRN0TFIwt6YFL7N9RU=
@@ -109,15 +115,20 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa h1:o8OuEkracbk3qH6GvlI6XpEN1HTSxkzOG42xZpfDv/s=
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
github.com/ethereum/go-ethereum v1.8.20/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
+github.com/ethereum/go-ethereum v1.8.27/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc h1:jtW8jbpkO4YirRSyepBOH8E+2HEw6/hKkBvFPwhUN8c=
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gizak/termui v0.0.0-20170117222342-991cd3d38091/go.mod h1:PkJoWUt/zacQKysNfQtcw1RW+eK2SxkieVBtl+4ovLA=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
+github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
@@ -132,20 +143,23 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
+github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA=
github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk=
github.com/golang-migrate/migrate/v4 v4.5.0 h1:ucd2qJu1BAKTtmjh7QlWYiq01DwlE/xXYQkOPE0ZTsI=
github.com/golang-migrate/migrate/v4 v4.5.0/go.mod h1:SzAcz2l+yDJVhQC7fwiF7T2MAFPMIkigJz98klRJ4OE=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v0.0.0-20170726212829-748d386b5c1e/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
-github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -154,12 +168,14 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
@@ -169,6 +185,8 @@ github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU=
github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
+github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/gyuho/goraph v0.0.0-20171001060514-a7a4454fd3eb h1:1mTTeUpJ+imP9A0eSfNnzif1pkpiEoy+ait7XiSqGNc=
@@ -182,21 +200,24 @@ github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo=
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
-github.com/influxdata/influxdb v0.0.0-20180221223340-01288bdb0883 h1:HsZXaxH4mZRDDcxGk5m1+o3R/ofaT5YrMG+aR0altIw=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb v0.0.0-20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8=
github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
+github.com/ipfs/go-cid v0.0.3 h1:UIAh32wymBpStoe83YCzwVQQ5Oy/H0FdxvUS6DJDzms=
+github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8=
+github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s=
github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50=
@@ -218,20 +239,24 @@ github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
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 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s=
github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/julienschmidt/httprouter v0.0.0-20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2 h1:BkkpZxPVs3gIf+3Tejt8lWzuo2P29N1ChGUMEpuSJ8U=
+github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2/go.mod h1:YvbcH+3Wo6XPs9nkgTY3u19KXLauXW+J5nB7hEHuX0A=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -239,6 +264,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ=
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -248,8 +274,9 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=
github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88=
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
@@ -257,19 +284,31 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0=
github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc=
+github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ=
+github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-libp2p v0.1.1 h1:52sB0TJuDk2nYMcMfHOKaPoaayDZjaYVCq6Vk1ejUTk=
github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8=
+github.com/libp2p/go-libp2p v0.4.0 h1:nV2q3fdhL80OWtPyBrsoWKcw32qC4TbbR+iGjEOMRaU=
+github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI=
github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU=
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78=
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
+github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
+github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY=
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
+github.com/libp2p/go-libp2p-circuit v0.1.3 h1:WsMYYaA0PwdpgJSQu12EzPYf5ypkLSTgcOsWr7DYrgI=
+github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM=
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
-github.com/libp2p/go-libp2p-core v0.0.3 h1:+IonUYY0nJZLb5Fdv6a6DOjtGP1L8Bb3faamiI2q5FY=
github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE=
+github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I=
+github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI=
+github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0=
+github.com/libp2p/go-libp2p-core v0.2.3 h1:zXikZ5pLfebtTMeIYfcwVQ2Pae77O0FIwDquwM6AGNM=
+github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A=
github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ=
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs=
@@ -286,14 +325,22 @@ github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUje
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E=
github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
+github.com/libp2p/go-libp2p-peerstore v0.1.3 h1:wMgajt1uM2tMiqf4M+4qWKVyyFc8SfA+84VV9glZq1M=
+github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI=
github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ=
github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
+github.com/libp2p/go-libp2p-secio v0.2.0 h1:ywzZBsWEEz2KNTn5RtzauEDq5RFEefPsttXYwAWqHng=
+github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s=
github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
+github.com/libp2p/go-libp2p-swarm v0.2.2 h1:T4hUpgEs2r371PweU3DuH7EOmBIdTBCwWs+FLcgx3bQ=
+github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc=
github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
+github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U=
+github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw=
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
@@ -301,50 +348,69 @@ github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgE
github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs=
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
+github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg=
+github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0=
github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
-github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0=
github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
+github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA=
+github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI=
github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
+github.com/libp2p/go-openssl v0.0.2 h1:9pP2d3Ubaxkv7ZisLjx9BFwgOGnQdQYnfcH29HNY3ls=
+github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0=
github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw=
github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4=
github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
-github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw=
github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg=
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o=
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
+github.com/libp2p/go-tcp-transport v0.1.1 h1:yGlqURmqgNA2fvzjSgZNlHcsd/IulAnKM8Ncu+vlqnw=
+github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4=
github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
+github.com/libp2p/go-ws-transport v0.1.2 h1:VnxQcLfSGtqupqPpBNu8fUiCv+IN1RJ2BcVqQEM+z8E=
+github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y=
github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI=
github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4=
github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/maruel/panicparse v0.0.0-20160720141634-ad661195ed0e/go.mod h1:nty42YY5QByNC5MM7q/nj938VbgPU7avs45z6NClpxI=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-isatty v0.0.0-20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
-github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM=
github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
+github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
+github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
+github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
-github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/mongodb/mongo-go-driver v0.3.0/go.mod h1:NK/HWDIIZkaYsnYa0hmtP443T5ELr0KDecmIioVuuyU=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
@@ -355,20 +421,29 @@ github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
-github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4=
github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
+github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
+github.com/multiformats/go-multiaddr v0.1.1 h1:rVAztJYMhCQ7vEFr8FvxW3mS+HF2eY/oPbOMeS0ZDnE=
+github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8=
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
+github.com/multiformats/go-multiaddr-dns v0.1.0 h1:gsPeMvo91XvcsNlQXgJgfjYjbsVV99bvveguUvDBpyQ=
+github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY=
github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA=
github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q=
+github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
+github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g=
github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU=
+github.com/multiformats/go-multiaddr-net v0.1.0 h1:ZepO8Ezwovd+7b5XPPDhQhayk1yt0AJpzQBpq9fejx4=
+github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA=
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
-github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik=
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
+github.com/multiformats/go-multihash v0.0.8 h1:wrYcW5yxSi3dU07n5jnuS5PrNwyHy0zRHGVoUugWvXg=
+github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ=
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/mutecomm/go-sqlcipher v0.0.0-20190227152316-55dbde17881f h1:hd3r+uv9DNLScbOrnlj82rBldHQf3XWmCeXAWbw8euQ=
@@ -377,6 +452,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
github.com/naoina/toml v0.0.0-20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/nsf/termbox-go v0.0.0-20170211012700-3540b76b9c77/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.0-20170128050532-febf2d34b54a h1:m6hB6GkmZ/suOSKZM7yx3Yt+7iZ9HNfzacCykJqgXA8=
github.com/olekukonko/tablewriter v0.0.0-20170128050532-febf2d34b54a/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -393,8 +470,10 @@ github.com/opentracing/opentracing-go v0.0.0-20180606204148-bd9c31933947/go.mod
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA=
github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
+github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterh/liner v0.0.0-20170902204657-a37ad3984311/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.0.0-20171216070316-e881fd58d78e/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -406,24 +485,27 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/prometheus v0.0.0-20170814170113-3101606756c5 h1:tpIq60O8y0FlitOnj7aFTnaiwj7ypYnJCfOwCnApKss=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/prometheus v0.0.0-20170814170113-3101606756c5/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s=
+github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic=
+github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
-github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 h1:8DPul/X0IT/1TNMIxoKLwdemEOBBHDC/K4EB16Cw5WE=
github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 h1:3hxavr+IHMsQBrYUPQM5v0CgENFktkkbg1sfpgM3h20=
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
github.com/russolsen/ohyeah v0.0.0-20160324131710-f4938c005315 h1:H3hCXwP92pH/hSgNrCLtjxvsKJ50sq26nICbZuoR1tQ=
github.com/russolsen/ohyeah v0.0.0-20160324131710-f4938c005315/go.mod h1:ZbKa3zlLnhGF1dAeJtMSoNtM5LgFQnqzq8eYH3uYYkU=
@@ -431,50 +513,68 @@ github.com/russolsen/same v0.0.0-20160222130632-f089df61f51d h1:A926QrjwToaPS7gi
github.com/russolsen/same v0.0.0-20160222130632-f089df61f51d/go.mod h1:Cpq811GTlHevuU6BZxk3ObOdK8AY5gHu9QGmDak0DT4=
github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a h1:yVNJFSzkEG8smsvd9udiQcMJA0MIsFvlG7ba314cu+s=
github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a/go.mod h1:TPq+fcJOdGrkpZpXF4UVmFjYxH0gGqnxdgZ+OzAmvJk=
+github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/sirupsen/logrus v1.2.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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek=
+github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
github.com/status-im/doubleratchet v2.0.0+incompatible h1:s77lF1lDubK0RKftxN2vH8G9gwtVVp13ggWfyY4O1q4=
github.com/status-im/doubleratchet v2.0.0+incompatible/go.mod h1:1sqR0+yhiM/bd+wrdX79AOt2csZuJOni0nUDzKNuqOU=
-github.com/status-im/go-ethereum v1.8.27-status.5 h1:FS+1KwA97yWh9BtHse0BLfEWtldboSiTMA7nCavxtzc=
-github.com/status-im/go-ethereum v1.8.27-status.5/go.mod h1:Ulij8LMpMvXnbnPcmDqrpI+iXoXSjxItuY/wmbasTZU=
+github.com/status-im/go-ethereum v1.9.5-status.4 h1:F5VrxH9LmTxWl4qwQjs0TI5TgG9dVuZKqGmdwHJ0cWk=
+github.com/status-im/go-ethereum v1.9.5-status.4/go.mod h1:Ulij8LMpMvXnbnPcmDqrpI+iXoXSjxItuY/wmbasTZU=
github.com/status-im/go-fcm v1.0.0-status h1:eUNKm4ooAXdEf9/GaTYeTELna5aVMOEbzjbm2irQ0gY=
github.com/status-im/go-fcm v1.0.0-status/go.mod h1:0JGzul9SfemcbTdw0mkzLR42j+BTNci5aQWlI0o/uk8=
github.com/status-im/go-multiaddr-ethv4 v1.2.0 h1:OT84UsUzTCwguqCpJqkrCMiL4VZ1SvUtH9a5MsZupBk=
github.com/status-im/go-multiaddr-ethv4 v1.2.0/go.mod h1:2VQ3C+9zEurcceasz12gPAtmEzCeyLUGPeKLSXYQKHo=
-github.com/status-im/migrate/v4 v4.0.0-20190821140204-a9d340ec8fb76af4afda06acf01740d45d2661ed h1:K2iga8l8OQIHnk2bBq2QsZTO2Q38YWy04xIspdITCdM=
+github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 h1:ju5UTwk5Odtm4trrY+4Ca4RMj5OyXbmVeDAVad2T0Jw=
+github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
github.com/status-im/migrate/v4 v4.0.0-20190821140204-a9d340ec8fb76af4afda06acf01740d45d2661ed/go.mod h1:r8HggRBZ/k7TRwByq/Hp3P/ubFppIna0nvyavVK0pjA=
+github.com/status-im/migrate/v4 v4.3.1-status.0.20190822050738-a9d340ec8fb7 h1:gWtw0g41Y55lIOjUikkx0qjSfzl5lNZWhsvzWZIdtvQ=
+github.com/status-im/migrate/v4 v4.3.1-status.0.20190822050738-a9d340ec8fb7/go.mod h1:r8HggRBZ/k7TRwByq/Hp3P/ubFppIna0nvyavVK0pjA=
github.com/status-im/rendezvous v1.3.0 h1:7RK/MXXW+tlm0asKm1u7Qp7Yni6AO29a7j8+E4Lbjg4=
github.com/status-im/rendezvous v1.3.0/go.mod h1:+hzjuP+j/XzLPeF6E50b88pWOTLdTcwjvNYt+Gh1W1s=
-github.com/status-im/status-protocol-go v0.0.0-20190926081215-cc44ddb7ce44 h1:RzyVhzGT79zfFFW7RpGnfk/Nvg+WjgTamGdw4o2InYk=
-github.com/status-im/status-protocol-go v0.0.0-20190926081215-cc44ddb7ce44/go.mod h1:g059a1CeUmHKzsokiKwdk5pCuhCPE1GeOh8vULbfn5w=
+github.com/status-im/status-protocol-go v0.2.3-0.20190926081215-cc44ddb7ce44 h1:/dyB9wnkkNURvznzewDov3ulnLbjl8h1OeEEr5NQmQM=
+github.com/status-im/status-protocol-go v0.2.3-0.20190926081215-cc44ddb7ce44/go.mod h1:g059a1CeUmHKzsokiKwdk5pCuhCPE1GeOh8vULbfn5w=
github.com/status-im/whisper v1.4.14 h1:9VHqx4+PUYfhDnYYtDxHkg/3cfVvkHjPNciY4LO83yc=
github.com/status-im/whisper v1.4.14/go.mod h1:WS6z39YJQ8WJa9s+DmTuEM/s2nVF6Iz3B1SZYw5cYf0=
+github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE=
+github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw=
+github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM=
+github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v0.0.0-20170809224252-890a5c3458b4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.3.1-0.20190712000136-221dbe5ed467 h1:/pva5wyh0PKqe0bnHBbndEzbqsilMKFNXI0GPbO+L8c=
github.com/stretchr/testify v1.3.1-0.20190712000136-221dbe5ed467/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/syndtr/goleveldb v0.0.0-20181128100959-b001fa50d6b2/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8=
+github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
github.com/uber/jaeger-client-go v0.0.0-20180607151842-f7e0d4744fa6/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-lib v0.0.0-20180615202729-a51202d6f4a7/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/vacp2p/mvds v0.0.21 h1:YeYja8noKsHvrnOHM4pqjBvDwwy+kUzXMkX1IBYJAbU=
github.com/vacp2p/mvds v0.0.21/go.mod h1:pIqr2Hg4cIkTJniGPCp4ptong2jxgxx6uToVoY94+II=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
@@ -485,14 +585,21 @@ github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h
github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA=
github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA=
github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
+github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds=
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
+github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk=
+github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
+github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=
+go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
@@ -501,7 +608,7 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc h1:F5tKCVGp+MUAHhKp5MZtGqAlGX3+oCsiL1Q629FL90M=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -509,10 +616,14 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc=
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M=
+golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
+golang.org/x/crypto v0.0.0-20191001141032-4663e185863a h1:IyO+qCPGvLbq/+jPIOaTO1++UxgNrSpFnvQlL0hnMMQ=
+golang.org/x/crypto v0.0.0-20191001141032-4663e185863a/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
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=
@@ -531,14 +642,15 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo=
golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6 h1:FP8hkuE6yUEaJnK7O2eTuejKWwW+Rhfj80dQ2JcKxCU=
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA=
+golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/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/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -550,11 +662,14 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190214214411-e77772198cdc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -562,10 +677,15 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190426135247-a129542de9ae h1:mQLHiymj/JXKnnjc62tb7nD5pZLs940/sXJu+Xp3DBA=
golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190927073244-c990c680b611 h1:q9u40nxWT5zRClI/uU9dHCiYGottAg6Nzz4YUQyHxdA=
+golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20171227012246-e19ae1496984/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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -578,10 +698,13 @@ golang.org/x/tools v0.0.0-20170215214335-be0fcc31ae23/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
@@ -609,8 +732,8 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
-gopkg.in/go-playground/validator.v9 v9.29.0 h1:5ofssLNYgAA/inWn6rTZ4juWpRJUwEnXc1LG2IeXwgQ=
-gopkg.in/go-playground/validator.v9 v9.29.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
+gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
+gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
@@ -619,6 +742,8 @@ gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHN
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20180302121509-abf0ba0be5d5 h1:VWXVtmkY4YFVuF1FokZ0PUsuvtx3Di6z/m47daSP5f0=
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20180302121509-abf0ba0be5d5/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
+gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
+gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0=
diff --git a/lib/library_test.go b/lib/library_test.go
index 7b1c31160..4d31d47c9 100644
--- a/lib/library_test.go
+++ b/lib/library_test.go
@@ -7,12 +7,47 @@
package main
import (
+ "os"
+ "path"
+ "path/filepath"
+ "strconv"
"testing"
+ . "github.com/status-im/status-go/t/utils" //nolint: golint
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
+func TestMain(m *testing.M) {
+ Init()
+
+ testChainDir = filepath.Join(TestDataDir, TestNetworkNames[GetNetworkID()])
+ keystoreDir = filepath.Join(TestDataDir, TestNetworkNames[GetNetworkID()], "keystore")
+
+ nodeConfigJSON = `{
+ "NetworkId": ` + strconv.Itoa(GetNetworkID()) + `,
+ "DataDir": "` + testChainDir + `",
+ "KeyStoreDir": "` + filepath.Join(testChainDir, "keystore") + `",
+ "HTTPPort": ` + strconv.Itoa(TestConfig.Node.HTTPPort) + `,
+ "LogLevel": "INFO",
+ "NoDiscovery": true,
+ "APIModules": "web3,eth",
+ "LightEthConfig": {
+ "Enabled": true
+ },
+ "WhisperConfig": {
+ "Enabled": true,
+ "DataDir": "` + path.Join(testChainDir, "wnode") + `",
+ "EnableNTPSync": false
+ },
+ "ShhextConfig": {
+ "BackupDisabledDataDir": "` + testChainDir + `"
+ }
+}`
+
+ os.Exit(m.Run())
+}
+
// the actual test functions are in non-_test.go files (so that they can use cgo i.e. import "C")
// the only intent of these wrappers is for gotest can find what tests are exposed.
func TestExportedAPI(t *testing.T) {
diff --git a/lib/library_test_utils.go b/lib/library_test_utils.go
index f7f3158b5..1e75332fa 100644
--- a/lib/library_test_utils.go
+++ b/lib/library_test_utils.go
@@ -17,10 +17,8 @@ import (
"io/ioutil"
"math/big"
"os"
- "path"
"path/filepath"
"reflect"
- "strconv"
"strings"
"testing"
"time"
@@ -31,7 +29,6 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/status-im/status-go/account"
"github.com/status-im/status-go/signal"
-
. "github.com/status-im/status-go/t/utils" //nolint: golint
"github.com/status-im/status-go/transactions"
"github.com/stretchr/testify/require"
@@ -99,32 +96,6 @@ func waitSignal(feed *event.Feed, event string, timeout time.Duration) error {
}
}
-func init() {
- testChainDir = filepath.Join(TestDataDir, TestNetworkNames[GetNetworkID()])
- keystoreDir = filepath.Join(TestDataDir, TestNetworkNames[GetNetworkID()], "keystore")
-
- nodeConfigJSON = `{
- "NetworkId": ` + strconv.Itoa(GetNetworkID()) + `,
- "DataDir": "` + testChainDir + `",
- "KeyStoreDir": "` + filepath.Join(testChainDir, "keystore") + `",
- "HTTPPort": ` + strconv.Itoa(TestConfig.Node.HTTPPort) + `,
- "LogLevel": "INFO",
- "NoDiscovery": true,
- "APIModules": "web3,eth",
- "LightEthConfig": {
- "Enabled": true
- },
- "WhisperConfig": {
- "Enabled": true,
- "DataDir": "` + path.Join(testChainDir, "wnode") + `",
- "EnableNTPSync": false
- },
- "ShhextConfig": {
- "BackupDisabledDataDir": "` + testChainDir + `"
- }
-}`
-}
-
func createAccountAndLogin(t *testing.T, feed *event.Feed) account.Info {
account1, _, err := statusBackend.AccountManager().CreateAccount(TestConfig.Account1.Password)
require.NoError(t, err)
@@ -321,7 +292,7 @@ func testCallRPC(t *testing.T, feed *event.Feed) bool {
func testCallRPCWithPrivateAPI(t *testing.T, feed *event.Feed) bool {
createAccountAndLogin(t, feed)
- expected := `{"jsonrpc":"2.0","id":64,"error":{"code":-32601,"message":"The method admin_nodeInfo does not exist/is not available"}}`
+ expected := `{"jsonrpc":"2.0","id":64,"error":{"code":-32601,"message":"the method admin_nodeInfo does not exist/is not available"}}`
rawResponse := CallRPC(C.CString(`{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":64}`))
require.Equal(t, expected, C.GoString(rawResponse))
return true
diff --git a/metrics/node/metrics.go b/metrics/node/metrics.go
index 5a9038448..13549cbfa 100644
--- a/metrics/node/metrics.go
+++ b/metrics/node/metrics.go
@@ -2,7 +2,6 @@ package node
import (
"errors"
- "flag"
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/node"
@@ -16,32 +15,48 @@ var (
)
func init() {
- // When running tests, we want metrics to be enabled.
- // Having init() in metrics_test.go does not work because
- // this init() is executed first.
- if flag.Lookup("test.v") != nil {
- metrics.Enabled = true
- }
-
nodePeersCounter = metrics.NewRegisteredCounter("p2p/Peers", nil)
nodePeersGauge = metrics.NewRegisteredGauge("p2p/PeersAbsolute", nil)
nodeMaxPeersGauge = metrics.NewRegisteredGauge("p2p/MaxPeers", nil)
}
func updateNodeMetrics(node *node.Node, evType p2p.PeerEventType) error {
- server := node.Server()
- if server == nil {
- return errors.New("p2p server is unavailable")
+ change, err := computeMetrics(node, evType)
+ if err != nil {
+ return err
}
- if evType == p2p.PeerEventTypeAdd {
- nodePeersCounter.Inc(1)
- } else if evType == p2p.PeerEventTypeDrop {
- nodePeersCounter.Dec(1)
+ if change.Counter > 0 {
+ nodePeersCounter.Inc(change.Counter)
+ } else if change.Counter < 0 {
+ nodePeersCounter.Dec(change.Counter)
}
- nodePeersGauge.Update(int64(server.PeerCount()))
- nodeMaxPeersGauge.Update(int64(server.MaxPeers))
+ nodePeersGauge.Update(change.Absolute)
+ nodeMaxPeersGauge.Update(change.Max)
return nil
}
+
+type peersChange struct {
+ Counter int64
+ Absolute int64
+ Max int64
+}
+
+func computeMetrics(node *node.Node, evType p2p.PeerEventType) (result peersChange, err error) {
+ server := node.Server()
+ if server == nil {
+ return result, errors.New("p2p server is unavailable")
+ }
+
+ if evType == p2p.PeerEventTypeAdd {
+ result.Counter = 1
+ } else if evType == p2p.PeerEventTypeDrop {
+ result.Counter = -1
+ }
+
+ result.Absolute = int64(server.PeerCount())
+ result.Max = int64(server.MaxPeers)
+ return
+}
diff --git a/metrics/node/metrics_test.go b/metrics/node/metrics_test.go
index 00383b267..88fb5b04d 100644
--- a/metrics/node/metrics_test.go
+++ b/metrics/node/metrics_test.go
@@ -21,28 +21,25 @@ func TestUpdateNodeMetricsPeersCounter(t *testing.T) {
require.NoError(t, n.Start())
defer func() { require.NoError(t, n.Stop()) }()
- err = updateNodeMetrics(n, p2p.PeerEventTypeAdd)
+ change, err := computeMetrics(n, p2p.PeerEventTypeAdd)
require.NoError(t, err)
- require.Equal(t, int64(1), nodePeersCounter.Count())
- require.Equal(t, int64(10), nodeMaxPeersGauge.Value())
-
- err = updateNodeMetrics(n, p2p.PeerEventTypeAdd)
- require.NoError(t, err)
- require.Equal(t, int64(2), nodePeersCounter.Count())
+ require.Equal(t, int64(1), change.Counter)
+ require.Equal(t, int64(10), change.Max)
// skip other events
- err = updateNodeMetrics(n, p2p.PeerEventTypeMsgRecv)
+ change, err = computeMetrics(n, p2p.PeerEventTypeMsgRecv)
require.NoError(t, err)
- err = updateNodeMetrics(n, p2p.PeerEventTypeMsgSend)
+ require.Equal(t, int64(0), change.Counter)
+ change, err = computeMetrics(n, p2p.PeerEventTypeMsgSend)
require.NoError(t, err)
- require.Equal(t, int64(2), nodePeersCounter.Count())
+ require.Equal(t, int64(0), change.Counter)
- err = updateNodeMetrics(n, p2p.PeerEventTypeDrop)
+ change, err = computeMetrics(n, p2p.PeerEventTypeDrop)
require.NoError(t, err)
- require.Equal(t, int64(1), nodePeersCounter.Count())
+ require.Equal(t, int64(-1), change.Counter)
n.Server().MaxPeers = 20
- err = updateNodeMetrics(n, p2p.PeerEventTypeDrop)
+ change, err = computeMetrics(n, p2p.PeerEventTypeDrop)
require.NoError(t, err)
- require.Equal(t, int64(20), nodeMaxPeersGauge.Value())
+ require.Equal(t, int64(20), change.Max)
}
diff --git a/node/node.go b/node/node.go
index 143e720f5..642446d2e 100644
--- a/node/node.go
+++ b/node/node.go
@@ -246,10 +246,6 @@ func activateLightEthService(stack *node.Node, accs *accounts.Manager, config *p
ethConf.SyncMode = downloader.LightSync
ethConf.NetworkId = config.NetworkID
ethConf.DatabaseCache = config.LightEthConfig.DatabaseCache
- ethConf.ULC = ð.ULCConfig{
- TrustedServers: config.LightEthConfig.TrustedNodes,
- MinTrustedFraction: config.LightEthConfig.MinTrustedFraction,
- }
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
// NOTE(dshulyak) here we set our instance of the accounts manager.
// without sharing same instance selected account won't be visible for personal_* methods.
diff --git a/node/node_test.go b/node/node_test.go
index c8fcb6640..af8aae581 100644
--- a/node/node_test.go
+++ b/node/node_test.go
@@ -8,7 +8,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/status-im/status-go/params"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/require"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/storage"
@@ -18,7 +18,8 @@ var enode1 = "enode://f32efef2739e5135a0f9a80600b321ba4d13393a5f1d3f5f593df85919
var enode2 = "enode://f32efef2739e5135a0f9a80600b321ba4d13393a5f1d3f5f593df85919262f06c70bfa66d38507b9d79a91021f5e200ec20150592e72934c66248e87014c4317@1.1.1.1:30404"
func TestMakeNodeDefaultConfig(t *testing.T) {
- config, err := MakeTestNodeConfig(3)
+ utils.Init()
+ config, err := utils.MakeTestNodeConfig(3)
require.NoError(t, err)
db, err := leveldb.Open(storage.NewMemStorage(), nil)
@@ -29,7 +30,8 @@ func TestMakeNodeDefaultConfig(t *testing.T) {
}
func TestMakeNodeWellFormedBootnodes(t *testing.T) {
- config, err := MakeTestNodeConfig(3)
+ utils.Init()
+ config, err := utils.MakeTestNodeConfig(3)
require.NoError(t, err)
bootnodes := []string{
@@ -46,7 +48,8 @@ func TestMakeNodeWellFormedBootnodes(t *testing.T) {
}
func TestMakeNodeMalformedBootnodes(t *testing.T) {
- config, err := MakeTestNodeConfig(3)
+ utils.Init()
+ config, err := utils.MakeTestNodeConfig(3)
require.NoError(t, err)
bootnodes := []string{
diff --git a/node/status_node_rpc_client_test.go b/node/status_node_rpc_client_test.go
index b29c2803d..38d8cec71 100644
--- a/node/status_node_rpc_client_test.go
+++ b/node/status_node_rpc_client_test.go
@@ -85,7 +85,7 @@ func TestNodeRPCClientCallOnlyPublicAPIs(t *testing.T) {
// call private API with public RPC client
err = client.Call(&result, "pri_someMethod")
- require.EqualError(t, err, "The method pri_someMethod does not exist/is not available")
+ require.EqualError(t, err, "the method pri_someMethod does not exist/is not available")
}
func TestNodeRPCClientCallWhitelistedPrivateService(t *testing.T) {
diff --git a/node/status_node_test.go b/node/status_node_test.go
index 9fd879cda..55ca5b64f 100644
--- a/node/status_node_test.go
+++ b/node/status_node_test.go
@@ -161,7 +161,7 @@ func TestStatusNodeAddPeer(t *testing.T) {
require.NoError(t, err)
require.NoError(t, peer.Start())
defer func() { require.NoError(t, peer.Stop()) }()
- peerURL := peer.Server().Self().String()
+ peerURL := peer.Server().Self().URLv4()
n := New()
@@ -200,7 +200,7 @@ func TestStatusNodeReconnectStaticPeers(t *testing.T) {
var errCh <-chan error
- peerURL := peer.Server().Self().String()
+ peerURL := peer.Server().Self().URLv4()
n := New()
// checks before node is started
diff --git a/peers/peerpool_test.go b/peers/peerpool_test.go
index 337f4c4a7..3125f88c9 100644
--- a/peers/peerpool_test.go
+++ b/peers/peerpool_test.go
@@ -182,6 +182,7 @@ func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailoverEthV5() {
}
func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailoverRendezvous() {
+ s.T().Skip("Skipping due to being flaky")
s.setupRendezvous()
s.singleTopicDiscoveryWithFailover()
}
diff --git a/peers/topicpool_test.go b/peers/topicpool_test.go
index 1f38ed1a3..73b9ffa3b 100644
--- a/peers/topicpool_test.go
+++ b/peers/topicpool_test.go
@@ -430,7 +430,7 @@ func TestServerIgnoresInboundPeer(t *testing.T) {
require.Contains(t, topicPool.pendingPeers, clientID)
require.False(t, topicPool.pendingPeers[clientID].added)
- errch := helpers.WaitForPeerAsync(server, client.Self().String(), p2p.PeerEventTypeAdd, 5*time.Second)
+ errch := helpers.WaitForPeerAsync(server, client.Self().URLv4(), p2p.PeerEventTypeAdd, 5*time.Second)
// connect to a server from client. client will be an inbound connection for a server.
client.AddPeer(server.Self())
select {
@@ -441,7 +441,7 @@ func TestServerIgnoresInboundPeer(t *testing.T) {
}
// wait some time to confirm that RemovePeer wasn't called on the server object.
- errch = helpers.WaitForPeerAsync(server, client.Self().String(), p2p.PeerEventTypeDrop, time.Second)
+ errch = helpers.WaitForPeerAsync(server, client.Self().URLv4(), p2p.PeerEventTypeDrop, time.Second)
// simulate that event was received by a topic pool.
// topic pool will ignore this even because it sees that it is inbound connection.
topicPool.ConfirmAdded(server, clientID)
diff --git a/services/shhext/mailservers/connmanager.go b/services/shhext/mailservers/connmanager.go
index 4970dde10..84c58ff4a 100644
--- a/services/shhext/mailservers/connmanager.go
+++ b/services/shhext/mailservers/connmanager.go
@@ -195,9 +195,7 @@ func (state *internalState) ReachedTarget() bool {
func (state *internalState) replaceNodes(new map[enode.ID]*enode.Node) {
for nid, n := range state.currentNodes {
if _, exist := new[nid]; !exist {
- if _, exist := state.connected[nid]; exist {
- delete(state.connected, nid)
- }
+ delete(state.connected, nid)
state.srv.RemovePeer(n)
}
}
diff --git a/services/shhext/service_test.go b/services/shhext/service_test.go
index ed55c7f74..8f66e9b86 100644
--- a/services/shhext/service_test.go
+++ b/services/shhext/service_test.go
@@ -249,27 +249,27 @@ func (s *ShhExtSuite) TestRequestMessagesErrors() {
}
func (s *ShhExtSuite) TestMultipleRequestMessagesWithoutForce() {
- waitErr := helpers.WaitForPeerAsync(s.nodes[0].Server(), s.nodes[1].Server().Self().String(), p2p.PeerEventTypeAdd, time.Second)
+ waitErr := helpers.WaitForPeerAsync(s.nodes[0].Server(), s.nodes[1].Server().Self().URLv4(), p2p.PeerEventTypeAdd, time.Second)
s.nodes[0].Server().AddPeer(s.nodes[1].Server().Self())
s.Require().NoError(<-waitErr)
client, err := s.nodes[0].Attach()
s.NoError(err)
s.NoError(client.Call(nil, "shhext_requestMessages", MessagesRequest{
- MailServerPeer: s.nodes[1].Server().Self().String(),
+ MailServerPeer: s.nodes[1].Server().Self().URLv4(),
Topics: []whisper.TopicType{{1}},
}))
s.EqualError(client.Call(nil, "shhext_requestMessages", MessagesRequest{
- MailServerPeer: s.nodes[1].Server().Self().String(),
+ MailServerPeer: s.nodes[1].Server().Self().URLv4(),
Topics: []whisper.TopicType{{1}},
}), "another request with the same topics was sent less than 3s ago. Please wait for a bit longer, or set `force` to true in request parameters")
s.NoError(client.Call(nil, "shhext_requestMessages", MessagesRequest{
- MailServerPeer: s.nodes[1].Server().Self().String(),
+ MailServerPeer: s.nodes[1].Server().Self().URLv4(),
Topics: []whisper.TopicType{{2}},
}))
}
func (s *ShhExtSuite) TestFailedRequestUnregistered() {
- waitErr := helpers.WaitForPeerAsync(s.nodes[0].Server(), s.nodes[1].Server().Self().String(), p2p.PeerEventTypeAdd, time.Second)
+ waitErr := helpers.WaitForPeerAsync(s.nodes[0].Server(), s.nodes[1].Server().Self().URLv4(), p2p.PeerEventTypeAdd, time.Second)
s.nodes[0].Server().AddPeer(s.nodes[1].Server().Self())
s.Require().NoError(<-waitErr)
client, err := s.nodes[0].Attach()
@@ -280,7 +280,7 @@ func (s *ShhExtSuite) TestFailedRequestUnregistered() {
Topics: topics,
}), "Could not find peer with ID: 10841e6db5c02fc331bf36a8d2a9137a1696d9d3b6b1f872f780e02aa8ec5bba")
s.NoError(client.Call(nil, "shhext_requestMessages", MessagesRequest{
- MailServerPeer: s.nodes[1].Server().Self().String(),
+ MailServerPeer: s.nodes[1].Server().Self().URLv4(),
Topics: topics,
}))
}
@@ -346,7 +346,7 @@ func (s *ShhExtSuite) TestRequestMessagesSuccess() {
defer func() { s.NoError(mailNode.Stop()) }()
// add mailPeer as a peer
- waitErr := helpers.WaitForPeerAsync(aNode.Server(), mailNode.Server().Self().String(), p2p.PeerEventTypeAdd, time.Second)
+ waitErr := helpers.WaitForPeerAsync(aNode.Server(), mailNode.Server().Self().URLv4(), p2p.PeerEventTypeAdd, time.Second)
aNode.Server().AddPeer(mailNode.Server().Self())
s.Require().NoError(<-waitErr)
@@ -356,7 +356,7 @@ func (s *ShhExtSuite) TestRequestMessagesSuccess() {
symKeyID, symKeyErr := shh.AddSymKeyFromPassword("some-pass")
s.Require().NoError(symKeyErr)
hash, err = api.RequestMessages(context.TODO(), MessagesRequest{
- MailServerPeer: mailNode.Server().Self().String(),
+ MailServerPeer: mailNode.Server().Self().URLv4(),
SymKeyID: symKeyID,
Force: true,
})
@@ -365,7 +365,7 @@ func (s *ShhExtSuite) TestRequestMessagesSuccess() {
// Send a request without a symmetric key. In this case,
// a public key extracted from MailServerPeer will be used.
hash, err = api.RequestMessages(context.TODO(), MessagesRequest{
- MailServerPeer: mailNode.Server().Self().String(),
+ MailServerPeer: mailNode.Server().Self().URLv4(),
Force: true,
})
s.Require().NoError(err)
diff --git a/services/wallet/service_test.go b/services/wallet/service_test.go
index 962c0b4b6..b0540d471 100644
--- a/services/wallet/service_test.go
+++ b/services/wallet/service_test.go
@@ -19,6 +19,7 @@ import (
)
func TestReactorChanges(t *testing.T) {
+ utils.Init()
suite.Run(t, new(ReactorChangesSuite))
}
diff --git a/t/devtests/miner/node.go b/t/devtests/miner/node.go
index e47068958..cbdfbdd80 100644
--- a/t/devtests/miner/node.go
+++ b/t/devtests/miner/node.go
@@ -56,8 +56,6 @@ func NewDevNode(faucet common.Address) (*node.Node, error) {
extra = append(extra, acc.Address[:]...)
extra = append(extra, make([]byte, 65)...) // extraSeal
ethcfg.Genesis.ExtraData = extra
- ethcfg.MinerGasPrice = big.NewInt(1)
- ethcfg.Etherbase = acc.Address
return stack, stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
return eth.New(ctx, ðcfg)
diff --git a/t/e2e/accounts/accounts_test.go b/t/e2e/accounts/accounts_test.go
index 2b1746517..090c07183 100644
--- a/t/e2e/accounts/accounts_test.go
+++ b/t/e2e/accounts/accounts_test.go
@@ -10,8 +10,8 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/status-im/status-go/account"
"github.com/status-im/status-go/extkeys"
- e2e "github.com/status-im/status-go/t/e2e"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/e2e"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
)
@@ -25,6 +25,7 @@ func buildLoginParams(mainAccountAddress, chatAddress, password string, watchAdd
}
func TestAccountsTestSuite(t *testing.T) {
+ utils.Init()
suite.Run(t, new(AccountsTestSuite))
}
@@ -43,7 +44,7 @@ func (s *AccountsTestSuite) TestAccountsList() {
s.Zero(len(accounts), "accounts returned, while there should be none (we haven't logged in yet)")
// create an account
- accountInfo, _, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo, _, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
// ensure that there is still no accounts returned
@@ -52,7 +53,14 @@ func (s *AccountsTestSuite) TestAccountsList() {
s.Zero(len(accounts), "accounts returned, while there should be none (we haven't logged in yet)")
// select account (sub-accounts will be created for this key)
- err = s.Backend.SelectAccount(buildLoginParams(accountInfo.WalletAddress, accountInfo.ChatAddress, TestConfig.Account1.Password, nil))
+ err = s.Backend.SelectAccount(
+ buildLoginParams(
+ accountInfo.WalletAddress,
+ accountInfo.ChatAddress,
+ utils.TestConfig.Account1.Password,
+ nil,
+ ),
+ )
s.NoError(err, "account selection failed")
// at this point main account should show up
@@ -121,13 +129,13 @@ func (s *AccountsTestSuite) TestRecoverAccount() {
s.NotNil(keyStore)
// create an acc
- accountInfo, mnemonic, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo, mnemonic, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
s.T().Logf("Account created: {walletAddress: %s, walletKey: %s, chatAddress: %s, chatKey: %s, mnemonic:%s}",
accountInfo.WalletAddress, accountInfo.WalletPubKey, accountInfo.ChatAddress, accountInfo.ChatPubKey, mnemonic)
// try recovering using password + mnemonic
- accountInfoCheck, err := s.Backend.AccountManager().RecoverAccount(TestConfig.Account1.Password, mnemonic)
+ accountInfoCheck, err := s.Backend.AccountManager().RecoverAccount(utils.TestConfig.Account1.Password, mnemonic)
s.NoError(err, "recover acc failed")
s.EqualValues(accountInfo, accountInfoCheck, "incorrect accound details recovered")
@@ -136,23 +144,23 @@ func (s *AccountsTestSuite) TestRecoverAccount() {
acc, err := account.ParseAccountString(accountInfo.WalletAddress)
s.NoError(err, "can not get acc from address")
- acc, key, err := keyStore.AccountDecryptedKey(acc, TestConfig.Account1.Password)
+ acc, key, err := keyStore.AccountDecryptedKey(acc, utils.TestConfig.Account1.Password)
s.NoError(err, "can not obtain decrypted acc key")
extChild2String := key.ExtendedKey.String()
- s.NoError(keyStore.Delete(acc, TestConfig.Account1.Password), "cannot remove acc")
+ s.NoError(keyStore.Delete(acc, utils.TestConfig.Account1.Password), "cannot remove acc")
- accountInfoCheck, err = s.Backend.AccountManager().RecoverAccount(TestConfig.Account1.Password, mnemonic)
+ accountInfoCheck, err = s.Backend.AccountManager().RecoverAccount(utils.TestConfig.Account1.Password, mnemonic)
s.NoError(err, "recover acc failed (for non-cached acc)")
s.EqualValues(accountInfo, accountInfoCheck, "incorrect acc details recovered (for non-cached acc)")
// make sure that extended key exists and is imported ok too
- _, key, err = keyStore.AccountDecryptedKey(acc, TestConfig.Account1.Password)
+ _, key, err = keyStore.AccountDecryptedKey(acc, utils.TestConfig.Account1.Password)
s.NoError(err)
s.Equal(extChild2String, key.ExtendedKey.String(), "CKD#2 key mismatch")
// make sure that calling import several times, just returns from cache (no error is expected)
- accountInfoCheck, err = s.Backend.AccountManager().RecoverAccount(TestConfig.Account1.Password, mnemonic)
+ accountInfoCheck, err = s.Backend.AccountManager().RecoverAccount(utils.TestConfig.Account1.Password, mnemonic)
s.NoError(err, "recover acc failed (for non-cached acc)")
s.EqualValues(accountInfo, accountInfoCheck, "incorrect acc details recovered (for non-cached acc)")
}
@@ -162,26 +170,26 @@ func (s *AccountsTestSuite) TestSelectAccount() {
defer s.StopTestBackend()
// create an account
- accountInfo1, _, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo1, _, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
s.T().Logf("Account created: {walletAddress: %s, walletKey: %s, chatAddress: %s, chatKey: %s}",
accountInfo1.WalletAddress, accountInfo1.WalletPubKey, accountInfo1.ChatAddress, accountInfo1.ChatPubKey)
- accountInfo2, _, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo2, _, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
s.T().Logf("Account created: {walletAddress: %s, walletKey: %s, chatAddress: %s, chatKey: %s}",
accountInfo2.WalletAddress, accountInfo2.WalletPubKey, accountInfo2.ChatAddress, accountInfo2.ChatPubKey)
// try selecting with wrong password
err = s.Backend.SelectAccount(buildLoginParams(accountInfo1.WalletAddress, accountInfo1.ChatAddress, "wrongPassword", nil))
- expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given passphrase")
+ expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given password")
s.EqualError(expectedErr, err.Error(), "select account is expected to throw error: wrong password used")
- err = s.Backend.SelectAccount(buildLoginParams(accountInfo1.WalletAddress, accountInfo1.ChatAddress, TestConfig.Account1.Password, nil))
+ err = s.Backend.SelectAccount(buildLoginParams(accountInfo1.WalletAddress, accountInfo1.ChatAddress, utils.TestConfig.Account1.Password, nil))
s.NoError(err)
// select another account, make sure that previous account is wiped out from Whisper cache
- s.NoError(s.Backend.SelectAccount(buildLoginParams(accountInfo2.WalletAddress, accountInfo2.ChatAddress, TestConfig.Account1.Password, nil)))
+ s.NoError(s.Backend.SelectAccount(buildLoginParams(accountInfo2.WalletAddress, accountInfo2.ChatAddress, utils.TestConfig.Account1.Password, nil)))
}
func (s *AccountsTestSuite) TestSetChatAccount() {
@@ -208,9 +216,9 @@ func (s *AccountsTestSuite) TestSelectedAccountOnRestart() {
s.StartTestBackend()
// create test accounts
- accountInfo1, _, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo1, _, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
- accountInfo2, _, err := s.Backend.AccountManager().CreateAccount(TestConfig.Account1.Password)
+ accountInfo2, _, err := s.Backend.AccountManager().CreateAccount(utils.TestConfig.Account1.Password)
s.NoError(err)
// make sure that no account is selected by default
@@ -223,14 +231,14 @@ func (s *AccountsTestSuite) TestSelectedAccountOnRestart() {
// select account
err = s.Backend.SelectAccount(buildLoginParams(accountInfo1.WalletAddress, accountInfo1.ChatAddress, "wrongPassword", nil))
- expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given passphrase")
+ expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given password")
s.EqualError(expectedErr, err.Error())
watchAddresses := []common.Address{
common.HexToAddress("0x00000000000000000000000000000000000001"),
common.HexToAddress("0x00000000000000000000000000000000000002"),
}
- s.NoError(s.Backend.SelectAccount(buildLoginParams(accountInfo2.WalletAddress, accountInfo2.ChatAddress, TestConfig.Account1.Password, watchAddresses)))
+ s.NoError(s.Backend.SelectAccount(buildLoginParams(accountInfo2.WalletAddress, accountInfo2.ChatAddress, utils.TestConfig.Account1.Password, watchAddresses)))
// stop node (and all of its sub-protocols)
nodeConfig := s.Backend.StatusNode().Config()
diff --git a/t/e2e/api/api_test.go b/t/e2e/api/api_test.go
index fd2e7a8d7..d3ebffa5f 100644
--- a/t/e2e/api/api_test.go
+++ b/t/e2e/api/api_test.go
@@ -10,13 +10,14 @@ import (
"github.com/status-im/status-go/node"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/signal"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/storage"
)
func TestAPI(t *testing.T) {
+ utils.Init()
suite.Run(t, new(APITestSuite))
}
@@ -45,10 +46,10 @@ func (s *APITestSuite) TestRaceConditions() {
progress := make(chan struct{}, cnt)
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
- nodeConfig1, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig1, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.NoError(err)
- nodeConfig2, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig2, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.NoError(err)
nodeConfigs := []*params.NodeConfig{nodeConfig1, nodeConfig2}
@@ -123,7 +124,7 @@ func (s *APITestSuite) TestEventsNodeStartStop() {
envelopes <- envelope
})
- nodeConfig, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.NoError(err)
s.NoError(s.backend.AccountManager().InitKeystore(nodeConfig.KeyStoreDir))
s.Require().NoError(s.backend.StartNode(nodeConfig))
@@ -162,7 +163,7 @@ func (s *APITestSuite) TestNodeStartCrash() {
})
defer signal.ResetDefaultNodeNotificationHandler()
- nodeConfig, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.NoError(err)
db, err := leveldb.Open(storage.NewMemStorage(), nil)
diff --git a/t/e2e/api/backend_test.go b/t/e2e/api/backend_test.go
index 4c65c93a7..a01f6c534 100644
--- a/t/e2e/api/backend_test.go
+++ b/t/e2e/api/backend_test.go
@@ -12,6 +12,7 @@ import (
)
func TestAPIBackendTestSuite(t *testing.T) {
+ Init() // from t/utils
suite.Run(t, new(APIBackendTestSuite))
}
diff --git a/t/e2e/node/manager_test.go b/t/e2e/node/manager_test.go
index 1c47c2946..9ee0a55cf 100644
--- a/t/e2e/node/manager_test.go
+++ b/t/e2e/node/manager_test.go
@@ -18,6 +18,7 @@ import (
)
func TestManagerTestSuite(t *testing.T) {
+ e2e.Init()
suite.Run(t, new(ManagerTestSuite))
}
diff --git a/t/e2e/rpc/client_test.go b/t/e2e/rpc/client_test.go
index 3ba41ec8d..96ff11f91 100644
--- a/t/e2e/rpc/client_test.go
+++ b/t/e2e/rpc/client_test.go
@@ -15,6 +15,7 @@ type RPCClientTestSuite struct {
}
func TestRPCClientTestSuite(t *testing.T) {
+ e2e.Init()
suite.Run(t, new(RPCClientTestSuite))
}
diff --git a/t/e2e/rpc/rpc_test.go b/t/e2e/rpc/rpc_test.go
index b6e13504c..11f197369 100644
--- a/t/e2e/rpc/rpc_test.go
+++ b/t/e2e/rpc/rpc_test.go
@@ -17,6 +17,7 @@ import (
)
func TestRPCTestSuite(t *testing.T) {
+ e2e.Init()
suite.Run(t, new(RPCTestSuite))
}
diff --git a/t/e2e/services/filters_latest_test.go b/t/e2e/services/filters_latest_test.go
index 32c2e94d2..9a071a575 100644
--- a/t/e2e/services/filters_latest_test.go
+++ b/t/e2e/services/filters_latest_test.go
@@ -7,22 +7,23 @@ import (
"time"
"github.com/status-im/status-go/params"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
-
- . "github.com/status-im/status-go/t/utils"
)
func TestFiltersAPISuite(t *testing.T) {
+ utils.Init()
s := new(FiltersAPISuite)
s.upstream = false
suite.Run(t, s)
}
func TestFiltersAPISuiteUpstream(t *testing.T) {
+ utils.Init()
s := new(FiltersAPISuite)
s.upstream = true
- if s.upstream && GetNetworkID() == params.StatusChainNetworkID {
+ if s.upstream && utils.GetNetworkID() == params.StatusChainNetworkID {
t.Skip()
return
}
@@ -50,8 +51,7 @@ func (s *FiltersAPISuite) TestFilters() {
filterID := s.filterIDFromRPCResponse(response)
// we don't check new blocks on private network, because no one mines them
- if GetNetworkID() != params.StatusChainNetworkID {
-
+ if utils.GetNetworkID() != params.StatusChainNetworkID {
timeout := time.After(time.Minute)
newBlocksChannel := s.getFirstFilterChange(filterID)
@@ -61,7 +61,6 @@ func (s *FiltersAPISuite) TestFilters() {
case <-timeout:
s.Fail("timeout while waiting for filter results")
}
-
}
basicCall = fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["%s"],"id":67}`, filterID)
diff --git a/t/e2e/services/peer_api_test.go b/t/e2e/services/peer_api_test.go
index 09f0ea19a..1eec55c46 100644
--- a/t/e2e/services/peer_api_test.go
+++ b/t/e2e/services/peer_api_test.go
@@ -4,18 +4,19 @@ import (
"testing"
"github.com/status-im/status-go/params"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
-
- . "github.com/status-im/status-go/t/utils"
)
func TestPeerAPISuite(t *testing.T) {
+ utils.Init()
s := new(PeerAPISuite)
s.upstream = false
suite.Run(t, s)
}
func TestPeerAPISuiteUpstream(t *testing.T) {
+ utils.Init()
s := new(PeerAPISuite)
s.upstream = true
suite.Run(t, s)
@@ -27,7 +28,7 @@ type PeerAPISuite struct {
}
func (s *PeerAPISuite) TestAccessiblePeerAPIs() {
- if s.upstream && GetNetworkID() == params.StatusChainNetworkID {
+ if s.upstream && utils.GetNetworkID() == params.StatusChainNetworkID {
s.T().Skip()
return
}
diff --git a/t/e2e/services/status_api_test.go b/t/e2e/services/status_api_test.go
index 582efe63b..92bebf194 100644
--- a/t/e2e/services/status_api_test.go
+++ b/t/e2e/services/status_api_test.go
@@ -9,7 +9,7 @@ import (
"github.com/status-im/status-go/account"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/services/status"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
)
@@ -22,12 +22,14 @@ type statusTestParams struct {
}
func TestStatusAPISuite(t *testing.T) {
+ utils.Init()
s := new(StatusAPISuite)
s.upstream = false
suite.Run(t, s)
}
func TestStatusAPISuiteUpstream(t *testing.T) {
+ utils.Init()
s := new(StatusAPISuite)
s.upstream = true
suite.Run(t, s)
@@ -39,7 +41,7 @@ type StatusAPISuite struct {
}
func (s *StatusAPISuite) TestAccessibleStatusAPIs() {
- if s.upstream && GetNetworkID() == params.StatusChainNetworkID {
+ if s.upstream && utils.GetNetworkID() == params.StatusChainNetworkID {
s.T().Skip()
return
}
@@ -61,8 +63,8 @@ func (s *StatusAPISuite) TestAccessibleStatusAPIs() {
func (s *StatusAPISuite) TestStatusLoginSuccess() {
addressKeyID := s.testStatusLogin(statusTestParams{
- Address: TestConfig.Account1.WalletAddress,
- Password: TestConfig.Account1.Password,
+ Address: utils.TestConfig.Account1.WalletAddress,
+ Password: utils.TestConfig.Account1.Password,
})
s.NotEmpty(addressKeyID)
}
@@ -70,7 +72,7 @@ func (s *StatusAPISuite) TestStatusLoginSuccess() {
func (s *StatusAPISuite) TestStatusLoginInvalidAddress() {
s.testStatusLogin(statusTestParams{
Address: "invalidaccount",
- Password: TestConfig.Account1.Password,
+ Password: utils.TestConfig.Account1.Password,
ExpectedError: account.ErrAddressToAccountMappingFailure,
})
}
@@ -78,7 +80,7 @@ func (s *StatusAPISuite) TestStatusLoginInvalidAddress() {
func (s *StatusAPISuite) TestStatusLoginInvalidPassword() {
s.testStatusLogin(statusTestParams{
Address: "invalidaccount",
- Password: TestConfig.Account1.Password,
+ Password: utils.TestConfig.Account1.Password,
ExpectedError: account.ErrAddressToAccountMappingFailure,
})
}
@@ -102,7 +104,7 @@ func (s *StatusAPISuite) TestStatusSignupSuccess() {
func (s *StatusAPISuite) testStatusLogin(testParams statusTestParams) *status.LoginResponse {
// Test upstream if that's not StatusChain
- if s.upstream && GetNetworkID() == params.StatusChainNetworkID {
+ if s.upstream && utils.GetNetworkID() == params.StatusChainNetworkID {
s.T().Skip()
return nil
}
@@ -143,7 +145,7 @@ func (s *StatusAPISuite) testStatusLogin(testParams statusTestParams) *status.Lo
func (s *StatusAPISuite) testStatusSignup(testParams statusTestParams) *status.SignupResponse {
// Test upstream if that's not StatusChain
- if s.upstream && GetNetworkID() == params.StatusChainNetworkID {
+ if s.upstream && utils.GetNetworkID() == params.StatusChainNetworkID {
s.T().Skip()
return nil
}
diff --git a/t/e2e/suites.go b/t/e2e/suites.go
index 32c68d611..4ae1062b9 100644
--- a/t/e2e/suites.go
+++ b/t/e2e/suites.go
@@ -10,7 +10,7 @@ import (
"github.com/status-im/status-go/multiaccounts/accounts"
"github.com/status-im/status-go/node"
"github.com/status-im/status-go/signal"
- . "github.com/status-im/status-go/t/utils" //nolint: golint
+ "github.com/status-im/status-go/t/utils"
"github.com/status-im/status-go/transactions"
"github.com/stretchr/testify/suite"
)
@@ -24,9 +24,10 @@ type StatusNodeTestSuite struct {
// All general log messages in this package should be routed through this logger.
var logger = log.New("package", "status-go/t/e2e")
-func init() {
- for id := range TestNetworkNames {
- nodeConfig, err := MakeTestNodeConfig(id)
+func Init() {
+ utils.Init()
+ for id := range utils.TestNetworkNames {
+ nodeConfig, err := utils.MakeTestNodeConfig(id)
if err != nil {
panic(err)
}
@@ -41,7 +42,7 @@ func init() {
// StartTestNode initiazes a StatusNode instances with configuration retrieved
// from the test config.
func (s *StatusNodeTestSuite) StartTestNode(opts ...TestNodeOption) {
- nodeConfig, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.NoError(err)
// Apply any options altering node config.
@@ -85,7 +86,7 @@ func (s *BackendTestSuite) TearDownTest() {
// StartTestBackend imports some keys and starts a node.
func (s *BackendTestSuite) StartTestBackend(opts ...TestNodeOption) {
- nodeConfig, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.Require().NoError(err)
// Apply any options altering node config.
@@ -103,7 +104,7 @@ func (s *BackendTestSuite) StartTestBackend(opts ...TestNodeOption) {
}
func (s *BackendTestSuite) StartTestBackendWithAccount(account multiaccounts.Account, password string, subaccs []accounts.Account, opts ...TestNodeOption) {
- nodeConfig, err := MakeTestNodeConfig(GetNetworkID())
+ nodeConfig, err := utils.MakeTestNodeConfig(utils.GetNetworkID())
s.Require().NoError(err)
// Apply any options altering node config.
@@ -155,10 +156,10 @@ func (s *BackendTestSuite) Transactor() *transactions.Transactor {
func importTestAccounts(keyStoreDir string) (err error) {
logger.Debug("Import accounts to", "dir", keyStoreDir)
- err = ImportTestAccount(keyStoreDir, GetAccount1PKFile())
+ err = utils.ImportTestAccount(keyStoreDir, utils.GetAccount1PKFile())
if err != nil {
return
}
- return ImportTestAccount(keyStoreDir, GetAccount2PKFile())
+ return utils.ImportTestAccount(keyStoreDir, utils.GetAccount2PKFile())
}
diff --git a/t/e2e/transactions/transactions_test.go b/t/e2e/transactions/transactions_test.go
index 8fbf366a6..f441bd662 100644
--- a/t/e2e/transactions/transactions_test.go
+++ b/t/e2e/transactions/transactions_test.go
@@ -14,8 +14,8 @@ import (
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/multiaccounts/accounts"
"github.com/status-im/status-go/params"
- e2e "github.com/status-im/status-go/t/e2e"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/e2e"
+ "github.com/status-im/status-go/t/utils"
"github.com/status-im/status-go/transactions"
"github.com/stretchr/testify/suite"
)
@@ -31,6 +31,7 @@ func buildLoginParams(mainAccountAddress, chatAddress, password string) account.
}
func TestTransactionsTestSuite(t *testing.T) {
+ utils.Init()
suite.Run(t, new(TransactionsTestSuite))
}
@@ -39,19 +40,19 @@ type TransactionsTestSuite struct {
}
func (s *TransactionsTestSuite) TestCallRPCSendTransaction() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
s.StartTestBackend()
defer s.StopTestBackend()
- EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
+ utils.EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
s.sendTransactionUsingRPCClient(s.Backend.CallRPC)
}
func (s *TransactionsTestSuite) TestCallUpstreamRPCSendTransaction() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
- addr, err := GetRemoteURL()
+ addr, err := utils.GetRemoteURL()
s.NoError(err)
s.StartTestBackend(e2e.WithUpstream(addr))
defer s.StopTestBackend()
@@ -60,19 +61,19 @@ func (s *TransactionsTestSuite) TestCallUpstreamRPCSendTransaction() {
}
func (s *TransactionsTestSuite) TestCallPrivateRPCSendTransaction() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
s.StartTestBackend()
defer s.StopTestBackend()
- EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
+ utils.EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
s.sendTransactionUsingRPCClient(s.Backend.CallPrivateRPC)
}
func (s *TransactionsTestSuite) TestCallUpstreamPrivateRPCSendTransaction() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
- addr, err := GetRemoteURL()
+ addr, err := utils.GetRemoteURL()
s.NoError(err)
s.StartTestBackend(e2e.WithUpstream(addr))
defer s.StopTestBackend()
@@ -83,7 +84,11 @@ func (s *TransactionsTestSuite) TestCallUpstreamPrivateRPCSendTransaction() {
func (s *TransactionsTestSuite) sendTransactionUsingRPCClient(
callRPCFn func(string) (string, error),
) {
- err := s.Backend.SelectAccount(buildLoginParams(TestConfig.Account1.WalletAddress, TestConfig.Account1.ChatAddress, TestConfig.Account1.Password))
+ err := s.Backend.SelectAccount(buildLoginParams(
+ utils.TestConfig.Account1.WalletAddress,
+ utils.TestConfig.Account1.ChatAddress,
+ utils.TestConfig.Account1.Password,
+ ))
s.NoError(err)
result, err := callRPCFn(`{
@@ -91,7 +96,7 @@ func (s *TransactionsTestSuite) sendTransactionUsingRPCClient(
"id": 1,
"method": "eth_sendTransaction",
"params": [{
- "from": "` + TestConfig.Account1.WalletAddress + `",
+ "from": "` + utils.TestConfig.Account1.WalletAddress + `",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"value": "0x9184e72a"
}]
@@ -101,26 +106,26 @@ func (s *TransactionsTestSuite) sendTransactionUsingRPCClient(
}
func (s *TransactionsTestSuite) TestEmptyToFieldPreserved() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
tmpdir, err := ioutil.TempDir("", "transactions-tests-")
s.Require().NoError(err)
defer os.Remove(tmpdir)
- wallet := common.HexToAddress(TestConfig.Account1.WalletAddress)
- s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, TestConfig.Account1.Password,
+ wallet := common.HexToAddress(utils.TestConfig.Account1.WalletAddress)
+ s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, utils.TestConfig.Account1.Password,
[]accounts.Account{{Address: wallet, Wallet: true, Chat: true}},
e2e.WithDataDir(tmpdir),
)
defer s.LogoutAndStop()
- EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
+ utils.EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
args := transactions.SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
}
- hash, err := s.Backend.SendTransaction(args, TestConfig.Account1.Password)
+ hash, err := s.Backend.SendTransaction(args, utils.TestConfig.Account1.Password)
s.NoError(err)
s.NotNil(hash)
}
@@ -128,7 +133,7 @@ func (s *TransactionsTestSuite) TestEmptyToFieldPreserved() {
// TestSendContractCompat tries to send transaction using the legacy "Data"
// field, which is supported for backward compatibility reasons.
func (s *TransactionsTestSuite) TestSendContractTxCompat() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
initFunc := func(byteCode []byte, args *transactions.SendTxArgs) {
args.Data = (hexutil.Bytes)(byteCode)
@@ -140,7 +145,7 @@ func (s *TransactionsTestSuite) TestSendContractTxCompat() {
// "Data" and "Input" fields. Also makes sure that the error is returned if
// they have different values.
func (s *TransactionsTestSuite) TestSendContractTxCollision() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
// Scenario 1: Both fields are filled and have the same value, expect success
initFunc := func(byteCode []byte, args *transactions.SendTxArgs) {
@@ -167,7 +172,7 @@ func (s *TransactionsTestSuite) TestSendContractTxCollision() {
}
func (s *TransactionsTestSuite) TestSendContractTx() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
initFunc := func(byteCode []byte, args *transactions.SendTxArgs) {
args.Input = (hexutil.Bytes)(byteCode)
@@ -180,14 +185,14 @@ func (s *TransactionsTestSuite) testSendContractTx(setInputAndDataValue initFunc
s.Require().NoError(err)
defer os.Remove(tmpdir)
- wallet := common.HexToAddress(TestConfig.Account1.WalletAddress)
- s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, TestConfig.Account1.Password,
+ wallet := common.HexToAddress(utils.TestConfig.Account1.WalletAddress)
+ s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, utils.TestConfig.Account1.Password,
[]accounts.Account{{Address: wallet, Wallet: true, Chat: true}},
e2e.WithDataDir(tmpdir),
)
defer s.LogoutAndStop()
- EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
+ utils.EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
// this call blocks, up until Complete Transaction is called
byteCode, err := hexutil.Decode(`0x6060604052341561000c57fe5b5b60a58061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636ffa1caa14603a575bfe5b3415604157fe5b60556004808035906020019091905050606b565b6040518082815260200191505060405180910390f35b60008160020290505b9190505600a165627a7a72305820ccdadd737e4ac7039963b54cee5e5afb25fa859a275252bdcf06f653155228210029`)
@@ -195,14 +200,14 @@ func (s *TransactionsTestSuite) testSendContractTx(setInputAndDataValue initFunc
gas := uint64(params.DefaultGas)
args := transactions.SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
To: nil, // marker, contract creation is expected
//Value: (*hexutil.Big)(new(big.Int).Mul(big.NewInt(1), gethcommon.Ether)),
Gas: (*hexutil.Uint64)(&gas),
}
setInputAndDataValue(byteCode, &args)
- hash, err := s.Backend.SendTransaction(args, TestConfig.Account1.Password)
+ hash, err := s.Backend.SendTransaction(args, utils.TestConfig.Account1.Password)
if expectedError != nil {
s.Equal(expectedError, err, expectedErrorDescription)
return
@@ -212,40 +217,40 @@ func (s *TransactionsTestSuite) testSendContractTx(setInputAndDataValue initFunc
}
func (s *TransactionsTestSuite) TestSendEther() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID)
tmpdir, err := ioutil.TempDir("", "transactions-tests-")
s.Require().NoError(err)
defer os.Remove(tmpdir)
- wallet := common.HexToAddress(TestConfig.Account1.WalletAddress)
- s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, TestConfig.Account1.Password,
+ wallet := common.HexToAddress(utils.TestConfig.Account1.WalletAddress)
+ s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, utils.TestConfig.Account1.Password,
[]accounts.Account{{Address: wallet, Wallet: true, Chat: true}},
e2e.WithDataDir(tmpdir),
)
defer s.LogoutAndStop()
- EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
+ utils.EnsureNodeSync(s.Backend.StatusNode().EnsureSync)
hash, err := s.Backend.SendTransaction(transactions.SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
Value: (*hexutil.Big)(big.NewInt(1000000000000)),
- }, TestConfig.Account1.Password)
+ }, utils.TestConfig.Account1.Password)
s.NoError(err)
s.False(reflect.DeepEqual(hash, gethcommon.Hash{}))
}
func (s *TransactionsTestSuite) TestSendEtherTxUpstream() {
- CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
+ utils.CheckTestSkipForNetworks(s.T(), params.MainNetworkID, params.StatusChainNetworkID)
tmpdir, err := ioutil.TempDir("", "transactions-tests-")
s.Require().NoError(err)
defer os.Remove(tmpdir)
- addr, err := GetRemoteURL()
+ addr, err := utils.GetRemoteURL()
s.NoError(err)
- wallet := common.HexToAddress(TestConfig.Account1.WalletAddress)
- s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, TestConfig.Account1.Password,
+ wallet := common.HexToAddress(utils.TestConfig.Account1.WalletAddress)
+ s.StartTestBackendWithAccount(multiaccounts.Account{Address: wallet}, utils.TestConfig.Account1.Password,
[]accounts.Account{{Address: wallet, Wallet: true, Chat: true}},
e2e.WithUpstream(addr),
e2e.WithDataDir(tmpdir),
@@ -253,11 +258,11 @@ func (s *TransactionsTestSuite) TestSendEtherTxUpstream() {
defer s.LogoutAndStop()
hash, err := s.Backend.SendTransaction(transactions.SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
GasPrice: (*hexutil.Big)(big.NewInt(28000000000)),
Value: (*hexutil.Big)(big.NewInt(1000000000000)),
- }, TestConfig.Account1.Password)
+ }, utils.TestConfig.Account1.Password)
s.NoError(err)
s.False(reflect.DeepEqual(hash, gethcommon.Hash{}))
}
diff --git a/t/e2e/whisper/mailservice_test.go b/t/e2e/whisper/mailservice_test.go
index 96ea8df50..93b523257 100644
--- a/t/e2e/whisper/mailservice_test.go
+++ b/t/e2e/whisper/mailservice_test.go
@@ -9,10 +9,12 @@ import (
"github.com/status-im/status-go/node"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/t/e2e"
+ "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite"
)
func TestMailServiceSuite(t *testing.T) {
+ utils.Init()
suite.Run(t, new(MailServiceSuite))
}
diff --git a/t/e2e/whisper/whisper_mailbox_test.go b/t/e2e/whisper/whisper_mailbox_test.go
index 24dd3ec1b..815ea84cc 100644
--- a/t/e2e/whisper/whisper_mailbox_test.go
+++ b/t/e2e/whisper/whisper_mailbox_test.go
@@ -5,6 +5,7 @@ import (
"encoding/hex"
"encoding/json"
"fmt"
+ "os"
"path/filepath"
"sort"
"strconv"
@@ -12,10 +13,6 @@ import (
"testing"
"time"
- "github.com/status-im/status-go/services/shhext"
-
- "os"
-
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
@@ -24,6 +21,7 @@ import (
"github.com/status-im/status-go/mailserver"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/rpc"
+ "github.com/status-im/status-go/services/shhext"
"github.com/status-im/status-go/t/helpers"
"github.com/status-im/status-go/t/utils"
whisper "github.com/status-im/whisper/whisperv6"
@@ -38,6 +36,7 @@ type WhisperMailboxSuite struct {
}
func TestWhisperMailboxTestSuite(t *testing.T) {
+ utils.Init()
suite.Run(t, new(WhisperMailboxSuite))
}
@@ -132,7 +131,7 @@ func (s *WhisperMailboxSuite) TestRequestMessageFromMailboxAsync() {
s.waitForEnvelopeEvents(envelopeArchivedWatcher, []string{messageHash}, whisper.EventMailServerEnvelopeArchived)
// Request messages (including the previous one, expired) from mailbox.
- requestID := s.requestHistoricMessagesFromLast12Hours(senderWhisperService, rpcClient, mailboxNode.Server().Self().String(), MailServerKeyID, topic.String(), 0, "")
+ requestID := s.requestHistoricMessagesFromLast12Hours(senderWhisperService, rpcClient, mailboxNode.Server().Self().URLv4(), MailServerKeyID, topic.String(), 0, "")
// wait for mail server response
resp := s.waitForMailServerResponse(mailServerResponseWatcher, requestID)
@@ -516,7 +515,7 @@ func (s *WhisperMailboxSuite) TestSyncBetweenTwoMailServers() {
defer stopEmptyMailbox()
s.Require().True(emptyMailbox.IsNodeRunning())
- emptyMailboxEnode := emptyMailbox.StatusNode().Server().Self().String()
+ emptyMailboxEnode := emptyMailbox.StatusNode().Server().Self().URLv4()
errCh := helpers.WaitForPeerAsync(emptyMailbox.StatusNode().Server(), mailboxEnode, p2p.PeerEventTypeAdd, 5*time.Second)
s.Require().NoError(emptyMailbox.StatusNode().AddPeer(mailboxEnode))
@@ -546,7 +545,7 @@ func (s *WhisperMailboxSuite) TestSyncBetweenTwoMailServers() {
&syncMessagesResponse,
"shhext_syncMessages",
shhext.SyncMessagesRequest{
- MailServerPeer: mailbox.StatusNode().Server().Self().String(),
+ MailServerPeer: mailbox.StatusNode().Server().Self().URLv4(),
From: 0,
To: uint32(time.Now().Unix()),
Limit: 1,
@@ -565,7 +564,7 @@ func (s *WhisperMailboxSuite) TestSyncBetweenTwoMailServers() {
&syncMessagesResponse,
"shhext_syncMessages",
shhext.SyncMessagesRequest{
- MailServerPeer: mailbox.StatusNode().Server().Self().String(),
+ MailServerPeer: mailbox.StatusNode().Server().Self().URLv4(),
From: 0,
To: uint32(time.Now().Unix()),
Limit: 10,
diff --git a/t/e2e/whisper/whisper_test.go b/t/e2e/whisper/whisper_test.go
index 1e8bf98d5..1eae4e176 100644
--- a/t/e2e/whisper/whisper_test.go
+++ b/t/e2e/whisper/whisper_test.go
@@ -179,7 +179,7 @@ func (s *WhisperTestSuite) TestSelectedAccountOnRestart() {
// select account with wrong password
err = s.Backend.SelectAccount(buildLoginParams(accountInfo1.WalletAddress, accountInfo1.ChatAddress, "wrongPassword"))
- expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given passphrase")
+ expectedErr := errors.New("cannot retrieve a valid key for a given account: could not decrypt key with given password")
s.EqualError(expectedErr, err.Error())
// select account with right password
diff --git a/t/utils/utils.go b/t/utils/utils.go
index 207d8cd33..578927ec9 100644
--- a/t/utils/utils.go
+++ b/t/utils/utils.go
@@ -58,7 +58,7 @@ var (
syncTimeout = 50 * time.Minute
)
-func init() {
+func Init() {
pwd, err := os.Getwd()
if err != nil {
panic(err)
diff --git a/transactions/transactor_test.go b/transactions/transactor_test.go
index e1ea7392f..d493d61fc 100644
--- a/transactions/transactor_test.go
+++ b/transactions/transactor_test.go
@@ -15,7 +15,6 @@ import (
"github.com/ethereum/go-ethereum/common"
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/contracts/ens/contract"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -24,14 +23,16 @@ import (
gethrpc "github.com/ethereum/go-ethereum/rpc"
"github.com/golang/mock/gomock"
"github.com/status-im/status-go/account"
+ "github.com/status-im/status-go/contracts/ens/contract"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/rpc"
- . "github.com/status-im/status-go/t/utils"
+ "github.com/status-im/status-go/t/utils"
"github.com/status-im/status-go/transactions/fake"
"github.com/stretchr/testify/suite"
)
func TestTransactorSuite(t *testing.T) {
+ utils.Init()
suite.Run(t, new(TransactorSuite))
}
@@ -54,7 +55,7 @@ func (s *TransactorSuite) SetupTest() {
rpcClient, _ := rpc.NewClient(s.client, params.UpstreamRPCConfig{})
// expected by simulated backend
chainID := gethparams.AllEthashProtocolChanges.ChainID.Uint64()
- nodeConfig, err := MakeTestNodeConfigWithDataDir("", "/tmp", chainID)
+ nodeConfig, err := utils.MakeTestNodeConfigWithDataDir("", "/tmp", chainID)
s.Require().NoError(err)
s.nodeConfig = nodeConfig
@@ -120,7 +121,7 @@ func (s *TransactorSuite) rlpEncodeTx(args SendTxArgs, config *params.NodeConfig
func (s *TransactorSuite) TestGasValues() {
key, _ := crypto.GenerateKey()
selectedAccount := &account.SelectedExtKey{
- Address: account.FromAddress(TestConfig.Account1.WalletAddress),
+ Address: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
AccountKey: &keystore.Key{PrivateKey: key},
}
testCases := []struct {
@@ -154,8 +155,8 @@ func (s *TransactorSuite) TestGasValues() {
s.T().Run(testCase.name, func(t *testing.T) {
s.SetupTest()
args := SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
Gas: testCase.gas,
GasPrice: testCase.gasPrice,
}
@@ -170,14 +171,14 @@ func (s *TransactorSuite) TestGasValues() {
func (s *TransactorSuite) TestArgsValidation() {
args := SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
Data: hexutil.Bytes([]byte{0x01, 0x02}),
Input: hexutil.Bytes([]byte{0x02, 0x01}),
}
s.False(args.Valid())
selectedAccount := &account.SelectedExtKey{
- Address: account.FromAddress(TestConfig.Account1.WalletAddress),
+ Address: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
}
_, err := s.manager.SendTransaction(args, selectedAccount)
s.EqualError(err, ErrInvalidSendTxArgs.Error())
@@ -185,8 +186,8 @@ func (s *TransactorSuite) TestArgsValidation() {
func (s *TransactorSuite) TestAccountMismatch() {
args := SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
}
var err error
@@ -197,7 +198,7 @@ func (s *TransactorSuite) TestAccountMismatch() {
// mismatched accounts
selectedAccount := &account.SelectedExtKey{
- Address: account.FromAddress(TestConfig.Account2.WalletAddress),
+ Address: account.FromAddress(utils.TestConfig.Account2.WalletAddress),
}
_, err = s.manager.SendTransaction(args, selectedAccount)
s.EqualError(err, ErrInvalidTxSender.Error())
@@ -214,15 +215,15 @@ func (s *TransactorSuite) TestLocalNonce() {
txCount := 3
key, _ := crypto.GenerateKey()
selectedAccount := &account.SelectedExtKey{
- Address: account.FromAddress(TestConfig.Account1.WalletAddress),
+ Address: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
AccountKey: &keystore.Key{PrivateKey: key},
}
nonce := hexutil.Uint64(0)
for i := 0; i < txCount; i++ {
args := SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
}
s.setupTransactionPoolAPI(args, nonce, hexutil.Uint64(i), selectedAccount, nil)
@@ -234,8 +235,8 @@ func (s *TransactorSuite) TestLocalNonce() {
nonce = hexutil.Uint64(5)
args := SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
}
s.setupTransactionPoolAPI(args, nonce, nonce, selectedAccount, nil)
@@ -249,8 +250,8 @@ func (s *TransactorSuite) TestLocalNonce() {
testErr := errors.New("test")
s.txServiceMock.EXPECT().GetTransactionCount(gomock.Any(), selectedAccount.Address, gethrpc.PendingBlockNumber).Return(nil, testErr)
args = SendTxArgs{
- From: account.FromAddress(TestConfig.Account1.WalletAddress),
- To: account.ToAddress(TestConfig.Account2.WalletAddress),
+ From: account.FromAddress(utils.TestConfig.Account1.WalletAddress),
+ To: account.ToAddress(utils.TestConfig.Account2.WalletAddress),
}
_, err = s.manager.SendTransaction(args, selectedAccount)
diff --git a/vendor/github.com/StackExchange/wmi/LICENSE b/vendor/github.com/StackExchange/wmi/LICENSE
new file mode 100644
index 000000000..ae80b6720
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Stack Exchange
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/StackExchange/wmi/README.md b/vendor/github.com/StackExchange/wmi/README.md
new file mode 100644
index 000000000..426d1a46b
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/README.md
@@ -0,0 +1,6 @@
+wmi
+===
+
+Package wmi provides a WQL interface to Windows WMI.
+
+Note: It interfaces with WMI on the local machine, therefore it only runs on Windows.
diff --git a/vendor/github.com/StackExchange/wmi/swbemservices.go b/vendor/github.com/StackExchange/wmi/swbemservices.go
new file mode 100644
index 000000000..9765a53f7
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/swbemservices.go
@@ -0,0 +1,260 @@
+// +build windows
+
+package wmi
+
+import (
+ "fmt"
+ "reflect"
+ "runtime"
+ "sync"
+
+ "github.com/go-ole/go-ole"
+ "github.com/go-ole/go-ole/oleutil"
+)
+
+// SWbemServices is used to access wmi. See https://msdn.microsoft.com/en-us/library/aa393719(v=vs.85).aspx
+type SWbemServices struct {
+ //TODO: track namespace. Not sure if we can re connect to a different namespace using the same instance
+ cWMIClient *Client //This could also be an embedded struct, but then we would need to branch on Client vs SWbemServices in the Query method
+ sWbemLocatorIUnknown *ole.IUnknown
+ sWbemLocatorIDispatch *ole.IDispatch
+ queries chan *queryRequest
+ closeError chan error
+ lQueryorClose sync.Mutex
+}
+
+type queryRequest struct {
+ query string
+ dst interface{}
+ args []interface{}
+ finished chan error
+}
+
+// InitializeSWbemServices will return a new SWbemServices object that can be used to query WMI
+func InitializeSWbemServices(c *Client, connectServerArgs ...interface{}) (*SWbemServices, error) {
+ //fmt.Println("InitializeSWbemServices: Starting")
+ //TODO: implement connectServerArgs as optional argument for init with connectServer call
+ s := new(SWbemServices)
+ s.cWMIClient = c
+ s.queries = make(chan *queryRequest)
+ initError := make(chan error)
+ go s.process(initError)
+
+ err, ok := <-initError
+ if ok {
+ return nil, err //Send error to caller
+ }
+ //fmt.Println("InitializeSWbemServices: Finished")
+ return s, nil
+}
+
+// Close will clear and release all of the SWbemServices resources
+func (s *SWbemServices) Close() error {
+ s.lQueryorClose.Lock()
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ if s.queries == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices has been closed")
+ }
+ //fmt.Println("Close: sending close request")
+ var result error
+ ce := make(chan error)
+ s.closeError = ce //Race condition if multiple callers to close. May need to lock here
+ close(s.queries) //Tell background to shut things down
+ s.lQueryorClose.Unlock()
+ err, ok := <-ce
+ if ok {
+ result = err
+ }
+ //fmt.Println("Close: finished")
+ return result
+}
+
+func (s *SWbemServices) process(initError chan error) {
+ //fmt.Println("process: starting background thread initialization")
+ //All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine
+ runtime.LockOSThread()
+ defer runtime.LockOSThread()
+
+ err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
+ if err != nil {
+ oleCode := err.(*ole.OleError).Code()
+ if oleCode != ole.S_OK && oleCode != S_FALSE {
+ initError <- fmt.Errorf("ole.CoInitializeEx error: %v", err)
+ return
+ }
+ }
+ defer ole.CoUninitialize()
+
+ unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
+ if err != nil {
+ initError <- fmt.Errorf("CreateObject SWbemLocator error: %v", err)
+ return
+ } else if unknown == nil {
+ initError <- ErrNilCreateObject
+ return
+ }
+ defer unknown.Release()
+ s.sWbemLocatorIUnknown = unknown
+
+ dispatch, err := s.sWbemLocatorIUnknown.QueryInterface(ole.IID_IDispatch)
+ if err != nil {
+ initError <- fmt.Errorf("SWbemLocator QueryInterface error: %v", err)
+ return
+ }
+ defer dispatch.Release()
+ s.sWbemLocatorIDispatch = dispatch
+
+ // we can't do the ConnectServer call outside the loop unless we find a way to track and re-init the connectServerArgs
+ //fmt.Println("process: initialized. closing initError")
+ close(initError)
+ //fmt.Println("process: waiting for queries")
+ for q := range s.queries {
+ //fmt.Printf("process: new query: len(query)=%d\n", len(q.query))
+ errQuery := s.queryBackground(q)
+ //fmt.Println("process: s.queryBackground finished")
+ if errQuery != nil {
+ q.finished <- errQuery
+ }
+ close(q.finished)
+ }
+ //fmt.Println("process: queries channel closed")
+ s.queries = nil //set channel to nil so we know it is closed
+ //TODO: I think the Release/Clear calls can panic if things are in a bad state.
+ //TODO: May need to recover from panics and send error to method caller instead.
+ close(s.closeError)
+}
+
+// Query runs the WQL query using a SWbemServices instance and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+func (s *SWbemServices) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ s.lQueryorClose.Lock()
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ if s.queries == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices has been closed")
+ }
+
+ //fmt.Println("Query: Sending query request")
+ qr := queryRequest{
+ query: query,
+ dst: dst,
+ args: connectServerArgs,
+ finished: make(chan error),
+ }
+ s.queries <- &qr
+ s.lQueryorClose.Unlock()
+ err, ok := <-qr.finished
+ if ok {
+ //fmt.Println("Query: Finished with error")
+ return err //Send error to caller
+ }
+ //fmt.Println("Query: Finished")
+ return nil
+}
+
+func (s *SWbemServices) queryBackground(q *queryRequest) error {
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ wmi := s.sWbemLocatorIDispatch //Should just rename in the code, but this will help as we break things apart
+ //fmt.Println("queryBackground: Starting")
+
+ dv := reflect.ValueOf(q.dst)
+ if dv.Kind() != reflect.Ptr || dv.IsNil() {
+ return ErrInvalidEntityType
+ }
+ dv = dv.Elem()
+ mat, elemType := checkMultiArg(dv)
+ if mat == multiArgTypeInvalid {
+ return ErrInvalidEntityType
+ }
+
+ // service is a SWbemServices
+ serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", q.args...)
+ if err != nil {
+ return err
+ }
+ service := serviceRaw.ToIDispatch()
+ defer serviceRaw.Clear()
+
+ // result is a SWBemObjectSet
+ resultRaw, err := oleutil.CallMethod(service, "ExecQuery", q.query)
+ if err != nil {
+ return err
+ }
+ result := resultRaw.ToIDispatch()
+ defer resultRaw.Clear()
+
+ count, err := oleInt64(result, "Count")
+ if err != nil {
+ return err
+ }
+
+ enumProperty, err := result.GetProperty("_NewEnum")
+ if err != nil {
+ return err
+ }
+ defer enumProperty.Clear()
+
+ enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
+ if err != nil {
+ return err
+ }
+ if enum == nil {
+ return fmt.Errorf("can't get IEnumVARIANT, enum is nil")
+ }
+ defer enum.Release()
+
+ // Initialize a slice with Count capacity
+ dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))
+
+ var errFieldMismatch error
+ for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {
+ if err != nil {
+ return err
+ }
+
+ err := func() error {
+ // item is a SWbemObject, but really a Win32_Process
+ item := itemRaw.ToIDispatch()
+ defer item.Release()
+
+ ev := reflect.New(elemType)
+ if err = s.cWMIClient.loadEntity(ev.Interface(), item); err != nil {
+ if _, ok := err.(*ErrFieldMismatch); ok {
+ // We continue loading entities even in the face of field mismatch errors.
+ // If we encounter any other error, that other error is returned. Otherwise,
+ // an ErrFieldMismatch is returned.
+ errFieldMismatch = err
+ } else {
+ return err
+ }
+ }
+ if mat != multiArgTypeStructPtr {
+ ev = ev.Elem()
+ }
+ dv.Set(reflect.Append(dv, ev))
+ return nil
+ }()
+ if err != nil {
+ return err
+ }
+ }
+ //fmt.Println("queryBackground: Finished")
+ return errFieldMismatch
+}
diff --git a/vendor/github.com/StackExchange/wmi/wmi.go b/vendor/github.com/StackExchange/wmi/wmi.go
new file mode 100644
index 000000000..a951b1258
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/wmi.go
@@ -0,0 +1,486 @@
+// +build windows
+
+/*
+Package wmi provides a WQL interface for WMI on Windows.
+
+Example code to print names of running processes:
+
+ type Win32_Process struct {
+ Name string
+ }
+
+ func main() {
+ var dst []Win32_Process
+ q := wmi.CreateQuery(&dst, "")
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ log.Fatal(err)
+ }
+ for i, v := range dst {
+ println(i, v.Name)
+ }
+ }
+
+*/
+package wmi
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "log"
+ "os"
+ "reflect"
+ "runtime"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/go-ole/go-ole"
+ "github.com/go-ole/go-ole/oleutil"
+)
+
+var l = log.New(os.Stdout, "", log.LstdFlags)
+
+var (
+ ErrInvalidEntityType = errors.New("wmi: invalid entity type")
+ // ErrNilCreateObject is the error returned if CreateObject returns nil even
+ // if the error was nil.
+ ErrNilCreateObject = errors.New("wmi: create object returned nil")
+ lock sync.Mutex
+)
+
+// S_FALSE is returned by CoInitializeEx if it was already called on this thread.
+const S_FALSE = 0x00000001
+
+// QueryNamespace invokes Query with the given namespace on the local machine.
+func QueryNamespace(query string, dst interface{}, namespace string) error {
+ return Query(query, dst, nil, namespace)
+}
+
+// Query runs the WQL query and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+//
+// Query is a wrapper around DefaultClient.Query.
+func Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ if DefaultClient.SWbemServicesClient == nil {
+ return DefaultClient.Query(query, dst, connectServerArgs...)
+ }
+ return DefaultClient.SWbemServicesClient.Query(query, dst, connectServerArgs...)
+}
+
+// A Client is an WMI query client.
+//
+// Its zero value (DefaultClient) is a usable client.
+type Client struct {
+ // NonePtrZero specifies if nil values for fields which aren't pointers
+ // should be returned as the field types zero value.
+ //
+ // Setting this to true allows stucts without pointer fields to be used
+ // without the risk failure should a nil value returned from WMI.
+ NonePtrZero bool
+
+ // PtrNil specifies if nil values for pointer fields should be returned
+ // as nil.
+ //
+ // Setting this to true will set pointer fields to nil where WMI
+ // returned nil, otherwise the types zero value will be returned.
+ PtrNil bool
+
+ // AllowMissingFields specifies that struct fields not present in the
+ // query result should not result in an error.
+ //
+ // Setting this to true allows custom queries to be used with full
+ // struct definitions instead of having to define multiple structs.
+ AllowMissingFields bool
+
+ // SWbemServiceClient is an optional SWbemServices object that can be
+ // initialized and then reused across multiple queries. If it is null
+ // then the method will initialize a new temporary client each time.
+ SWbemServicesClient *SWbemServices
+}
+
+// DefaultClient is the default Client and is used by Query, QueryNamespace
+var DefaultClient = &Client{}
+
+// Query runs the WQL query and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+func (c *Client) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ dv := reflect.ValueOf(dst)
+ if dv.Kind() != reflect.Ptr || dv.IsNil() {
+ return ErrInvalidEntityType
+ }
+ dv = dv.Elem()
+ mat, elemType := checkMultiArg(dv)
+ if mat == multiArgTypeInvalid {
+ return ErrInvalidEntityType
+ }
+
+ lock.Lock()
+ defer lock.Unlock()
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
+ if err != nil {
+ oleCode := err.(*ole.OleError).Code()
+ if oleCode != ole.S_OK && oleCode != S_FALSE {
+ return err
+ }
+ }
+ defer ole.CoUninitialize()
+
+ unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
+ if err != nil {
+ return err
+ } else if unknown == nil {
+ return ErrNilCreateObject
+ }
+ defer unknown.Release()
+
+ wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
+ if err != nil {
+ return err
+ }
+ defer wmi.Release()
+
+ // service is a SWbemServices
+ serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", connectServerArgs...)
+ if err != nil {
+ return err
+ }
+ service := serviceRaw.ToIDispatch()
+ defer serviceRaw.Clear()
+
+ // result is a SWBemObjectSet
+ resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query)
+ if err != nil {
+ return err
+ }
+ result := resultRaw.ToIDispatch()
+ defer resultRaw.Clear()
+
+ count, err := oleInt64(result, "Count")
+ if err != nil {
+ return err
+ }
+
+ enumProperty, err := result.GetProperty("_NewEnum")
+ if err != nil {
+ return err
+ }
+ defer enumProperty.Clear()
+
+ enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
+ if err != nil {
+ return err
+ }
+ if enum == nil {
+ return fmt.Errorf("can't get IEnumVARIANT, enum is nil")
+ }
+ defer enum.Release()
+
+ // Initialize a slice with Count capacity
+ dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))
+
+ var errFieldMismatch error
+ for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {
+ if err != nil {
+ return err
+ }
+
+ err := func() error {
+ // item is a SWbemObject, but really a Win32_Process
+ item := itemRaw.ToIDispatch()
+ defer item.Release()
+
+ ev := reflect.New(elemType)
+ if err = c.loadEntity(ev.Interface(), item); err != nil {
+ if _, ok := err.(*ErrFieldMismatch); ok {
+ // We continue loading entities even in the face of field mismatch errors.
+ // If we encounter any other error, that other error is returned. Otherwise,
+ // an ErrFieldMismatch is returned.
+ errFieldMismatch = err
+ } else {
+ return err
+ }
+ }
+ if mat != multiArgTypeStructPtr {
+ ev = ev.Elem()
+ }
+ dv.Set(reflect.Append(dv, ev))
+ return nil
+ }()
+ if err != nil {
+ return err
+ }
+ }
+ return errFieldMismatch
+}
+
+// ErrFieldMismatch is returned when a field is to be loaded into a different
+// type than the one it was stored from, or when a field is missing or
+// unexported in the destination struct.
+// StructType is the type of the struct pointed to by the destination argument.
+type ErrFieldMismatch struct {
+ StructType reflect.Type
+ FieldName string
+ Reason string
+}
+
+func (e *ErrFieldMismatch) Error() string {
+ return fmt.Sprintf("wmi: cannot load field %q into a %q: %s",
+ e.FieldName, e.StructType, e.Reason)
+}
+
+var timeType = reflect.TypeOf(time.Time{})
+
+// loadEntity loads a SWbemObject into a struct pointer.
+func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismatch error) {
+ v := reflect.ValueOf(dst).Elem()
+ for i := 0; i < v.NumField(); i++ {
+ f := v.Field(i)
+ of := f
+ isPtr := f.Kind() == reflect.Ptr
+ if isPtr {
+ ptr := reflect.New(f.Type().Elem())
+ f.Set(ptr)
+ f = f.Elem()
+ }
+ n := v.Type().Field(i).Name
+ if !f.CanSet() {
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "CanSet() is false",
+ }
+ }
+ prop, err := oleutil.GetProperty(src, n)
+ if err != nil {
+ if !c.AllowMissingFields {
+ errFieldMismatch = &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "no such struct field",
+ }
+ }
+ continue
+ }
+ defer prop.Clear()
+
+ switch val := prop.Value().(type) {
+ case int8, int16, int32, int64, int:
+ v := reflect.ValueOf(val).Int()
+ switch f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ f.SetInt(v)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ f.SetUint(uint64(v))
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not an integer class",
+ }
+ }
+ case uint8, uint16, uint32, uint64:
+ v := reflect.ValueOf(val).Uint()
+ switch f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ f.SetInt(int64(v))
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ f.SetUint(v)
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not an integer class",
+ }
+ }
+ case string:
+ switch f.Kind() {
+ case reflect.String:
+ f.SetString(val)
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ iv, err := strconv.ParseInt(val, 10, 64)
+ if err != nil {
+ return err
+ }
+ f.SetInt(iv)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ uv, err := strconv.ParseUint(val, 10, 64)
+ if err != nil {
+ return err
+ }
+ f.SetUint(uv)
+ case reflect.Struct:
+ switch f.Type() {
+ case timeType:
+ if len(val) == 25 {
+ mins, err := strconv.Atoi(val[22:])
+ if err != nil {
+ return err
+ }
+ val = val[:22] + fmt.Sprintf("%02d%02d", mins/60, mins%60)
+ }
+ t, err := time.Parse("20060102150405.000000-0700", val)
+ if err != nil {
+ return err
+ }
+ f.Set(reflect.ValueOf(t))
+ }
+ }
+ case bool:
+ switch f.Kind() {
+ case reflect.Bool:
+ f.SetBool(val)
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not a bool",
+ }
+ }
+ case float32:
+ switch f.Kind() {
+ case reflect.Float32:
+ f.SetFloat(float64(val))
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not a Float32",
+ }
+ }
+ default:
+ if f.Kind() == reflect.Slice {
+ switch f.Type().Elem().Kind() {
+ case reflect.String:
+ safeArray := prop.ToArray()
+ if safeArray != nil {
+ arr := safeArray.ToValueArray()
+ fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))
+ for i, v := range arr {
+ s := fArr.Index(i)
+ s.SetString(v.(string))
+ }
+ f.Set(fArr)
+ }
+ case reflect.Uint8:
+ safeArray := prop.ToArray()
+ if safeArray != nil {
+ arr := safeArray.ToValueArray()
+ fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))
+ for i, v := range arr {
+ s := fArr.Index(i)
+ s.SetUint(reflect.ValueOf(v).Uint())
+ }
+ f.Set(fArr)
+ }
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: fmt.Sprintf("unsupported slice type (%T)", val),
+ }
+ }
+ } else {
+ typeof := reflect.TypeOf(val)
+ if typeof == nil && (isPtr || c.NonePtrZero) {
+ if (isPtr && c.PtrNil) || (!isPtr && c.NonePtrZero) {
+ of.Set(reflect.Zero(of.Type()))
+ }
+ break
+ }
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: fmt.Sprintf("unsupported type (%T)", val),
+ }
+ }
+ }
+ }
+ return errFieldMismatch
+}
+
+type multiArgType int
+
+const (
+ multiArgTypeInvalid multiArgType = iota
+ multiArgTypeStruct
+ multiArgTypeStructPtr
+)
+
+// checkMultiArg checks that v has type []S, []*S for some struct type S.
+//
+// It returns what category the slice's elements are, and the reflect.Type
+// that represents S.
+func checkMultiArg(v reflect.Value) (m multiArgType, elemType reflect.Type) {
+ if v.Kind() != reflect.Slice {
+ return multiArgTypeInvalid, nil
+ }
+ elemType = v.Type().Elem()
+ switch elemType.Kind() {
+ case reflect.Struct:
+ return multiArgTypeStruct, elemType
+ case reflect.Ptr:
+ elemType = elemType.Elem()
+ if elemType.Kind() == reflect.Struct {
+ return multiArgTypeStructPtr, elemType
+ }
+ }
+ return multiArgTypeInvalid, nil
+}
+
+func oleInt64(item *ole.IDispatch, prop string) (int64, error) {
+ v, err := oleutil.GetProperty(item, prop)
+ if err != nil {
+ return 0, err
+ }
+ defer v.Clear()
+
+ i := int64(v.Val)
+ return i, nil
+}
+
+// CreateQuery returns a WQL query string that queries all columns of src. where
+// is an optional string that is appended to the query, to be used with WHERE
+// clauses. In such a case, the "WHERE" string should appear at the beginning.
+func CreateQuery(src interface{}, where string) string {
+ var b bytes.Buffer
+ b.WriteString("SELECT ")
+ s := reflect.Indirect(reflect.ValueOf(src))
+ t := s.Type()
+ if s.Kind() == reflect.Slice {
+ t = t.Elem()
+ }
+ if t.Kind() != reflect.Struct {
+ return ""
+ }
+ var fields []string
+ for i := 0; i < t.NumField(); i++ {
+ fields = append(fields, t.Field(i).Name)
+ }
+ b.WriteString(strings.Join(fields, ", "))
+ b.WriteString(" FROM ")
+ b.WriteString(t.Name())
+ b.WriteString(" " + where)
+ return b.String()
+}
diff --git a/vendor/github.com/btcsuite/btcd/btcec/genprecomps.go b/vendor/github.com/btcsuite/btcd/btcec/genprecomps.go
new file mode 100644
index 000000000..d4a9c1b83
--- /dev/null
+++ b/vendor/github.com/btcsuite/btcd/btcec/genprecomps.go
@@ -0,0 +1,63 @@
+// Copyright 2015 The btcsuite developers
+// Use of this source code is governed by an ISC
+// license that can be found in the LICENSE file.
+
+// This file is ignored during the regular build due to the following build tag.
+// It is called by go generate and used to automatically generate pre-computed
+// tables used to accelerate operations.
+// +build ignore
+
+package main
+
+import (
+ "bytes"
+ "compress/zlib"
+ "encoding/base64"
+ "fmt"
+ "log"
+ "os"
+
+ "github.com/btcsuite/btcd/btcec"
+)
+
+func main() {
+ fi, err := os.Create("secp256k1.go")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fi.Close()
+
+ // Compress the serialized byte points.
+ serialized := btcec.S256().SerializedBytePoints()
+ var compressed bytes.Buffer
+ w := zlib.NewWriter(&compressed)
+ if _, err := w.Write(serialized); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ w.Close()
+
+ // Encode the compressed byte points with base64.
+ encoded := make([]byte, base64.StdEncoding.EncodedLen(compressed.Len()))
+ base64.StdEncoding.Encode(encoded, compressed.Bytes())
+
+ fmt.Fprintln(fi, "// Copyright (c) 2015 The btcsuite developers")
+ fmt.Fprintln(fi, "// Use of this source code is governed by an ISC")
+ fmt.Fprintln(fi, "// license that can be found in the LICENSE file.")
+ fmt.Fprintln(fi)
+ fmt.Fprintln(fi, "package btcec")
+ fmt.Fprintln(fi)
+ fmt.Fprintln(fi, "// Auto-generated file (see genprecomps.go)")
+ fmt.Fprintln(fi, "// DO NOT EDIT")
+ fmt.Fprintln(fi)
+ fmt.Fprintf(fi, "var secp256k1BytePoints = %q\n", string(encoded))
+
+ a1, b1, a2, b2 := btcec.S256().EndomorphismVectors()
+ fmt.Println("The following values are the computed linearly " +
+ "independent vectors needed to make use of the secp256k1 " +
+ "endomorphism:")
+ fmt.Printf("a1: %x\n", a1)
+ fmt.Printf("b1: %x\n", b1)
+ fmt.Printf("a2: %x\n", a2)
+ fmt.Printf("b2: %x\n", b2)
+}
diff --git a/vendor/github.com/btcsuite/btcd/btcec/signature.go b/vendor/github.com/btcsuite/btcd/btcec/signature.go
index bddb22831..f1c437749 100644
--- a/vendor/github.com/btcsuite/btcd/btcec/signature.go
+++ b/vendor/github.com/btcsuite/btcd/btcec/signature.go
@@ -85,10 +85,10 @@ func (sig *Signature) IsEqual(otherSig *Signature) bool {
sig.S.Cmp(otherSig.S) == 0
}
-// minSigLen is the minimum length of a DER encoded signature and is
-// when both R and S are 1 byte each.
+// MinSigLen is the minimum length of a DER encoded signature and is when both R
+// and S are 1 byte each.
// 0x30 + <1-byte> + 0x02 + 0x01 + + 0x2 + 0x01 +
-const minSigLen = 8
+const MinSigLen = 8
func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error) {
// Originally this code used encoding/asn1 in order to parse the
@@ -103,7 +103,7 @@ func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error)
signature := &Signature{}
- if len(sigStr) < minSigLen {
+ if len(sigStr) < MinSigLen {
return nil, errors.New("malformed signature: too short")
}
// 0x30
@@ -118,7 +118,7 @@ func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error)
// siglen should be less than the entire message and greater than
// the minimal message size.
- if int(siglen+2) > len(sigStr) || int(siglen+2) < minSigLen {
+ if int(siglen+2) > len(sigStr) || int(siglen+2) < MinSigLen {
return nil, errors.New("malformed signature: bad length")
}
// trim the slice we're working on so we only look at what matters.
diff --git a/vendor/github.com/btcsuite/btcd/wire/message.go b/vendor/github.com/btcsuite/btcd/wire/message.go
index 4f03cf564..e93764770 100644
--- a/vendor/github.com/btcsuite/btcd/wire/message.go
+++ b/vendor/github.com/btcsuite/btcd/wire/message.go
@@ -321,9 +321,13 @@ func WriteMessageWithEncodingN(w io.Writer, msg Message, pver uint32,
return totalBytes, err
}
- // Write payload.
- n, err = w.Write(payload)
- totalBytes += n
+ // Only write the payload if there is one, e.g., verack messages don't
+ // have one.
+ if len(payload) > 0 {
+ n, err = w.Write(payload)
+ totalBytes += n
+ }
+
return totalBytes, err
}
diff --git a/vendor/github.com/btcsuite/btcutil/base58/genalphabet.go b/vendor/github.com/btcsuite/btcutil/base58/genalphabet.go
new file mode 100644
index 000000000..010cbee39
--- /dev/null
+++ b/vendor/github.com/btcsuite/btcutil/base58/genalphabet.go
@@ -0,0 +1,79 @@
+// Copyright (c) 2015 The btcsuite developers
+// Use of this source code is governed by an ISC
+// license that can be found in the LICENSE file.
+
+//+build ignore
+
+package main
+
+import (
+ "bytes"
+ "io"
+ "log"
+ "os"
+ "strconv"
+)
+
+var (
+ start = []byte(`// Copyright (c) 2015 The btcsuite developers
+// Use of this source code is governed by an ISC
+// license that can be found in the LICENSE file.
+
+// AUTOGENERATED by genalphabet.go; do not edit.
+
+package base58
+
+const (
+ // alphabet is the modified base58 alphabet used by Bitcoin.
+ alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
+
+ alphabetIdx0 = '1'
+)
+
+var b58 = [256]byte{`)
+
+ end = []byte(`}`)
+
+ alphabet = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
+ tab = []byte("\t")
+ invalid = []byte("255")
+ comma = []byte(",")
+ space = []byte(" ")
+ nl = []byte("\n")
+)
+
+func write(w io.Writer, b []byte) {
+ _, err := w.Write(b)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+func main() {
+ fi, err := os.Create("alphabet.go")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fi.Close()
+
+ write(fi, start)
+ write(fi, nl)
+ for i := byte(0); i < 32; i++ {
+ write(fi, tab)
+ for j := byte(0); j < 8; j++ {
+ idx := bytes.IndexByte(alphabet, i*8+j)
+ if idx == -1 {
+ write(fi, invalid)
+ } else {
+ write(fi, strconv.AppendInt(nil, int64(idx), 10))
+ }
+ write(fi, comma)
+ if j != 7 {
+ write(fi, space)
+ }
+ }
+ write(fi, nl)
+ }
+ write(fi, end)
+ write(fi, nl)
+}
diff --git a/vendor/github.com/elastic/gosigar/.appveyor.yml b/vendor/github.com/elastic/gosigar/.appveyor.yml
new file mode 100644
index 000000000..ff467086d
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/.appveyor.yml
@@ -0,0 +1,84 @@
+# Version format
+version: "{build}"
+
+# Operating system (build VM template)
+os: Windows Server 2012 R2
+
+# Environment variables
+environment:
+ GOPATH: c:\gopath
+ GVM_GO_VERSION: 1.8.3
+ GVM_DL: https://github.com/andrewkroh/gvm/releases/download/v0.0.1/gvm-windows-amd64.exe
+
+# Custom clone folder (variables are not expanded here).
+clone_folder: c:\gopath\src\github.com\elastic\gosigar
+
+# Cache mingw install until appveyor.yml is modified.
+cache:
+- C:\ProgramData\chocolatey\bin -> .appveyor.yml
+- C:\ProgramData\chocolatey\lib -> .appveyor.yml
+- C:\Users\appveyor\.gvm -> .appveyor.yml
+- C:\Windows\System32\gvm.exe -> .appveyor.yml
+- C:\tools\mingw64 -> .appveyor.yml
+
+# Scripts that run after cloning repository
+install:
+ - ps: >-
+ if(!(Test-Path "C:\Windows\System32\gvm.exe")) {
+ wget "$env:GVM_DL" -Outfile C:\Windows\System32\gvm.exe
+ }
+ - ps: gvm --format=powershell "$env:GVM_GO_VERSION" | Invoke-Expression
+ # AppVeyor installed mingw is 32-bit only so install 64-bit version.
+ - ps: >-
+ if(!(Test-Path "C:\tools\mingw64\bin\gcc.exe")) {
+ cinst mingw > mingw-install.txt
+ Push-AppveyorArtifact mingw-install.txt
+ }
+ - set PATH=C:\tools\mingw64\bin;%GOROOT%\bin;%PATH%
+ - set PATH=%GOPATH%\bin;%PATH%
+ - go version
+ - go env
+ - python --version
+ - go get github.com/elastic/beats/vendor/github.com/pierrre/gotestcover
+
+# To run your custom scripts instead of automatic MSBuild
+build_script:
+ # Compile
+ - appveyor AddCompilationMessage "Starting Compile"
+ - cd c:\gopath\src\github.com\elastic\gosigar
+ - go get -v -t -d ./...
+ - go build
+ - go build -o examples/df/df.exe ./examples/df
+ - go build -o examples/free/free.exe ./examples/free
+ - go build -o examples/ps/ps.exe ./examples/ps
+ - go build -o examples/uptime/uptime.exe ./examples/uptime
+ - appveyor AddCompilationMessage "Compile Success"
+
+# To run your custom scripts instead of automatic tests
+test_script:
+ # Unit tests
+ - ps: Add-AppveyorTest "Unit Tests" -Outcome Running
+ - mkdir build\coverage
+ - gotestcover -v -coverprofile=build/coverage/unit.cov github.com/elastic/gosigar/...
+ - ps: Update-AppveyorTest "Unit Tests" -Outcome Passed
+ - ps: Add-AppveyorTest "Running Examples" -Outcome Running
+ - .\examples\df\df.exe
+ - .\examples\free\free.exe
+ - .\examples\ps\ps.exe
+ - .\examples\uptime\uptime.exe
+ - ps: Update-AppveyorTest "Running Examples" -Outcome Passed
+
+after_test:
+ - go tool cover -html=build\coverage\unit.cov -o build\coverage\unit.html
+ - ps: Push-AppveyorArtifact build\coverage\unit.cov
+ - ps: Push-AppveyorArtifact build\coverage\unit.html
+ # Upload coverage report.
+ - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%"
+ - pip install codecov
+ - codecov -X gcov -f "build\coverage\unit.cov"
+
+# To disable deployment
+deploy: off
+
+# Notifications should only be setup using the AppVeyor UI so that
+# forks can be created without inheriting the settings.
diff --git a/vendor/github.com/elastic/gosigar/.gitignore b/vendor/github.com/elastic/gosigar/.gitignore
new file mode 100644
index 000000000..6f145056f
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/.gitignore
@@ -0,0 +1,41 @@
+# Directories
+/.vagrant
+/.idea
+/build
+
+# Files
+.DS_Store
+/*.iml
+*.h
+
+# Editor swap files
+*.swp
+*.swo
+*.swn
+
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+*.exe
+*.test
+*.prof
+*.pyc
+*.swp
+
+# Example binaries
+examples/df/df
+examples/df/df.exe
+examples/free/free
+examples/free/free.exe
+examples/ps/ps
+examples/ps/ps.exe
+examples/ss/ss
+examples/ss/ss.exe
+examples/uptime/uptime
+examples/uptime/uptime.exe
+
+# Test Data
+cgroup/testdata/*
+!cgroup/testdata/*.zip
+
diff --git a/vendor/github.com/elastic/gosigar/.travis.yml b/vendor/github.com/elastic/gosigar/.travis.yml
new file mode 100644
index 000000000..30f58bfcf
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/.travis.yml
@@ -0,0 +1,36 @@
+language: go
+
+os:
+ - linux
+ - osx
+
+go:
+ - 1.8.3
+
+env:
+ global:
+ - PROJ="github.com/elastic/gosigar"
+
+sudo: false
+
+before_install:
+ # Put project into proper GOPATH location (important for forks).
+ - mkdir -p $HOME/gopath/src/${PROJ}
+ - rsync -az ${TRAVIS_BUILD_DIR}/ $HOME/gopath/src/${PROJ}/
+ - export TRAVIS_BUILD_DIR=$HOME/gopath/src/${PROJ}
+ - cd $HOME/gopath/src/${PROJ}
+
+install:
+ - go get -v -t -d ./...
+ - go get github.com/elastic/beats/vendor/github.com/pierrre/gotestcover
+
+script:
+ - gofmt -l . | read && echo "Code differs from gofmt's style. Run 'gofmt -w .'" 1>&2 && exit 1 || true
+ - go vet
+ - go build
+ - mkdir -p build/coverage
+ - gotestcover -v -coverprofile=build/coverage/unit.cov github.com/elastic/gosigar/...
+ - for i in $(ls examples); do go build -o examples/$i/$i ./examples/$i; ./examples/$i/$i; done
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash) -f build/coverage/unit.cov
diff --git a/vendor/github.com/elastic/gosigar/CHANGELOG.md b/vendor/github.com/elastic/gosigar/CHANGELOG.md
new file mode 100644
index 000000000..45262e7b8
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/CHANGELOG.md
@@ -0,0 +1,113 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+## [Unreleased]
+
+### Added
+
+### Fixed
+
+- Added missing runtime import for FreeBSD. #104
+
+### Changed
+
+### Deprecated
+
+## [0.9.0]
+
+### Added
+- Added support for huge TLB pages on Linux #97
+- Added support for big endian platform #100
+
+### Fixed
+- Add missing method for OpenBSD #99
+
+## [0.8.0]
+
+### Added
+- Added partial `getrusage` support for Windows to retrieve system CPU time and user CPU time. #95
+- Added full `getrusage` support for Unix. #95
+
+## [0.7.0]
+
+### Added
+- Added method stubs for process handling for operating system that are not supported
+ by gosigar. All methods return `ErrNotImplemented` on such systems. #88
+
+### Fixed
+- Fix freebsd build by using the common version of Get(pid). #91
+
+### Changed
+- Fixed issues in cgroup package by adding missing error checks and closing
+ file handles. #92
+
+## [0.6.0]
+
+### Added
+- Added method stubs to enable compilation for operating systems that are not
+ supported by gosigar. All methods return `ErrNotImplemented` on these unsupported
+ operating systems. #83
+- FreeBSD returns `ErrNotImplemented` for `ProcTime.Get`. #83
+
+### Changed
+- OpenBSD returns `ErrNotImplemented` for `ProcTime.Get` instead of `nil`. #83
+- Fixed incorrect `Mem.Used` calculation under linux. #82
+- Fixed `ProcState` on Linux and FreeBSD when process names contain parentheses. #81
+
+### Removed
+- Remove NetBSD build from sigar_unix.go as it is not supported by gosigar. #83
+
+## [0.5.0]
+
+### Changed
+- Fixed Trim environment variables when comparing values in the test suite. #79
+- Make `kern_procargs` more robust under darwin when we cannot retrieve
+ all the information about a process. #78
+
+## [0.4.0]
+
+### Changed
+- Fixed Windows issue that caused a hang during `init()` if WMI wasn't ready. #74
+
+## [0.3.0]
+
+### Added
+- Read `MemAvailable` value for kernel 3.14+ #71
+
+## [0.2.0]
+
+### Added
+- Added `ErrCgroupsMissing` to indicate that /proc/cgroups is missing which is
+ an indicator that cgroups were disabled at compile time. #64
+
+### Changed
+- Changed `cgroup.SupportedSubsystems()` to honor the "enabled" column in the
+ /proc/cgroups file. #64
+
+## [0.1.0]
+
+### Added
+- Added `CpuList` implementation for Windows that returns CPU timing information
+ on a per CPU basis. #55
+- Added `Uptime` implementation for Windows. #55
+- Added `Swap` implementation for Windows based on page file metrics. #55
+- Added support to `github.com/gosigar/sys/windows` for querying and enabling
+ privileges in a process token.
+- Added utility code for interfacing with linux NETLINK_INET_DIAG. #60
+- Added `ProcEnv` for getting a process's environment variables. #61
+
+### Changed
+- Changed several `OpenProcess` calls on Windows to request the lowest possible
+ access privileges. #50
+- Removed cgo usage from Windows code.
+- Added OS version checks to `ProcArgs.Get` on Windows because the
+ `Win32_Process` WMI query is not available prior to Windows vista. On XP and
+ Windows 2003, this method returns `ErrNotImplemented`. #55
+
+### Fixed
+- Fixed value of `Mem.ActualFree` and `Mem.ActualUsed` on Windows. #49
+- Fixed `ProcTime.StartTime` on Windows to report value in milliseconds since
+ Unix epoch. #51
+- Fixed `ProcStatus.PPID` value is wrong on Windows. #55
+- Fixed `ProcStatus.Username` error on Windows XP #56
diff --git a/vendor/github.com/elastic/gosigar/LICENSE b/vendor/github.com/elastic/gosigar/LICENSE
new file mode 100644
index 000000000..11069edd7
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/github.com/elastic/gosigar/NOTICE b/vendor/github.com/elastic/gosigar/NOTICE
new file mode 100644
index 000000000..fda553b5c
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/NOTICE
@@ -0,0 +1,9 @@
+Copyright (c) [2009-2011] VMware, Inc. All Rights Reserved.
+
+This product is licensed to you under the Apache License, Version 2.0 (the "License").
+You may not use this product except in compliance with the License.
+
+This product includes a number of subcomponents with
+separate copyright notices and license terms. Your use of these
+subcomponents is subject to the terms and conditions of the
+subcomponent's license, as noted in the LICENSE file.
\ No newline at end of file
diff --git a/vendor/github.com/elastic/gosigar/README.md b/vendor/github.com/elastic/gosigar/README.md
new file mode 100644
index 000000000..ecdfc1c3c
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/README.md
@@ -0,0 +1,58 @@
+# Go sigar [![Build Status](https://travis-ci.org/elastic/gosigar.svg?branch=master)](https://travis-ci.org/elastic/gosigar) [![Build status](https://ci.appveyor.com/api/projects/status/4yh6sa7u97ek5uib/branch/master?svg=true)](https://ci.appveyor.com/project/elastic-beats/gosigar/branch/master)
+
+
+## Overview
+
+Go sigar is a golang implementation of the
+[sigar API](https://github.com/hyperic/sigar). The Go version of
+sigar has a very similar interface, but is being written from scratch
+in pure go/cgo, rather than cgo bindings for libsigar.
+
+## Test drive
+
+ $ go get github.com/elastic/gosigar
+ $ cd $GOPATH/src/github.com/elastic/gosigar/examples/ps
+ $ go build
+ $ ./ps
+
+## Supported platforms
+
+The features vary by operating system.
+
+| Feature | Linux | Darwin | Windows | OpenBSD | FreeBSD |
+|-----------------|:-----:|:------:|:-------:|:-------:|:-------:|
+| Cpu | X | X | X | X | X |
+| CpuList | X | X | | X | X |
+| FDUsage | X | | | | X |
+| FileSystemList | X | X | X | X | X |
+| FileSystemUsage | X | X | X | X | X |
+| HugeTLBPages | X | | | | |
+| LoadAverage | X | X | | X | X |
+| Mem | X | X | X | X | X |
+| ProcArgs | X | X | X | | X |
+| ProcEnv | X | X | | | X |
+| ProcExe | X | X | | | X |
+| ProcFDUsage | X | | | | X |
+| ProcList | X | X | X | | X |
+| ProcMem | X | X | X | | X |
+| ProcState | X | X | X | | X |
+| ProcTime | X | X | X | | X |
+| Swap | X | X | | X | X |
+| Uptime | X | X | | X | X |
+
+## OS Specific Notes
+
+### FreeBSD
+
+Mount both `linprocfs` and `procfs` for compatability. Consider adding these
+mounts to your `/etc/fstab` file so they are mounted automatically at boot.
+
+```
+sudo mount -t procfs proc /proc
+sudo mkdir -p /compat/linux/proc
+sudo mount -t linprocfs /dev/null /compat/linux/proc
+```
+
+## License
+
+Apache 2.0
diff --git a/vendor/github.com/elastic/gosigar/Vagrantfile b/vendor/github.com/elastic/gosigar/Vagrantfile
new file mode 100644
index 000000000..6fd990c14
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/Vagrantfile
@@ -0,0 +1,25 @@
+# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
+VAGRANTFILE_API_VERSION = "2"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.vm.box = "hashicorp/precise64"
+ config.vm.provision "shell", inline: "mkdir -p /home/vagrant/go"
+ config.vm.synced_folder ".", "/home/vagrant/go/src/github.com/cloudfoundry/gosigar"
+ config.vm.provision "shell", inline: "chown -R vagrant:vagrant /home/vagrant/go"
+ install_go = <<-BASH
+ set -e
+
+if [ ! -d "/usr/local/go" ]; then
+ cd /tmp && wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz
+ cd /usr/local
+ tar xvzf /tmp/go1.3.3.linux-amd64.tar.gz
+ echo 'export GOPATH=/home/vagrant/go; export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin' >> /home/vagrant/.bashrc
+fi
+export GOPATH=/home/vagrant/go
+export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin
+/usr/local/go/bin/go get -u github.com/onsi/ginkgo/ginkgo
+/usr/local/go/bin/go get -u github.com/onsi/gomega;
+BASH
+ config.vm.provision "shell", inline: 'apt-get install -y git-core'
+ config.vm.provision "shell", inline: install_go
+end
diff --git a/vendor/github.com/elastic/gosigar/codecov.yml b/vendor/github.com/elastic/gosigar/codecov.yml
new file mode 100644
index 000000000..76ade0fdb
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/codecov.yml
@@ -0,0 +1,21 @@
+# Enable coverage report message for diff on commit
+coverage:
+ status:
+ project: off
+ patch:
+ default:
+ # basic
+ target: auto
+ threshold: null
+ base: auto
+ # advanced
+ branches: null
+ if_no_uploads: error
+ if_not_found: success
+ if_ci_failed: error
+ only_pulls: false
+ flags: null
+ paths: null
+
+# Disable comments on Pull Requests
+comment: false
diff --git a/vendor/github.com/elastic/gosigar/concrete_sigar.go b/vendor/github.com/elastic/gosigar/concrete_sigar.go
new file mode 100644
index 000000000..e3ee80a98
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/concrete_sigar.go
@@ -0,0 +1,89 @@
+package gosigar
+
+import (
+ "time"
+)
+
+type ConcreteSigar struct{}
+
+func (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) {
+ // samplesCh is buffered to 1 value to immediately return first CPU sample
+ samplesCh := make(chan Cpu, 1)
+
+ stopCh := make(chan struct{})
+
+ go func() {
+ var cpuUsage Cpu
+
+ // Immediately provide non-delta value.
+ // samplesCh is buffered to 1 value, so it will not block.
+ cpuUsage.Get()
+ samplesCh <- cpuUsage
+
+ ticker := time.NewTicker(collectionInterval)
+
+ for {
+ select {
+ case <-ticker.C:
+ previousCpuUsage := cpuUsage
+
+ cpuUsage.Get()
+
+ select {
+ case samplesCh <- cpuUsage.Delta(previousCpuUsage):
+ default:
+ // Include default to avoid channel blocking
+ }
+
+ case <-stopCh:
+ return
+ }
+ }
+ }()
+
+ return samplesCh, stopCh
+}
+
+func (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) {
+ l := LoadAverage{}
+ err := l.Get()
+ return l, err
+}
+
+func (c *ConcreteSigar) GetMem() (Mem, error) {
+ m := Mem{}
+ err := m.Get()
+ return m, err
+}
+
+func (c *ConcreteSigar) GetSwap() (Swap, error) {
+ s := Swap{}
+ err := s.Get()
+ return s, err
+}
+
+func (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) {
+ p := HugeTLBPages{}
+ err := p.Get()
+ return p, err
+}
+
+func (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) {
+ f := FileSystemUsage{}
+ err := f.Get(path)
+ return f, err
+}
+
+func (c *ConcreteSigar) GetFDUsage() (FDUsage, error) {
+ fd := FDUsage{}
+ err := fd.Get()
+ return fd, err
+}
+
+// GetRusage return the resource usage of the process
+// Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD
+func (c *ConcreteSigar) GetRusage(who int) (Rusage, error) {
+ r := Rusage{}
+ err := r.Get(who)
+ return r, err
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_darwin.go b/vendor/github.com/elastic/gosigar/sigar_darwin.go
new file mode 100644
index 000000000..a90b998c2
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_darwin.go
@@ -0,0 +1,498 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+/*
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+*/
+import "C"
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "os/user"
+ "runtime"
+ "strconv"
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+func (self *LoadAverage) Get() error {
+ avg := []C.double{0, 0, 0}
+
+ C.getloadavg(&avg[0], C.int(len(avg)))
+
+ self.One = float64(avg[0])
+ self.Five = float64(avg[1])
+ self.Fifteen = float64(avg[2])
+
+ return nil
+}
+
+func (self *Uptime) Get() error {
+ tv := syscall.Timeval32{}
+
+ if err := sysctlbyname("kern.boottime", &tv); err != nil {
+ return err
+ }
+
+ self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+ var vmstat C.vm_statistics_data_t
+
+ if err := sysctlbyname("hw.memsize", &self.Total); err != nil {
+ return err
+ }
+
+ if err := vm_info(&vmstat); err != nil {
+ return err
+ }
+
+ kern := uint64(vmstat.inactive_count) << 12
+ self.Free = uint64(vmstat.free_count) << 12
+
+ self.Used = self.Total - self.Free
+ self.ActualFree = self.Free + kern
+ self.ActualUsed = self.Used - kern
+
+ return nil
+}
+
+type xsw_usage struct {
+ Total, Avail, Used uint64
+}
+
+func (self *Swap) Get() error {
+ sw_usage := xsw_usage{}
+
+ if err := sysctlbyname("vm.swapusage", &sw_usage); err != nil {
+ return err
+ }
+
+ self.Total = sw_usage.Total
+ self.Used = sw_usage.Used
+ self.Free = sw_usage.Avail
+
+ return nil
+}
+
+func (self *HugeTLBPages) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Cpu) Get() error {
+ var count C.mach_msg_type_number_t = C.HOST_CPU_LOAD_INFO_COUNT
+ var cpuload C.host_cpu_load_info_data_t
+
+ status := C.host_statistics(C.host_t(C.mach_host_self()),
+ C.HOST_CPU_LOAD_INFO,
+ C.host_info_t(unsafe.Pointer(&cpuload)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_statistics error=%d", status)
+ }
+
+ self.User = uint64(cpuload.cpu_ticks[C.CPU_STATE_USER])
+ self.Sys = uint64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM])
+ self.Idle = uint64(cpuload.cpu_ticks[C.CPU_STATE_IDLE])
+ self.Nice = uint64(cpuload.cpu_ticks[C.CPU_STATE_NICE])
+
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ var count C.mach_msg_type_number_t
+ var cpuload *C.processor_cpu_load_info_data_t
+ var ncpu C.natural_t
+
+ status := C.host_processor_info(C.host_t(C.mach_host_self()),
+ C.PROCESSOR_CPU_LOAD_INFO,
+ &ncpu,
+ (*C.processor_info_array_t)(unsafe.Pointer(&cpuload)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_processor_info error=%d", status)
+ }
+
+ // jump through some cgo casting hoops and ensure we properly free
+ // the memory that cpuload points to
+ target := C.vm_map_t(C.mach_task_self_)
+ address := C.vm_address_t(uintptr(unsafe.Pointer(cpuload)))
+ defer C.vm_deallocate(target, address, C.vm_size_t(ncpu))
+
+ // the body of struct processor_cpu_load_info
+ // aka processor_cpu_load_info_data_t
+ var cpu_ticks [C.CPU_STATE_MAX]uint32
+
+ // copy the cpuload array to a []byte buffer
+ // where we can binary.Read the data
+ size := int(ncpu) * binary.Size(cpu_ticks)
+ buf := C.GoBytes(unsafe.Pointer(cpuload), C.int(size))
+
+ bbuf := bytes.NewBuffer(buf)
+
+ self.List = make([]Cpu, 0, ncpu)
+
+ for i := 0; i < int(ncpu); i++ {
+ cpu := Cpu{}
+
+ err := binary.Read(bbuf, binary.LittleEndian, &cpu_ticks)
+ if err != nil {
+ return err
+ }
+
+ cpu.User = uint64(cpu_ticks[C.CPU_STATE_USER])
+ cpu.Sys = uint64(cpu_ticks[C.CPU_STATE_SYSTEM])
+ cpu.Idle = uint64(cpu_ticks[C.CPU_STATE_IDLE])
+ cpu.Nice = uint64(cpu_ticks[C.CPU_STATE_NICE])
+
+ self.List = append(self.List, cpu)
+ }
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FileSystemList) Get() error {
+ num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ buf := make([]syscall.Statfs_t, num)
+
+ _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ fslist := make([]FileSystem, 0, num)
+
+ for i := 0; i < num; i++ {
+ fs := FileSystem{}
+
+ fs.DirName = bytePtrToString(&buf[i].Mntonname[0])
+ fs.DevName = bytePtrToString(&buf[i].Mntfromname[0])
+ fs.SysTypeName = bytePtrToString(&buf[i].Fstypename[0])
+
+ fslist = append(fslist, fs)
+ }
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *ProcList) Get() error {
+ n := C.proc_listpids(C.PROC_ALL_PIDS, 0, nil, 0)
+ if n <= 0 {
+ return syscall.EINVAL
+ }
+ buf := make([]byte, n)
+ n = C.proc_listpids(C.PROC_ALL_PIDS, 0, unsafe.Pointer(&buf[0]), n)
+ if n <= 0 {
+ return syscall.ENOMEM
+ }
+
+ var pid int32
+ num := int(n) / binary.Size(pid)
+ list := make([]int, 0, num)
+ bbuf := bytes.NewBuffer(buf)
+
+ for i := 0; i < num; i++ {
+ if err := binary.Read(bbuf, binary.LittleEndian, &pid); err != nil {
+ return err
+ }
+ if pid == 0 {
+ continue
+ }
+
+ list = append(list, int(pid))
+ }
+
+ self.List = list
+
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.Name = C.GoString(&info.pbsd.pbi_comm[0])
+
+ switch info.pbsd.pbi_status {
+ case C.SIDL:
+ self.State = RunStateIdle
+ case C.SRUN:
+ self.State = RunStateRun
+ case C.SSLEEP:
+ self.State = RunStateSleep
+ case C.SSTOP:
+ self.State = RunStateStop
+ case C.SZOMB:
+ self.State = RunStateZombie
+ default:
+ self.State = RunStateUnknown
+ }
+
+ self.Ppid = int(info.pbsd.pbi_ppid)
+
+ self.Pgid = int(info.pbsd.pbi_pgid)
+
+ self.Tty = int(info.pbsd.e_tdev)
+
+ self.Priority = int(info.ptinfo.pti_priority)
+
+ self.Nice = int(info.pbsd.pbi_nice)
+
+ // Get process username. Fallback to UID if username is not available.
+ uid := strconv.Itoa(int(info.pbsd.pbi_uid))
+ user, err := user.LookupId(uid)
+ if err == nil && user.Username != "" {
+ self.Username = user.Username
+ } else {
+ self.Username = uid
+ }
+
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.Size = uint64(info.ptinfo.pti_virtual_size)
+ self.Resident = uint64(info.ptinfo.pti_resident_size)
+ self.PageFaults = uint64(info.ptinfo.pti_faults)
+
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.User =
+ uint64(info.ptinfo.pti_total_user) / uint64(time.Millisecond)
+
+ self.Sys =
+ uint64(info.ptinfo.pti_total_system) / uint64(time.Millisecond)
+
+ self.Total = self.User + self.Sys
+
+ self.StartTime = (uint64(info.pbsd.pbi_start_tvsec) * 1000) +
+ (uint64(info.pbsd.pbi_start_tvusec) / 1000)
+
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ var args []string
+
+ argv := func(arg string) {
+ args = append(args, arg)
+ }
+
+ err := kern_procargs(pid, nil, argv, nil)
+
+ self.List = args
+
+ return err
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ if self.Vars == nil {
+ self.Vars = map[string]string{}
+ }
+
+ env := func(k, v string) {
+ self.Vars[k] = v
+ }
+
+ return kern_procargs(pid, nil, nil, env)
+}
+
+func (self *ProcExe) Get(pid int) error {
+ exe := func(arg string) {
+ self.Name = arg
+ }
+
+ return kern_procargs(pid, exe, nil, nil)
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+// wrapper around sysctl KERN_PROCARGS2
+// callbacks params are optional,
+// up to the caller as to which pieces of data they want
+func kern_procargs(pid int,
+ exe func(string),
+ argv func(string),
+ env func(string, string)) error {
+
+ mib := []C.int{C.CTL_KERN, C.KERN_PROCARGS2, C.int(pid)}
+ argmax := uintptr(C.ARG_MAX)
+ buf := make([]byte, argmax)
+ err := sysctl(mib, &buf[0], &argmax, nil, 0)
+ if err != nil {
+ return nil
+ }
+
+ bbuf := bytes.NewBuffer(buf)
+ bbuf.Truncate(int(argmax))
+
+ var argc int32
+ binary.Read(bbuf, binary.LittleEndian, &argc)
+
+ path, err := bbuf.ReadBytes(0)
+ if err != nil {
+ return fmt.Errorf("Error reading the argv[0]: %v", err)
+ }
+ if exe != nil {
+ exe(string(chop(path)))
+ }
+
+ // skip trailing \0's
+ for {
+ c, err := bbuf.ReadByte()
+ if err != nil {
+ return fmt.Errorf("Error skipping nils: %v", err)
+ }
+ if c != 0 {
+ bbuf.UnreadByte()
+ break // start of argv[0]
+ }
+ }
+
+ for i := 0; i < int(argc); i++ {
+ arg, err := bbuf.ReadBytes(0)
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ return fmt.Errorf("Error reading args: %v", err)
+ }
+ if argv != nil {
+ argv(string(chop(arg)))
+ }
+ }
+
+ if env == nil {
+ return nil
+ }
+
+ delim := []byte{61} // "="
+
+ for {
+ line, err := bbuf.ReadBytes(0)
+ if err == io.EOF || line[0] == 0 {
+ break
+ }
+ if err != nil {
+ return fmt.Errorf("Error reading args: %v", err)
+ }
+ pair := bytes.SplitN(chop(line), delim, 2)
+
+ if len(pair) != 2 {
+ return fmt.Errorf("Error reading process information for PID: %d", pid)
+ }
+
+ env(string(pair[0]), string(pair[1]))
+ }
+
+ return nil
+}
+
+// XXX copied from zsyscall_darwin_amd64.go
+func sysctl(mib []C.int, old *byte, oldlen *uintptr,
+ new *byte, newlen uintptr) (err error) {
+ var p0 unsafe.Pointer
+ p0 = unsafe.Pointer(&mib[0])
+ _, _, e1 := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p0),
+ uintptr(len(mib)),
+ uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)),
+ uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
+func vm_info(vmstat *C.vm_statistics_data_t) error {
+ var count C.mach_msg_type_number_t = C.HOST_VM_INFO_COUNT
+
+ status := C.host_statistics(
+ C.host_t(C.mach_host_self()),
+ C.HOST_VM_INFO,
+ C.host_info_t(unsafe.Pointer(vmstat)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_statistics=%d", status)
+ }
+
+ return nil
+}
+
+// generic Sysctl buffer unmarshalling
+func sysctlbyname(name string, data interface{}) (err error) {
+ val, err := syscall.Sysctl(name)
+ if err != nil {
+ return err
+ }
+
+ buf := []byte(val)
+
+ switch v := data.(type) {
+ case *uint64:
+ *v = *(*uint64)(unsafe.Pointer(&buf[0]))
+ return
+ }
+
+ bbuf := bytes.NewBuffer([]byte(val))
+ return binary.Read(bbuf, binary.LittleEndian, data)
+}
+
+func task_info(pid int, info *C.struct_proc_taskallinfo) error {
+ size := C.int(unsafe.Sizeof(*info))
+ ptr := unsafe.Pointer(info)
+
+ n := C.proc_pidinfo(C.int(pid), C.PROC_PIDTASKALLINFO, 0, ptr, size)
+ if n != size {
+ return fmt.Errorf("Could not read process info for pid %d", pid)
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_format.go b/vendor/github.com/elastic/gosigar/sigar_format.go
new file mode 100644
index 000000000..ac56c9873
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_format.go
@@ -0,0 +1,126 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "strconv"
+ "time"
+)
+
+// Go version of apr_strfsize
+func FormatSize(size uint64) string {
+ ord := []string{"K", "M", "G", "T", "P", "E"}
+ o := 0
+ buf := new(bytes.Buffer)
+ w := bufio.NewWriter(buf)
+
+ if size < 973 {
+ fmt.Fprintf(w, "%3d ", size)
+ w.Flush()
+ return buf.String()
+ }
+
+ for {
+ remain := size & 1023
+ size >>= 10
+
+ if size >= 973 {
+ o++
+ continue
+ }
+
+ if size < 9 || (size == 9 && remain < 973) {
+ remain = ((remain * 5) + 256) / 512
+ if remain >= 10 {
+ size++
+ remain = 0
+ }
+
+ fmt.Fprintf(w, "%d.%d%s", size, remain, ord[o])
+ break
+ }
+
+ if remain >= 512 {
+ size++
+ }
+
+ fmt.Fprintf(w, "%3d%s", size, ord[o])
+ break
+ }
+
+ w.Flush()
+ return buf.String()
+}
+
+func FormatPercent(percent float64) string {
+ return strconv.FormatFloat(percent, 'f', -1, 64) + "%"
+}
+
+func (self *FileSystemUsage) UsePercent() float64 {
+ b_used := (self.Total - self.Free) / 1024
+ b_avail := self.Avail / 1024
+ utotal := b_used + b_avail
+ used := b_used
+
+ if utotal != 0 {
+ u100 := used * 100
+ pct := u100 / utotal
+ if u100%utotal != 0 {
+ pct += 1
+ }
+ return (float64(pct) / float64(100)) * 100.0
+ }
+
+ return 0.0
+}
+
+func (self *Uptime) Format() string {
+ buf := new(bytes.Buffer)
+ w := bufio.NewWriter(buf)
+ uptime := uint64(self.Length)
+
+ days := uptime / (60 * 60 * 24)
+
+ if days != 0 {
+ s := ""
+ if days > 1 {
+ s = "s"
+ }
+ fmt.Fprintf(w, "%d day%s, ", days, s)
+ }
+
+ minutes := uptime / 60
+ hours := minutes / 60
+ hours %= 24
+ minutes %= 60
+
+ fmt.Fprintf(w, "%2d:%02d", hours, minutes)
+
+ w.Flush()
+ return buf.String()
+}
+
+func (self *ProcTime) FormatStartTime() string {
+ if self.StartTime == 0 {
+ return "00:00"
+ }
+ start := time.Unix(int64(self.StartTime)/1000, 0)
+ format := "Jan02"
+ if time.Since(start).Seconds() < (60 * 60 * 24) {
+ format = "15:04"
+ }
+ return start.Format(format)
+}
+
+func (self *ProcTime) FormatTotal() string {
+ t := self.Total / 1000
+ ss := t % 60
+ t /= 60
+ mm := t % 60
+ t /= 60
+ hh := t % 24
+ return fmt.Sprintf("%02d:%02d:%02d", hh, mm, ss)
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_freebsd.go b/vendor/github.com/elastic/gosigar/sigar_freebsd.go
new file mode 100644
index 000000000..9b2af639b
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_freebsd.go
@@ -0,0 +1,113 @@
+// Copied and modified from sigar_linux.go.
+
+package gosigar
+
+import (
+ "io/ioutil"
+ "runtime"
+ "strconv"
+ "strings"
+ "unsafe"
+)
+
+/*
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+*/
+import "C"
+
+func init() {
+ system.ticks = uint64(C.sysconf(C._SC_CLK_TCK))
+
+ Procd = "/compat/linux/proc"
+
+ getLinuxBootTime()
+}
+
+func getMountTableFileName() string {
+ return Procd + "/mtab"
+}
+
+func (self *Uptime) Get() error {
+ ts := C.struct_timespec{}
+
+ if _, err := C.clock_gettime(C.CLOCK_UPTIME, &ts); err != nil {
+ return err
+ }
+
+ self.Length = float64(ts.tv_sec) + 1e-9*float64(ts.tv_nsec)
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ val := C.uint32_t(0)
+ sc := C.size_t(4)
+
+ name := C.CString("kern.openfiles")
+ _, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
+ C.free(unsafe.Pointer(name))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(val)
+
+ name = C.CString("kern.maxfiles")
+ _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
+ C.free(unsafe.Pointer(name))
+ if err != nil {
+ return err
+ }
+ self.Max = uint64(val)
+
+ self.Unused = self.Max - self.Open
+
+ return nil
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ err := readFile("/proc/"+strconv.Itoa(pid)+"/rlimit", func(line string) bool {
+ if strings.HasPrefix(line, "nofile") {
+ fields := strings.Fields(line)
+ if len(fields) == 3 {
+ self.SoftLimit, _ = strconv.ParseUint(fields[1], 10, 64)
+ self.HardLimit, _ = strconv.ParseUint(fields[2], 10, 64)
+ }
+ return false
+ }
+ return true
+ })
+ if err != nil {
+ return err
+ }
+
+ // linprocfs only provides this information for this process (self).
+ fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(len(fds))
+
+ return nil
+}
+
+func (self *HugeTLBPages) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func parseCpuStat(self *Cpu, line string) error {
+ fields := strings.Fields(line)
+
+ self.User, _ = strtoull(fields[1])
+ self.Nice, _ = strtoull(fields[2])
+ self.Sys, _ = strtoull(fields[3])
+ self.Idle, _ = strtoull(fields[4])
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_interface.go b/vendor/github.com/elastic/gosigar/sigar_interface.go
new file mode 100644
index 000000000..df79ae08d
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_interface.go
@@ -0,0 +1,207 @@
+package gosigar
+
+import (
+ "time"
+)
+
+type ErrNotImplemented struct {
+ OS string
+}
+
+func (e ErrNotImplemented) Error() string {
+ return "not implemented on " + e.OS
+}
+
+func IsNotImplemented(err error) bool {
+ switch err.(type) {
+ case ErrNotImplemented, *ErrNotImplemented:
+ return true
+ default:
+ return false
+ }
+}
+
+type Sigar interface {
+ CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{})
+ GetLoadAverage() (LoadAverage, error)
+ GetMem() (Mem, error)
+ GetSwap() (Swap, error)
+ GetHugeTLBPages(HugeTLBPages, error)
+ GetFileSystemUsage(string) (FileSystemUsage, error)
+ GetFDUsage() (FDUsage, error)
+ GetRusage(who int) (Rusage, error)
+}
+
+type Cpu struct {
+ User uint64
+ Nice uint64
+ Sys uint64
+ Idle uint64
+ Wait uint64
+ Irq uint64
+ SoftIrq uint64
+ Stolen uint64
+}
+
+func (cpu *Cpu) Total() uint64 {
+ return cpu.User + cpu.Nice + cpu.Sys + cpu.Idle +
+ cpu.Wait + cpu.Irq + cpu.SoftIrq + cpu.Stolen
+}
+
+func (cpu Cpu) Delta(other Cpu) Cpu {
+ return Cpu{
+ User: cpu.User - other.User,
+ Nice: cpu.Nice - other.Nice,
+ Sys: cpu.Sys - other.Sys,
+ Idle: cpu.Idle - other.Idle,
+ Wait: cpu.Wait - other.Wait,
+ Irq: cpu.Irq - other.Irq,
+ SoftIrq: cpu.SoftIrq - other.SoftIrq,
+ Stolen: cpu.Stolen - other.Stolen,
+ }
+}
+
+type LoadAverage struct {
+ One, Five, Fifteen float64
+}
+
+type Uptime struct {
+ Length float64
+}
+
+type Mem struct {
+ Total uint64
+ Used uint64
+ Free uint64
+ ActualFree uint64
+ ActualUsed uint64
+}
+
+type Swap struct {
+ Total uint64
+ Used uint64
+ Free uint64
+}
+
+type HugeTLBPages struct {
+ Total uint64
+ Free uint64
+ Reserved uint64
+ Surplus uint64
+ DefaultSize uint64
+ TotalAllocatedSize uint64
+}
+
+type CpuList struct {
+ List []Cpu
+}
+
+type FDUsage struct {
+ Open uint64
+ Unused uint64
+ Max uint64
+}
+
+type FileSystem struct {
+ DirName string
+ DevName string
+ TypeName string
+ SysTypeName string
+ Options string
+ Flags uint32
+}
+
+type FileSystemList struct {
+ List []FileSystem
+}
+
+type FileSystemUsage struct {
+ Total uint64
+ Used uint64
+ Free uint64
+ Avail uint64
+ Files uint64
+ FreeFiles uint64
+}
+
+type ProcList struct {
+ List []int
+}
+
+type RunState byte
+
+const (
+ RunStateSleep = 'S'
+ RunStateRun = 'R'
+ RunStateStop = 'T'
+ RunStateZombie = 'Z'
+ RunStateIdle = 'D'
+ RunStateUnknown = '?'
+)
+
+type ProcState struct {
+ Name string
+ Username string
+ State RunState
+ Ppid int
+ Pgid int
+ Tty int
+ Priority int
+ Nice int
+ Processor int
+}
+
+type ProcMem struct {
+ Size uint64
+ Resident uint64
+ Share uint64
+ MinorFaults uint64
+ MajorFaults uint64
+ PageFaults uint64
+}
+
+type ProcTime struct {
+ StartTime uint64
+ User uint64
+ Sys uint64
+ Total uint64
+}
+
+type ProcArgs struct {
+ List []string
+}
+
+type ProcEnv struct {
+ Vars map[string]string
+}
+
+type ProcExe struct {
+ Name string
+ Cwd string
+ Root string
+}
+
+type ProcFDUsage struct {
+ Open uint64
+ SoftLimit uint64
+ HardLimit uint64
+}
+
+type Rusage struct {
+ Utime time.Duration
+ Stime time.Duration
+ Maxrss int64
+ Ixrss int64
+ Idrss int64
+ Isrss int64
+ Minflt int64
+ Majflt int64
+ Nswap int64
+ Inblock int64
+ Oublock int64
+ Msgsnd int64
+ Msgrcv int64
+ Nsignals int64
+ Nvcsw int64
+ Nivcsw int64
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_linux.go b/vendor/github.com/elastic/gosigar/sigar_linux.go
new file mode 100644
index 000000000..09f2e30b2
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_linux.go
@@ -0,0 +1,108 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "io/ioutil"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+func init() {
+ system.ticks = 100 // C.sysconf(C._SC_CLK_TCK)
+
+ Procd = "/proc"
+
+ getLinuxBootTime()
+}
+
+func getMountTableFileName() string {
+ return "/etc/mtab"
+}
+
+func (self *Uptime) Get() error {
+ sysinfo := syscall.Sysinfo_t{}
+
+ if err := syscall.Sysinfo(&sysinfo); err != nil {
+ return err
+ }
+
+ self.Length = float64(sysinfo.Uptime)
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return readFile(Procd+"/sys/fs/file-nr", func(line string) bool {
+ fields := strings.Fields(line)
+ if len(fields) == 3 {
+ self.Open, _ = strconv.ParseUint(fields[0], 10, 64)
+ self.Unused, _ = strconv.ParseUint(fields[1], 10, 64)
+ self.Max, _ = strconv.ParseUint(fields[2], 10, 64)
+ }
+ return false
+ })
+}
+
+func (self *HugeTLBPages) Get() error {
+ table, err := parseMeminfo()
+ if err != nil {
+ return err
+ }
+
+ self.Total, _ = table["HugePages_Total"]
+ self.Free, _ = table["HugePages_Free"]
+ self.Reserved, _ = table["HugePages_Rsvd"]
+ self.Surplus, _ = table["HugePages_Surp"]
+ self.DefaultSize, _ = table["Hugepagesize"]
+
+ if totalSize, found := table["Hugetlb"]; found {
+ self.TotalAllocatedSize = totalSize
+ } else {
+ // If Hugetlb is not present, or huge pages of different sizes
+ // are used, this figure can be unaccurate.
+ // TODO (jsoriano): Extract information from /sys/kernel/mm/hugepages too
+ self.TotalAllocatedSize = (self.Total - self.Free + self.Reserved) * self.DefaultSize
+ }
+
+ return nil
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ err := readFile(procFileName(pid, "limits"), func(line string) bool {
+ if strings.HasPrefix(line, "Max open files") {
+ fields := strings.Fields(line)
+ if len(fields) == 6 {
+ self.SoftLimit, _ = strconv.ParseUint(fields[3], 10, 64)
+ self.HardLimit, _ = strconv.ParseUint(fields[4], 10, 64)
+ }
+ return false
+ }
+ return true
+ })
+ if err != nil {
+ return err
+ }
+ fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(len(fds))
+ return nil
+}
+
+func parseCpuStat(self *Cpu, line string) error {
+ fields := strings.Fields(line)
+
+ self.User, _ = strtoull(fields[1])
+ self.Nice, _ = strtoull(fields[2])
+ self.Sys, _ = strtoull(fields[3])
+ self.Idle, _ = strtoull(fields[4])
+ self.Wait, _ = strtoull(fields[5])
+ self.Irq, _ = strtoull(fields[6])
+ self.SoftIrq, _ = strtoull(fields[7])
+ self.Stolen, _ = strtoull(fields[8])
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_linux_common.go b/vendor/github.com/elastic/gosigar/sigar_linux_common.go
new file mode 100644
index 000000000..7ca649762
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_linux_common.go
@@ -0,0 +1,482 @@
+// Copyright (c) 2012 VMware, Inc.
+
+// +build freebsd linux
+
+package gosigar
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "os/user"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+var system struct {
+ ticks uint64
+ btime uint64
+}
+
+var Procd string
+
+func getLinuxBootTime() {
+ // grab system boot time
+ readFile(Procd+"/stat", func(line string) bool {
+ if strings.HasPrefix(line, "btime") {
+ system.btime, _ = strtoull(line[6:])
+ return false // stop reading
+ }
+ return true
+ })
+}
+
+func (self *LoadAverage) Get() error {
+ line, err := ioutil.ReadFile(Procd + "/loadavg")
+ if err != nil {
+ return nil
+ }
+
+ fields := strings.Fields(string(line))
+
+ self.One, _ = strconv.ParseFloat(fields[0], 64)
+ self.Five, _ = strconv.ParseFloat(fields[1], 64)
+ self.Fifteen, _ = strconv.ParseFloat(fields[2], 64)
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+
+ table, err := parseMeminfo()
+ if err != nil {
+ return err
+ }
+
+ self.Total, _ = table["MemTotal"]
+ self.Free, _ = table["MemFree"]
+ buffers, _ := table["Buffers"]
+ cached, _ := table["Cached"]
+
+ if available, ok := table["MemAvailable"]; ok {
+ // MemAvailable is in /proc/meminfo (kernel 3.14+)
+ self.ActualFree = available
+ } else {
+ self.ActualFree = self.Free + buffers + cached
+ }
+
+ self.Used = self.Total - self.Free
+ self.ActualUsed = self.Total - self.ActualFree
+
+ return nil
+}
+
+func (self *Swap) Get() error {
+
+ table, err := parseMeminfo()
+ if err != nil {
+ return err
+ }
+ self.Total, _ = table["SwapTotal"]
+ self.Free, _ = table["SwapFree"]
+
+ self.Used = self.Total - self.Free
+ return nil
+}
+
+func (self *Cpu) Get() error {
+ return readFile(Procd+"/stat", func(line string) bool {
+ if len(line) > 4 && line[0:4] == "cpu " {
+ parseCpuStat(self, line)
+ return false
+ }
+ return true
+
+ })
+}
+
+func (self *CpuList) Get() error {
+ capacity := len(self.List)
+ if capacity == 0 {
+ capacity = 4
+ }
+ list := make([]Cpu, 0, capacity)
+
+ err := readFile(Procd+"/stat", func(line string) bool {
+ if len(line) > 3 && line[0:3] == "cpu" && line[3] != ' ' {
+ cpu := Cpu{}
+ parseCpuStat(&cpu, line)
+ list = append(list, cpu)
+ }
+ return true
+ })
+
+ self.List = list
+
+ return err
+}
+
+func (self *FileSystemList) Get() error {
+ capacity := len(self.List)
+ if capacity == 0 {
+ capacity = 10
+ }
+ fslist := make([]FileSystem, 0, capacity)
+
+ err := readFile(getMountTableFileName(), func(line string) bool {
+ fields := strings.Fields(line)
+
+ fs := FileSystem{}
+ fs.DevName = fields[0]
+ fs.DirName = fields[1]
+ fs.SysTypeName = fields[2]
+ fs.Options = fields[3]
+
+ fslist = append(fslist, fs)
+
+ return true
+ })
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *ProcList) Get() error {
+ dir, err := os.Open(Procd)
+ if err != nil {
+ return err
+ }
+ defer dir.Close()
+
+ const readAllDirnames = -1 // see os.File.Readdirnames doc
+
+ names, err := dir.Readdirnames(readAllDirnames)
+ if err != nil {
+ return err
+ }
+
+ capacity := len(names)
+ list := make([]int, 0, capacity)
+
+ for _, name := range names {
+ if name[0] < '0' || name[0] > '9' {
+ continue
+ }
+ pid, err := strconv.Atoi(name)
+ if err == nil {
+ list = append(list, pid)
+ }
+ }
+
+ self.List = list
+
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ data, err := readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ // Extract the comm value with is surrounded by parentheses.
+ lIdx := bytes.Index(data, []byte("("))
+ rIdx := bytes.LastIndex(data, []byte(")"))
+ if lIdx < 0 || rIdx < 0 || lIdx >= rIdx || rIdx+2 >= len(data) {
+ return fmt.Errorf("failed to extract comm for pid %d from '%v'", pid, string(data))
+ }
+ self.Name = string(data[lIdx+1 : rIdx])
+
+ // Extract the rest of the fields that we are interested in.
+ fields := bytes.Fields(data[rIdx+2:])
+ if len(fields) <= 36 {
+ return fmt.Errorf("expected more stat fields for pid %d from '%v'", pid, string(data))
+ }
+
+ interests := bytes.Join([][]byte{
+ fields[0], // state
+ fields[1], // ppid
+ fields[2], // pgrp
+ fields[4], // tty_nr
+ fields[15], // priority
+ fields[16], // nice
+ fields[36], // processor (last processor executed on)
+ }, []byte(" "))
+
+ var state string
+ _, err = fmt.Fscan(bytes.NewBuffer(interests),
+ &state,
+ &self.Ppid,
+ &self.Pgid,
+ &self.Tty,
+ &self.Priority,
+ &self.Nice,
+ &self.Processor,
+ )
+ if err != nil {
+ return fmt.Errorf("failed to parse stat fields for pid %d from '%v': %v", pid, string(data), err)
+ }
+ self.State = RunState(state[0])
+
+ // Read /proc/[pid]/status to get the uid, then lookup uid to get username.
+ status, err := getProcStatus(pid)
+ if err != nil {
+ return fmt.Errorf("failed to read process status for pid %d: %v", pid, err)
+ }
+ uids, err := getUIDs(status)
+ if err != nil {
+ return fmt.Errorf("failed to read process status for pid %d: %v", pid, err)
+ }
+ user, err := user.LookupId(uids[0])
+ if err == nil {
+ self.Username = user.Username
+ } else {
+ self.Username = uids[0]
+ }
+
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ contents, err := readProcFile(pid, "statm")
+ if err != nil {
+ return err
+ }
+
+ fields := strings.Fields(string(contents))
+
+ size, _ := strtoull(fields[0])
+ self.Size = size << 12
+
+ rss, _ := strtoull(fields[1])
+ self.Resident = rss << 12
+
+ share, _ := strtoull(fields[2])
+ self.Share = share << 12
+
+ contents, err = readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ fields = strings.Fields(string(contents))
+
+ self.MinorFaults, _ = strtoull(fields[10])
+ self.MajorFaults, _ = strtoull(fields[12])
+ self.PageFaults = self.MinorFaults + self.MajorFaults
+
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ contents, err := readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ fields := strings.Fields(string(contents))
+
+ user, _ := strtoull(fields[13])
+ sys, _ := strtoull(fields[14])
+ // convert to millis
+ self.User = user * (1000 / system.ticks)
+ self.Sys = sys * (1000 / system.ticks)
+ self.Total = self.User + self.Sys
+
+ // convert to millis
+ self.StartTime, _ = strtoull(fields[21])
+ self.StartTime /= system.ticks
+ self.StartTime += system.btime
+ self.StartTime *= 1000
+
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ contents, err := readProcFile(pid, "cmdline")
+ if err != nil {
+ return err
+ }
+
+ bbuf := bytes.NewBuffer(contents)
+
+ var args []string
+
+ for {
+ arg, err := bbuf.ReadBytes(0)
+ if err == io.EOF {
+ break
+ }
+ args = append(args, string(chop(arg)))
+ }
+
+ self.List = args
+
+ return nil
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ contents, err := readProcFile(pid, "environ")
+ if err != nil {
+ return err
+ }
+
+ if self.Vars == nil {
+ self.Vars = map[string]string{}
+ }
+
+ pairs := bytes.Split(contents, []byte{0})
+ for _, kv := range pairs {
+ parts := bytes.SplitN(kv, []byte{'='}, 2)
+ if len(parts) != 2 {
+ continue
+ }
+
+ key := string(bytes.TrimSpace(parts[0]))
+ if key == "" {
+ continue
+ }
+
+ self.Vars[key] = string(bytes.TrimSpace(parts[1]))
+ }
+
+ return nil
+}
+
+func (self *ProcExe) Get(pid int) error {
+ fields := map[string]*string{
+ "exe": &self.Name,
+ "cwd": &self.Cwd,
+ "root": &self.Root,
+ }
+
+ for name, field := range fields {
+ val, err := os.Readlink(procFileName(pid, name))
+
+ if err != nil {
+ return err
+ }
+
+ *field = val
+ }
+
+ return nil
+}
+
+func parseMeminfo() (map[string]uint64, error) {
+ table := map[string]uint64{}
+
+ err := readFile(Procd+"/meminfo", func(line string) bool {
+ fields := strings.Split(line, ":")
+
+ if len(fields) != 2 {
+ return true // skip on errors
+ }
+
+ valueUnit := strings.Fields(fields[1])
+ value, err := strtoull(valueUnit[0])
+ if err != nil {
+ return true // skip on errors
+ }
+
+ if len(valueUnit) > 1 && valueUnit[1] == "kB" {
+ value *= 1024
+ }
+ table[fields[0]] = value
+
+ return true
+ })
+ return table, err
+}
+
+func readFile(file string, handler func(string) bool) error {
+ contents, err := ioutil.ReadFile(file)
+ if err != nil {
+ return err
+ }
+
+ reader := bufio.NewReader(bytes.NewBuffer(contents))
+
+ for {
+ line, _, err := reader.ReadLine()
+ if err == io.EOF {
+ break
+ }
+ if !handler(string(line)) {
+ break
+ }
+ }
+
+ return nil
+}
+
+func strtoull(val string) (uint64, error) {
+ return strconv.ParseUint(val, 10, 64)
+}
+
+func procFileName(pid int, name string) string {
+ return Procd + "/" + strconv.Itoa(pid) + "/" + name
+}
+
+func readProcFile(pid int, name string) (content []byte, err error) {
+ path := procFileName(pid, name)
+
+ // Panics have been reported when reading proc files, let's recover and
+ // report the path if this happens
+ // See https://github.com/elastic/beats/issues/6692
+ defer func() {
+ if r := recover(); r != nil {
+ content = nil
+ err = fmt.Errorf("recovered panic when reading proc file '%s': %v", path, r)
+ }
+ }()
+ contents, err := ioutil.ReadFile(path)
+
+ if err != nil {
+ if perr, ok := err.(*os.PathError); ok {
+ if perr.Err == syscall.ENOENT {
+ return nil, syscall.ESRCH
+ }
+ }
+ }
+
+ return contents, err
+}
+
+// getProcStatus reads /proc/[pid]/status which contains process status
+// information in human readable form.
+func getProcStatus(pid int) (map[string]string, error) {
+ status := make(map[string]string, 42)
+ path := filepath.Join(Procd, strconv.Itoa(pid), "status")
+ err := readFile(path, func(line string) bool {
+ fields := strings.SplitN(line, ":", 2)
+ if len(fields) == 2 {
+ status[fields[0]] = strings.TrimSpace(fields[1])
+ }
+
+ return true
+ })
+ return status, err
+}
+
+// getUIDs reads the "Uid" value from status and splits it into four values --
+// real, effective, saved set, and file system UIDs.
+func getUIDs(status map[string]string) ([]string, error) {
+ uidLine, ok := status["Uid"]
+ if !ok {
+ return nil, fmt.Errorf("Uid not found in proc status")
+ }
+
+ uidStrs := strings.Fields(uidLine)
+ if len(uidStrs) != 4 {
+ return nil, fmt.Errorf("Uid line ('%s') did not contain four values", uidLine)
+ }
+
+ return uidStrs, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_openbsd.go b/vendor/github.com/elastic/gosigar/sigar_openbsd.go
new file mode 100644
index 000000000..e4371b8b6
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_openbsd.go
@@ -0,0 +1,426 @@
+// Copyright (c) 2016 Jasper Lievisse Adriaanse .
+
+// +build openbsd
+
+package gosigar
+
+/*
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+*/
+import "C"
+
+//import "github.com/davecgh/go-spew/spew"
+
+import (
+ "runtime"
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+type Uvmexp struct {
+ pagesize uint32
+ pagemask uint32
+ pageshift uint32
+ npages uint32
+ free uint32
+ active uint32
+ inactive uint32
+ paging uint32
+ wired uint32
+ zeropages uint32
+ reserve_pagedaemon uint32
+ reserve_kernel uint32
+ anonpages uint32
+ vnodepages uint32
+ vtextpages uint32
+ freemin uint32
+ freetarg uint32
+ inactarg uint32
+ wiredmax uint32
+ anonmin uint32
+ vtextmin uint32
+ vnodemin uint32
+ anonminpct uint32
+ vtextmi uint32
+ npct uint32
+ vnodeminpct uint32
+ nswapdev uint32
+ swpages uint32
+ swpginuse uint32
+ swpgonly uint32
+ nswget uint32
+ nanon uint32
+ nanonneeded uint32
+ nfreeanon uint32
+ faults uint32
+ traps uint32
+ intrs uint32
+ swtch uint32
+ softs uint32
+ syscalls uint32
+ pageins uint32
+ obsolete_swapins uint32
+ obsolete_swapouts uint32
+ pgswapin uint32
+ pgswapout uint32
+ forks uint32
+ forks_ppwait uint32
+ forks_sharevm uint32
+ pga_zerohit uint32
+ pga_zeromiss uint32
+ zeroaborts uint32
+ fltnoram uint32
+ fltnoanon uint32
+ fltpgwait uint32
+ fltpgrele uint32
+ fltrelck uint32
+ fltrelckok uint32
+ fltanget uint32
+ fltanretry uint32
+ fltamcopy uint32
+ fltnamap uint32
+ fltnomap uint32
+ fltlget uint32
+ fltget uint32
+ flt_anon uint32
+ flt_acow uint32
+ flt_obj uint32
+ flt_prcopy uint32
+ flt_przero uint32
+ pdwoke uint32
+ pdrevs uint32
+ pdswout uint32
+ pdfreed uint32
+ pdscans uint32
+ pdanscan uint32
+ pdobscan uint32
+ pdreact uint32
+ pdbusy uint32
+ pdpageouts uint32
+ pdpending uint32
+ pddeact uint32
+ pdreanon uint32
+ pdrevnode uint32
+ pdrevtext uint32
+ fpswtch uint32
+ kmapent uint32
+}
+
+type Bcachestats struct {
+ numbufs uint64
+ numbufpages uint64
+ numdirtypages uint64
+ numcleanpages uint64
+ pendingwrites uint64
+ pendingreads uint64
+ numwrites uint64
+ numreads uint64
+ cachehits uint64
+ busymapped uint64
+ dmapages uint64
+ highpages uint64
+ delwribufs uint64
+ kvaslots uint64
+ kvaslots_avail uint64
+}
+
+type Swapent struct {
+ se_dev C.dev_t
+ se_flags int32
+ se_nblks int32
+ se_inuse int32
+ se_priority int32
+ sw_path []byte
+}
+
+func (self *FileSystemList) Get() error {
+ num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ buf := make([]syscall.Statfs_t, num)
+
+ _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ fslist := make([]FileSystem, 0, num)
+
+ for i := 0; i < num; i++ {
+ fs := FileSystem{}
+
+ fs.DirName = bytePtrToString(&buf[i].F_mntonname[0])
+ fs.DevName = bytePtrToString(&buf[i].F_mntfromname[0])
+ fs.SysTypeName = bytePtrToString(&buf[i].F_fstypename[0])
+
+ fslist = append(fslist, fs)
+ }
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ stat := syscall.Statfs_t{}
+ err := syscall.Statfs(path, &stat)
+ if err != nil {
+ return err
+ }
+
+ self.Total = uint64(stat.F_blocks) * uint64(stat.F_bsize)
+ self.Free = uint64(stat.F_bfree) * uint64(stat.F_bsize)
+ self.Avail = uint64(stat.F_bavail) * uint64(stat.F_bsize)
+ self.Used = self.Total - self.Free
+ self.Files = stat.F_files
+ self.FreeFiles = stat.F_ffree
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *LoadAverage) Get() error {
+ avg := []C.double{0, 0, 0}
+
+ C.getloadavg(&avg[0], C.int(len(avg)))
+
+ self.One = float64(avg[0])
+ self.Five = float64(avg[1])
+ self.Fifteen = float64(avg[2])
+
+ return nil
+}
+
+func (self *Uptime) Get() error {
+ tv := syscall.Timeval{}
+ mib := [2]int32{C.CTL_KERN, C.KERN_BOOTTIME}
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ // Now perform the actual sysctl(3) call, storing the result in tv
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&tv)), uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+ n := uintptr(0)
+
+ var uvmexp Uvmexp
+ mib := [2]int32{C.CTL_VM, C.VM_UVMEXP}
+ n = uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&uvmexp)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ var bcachestats Bcachestats
+ mib3 := [3]int32{C.CTL_VFS, C.VFS_GENERIC, C.VFS_BCACHESTAT}
+ n = uintptr(0)
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, uintptr(unsafe.Pointer(&bcachestats)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.Total = uint64(uvmexp.npages) << uvmexp.pageshift
+ self.Used = uint64(uvmexp.npages-uvmexp.free) << uvmexp.pageshift
+ self.Free = uint64(uvmexp.free) << uvmexp.pageshift
+
+ self.ActualFree = self.Free + (uint64(bcachestats.numbufpages) << uvmexp.pageshift)
+ self.ActualUsed = self.Used - (uint64(bcachestats.numbufpages) << uvmexp.pageshift)
+
+ return nil
+}
+
+func (self *Swap) Get() error {
+ nswap := C.swapctl(C.SWAP_NSWAP, unsafe.Pointer(uintptr(0)), 0)
+
+ // If there are no swap devices, nothing to do here.
+ if nswap == 0 {
+ return nil
+ }
+
+ swdev := make([]Swapent, nswap)
+
+ rnswap := C.swapctl(C.SWAP_STATS, unsafe.Pointer(&swdev[0]), nswap)
+ if rnswap == 0 {
+ return nil
+ }
+
+ for i := 0; i < int(nswap); i++ {
+ if swdev[i].se_flags&C.SWF_ENABLE == 2 {
+ self.Used = self.Used + uint64(swdev[i].se_inuse/(1024/C.DEV_BSIZE))
+ self.Total = self.Total + uint64(swdev[i].se_nblks/(1024/C.DEV_BSIZE))
+ }
+ }
+
+ self.Free = self.Total - self.Used
+
+ return nil
+}
+
+func (self *HugeTLBPages) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Cpu) Get() error {
+ load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}
+
+ mib := [2]int32{C.CTL_KERN, C.KERN_CPTIME}
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&load)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.User = uint64(load[0])
+ self.Nice = uint64(load[1])
+ self.Sys = uint64(load[2])
+ self.Irq = uint64(load[3])
+ self.Idle = uint64(load[4])
+
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ mib := [2]int32{C.CTL_HW, C.HW_NCPU}
+ var ncpu int
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ // Now perform the actual sysctl(3) call, storing the result in ncpu
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&ncpu)), uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}
+
+ self.List = make([]Cpu, ncpu)
+ for curcpu := range self.List {
+ sysctlCptime(ncpu, curcpu, &load)
+ fillCpu(&self.List[curcpu], load)
+ }
+
+ return nil
+}
+
+func (self *ProcList) Get() error {
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcState) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcExe) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Rusage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func fillCpu(cpu *Cpu, load [C.CPUSTATES]C.long) {
+ cpu.User = uint64(load[0])
+ cpu.Nice = uint64(load[1])
+ cpu.Sys = uint64(load[2])
+ cpu.Irq = uint64(load[3])
+ cpu.Idle = uint64(load[4])
+}
+
+func sysctlCptime(ncpu int, curcpu int, load *[C.CPUSTATES]C.long) error {
+ var mib []int32
+
+ // Use the correct mib based on the number of CPUs and fill out the
+ // current CPU number in case of SMP. (0 indexed cf. self.List)
+ if ncpu == 0 {
+ mib = []int32{C.CTL_KERN, C.KERN_CPTIME}
+ } else {
+ mib = []int32{C.CTL_KERN, C.KERN_CPTIME2, int32(curcpu)}
+ }
+
+ len := len(mib)
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), uintptr(unsafe.Pointer(load)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_stub.go b/vendor/github.com/elastic/gosigar/sigar_stub.go
new file mode 100644
index 000000000..de9565aec
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_stub.go
@@ -0,0 +1,75 @@
+// +build !darwin,!freebsd,!linux,!openbsd,!windows
+
+package gosigar
+
+import (
+ "runtime"
+)
+
+func (c *Cpu) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (l *LoadAverage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (m *Mem) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (s *Swap) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (s *HugeTLBPages) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (f *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcTime) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *CpuList) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcState) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcExe) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcMem) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcFDUsage) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcEnv) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcList) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcArgs) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Rusage) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_unix.go b/vendor/github.com/elastic/gosigar/sigar_unix.go
new file mode 100644
index 000000000..3f3a9f7ff
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_unix.go
@@ -0,0 +1,69 @@
+// Copyright (c) 2012 VMware, Inc.
+
+// +build darwin freebsd linux
+
+package gosigar
+
+import (
+ "syscall"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+func (self *FileSystemUsage) Get(path string) error {
+ stat := syscall.Statfs_t{}
+ err := syscall.Statfs(path, &stat)
+ if err != nil {
+ return err
+ }
+
+ self.Total = uint64(stat.Blocks) * uint64(stat.Bsize)
+ self.Free = uint64(stat.Bfree) * uint64(stat.Bsize)
+ self.Avail = uint64(stat.Bavail) * uint64(stat.Bsize)
+ self.Used = self.Total - self.Free
+ self.Files = stat.Files
+ self.FreeFiles = uint64(stat.Ffree)
+
+ return nil
+}
+
+func (r *Rusage) Get(who int) error {
+ ru, err := getResourceUsage(who)
+ if err != nil {
+ return err
+ }
+
+ uTime := convertRtimeToDur(ru.Utime)
+ sTime := convertRtimeToDur(ru.Stime)
+
+ r.Utime = uTime
+ r.Stime = sTime
+ r.Maxrss = int64(ru.Maxrss)
+ r.Ixrss = int64(ru.Ixrss)
+ r.Idrss = int64(ru.Idrss)
+ r.Isrss = int64(ru.Isrss)
+ r.Minflt = int64(ru.Minflt)
+ r.Majflt = int64(ru.Majflt)
+ r.Nswap = int64(ru.Nswap)
+ r.Inblock = int64(ru.Inblock)
+ r.Oublock = int64(ru.Oublock)
+ r.Msgsnd = int64(ru.Msgsnd)
+ r.Msgrcv = int64(ru.Msgrcv)
+ r.Nsignals = int64(ru.Nsignals)
+ r.Nvcsw = int64(ru.Nvcsw)
+ r.Nivcsw = int64(ru.Nivcsw)
+
+ return nil
+}
+
+func getResourceUsage(who int) (unix.Rusage, error) {
+ r := unix.Rusage{}
+ err := unix.Getrusage(who, &r)
+
+ return r, err
+}
+
+func convertRtimeToDur(t unix.Timeval) time.Duration {
+ return time.Duration(t.Nano())
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_util.go b/vendor/github.com/elastic/gosigar/sigar_util.go
new file mode 100644
index 000000000..bf93b02b2
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_util.go
@@ -0,0 +1,22 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "unsafe"
+)
+
+func bytePtrToString(ptr *int8) string {
+ bytes := (*[10000]byte)(unsafe.Pointer(ptr))
+
+ n := 0
+ for bytes[n] != 0 {
+ n++
+ }
+
+ return string(bytes[0:n])
+}
+
+func chop(buf []byte) []byte {
+ return buf[0 : len(buf)-1]
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_windows.go b/vendor/github.com/elastic/gosigar/sigar_windows.go
new file mode 100644
index 000000000..c2b54d8d7
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_windows.go
@@ -0,0 +1,441 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "sync"
+ "syscall"
+ "time"
+
+ "github.com/StackExchange/wmi"
+ "github.com/elastic/gosigar/sys/windows"
+ "github.com/pkg/errors"
+)
+
+// Win32_Process represents a process on the Windows operating system. If
+// additional fields are added here (that match the Windows struct) they will
+// automatically be populated when calling getWin32Process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx
+type Win32_Process struct {
+ CommandLine string
+}
+
+// Win32_OperatingSystem WMI class represents a Windows-based operating system
+// installed on a computer.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx
+type Win32_OperatingSystem struct {
+ LastBootUpTime time.Time
+}
+
+var (
+ // version is Windows version of the host OS.
+ version = windows.GetWindowsVersion()
+
+ // processQueryLimitedInfoAccess is set to PROCESS_QUERY_INFORMATION for Windows
+ // 2003 and XP where PROCESS_QUERY_LIMITED_INFORMATION is unknown. For all newer
+ // OS versions it is set to PROCESS_QUERY_LIMITED_INFORMATION.
+ processQueryLimitedInfoAccess = windows.PROCESS_QUERY_LIMITED_INFORMATION
+
+ // bootTime is the time when the OS was last booted. This value may be nil
+ // on operating systems that do not support the WMI query used to obtain it.
+ bootTime *time.Time
+ bootTimeLock sync.Mutex
+)
+
+func init() {
+ if !version.IsWindowsVistaOrGreater() {
+ // PROCESS_QUERY_LIMITED_INFORMATION cannot be used on 2003 or XP.
+ processQueryLimitedInfoAccess = syscall.PROCESS_QUERY_INFORMATION
+ }
+}
+
+func (self *LoadAverage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcExe) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Uptime) Get() error {
+ // Minimum supported OS is Windows Vista.
+ if !version.IsWindowsVistaOrGreater() {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ bootTimeLock.Lock()
+ defer bootTimeLock.Unlock()
+ if bootTime == nil {
+ os, err := getWin32OperatingSystem()
+ if err != nil {
+ return errors.Wrap(err, "failed to get boot time using WMI")
+ }
+ bootTime = &os.LastBootUpTime
+ }
+
+ self.Length = time.Since(*bootTime).Seconds()
+ return nil
+}
+
+func (self *Mem) Get() error {
+ memoryStatusEx, err := windows.GlobalMemoryStatusEx()
+ if err != nil {
+ return errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ self.Total = memoryStatusEx.TotalPhys
+ self.Free = memoryStatusEx.AvailPhys
+ self.Used = self.Total - self.Free
+ self.ActualFree = self.Free
+ self.ActualUsed = self.Used
+ return nil
+}
+
+func (self *Swap) Get() error {
+ memoryStatusEx, err := windows.GlobalMemoryStatusEx()
+ if err != nil {
+ return errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ self.Total = memoryStatusEx.TotalPageFile
+ self.Free = memoryStatusEx.AvailPageFile
+ self.Used = self.Total - self.Free
+ return nil
+}
+
+func (self *HugeTLBPages) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Cpu) Get() error {
+ idle, kernel, user, err := windows.GetSystemTimes()
+ if err != nil {
+ return errors.Wrap(err, "GetSystemTimes failed")
+ }
+
+ // CPU times are reported in milliseconds by gosigar.
+ self.Idle = uint64(idle / time.Millisecond)
+ self.Sys = uint64(kernel / time.Millisecond)
+ self.User = uint64(user / time.Millisecond)
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ cpus, err := windows.NtQuerySystemProcessorPerformanceInformation()
+ if err != nil {
+ return errors.Wrap(err, "NtQuerySystemProcessorPerformanceInformation failed")
+ }
+
+ self.List = make([]Cpu, 0, len(cpus))
+ for _, cpu := range cpus {
+ self.List = append(self.List, Cpu{
+ Idle: uint64(cpu.IdleTime / time.Millisecond),
+ Sys: uint64(cpu.KernelTime / time.Millisecond),
+ User: uint64(cpu.UserTime / time.Millisecond),
+ })
+ }
+ return nil
+}
+
+func (self *FileSystemList) Get() error {
+ drives, err := windows.GetLogicalDriveStrings()
+ if err != nil {
+ return errors.Wrap(err, "GetLogicalDriveStrings failed")
+ }
+
+ for _, drive := range drives {
+ dt, err := windows.GetDriveType(drive)
+ if err != nil {
+ return errors.Wrapf(err, "GetDriveType failed")
+ }
+
+ self.List = append(self.List, FileSystem{
+ DirName: drive,
+ DevName: drive,
+ TypeName: dt.String(),
+ })
+ }
+ return nil
+}
+
+// Get retrieves a list of all process identifiers (PIDs) in the system.
+func (self *ProcList) Get() error {
+ pids, err := windows.EnumProcesses()
+ if err != nil {
+ return errors.Wrap(err, "EnumProcesses failed")
+ }
+
+ // Convert uint32 PIDs to int.
+ self.List = make([]int, 0, len(pids))
+ for _, pid := range pids {
+ self.List = append(self.List, int(pid))
+ }
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ var errs []error
+
+ var err error
+ self.Name, err = getProcName(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcName failed"))
+ }
+
+ self.State, err = getProcStatus(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcStatus failed"))
+ }
+
+ self.Ppid, err = getParentPid(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getParentPid failed"))
+ }
+
+ self.Username, err = getProcCredName(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcCredName failed"))
+ }
+
+ if len(errs) > 0 {
+ errStrs := make([]string, 0, len(errs))
+ for _, e := range errs {
+ errStrs = append(errStrs, e.Error())
+ }
+ return errors.New(strings.Join(errStrs, "; "))
+ }
+ return nil
+}
+
+// getProcName returns the process name associated with the PID.
+func getProcName(pid int) (string, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ filename, err := windows.GetProcessImageFileName(handle)
+ if err != nil {
+ return "", errors.Wrapf(err, "GetProcessImageFileName failed for pid=%v", pid)
+ }
+
+ return filepath.Base(filename), nil
+}
+
+// getProcStatus returns the status of a process.
+func getProcStatus(pid int) (RunState, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ var exitCode uint32
+ err = syscall.GetExitCodeProcess(handle, &exitCode)
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "GetExitCodeProcess failed for pid=%v")
+ }
+
+ if exitCode == 259 { //still active
+ return RunStateRun, nil
+ }
+ return RunStateSleep, nil
+}
+
+// getParentPid returns the parent process ID of a process.
+func getParentPid(pid int) (int, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ procInfo, err := windows.NtQueryProcessBasicInformation(handle)
+ if err != nil {
+ return 0, errors.Wrapf(err, "NtQueryProcessBasicInformation failed for pid=%v", pid)
+ }
+
+ return int(procInfo.InheritedFromUniqueProcessID), nil
+}
+
+func getProcCredName(pid int) (string, error) {
+ handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid))
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ // Find process token via win32.
+ var token syscall.Token
+ err = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token)
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcessToken failed for pid=%v", pid)
+ }
+
+ // Find the token user.
+ tokenUser, err := token.GetTokenUser()
+ if err != nil {
+ return "", errors.Wrapf(err, "GetTokenInformation failed for pid=%v", pid)
+ }
+
+ // Close token to prevent handle leaks.
+ err = token.Close()
+ if err != nil {
+ return "", errors.Wrapf(err, "failed while closing process token handle for pid=%v", pid)
+ }
+
+ // Look up domain account by SID.
+ account, domain, _, err := tokenUser.User.Sid.LookupAccount("")
+ if err != nil {
+ sid, sidErr := tokenUser.User.Sid.String()
+ if sidErr != nil {
+ return "", errors.Wrapf(err, "failed while looking up account name for pid=%v", pid)
+ }
+ return "", errors.Wrapf(err, "failed while looking up account name for SID=%v of pid=%v", sid, pid)
+ }
+
+ return fmt.Sprintf(`%s\%s`, domain, account), nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess|windows.PROCESS_VM_READ, false, uint32(pid))
+ if err != nil {
+ return errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ counters, err := windows.GetProcessMemoryInfo(handle)
+ if err != nil {
+ return errors.Wrapf(err, "GetProcessMemoryInfo failed for pid=%v", pid)
+ }
+
+ self.Resident = uint64(counters.WorkingSetSize)
+ self.Size = uint64(counters.PrivateUsage)
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ cpu, err := getProcTimes(pid)
+ if err != nil {
+ return err
+ }
+
+ // Windows epoch times are expressed as time elapsed since midnight on
+ // January 1, 1601 at Greenwich, England. This converts the Filetime to
+ // unix epoch in milliseconds.
+ self.StartTime = uint64(cpu.CreationTime.Nanoseconds() / 1e6)
+
+ // Convert to millis.
+ self.User = uint64(windows.FiletimeToDuration(&cpu.UserTime).Nanoseconds() / 1e6)
+ self.Sys = uint64(windows.FiletimeToDuration(&cpu.KernelTime).Nanoseconds() / 1e6)
+ self.Total = self.User + self.Sys
+
+ return nil
+}
+
+func getProcTimes(pid int) (*syscall.Rusage, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return nil, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ var cpu syscall.Rusage
+ if err := syscall.GetProcessTimes(handle, &cpu.CreationTime, &cpu.ExitTime, &cpu.KernelTime, &cpu.UserTime); err != nil {
+ return nil, errors.Wrapf(err, "GetProcessTimes failed for pid=%v", pid)
+ }
+
+ return &cpu, nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ // The minimum supported client for Win32_Process is Windows Vista.
+ if !version.IsWindowsVistaOrGreater() {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ process, err := getWin32Process(int32(pid))
+ if err != nil {
+ return errors.Wrapf(err, "ProcArgs failed for pid=%v", pid)
+ }
+
+ self.List = []string{process.CommandLine}
+ return nil
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, err := windows.GetDiskFreeSpaceEx(path)
+ if err != nil {
+ return errors.Wrap(err, "GetDiskFreeSpaceEx failed")
+ }
+
+ self.Total = totalNumberOfBytes
+ self.Free = totalNumberOfFreeBytes
+ self.Used = self.Total - self.Free
+ self.Avail = freeBytesAvailable
+ return nil
+}
+
+// getWin32Process gets information about the process with the given process ID.
+// It uses a WMI query to get the information from the local system.
+func getWin32Process(pid int32) (Win32_Process, error) {
+ var dst []Win32_Process
+ query := fmt.Sprintf("WHERE ProcessId = %d", pid)
+ q := wmi.CreateQuery(&dst, query)
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: %v", query, err)
+ }
+ if len(dst) < 1 {
+ return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: Process not found", query)
+ }
+ return dst[0], nil
+}
+
+func getWin32OperatingSystem() (Win32_OperatingSystem, error) {
+ var dst []Win32_OperatingSystem
+ q := wmi.CreateQuery(&dst, "")
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ return Win32_OperatingSystem{}, errors.Wrap(err, "wmi query for Win32_OperatingSystem failed")
+ }
+ if len(dst) != 1 {
+ return Win32_OperatingSystem{}, errors.New("wmi query for Win32_OperatingSystem failed")
+ }
+ return dst[0], nil
+}
+
+func (self *Rusage) Get(who int) error {
+ if who != 0 {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ pid := os.Getpid()
+ cpu, err := getProcTimes(pid)
+ if err != nil {
+ return err
+ }
+
+ self.Utime = windows.FiletimeToDuration(&cpu.UserTime)
+ self.Stime = windows.FiletimeToDuration(&cpu.KernelTime)
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/doc.go b/vendor/github.com/elastic/gosigar/sys/windows/doc.go
new file mode 100644
index 000000000..dda57aa83
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/doc.go
@@ -0,0 +1,2 @@
+// Package windows contains various Windows system call.
+package windows
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go
new file mode 100644
index 000000000..85de365e1
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go
@@ -0,0 +1,132 @@
+// +build windows
+
+package windows
+
+import (
+ "bytes"
+ "encoding/binary"
+ "io"
+ "runtime"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "github.com/pkg/errors"
+)
+
+// On both 32-bit and 64-bit systems NtQuerySystemInformation expects the
+// size of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION to be 48.
+const sizeofSystemProcessorPerformanceInformation = 48
+
+// ProcessBasicInformation is an equivalent representation of
+// PROCESS_BASIC_INFORMATION in the Windows API.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
+type ProcessBasicInformation struct {
+ ExitStatus uint
+ PebBaseAddress uintptr
+ AffinityMask uint
+ BasePriority uint
+ UniqueProcessID uint
+ InheritedFromUniqueProcessID uint
+}
+
+// NtQueryProcessBasicInformation queries basic information about the process
+// associated with the given handle (provided by OpenProcess). It uses the
+// NtQueryInformationProcess function to collect the data.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
+func NtQueryProcessBasicInformation(handle syscall.Handle) (ProcessBasicInformation, error) {
+ var processBasicInfo ProcessBasicInformation
+ processBasicInfoPtr := (*byte)(unsafe.Pointer(&processBasicInfo))
+ size := uint32(unsafe.Sizeof(processBasicInfo))
+ ntStatus, _ := _NtQueryInformationProcess(handle, 0, processBasicInfoPtr, size, nil)
+ if ntStatus != 0 {
+ return ProcessBasicInformation{}, errors.Errorf("NtQueryInformationProcess failed, NTSTATUS=0x%X", ntStatus)
+ }
+
+ return processBasicInfo, nil
+}
+
+// SystemProcessorPerformanceInformation contains CPU performance information
+// for a single CPU.
+type SystemProcessorPerformanceInformation struct {
+ IdleTime time.Duration // Amount of time spent idle.
+ KernelTime time.Duration // Kernel time does NOT include time spent in idle.
+ UserTime time.Duration // Amount of time spent executing in user mode.
+}
+
+// _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION is an equivalent representation of
+// SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION in the Windows API. This struct is
+// used internally with NtQuerySystemInformation call and is not exported. The
+// exported equivalent is SystemProcessorPerformanceInformation.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+type _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION struct {
+ IdleTime int64
+ KernelTime int64
+ UserTime int64
+ Reserved1 [2]int64
+ Reserved2 uint32
+}
+
+// NtQuerySystemProcessorPerformanceInformation queries CPU performance
+// information for each CPU. It uses the NtQuerySystemInformation function to
+// collect the SystemProcessorPerformanceInformation.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+func NtQuerySystemProcessorPerformanceInformation() ([]SystemProcessorPerformanceInformation, error) {
+ // NTSTATUS code for success.
+ // https://msdn.microsoft.com/en-us/library/cc704588.aspx
+ const STATUS_SUCCESS = 0
+
+ // From the _SYSTEM_INFORMATION_CLASS enum.
+ // http://processhacker.sourceforge.net/doc/ntexapi_8h.html#ad5d815b48e8f4da1ef2eb7a2f18a54e0
+ const systemProcessorPerformanceInformation = 8
+
+ // Create a buffer large enough to hold an entry for each processor.
+ b := make([]byte, runtime.NumCPU()*sizeofSystemProcessorPerformanceInformation)
+
+ // Query the performance information. Note that this function uses 0 to
+ // indicate success. Most other Windows functions use non-zero for success.
+ var returnLength uint32
+ ntStatus, _ := _NtQuerySystemInformation(systemProcessorPerformanceInformation, &b[0], uint32(len(b)), &returnLength)
+ if ntStatus != STATUS_SUCCESS {
+ return nil, errors.Errorf("NtQuerySystemInformation failed, NTSTATUS=0x%X, bufLength=%v, returnLength=%v", ntStatus, len(b), returnLength)
+ }
+
+ return readSystemProcessorPerformanceInformationBuffer(b)
+}
+
+// readSystemProcessorPerformanceInformationBuffer reads from a buffer
+// containing SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION data. The buffer should
+// contain one entry for each CPU.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+func readSystemProcessorPerformanceInformationBuffer(b []byte) ([]SystemProcessorPerformanceInformation, error) {
+ n := len(b) / sizeofSystemProcessorPerformanceInformation
+ r := bytes.NewReader(b)
+
+ rtn := make([]SystemProcessorPerformanceInformation, 0, n)
+ for i := 0; i < n; i++ {
+ _, err := r.Seek(int64(i*sizeofSystemProcessorPerformanceInformation), io.SeekStart)
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to seek to cpuN=%v in buffer", i)
+ }
+
+ times := make([]uint64, 3)
+ for j := range times {
+ err := binary.Read(r, binary.LittleEndian, ×[j])
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed reading cpu times for cpuN=%v", i)
+ }
+ }
+
+ idleTime := time.Duration(times[0] * 100)
+ kernelTime := time.Duration(times[1] * 100)
+ userTime := time.Duration(times[2] * 100)
+
+ rtn = append(rtn, SystemProcessorPerformanceInformation{
+ IdleTime: idleTime,
+ KernelTime: kernelTime - idleTime, // Subtract out idle time from kernel time.
+ UserTime: userTime,
+ })
+ }
+
+ return rtn, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/privileges.go b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go
new file mode 100644
index 000000000..28c78fd22
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go
@@ -0,0 +1,272 @@
+// +build windows
+
+package windows
+
+import (
+ "bytes"
+ "encoding/binary"
+ "encoding/json"
+ "fmt"
+ "runtime"
+ "strings"
+ "sync"
+ "syscall"
+
+ "github.com/pkg/errors"
+ "golang.org/x/sys/windows"
+)
+
+// Cache of privilege names to LUIDs.
+var (
+ privNames = make(map[string]int64)
+ privNameMutex sync.Mutex
+)
+
+const (
+ // SeDebugPrivilege is the name of the privilege used to debug programs.
+ SeDebugPrivilege = "SeDebugPrivilege"
+)
+
+// Errors returned by AdjustTokenPrivileges.
+const (
+ ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300
+)
+
+// Attribute bits for privileges.
+const (
+ _SE_PRIVILEGE_ENABLED_BY_DEFAULT uint32 = 0x00000001
+ _SE_PRIVILEGE_ENABLED uint32 = 0x00000002
+ _SE_PRIVILEGE_REMOVED uint32 = 0x00000004
+ _SE_PRIVILEGE_USED_FOR_ACCESS uint32 = 0x80000000
+)
+
+// Privilege contains information about a single privilege associated with a
+// Token.
+type Privilege struct {
+ LUID int64 `json:"-"` // Locally unique identifier (guaranteed only until the system is restarted).
+ Name string `json:"-"`
+ EnabledByDefault bool `json:"enabled_by_default,omitempty"`
+ Enabled bool `json:"enabled"`
+ Removed bool `json:"removed,omitempty"`
+ Used bool `json:"used,omitempty"`
+}
+
+func (p Privilege) String() string {
+ var buf bytes.Buffer
+ buf.WriteString(p.Name)
+ buf.WriteString("=(")
+
+ opts := make([]string, 0, 4)
+ if p.EnabledByDefault {
+ opts = append(opts, "Default")
+ }
+ if p.Enabled {
+ opts = append(opts, "Enabled")
+ }
+ if !p.EnabledByDefault && !p.Enabled {
+ opts = append(opts, "Disabled")
+ }
+ if p.Removed {
+ opts = append(opts, "Removed")
+ }
+ if p.Used {
+ opts = append(opts, "Used")
+ }
+
+ buf.WriteString(strings.Join(opts, ", "))
+ buf.WriteString(")")
+
+ // Example: SeDebugPrivilege=(Default, Enabled)
+ return buf.String()
+}
+
+// User represent the information about a Windows account.
+type User struct {
+ SID string
+ Account string
+ Domain string
+ Type uint32
+}
+
+func (u User) String() string {
+ return fmt.Sprintf(`User:%v\%v, SID:%v, Type:%v`, u.Domain, u.Account, u.SID, u.Type)
+}
+
+// DebugInfo contains general debug info about the current process.
+type DebugInfo struct {
+ OSVersion Version // OS version info.
+ Arch string // Architecture of the machine.
+ NumCPU int // Number of CPUs.
+ User User // User that this process is running as.
+ ProcessPrivs map[string]Privilege // Privileges held by the process.
+}
+
+func (d DebugInfo) String() string {
+ bytes, _ := json.Marshal(d)
+ return string(bytes)
+}
+
+// LookupPrivilegeName looks up a privilege name given a LUID value.
+func LookupPrivilegeName(systemName string, luid int64) (string, error) {
+ buf := make([]uint16, 256)
+ bufSize := uint32(len(buf))
+ err := _LookupPrivilegeName(systemName, &luid, &buf[0], &bufSize)
+ if err != nil {
+ return "", errors.Wrapf(err, "LookupPrivilegeName failed for luid=%v", luid)
+ }
+
+ return syscall.UTF16ToString(buf), nil
+}
+
+// mapPrivileges maps privilege names to LUID values.
+func mapPrivileges(names []string) ([]int64, error) {
+ var privileges []int64
+ privNameMutex.Lock()
+ defer privNameMutex.Unlock()
+ for _, name := range names {
+ p, ok := privNames[name]
+ if !ok {
+ err := _LookupPrivilegeValue("", name, &p)
+ if err != nil {
+ return nil, errors.Wrapf(err, "LookupPrivilegeValue failed on '%v'", name)
+ }
+ privNames[name] = p
+ }
+ privileges = append(privileges, p)
+ }
+ return privileges, nil
+}
+
+// EnableTokenPrivileges enables the specified privileges in the given
+// Token. The token must have TOKEN_ADJUST_PRIVILEGES access. If the token
+// does not already contain the privilege it cannot be enabled.
+func EnableTokenPrivileges(token syscall.Token, privileges ...string) error {
+ privValues, err := mapPrivileges(privileges)
+ if err != nil {
+ return err
+ }
+
+ var b bytes.Buffer
+ binary.Write(&b, binary.LittleEndian, uint32(len(privValues)))
+ for _, p := range privValues {
+ binary.Write(&b, binary.LittleEndian, p)
+ binary.Write(&b, binary.LittleEndian, uint32(_SE_PRIVILEGE_ENABLED))
+ }
+
+ success, err := _AdjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(b.Len()), nil, nil)
+ if !success {
+ return err
+ }
+ if err == ERROR_NOT_ALL_ASSIGNED {
+ return errors.Wrap(err, "error not all privileges were assigned")
+ }
+
+ return nil
+}
+
+// GetTokenPrivileges returns a list of privileges associated with a token.
+// The provided token must have at a minimum TOKEN_QUERY access. This is a
+// wrapper around the GetTokenInformation function.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx
+func GetTokenPrivileges(token syscall.Token) (map[string]Privilege, error) {
+ // Determine the required buffer size.
+ var size uint32
+ syscall.GetTokenInformation(token, syscall.TokenPrivileges, nil, 0, &size)
+
+ // This buffer will receive a TOKEN_PRIVILEGE structure.
+ b := bytes.NewBuffer(make([]byte, size))
+ err := syscall.GetTokenInformation(token, syscall.TokenPrivileges, &b.Bytes()[0], uint32(b.Len()), &size)
+ if err != nil {
+ return nil, errors.Wrap(err, "GetTokenInformation failed")
+ }
+
+ var privilegeCount uint32
+ err = binary.Read(b, binary.LittleEndian, &privilegeCount)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read PrivilegeCount")
+ }
+
+ rtn := make(map[string]Privilege, privilegeCount)
+ for i := 0; i < int(privilegeCount); i++ {
+ var luid int64
+ err = binary.Read(b, binary.LittleEndian, &luid)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read LUID value")
+ }
+
+ var attributes uint32
+ err = binary.Read(b, binary.LittleEndian, &attributes)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read attributes")
+ }
+
+ name, err := LookupPrivilegeName("", luid)
+ if err != nil {
+ return nil, errors.Wrapf(err, "LookupPrivilegeName failed for LUID=%v", luid)
+ }
+
+ rtn[name] = Privilege{
+ LUID: luid,
+ Name: name,
+ EnabledByDefault: (attributes & _SE_PRIVILEGE_ENABLED_BY_DEFAULT) > 0,
+ Enabled: (attributes & _SE_PRIVILEGE_ENABLED) > 0,
+ Removed: (attributes & _SE_PRIVILEGE_REMOVED) > 0,
+ Used: (attributes & _SE_PRIVILEGE_USED_FOR_ACCESS) > 0,
+ }
+ }
+
+ return rtn, nil
+}
+
+// GetTokenUser returns the User associated with the given Token.
+func GetTokenUser(token syscall.Token) (User, error) {
+ tokenUser, err := token.GetTokenUser()
+ if err != nil {
+ return User{}, errors.Wrap(err, "GetTokenUser failed")
+ }
+
+ var user User
+ user.SID, err = tokenUser.User.Sid.String()
+ if err != nil {
+ return user, errors.Wrap(err, "ConvertSidToStringSid failed")
+ }
+
+ user.Account, user.Domain, user.Type, err = tokenUser.User.Sid.LookupAccount("")
+ if err != nil {
+ return user, errors.Wrap(err, "LookupAccountSid failed")
+ }
+
+ return user, nil
+}
+
+// GetDebugInfo returns general debug info about the current process.
+func GetDebugInfo() (*DebugInfo, error) {
+ h, err := windows.GetCurrentProcess()
+ if err != nil {
+ return nil, err
+ }
+
+ var token syscall.Token
+ err = syscall.OpenProcessToken(syscall.Handle(h), syscall.TOKEN_QUERY, &token)
+ if err != nil {
+ return nil, err
+ }
+
+ privs, err := GetTokenPrivileges(token)
+ if err != nil {
+ return nil, err
+ }
+
+ user, err := GetTokenUser(token)
+ if err != nil {
+ return nil, err
+ }
+
+ return &DebugInfo{
+ User: user,
+ ProcessPrivs: privs,
+ OSVersion: GetWindowsVersion(),
+ Arch: runtime.GOARCH,
+ NumCPU: runtime.NumCPU(),
+ }, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go
new file mode 100644
index 000000000..88df0febf
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go
@@ -0,0 +1,385 @@
+package windows
+
+import (
+ "fmt"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "github.com/pkg/errors"
+)
+
+var (
+ sizeofUint32 = 4
+ sizeofProcessEntry32 = uint32(unsafe.Sizeof(ProcessEntry32{}))
+ sizeofProcessMemoryCountersEx = uint32(unsafe.Sizeof(ProcessMemoryCountersEx{}))
+ sizeofMemoryStatusEx = uint32(unsafe.Sizeof(MemoryStatusEx{}))
+)
+
+// Process-specific access rights. Others are declared in the syscall package.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx
+const (
+ PROCESS_QUERY_LIMITED_INFORMATION uint32 = 0x1000
+ PROCESS_VM_READ uint32 = 0x0010
+)
+
+// MAX_PATH is the maximum length for a path in Windows.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
+const MAX_PATH = 260
+
+// DriveType represents a type of drive (removable, fixed, CD-ROM, RAM disk, or
+// network drive).
+type DriveType uint32
+
+// Drive types as returned by GetDriveType.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx
+const (
+ DRIVE_UNKNOWN DriveType = iota
+ DRIVE_NO_ROOT_DIR
+ DRIVE_REMOVABLE
+ DRIVE_FIXED
+ DRIVE_REMOTE
+ DRIVE_CDROM
+ DRIVE_RAMDISK
+)
+
+func (dt DriveType) String() string {
+ names := map[DriveType]string{
+ DRIVE_UNKNOWN: "unknown",
+ DRIVE_NO_ROOT_DIR: "invalid",
+ DRIVE_REMOVABLE: "removable",
+ DRIVE_FIXED: "fixed",
+ DRIVE_REMOTE: "remote",
+ DRIVE_CDROM: "cdrom",
+ DRIVE_RAMDISK: "ramdisk",
+ }
+
+ name, found := names[dt]
+ if !found {
+ return "unknown DriveType value"
+ }
+ return name
+}
+
+// Flags that can be used with CreateToolhelp32Snapshot.
+const (
+ TH32CS_INHERIT uint32 = 0x80000000 // Indicates that the snapshot handle is to be inheritable.
+ TH32CS_SNAPHEAPLIST uint32 = 0x00000001 // Includes all heaps of the process specified in th32ProcessID in the snapshot.
+ TH32CS_SNAPMODULE uint32 = 0x00000008 // Includes all modules of the process specified in th32ProcessID in the snapshot.
+ TH32CS_SNAPMODULE32 uint32 = 0x00000010 // Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process.
+ TH32CS_SNAPPROCESS uint32 = 0x00000002 // Includes all processes in the system in the snapshot.
+ TH32CS_SNAPTHREAD uint32 = 0x00000004 // Includes all threads in the system in the snapshot.
+)
+
+// ProcessEntry32 is an equivalent representation of PROCESSENTRY32 in the
+// Windows API. It contains a process's information. Do not modify or reorder.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx
+type ProcessEntry32 struct {
+ size uint32
+ CntUsage uint32
+ ProcessID uint32
+ DefaultHeapID uintptr
+ ModuleID uint32
+ CntThreads uint32
+ ParentProcessID uint32
+ PriorityClassBase int32
+ Flags uint32
+ exeFile [MAX_PATH]uint16
+}
+
+// ExeFile returns the name of the executable file for the process. It does
+// not contain the full path.
+func (p ProcessEntry32) ExeFile() string {
+ return syscall.UTF16ToString(p.exeFile[:])
+}
+
+func (p ProcessEntry32) String() string {
+ return fmt.Sprintf("{CntUsage:%v ProcessID:%v DefaultHeapID:%v ModuleID:%v "+
+ "CntThreads:%v ParentProcessID:%v PriorityClassBase:%v Flags:%v ExeFile:%v",
+ p.CntUsage, p.ProcessID, p.DefaultHeapID, p.ModuleID, p.CntThreads,
+ p.ParentProcessID, p.PriorityClassBase, p.Flags, p.ExeFile())
+}
+
+// MemoryStatusEx is an equivalent representation of MEMORYSTATUSEX in the
+// Windows API. It contains information about the current state of both physical
+// and virtual memory, including extended memory.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770
+type MemoryStatusEx struct {
+ length uint32
+ MemoryLoad uint32
+ TotalPhys uint64
+ AvailPhys uint64
+ TotalPageFile uint64
+ AvailPageFile uint64
+ TotalVirtual uint64
+ AvailVirtual uint64
+ AvailExtendedVirtual uint64
+}
+
+// ProcessMemoryCountersEx is an equivalent representation of
+// PROCESS_MEMORY_COUNTERS_EX in the Windows API.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684874(v=vs.85).aspx
+type ProcessMemoryCountersEx struct {
+ cb uint32
+ PageFaultCount uint32
+ PeakWorkingSetSize uintptr
+ WorkingSetSize uintptr
+ QuotaPeakPagedPoolUsage uintptr
+ QuotaPagedPoolUsage uintptr
+ QuotaPeakNonPagedPoolUsage uintptr
+ QuotaNonPagedPoolUsage uintptr
+ PagefileUsage uintptr
+ PeakPagefileUsage uintptr
+ PrivateUsage uintptr
+}
+
+// GetLogicalDriveStrings returns a list of drives in the system.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx
+func GetLogicalDriveStrings() ([]string, error) {
+ // Determine the size of the buffer required to receive all drives.
+ bufferLength, err := _GetLogicalDriveStringsW(0, nil)
+ if err != nil {
+ return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed to get buffer length")
+ }
+ if bufferLength < 0 {
+ return nil, errors.New("GetLogicalDriveStringsW returned an invalid buffer length")
+ }
+
+ buffer := make([]uint16, bufferLength)
+ _, err = _GetLogicalDriveStringsW(uint32(len(buffer)), &buffer[0])
+ if err != nil {
+ return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed")
+ }
+
+ // Split the uint16 slice at null-terminators.
+ var startIdx int
+ var drivesUTF16 [][]uint16
+ for i, value := range buffer {
+ if value == 0 {
+ drivesUTF16 = append(drivesUTF16, buffer[startIdx:i])
+ startIdx = i + 1
+ }
+ }
+
+ // Convert the utf16 slices to strings.
+ drives := make([]string, 0, len(drivesUTF16))
+ for _, driveUTF16 := range drivesUTF16 {
+ if len(driveUTF16) > 0 {
+ drives = append(drives, syscall.UTF16ToString(driveUTF16))
+ }
+ }
+
+ return drives, nil
+}
+
+// GlobalMemoryStatusEx retrieves information about the system's current usage
+// of both physical and virtual memory.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
+func GlobalMemoryStatusEx() (MemoryStatusEx, error) {
+ memoryStatusEx := MemoryStatusEx{length: sizeofMemoryStatusEx}
+ err := _GlobalMemoryStatusEx(&memoryStatusEx)
+ if err != nil {
+ return MemoryStatusEx{}, errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ return memoryStatusEx, nil
+}
+
+// GetProcessMemoryInfo retrieves information about the memory usage of the
+// specified process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx
+func GetProcessMemoryInfo(handle syscall.Handle) (ProcessMemoryCountersEx, error) {
+ processMemoryCountersEx := ProcessMemoryCountersEx{cb: sizeofProcessMemoryCountersEx}
+ err := _GetProcessMemoryInfo(handle, &processMemoryCountersEx, processMemoryCountersEx.cb)
+ if err != nil {
+ return ProcessMemoryCountersEx{}, errors.Wrap(err, "GetProcessMemoryInfo failed")
+ }
+
+ return processMemoryCountersEx, nil
+}
+
+// GetProcessImageFileName Retrieves the name of the executable file for the
+// specified process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx
+func GetProcessImageFileName(handle syscall.Handle) (string, error) {
+ buffer := make([]uint16, MAX_PATH)
+ _, err := _GetProcessImageFileName(handle, &buffer[0], uint32(len(buffer)))
+ if err != nil {
+ return "", errors.Wrap(err, "GetProcessImageFileName failed")
+ }
+
+ return syscall.UTF16ToString(buffer), nil
+}
+
+// GetSystemTimes retrieves system timing information. On a multiprocessor
+// system, the values returned are the sum of the designated times across all
+// processors. The returned kernel time does not include the system idle time.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724400(v=vs.85).aspx
+func GetSystemTimes() (idle, kernel, user time.Duration, err error) {
+ var idleTime, kernelTime, userTime syscall.Filetime
+ err = _GetSystemTimes(&idleTime, &kernelTime, &userTime)
+ if err != nil {
+ return 0, 0, 0, errors.Wrap(err, "GetSystemTimes failed")
+ }
+
+ idle = FiletimeToDuration(&idleTime)
+ kernel = FiletimeToDuration(&kernelTime) // Kernel time includes idle time so we subtract it out.
+ user = FiletimeToDuration(&userTime)
+
+ return idle, kernel - idle, user, nil
+}
+
+// FiletimeToDuration converts a Filetime to a time.Duration. Do not use this
+// method to convert a Filetime to an actual clock time, for that use
+// Filetime.Nanosecond().
+func FiletimeToDuration(ft *syscall.Filetime) time.Duration {
+ n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals
+ return time.Duration(n * 100)
+}
+
+// GetDriveType Determines whether a disk drive is a removable, fixed, CD-ROM,
+// RAM disk, or network drive. A trailing backslash is required on the
+// rootPathName.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939
+func GetDriveType(rootPathName string) (DriveType, error) {
+ rootPathNamePtr, err := syscall.UTF16PtrFromString(rootPathName)
+ if err != nil {
+ return DRIVE_UNKNOWN, errors.Wrapf(err, "UTF16PtrFromString failed for rootPathName=%v", rootPathName)
+ }
+
+ dt, err := _GetDriveType(rootPathNamePtr)
+ if err != nil {
+ return DRIVE_UNKNOWN, errors.Wrapf(err, "GetDriveType failed for rootPathName=%v", rootPathName)
+ }
+
+ return dt, nil
+}
+
+// EnumProcesses retrieves the process identifier for each process object in the
+// system. This function can return a max of 65536 PIDs. If there are more
+// processes than that then this will not return them all.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx
+func EnumProcesses() ([]uint32, error) {
+ enumProcesses := func(size int) ([]uint32, error) {
+ var (
+ pids = make([]uint32, size)
+ sizeBytes = len(pids) * sizeofUint32
+ bytesWritten uint32
+ )
+
+ err := _EnumProcesses(&pids[0], uint32(sizeBytes), &bytesWritten)
+
+ pidsWritten := int(bytesWritten) / sizeofUint32
+ if int(bytesWritten)%sizeofUint32 != 0 || pidsWritten > len(pids) {
+ return nil, errors.Errorf("EnumProcesses returned an invalid bytesWritten value of %v", bytesWritten)
+ }
+ pids = pids[:pidsWritten]
+
+ return pids, err
+ }
+
+ // Retry the EnumProcesses call with larger arrays if needed.
+ size := 2048
+ var pids []uint32
+ for tries := 0; tries < 5; tries++ {
+ var err error
+ pids, err = enumProcesses(size)
+ if err != nil {
+ return nil, errors.Wrap(err, "EnumProcesses failed")
+ }
+
+ if len(pids) < size {
+ break
+ }
+
+ // Increase the size the pids array and retry the enumProcesses call
+ // because the array wasn't large enough to hold all of the processes.
+ size *= 2
+ }
+
+ return pids, nil
+}
+
+// GetDiskFreeSpaceEx retrieves information about the amount of space that is
+// available on a disk volume, which is the total amount of space, the total
+// amount of free space, and the total amount of free space available to the
+// user that is associated with the calling thread.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx
+func GetDiskFreeSpaceEx(directoryName string) (freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64, err error) {
+ directoryNamePtr, err := syscall.UTF16PtrFromString(directoryName)
+ if err != nil {
+ return 0, 0, 0, errors.Wrapf(err, "UTF16PtrFromString failed for directoryName=%v", directoryName)
+ }
+
+ err = _GetDiskFreeSpaceEx(directoryNamePtr, &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes)
+ if err != nil {
+ return 0, 0, 0, err
+ }
+
+ return freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, nil
+}
+
+// CreateToolhelp32Snapshot takes a snapshot of the specified processes, as well
+// as the heaps, modules, and threads used by these processes.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
+func CreateToolhelp32Snapshot(flags, pid uint32) (syscall.Handle, error) {
+ h, err := _CreateToolhelp32Snapshot(flags, pid)
+ if err != nil {
+ return syscall.InvalidHandle, err
+ }
+ if h == syscall.InvalidHandle {
+ return syscall.InvalidHandle, syscall.GetLastError()
+ }
+
+ return h, nil
+}
+
+// Process32First retrieves information about the first process encountered in a
+// system snapshot.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834
+func Process32First(handle syscall.Handle) (ProcessEntry32, error) {
+ processEntry32 := ProcessEntry32{size: sizeofProcessEntry32}
+ err := _Process32First(handle, &processEntry32)
+ if err != nil {
+ return ProcessEntry32{}, errors.Wrap(err, "Process32First failed")
+ }
+
+ return processEntry32, nil
+}
+
+// Process32Next retrieves information about the next process recorded in a
+// system snapshot. When there are no more processes to iterate then
+// syscall.ERROR_NO_MORE_FILES is returned (use errors.Cause() to unwrap).
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836
+func Process32Next(handle syscall.Handle) (ProcessEntry32, error) {
+ processEntry32 := ProcessEntry32{size: sizeofProcessEntry32}
+ err := _Process32Next(handle, &processEntry32)
+ if err != nil {
+ return ProcessEntry32{}, errors.Wrap(err, "Process32Next failed")
+ }
+
+ return processEntry32, nil
+}
+
+// Use "GOOS=windows go generate -v -x ." to generate the source.
+
+// Add -trace to enable debug prints around syscalls.
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
+
+// Windows API calls
+//sys _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) = kernel32.GlobalMemoryStatusEx
+//sys _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) = kernel32.GetLogicalDriveStringsW
+//sys _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) = psapi.GetProcessMemoryInfo
+//sys _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) = psapi.GetProcessImageFileNameW
+//sys _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) = kernel32.GetSystemTimes
+//sys _GetDriveType(rootPathName *uint16) (dt DriveType, err error) = kernel32.GetDriveTypeW
+//sys _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
+//sys _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = kernel32.GetDiskFreeSpaceExW
+//sys _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32FirstW
+//sys _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32NextW
+//sys _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) = kernel32.CreateToolhelp32Snapshot
+//sys _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQuerySystemInformation
+//sys _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQueryInformationProcess
+//sys _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW
+//sys _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) = advapi32.LookupPrivilegeValueW
+//sys _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/version.go b/vendor/github.com/elastic/gosigar/sys/windows/version.go
new file mode 100644
index 000000000..d0bca89c1
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/version.go
@@ -0,0 +1,43 @@
+// +build windows
+
+package windows
+
+import (
+ "fmt"
+ "syscall"
+)
+
+// Version identifies a Windows version by major, minor, and build number.
+type Version struct {
+ Major int
+ Minor int
+ Build int
+}
+
+// GetWindowsVersion returns the Windows version information. Applications not
+// manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version
+// value (6.2).
+//
+// For a table of version numbers see:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx
+func GetWindowsVersion() Version {
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
+ ver, err := syscall.GetVersion()
+ if err != nil {
+ // GetVersion should never return an error.
+ panic(fmt.Errorf("GetVersion failed: %v", err))
+ }
+
+ return Version{
+ Major: int(ver & 0xFF),
+ Minor: int(ver >> 8 & 0xFF),
+ Build: int(ver >> 16),
+ }
+}
+
+// IsWindowsVistaOrGreater returns true if the Windows version is Vista or
+// greater.
+func (v Version) IsWindowsVistaOrGreater() bool {
+ // Vista is 6.0.
+ return v.Major >= 6 && v.Minor >= 0
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go
new file mode 100644
index 000000000..53fae4e3b
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go
@@ -0,0 +1,260 @@
+// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
+
+package windows
+
+import "unsafe"
+import "syscall"
+
+var _ unsafe.Pointer
+
+var (
+ modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+ modpsapi = syscall.NewLazyDLL("psapi.dll")
+ modntdll = syscall.NewLazyDLL("ntdll.dll")
+ modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
+
+ procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
+ procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
+ procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo")
+ procGetProcessImageFileNameW = modpsapi.NewProc("GetProcessImageFileNameW")
+ procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
+ procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW")
+ procEnumProcesses = modpsapi.NewProc("EnumProcesses")
+ procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW")
+ procProcess32FirstW = modkernel32.NewProc("Process32FirstW")
+ procProcess32NextW = modkernel32.NewProc("Process32NextW")
+ procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
+ procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation")
+ procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess")
+ procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW")
+ procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW")
+ procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
+)
+
+func _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) {
+ r1, _, e1 := syscall.Syscall(procGlobalMemoryStatusEx.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0)
+ length = uint32(r0)
+ if length == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(psmemCounters)), uintptr(cb))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(outImageFileName)), uintptr(size))
+ length = uint32(r0)
+ if length == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetSystemTimes.Addr(), 3, uintptr(unsafe.Pointer(idleTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetDriveType(rootPathName *uint16) (dt DriveType, err error) {
+ r0, _, e1 := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0)
+ dt = DriveType(r0)
+ if dt == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(sizeBytes), uintptr(unsafe.Pointer(bytesReturned)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailable)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processID), 0)
+ handle = syscall.Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInformationClass), uintptr(unsafe.Pointer(systemInformation)), uintptr(systemInformationLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
+ ntstatus = uint32(r0)
+ if ntstatus == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInformationClass), uintptr(unsafe.Pointer(processInformation)), uintptr(processInformationLength), uintptr(unsafe.Pointer(returnLength)), 0)
+ ntstatus = uint32(r0)
+ if ntstatus == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(systemName)
+ if err != nil {
+ return
+ }
+ return __LookupPrivilegeName(_p0, luid, buffer, size)
+}
+
+func __LookupPrivilegeName(systemName *uint16, luid *int64, buffer *uint16, size *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(systemName)
+ if err != nil {
+ return
+ }
+ var _p1 *uint16
+ _p1, err = syscall.UTF16PtrFromString(name)
+ if err != nil {
+ return
+ }
+ return __LookupPrivilegeValue(_p0, _p1, luid)
+}
+
+func __LookupPrivilegeValue(systemName *uint16, name *uint16, luid *int64) (err error) {
+ r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {
+ var _p0 uint32
+ if releaseAll {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize)))
+ success = r0 != 0
+ if true {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
diff --git a/vendor/github.com/ethereum/go-ethereum/.dockerignore b/vendor/github.com/ethereum/go-ethereum/.dockerignore
index d280741c6..0c013d18b 100644
--- a/vendor/github.com/ethereum/go-ethereum/.dockerignore
+++ b/vendor/github.com/ethereum/go-ethereum/.dockerignore
@@ -1,7 +1,3 @@
-**/.git
-.git
-!.git/HEAD
-!.git/refs/heads
**/*_test.go
build/_workspace
diff --git a/vendor/github.com/ethereum/go-ethereum/.gitignore b/vendor/github.com/ethereum/go-ethereum/.gitignore
index 3e0009e16..3016facee 100644
--- a/vendor/github.com/ethereum/go-ethereum/.gitignore
+++ b/vendor/github.com/ethereum/go-ethereum/.gitignore
@@ -42,6 +42,7 @@ profile.cov
/dashboard/assets/node_modules
/dashboard/assets/stats.json
/dashboard/assets/bundle.js
+/dashboard/assets/bundle.js.map
/dashboard/assets/package-lock.json
**/yarn-error.log
diff --git a/vendor/github.com/ethereum/go-ethereum/.travis.yml b/vendor/github.com/ethereum/go-ethereum/.travis.yml
index d93282078..996ec4fdc 100644
--- a/vendor/github.com/ethereum/go-ethereum/.travis.yml
+++ b/vendor/github.com/ethereum/go-ethereum/.travis.yml
@@ -1,33 +1,48 @@
language: go
go_import_path: github.com/ethereum/go-ethereum
sudo: false
-matrix:
+jobs:
include:
- - os: linux
+ # This builder only tests code linters on latest version of Go
+ - stage: lint
+ os: linux
dist: xenial
- sudo: required
- go: 1.10.x
+ go: 1.12.x
+ env:
+ - lint
+ git:
+ submodules: false # avoid cloning ethereum/tests
script:
- - sudo modprobe fuse
- - sudo chmod 666 /dev/fuse
- - sudo chown root:$USER /etc/fuse.conf
- - go run build/ci.go install
- - go run build/ci.go test -coverage $TEST_PACKAGES
+ - go run build/ci.go lint
- # These are the latest Go versions.
- - os: linux
+ - stage: build
+ os: linux
dist: xenial
- sudo: required
go: 1.11.x
script:
- - sudo modprobe fuse
- - sudo chmod 666 /dev/fuse
- - sudo chown root:$USER /etc/fuse.conf
- go run build/ci.go install
- go run build/ci.go test -coverage $TEST_PACKAGES
- - os: osx
- go: 1.11.x
+ - stage: build
+ os: linux
+ dist: xenial
+ go: 1.12.x
+ script:
+ - go run build/ci.go install
+ - go run build/ci.go test -coverage $TEST_PACKAGES
+
+ # These are the latest Go versions.
+ - stage: build
+ os: linux
+ dist: xenial
+ go: 1.13.x
+ script:
+ - go run build/ci.go install
+ - go run build/ci.go test -coverage $TEST_PACKAGES
+
+ - stage: build
+ os: osx
+ go: 1.13.x
script:
- echo "Increase the maximum number of open file descriptors on macOS"
- NOFILE=20480
@@ -41,22 +56,12 @@ matrix:
- go run build/ci.go install
- go run build/ci.go test -coverage $TEST_PACKAGES
- # This builder only tests code linters on latest version of Go
- - os: linux
- dist: xenial
- go: 1.11.x
- env:
- - lint
- git:
- submodules: false # avoid cloning ethereum/tests
- script:
- - go run build/ci.go lint
-
# This builder does the Ubuntu PPA upload
- - if: type = push
+ - stage: build
+ if: type = push
os: linux
dist: xenial
- go: 1.11.x
+ go: 1.13.x
env:
- ubuntu-ppa
git:
@@ -75,11 +80,12 @@ matrix:
- go run build/ci.go debsrc -upload ethereum/ethereum -sftp-user geth-ci -signer "Go Ethereum Linux Builder "
# This builder does the Linux Azure uploads
- - if: type = push
+ - stage: build
+ if: type = push
os: linux
dist: xenial
sudo: required
- go: 1.11.x
+ go: 1.13.x
env:
- azure-linux
git:
@@ -109,12 +115,13 @@ matrix:
- go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
# This builder does the Linux Azure MIPS xgo uploads
- - if: type = push
+ - stage: build
+ if: type = push
os: linux
dist: xenial
services:
- docker
- go: 1.11.x
+ go: 1.13.x
env:
- azure-linux-mips
git:
@@ -137,7 +144,8 @@ matrix:
- go run build/ci.go archive -arch mips64le -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
# This builder does the Android Maven and Azure uploads
- - if: type = push
+ - stage: build
+ if: type = push
os: linux
dist: xenial
addons:
@@ -159,25 +167,25 @@ matrix:
git:
submodules: false # avoid cloning ethereum/tests
before_install:
- - curl https://storage.googleapis.com/golang/go1.11.5.linux-amd64.tar.gz | tar -xz
+ - curl https://dl.google.com/go/go1.13.linux-amd64.tar.gz | tar -xz
- export PATH=`pwd`/go/bin:$PATH
- export GOROOT=`pwd`/go
- export GOPATH=$HOME/go
script:
# Build the Android archive and upload it to Maven Central and Azure
- - curl https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip -o android-ndk-r17b.zip
- - unzip -q android-ndk-r17b.zip && rm android-ndk-r17b.zip
- - mv android-ndk-r17b $HOME
- - export ANDROID_NDK=$HOME/android-ndk-r17b
+ - curl https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip -o android-ndk-r19b.zip
+ - unzip -q android-ndk-r19b.zip && rm android-ndk-r19b.zip
+ - mv android-ndk-r19b $ANDROID_HOME/ndk-bundle
- mkdir -p $GOPATH/src/github.com/ethereum
- - ln -s `pwd` $GOPATH/src/github.com/ethereum
+ - ln -s `pwd` $GOPATH/src/github.com/ethereum/go-ethereum
- go run build/ci.go aar -signer ANDROID_SIGNING_KEY -deploy https://oss.sonatype.org -upload gethstore/builds
# This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads
- - if: type = push
+ - stage: build
+ if: type = push
os: osx
- go: 1.11.x
+ go: 1.13.x
env:
- azure-osx
- azure-ios
@@ -204,10 +212,11 @@ matrix:
- go run build/ci.go xcode -signer IOS_SIGNING_KEY -deploy trunk -upload gethstore/builds
# This builder does the Azure archive purges to avoid accumulating junk
- - if: type = cron
+ - stage: build
+ if: type = cron
os: linux
dist: xenial
- go: 1.11.x
+ go: 1.13.x
env:
- azure-purge
git:
diff --git a/vendor/github.com/ethereum/go-ethereum/AUTHORS b/vendor/github.com/ethereum/go-ethereum/AUTHORS
index 609dc48c7..526ea35c2 100644
--- a/vendor/github.com/ethereum/go-ethereum/AUTHORS
+++ b/vendor/github.com/ethereum/go-ethereum/AUTHORS
@@ -1,5 +1,11 @@
# This is the official list of go-ethereum authors for copyright purposes.
+a e r t h
+Abel Nieto
+Abel Nieto
+Adam Babik
+Aditya
+Adrià Cidre
Afri Schoedon <5chdn@users.noreply.github.com>
Agustin Armellini Fischer
Airead
@@ -10,165 +16,354 @@ Alex Leverington
Alex Wu
Alexandre Van de Sande
Ali Hajimirza
+am2rican5
+Andrea Franz
+Andrey Petrov
+Andrey Petrov
+ANOTHEL
+Antoine Rondelet
Anton Evangelatov
+Antonio Salazar Cardozo
Arba Sasmoyo
Armani Ferrante
Armin Braun
Aron Fischer
+atsushi-ishibashi
+ayeowch
+b00ris
+bailantaotao
+baizhenxuan
+Balint Gabor
Bas van Kervel
Benjamin Brent
+benma
Benoit Verkindt
+bloonfield
Bo
Bo Ye
Bob Glickstein
+Brent
Brian Schroeder
+Bruno Škvorc
+C. Brown
+Caesar Chad
Casey Detrio
+CDsigma
+changhong
Chase Wright
+Chen Quan
+chenyufeng
+Christian Muehlhaeuser
Christoph Jentzsch
+cong
+Corey Lin <514971757@qq.com>
+cpusoft
+Crispin Flowerday
+croath
+cui <523516579@qq.com>
+Dan Kinsley
Daniel A. Nagy
Daniel Sloof
Darrel Herbst
Dave Appleton
+Dave McGregor
+David Huie
+Derek Gottfrid
Diego Siqueira
+Diep Pham
+dipingxian2 <39109351+dipingxian2@users.noreply.github.com>
+dm4
+Dmitrij Koniajev
Dmitry Shulyak
+Domino Valdano
+Domino Valdano
+Dragan Milic
+dragonvslinux <35779158+dragononcrypto@users.noreply.github.com>
Egon Elbre
+Elad
+Eli
Elias Naur
Elliot Shepherd
+Emil
+emile
Enrique Fynn
+Enrique Fynn
+EOS Classic
+Erichin
Ernesto del Toro
Ethan Buchman
+ethersphere
Eugene Valeyev
Evangelos Pappas
+Evgeny
Evgeny Danilenko <6655321@bk.ru>
+evgk
Fabian Vogelsteller
Fabio Barone
Fabio Berger
FaceHo
Felix Lange
+Ferenc Szabo
+ferhat elmas
Fiisio
+Frank Szendzielarz <33515470+FrankSzendzielarz@users.noreply.github.com>
Frank Wang
+Franklin
Furkan KAMACI
+GagziW
Gary Rong
George Ornbo
Gregg Dourgarian
+Guilherme Salgado
Guillaume Ballet
Guillaume Nicolas
+GuiltyMorishita
+Gus
Gustav Simonsson
+Gísli Kristjánsson
+Ha ĐANG
+HackyMiner
+hadv
Hao Bryan Cheng
+HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
Henning Diedrich
+holisticode
+Hongbin Mao
+Hsien-Tang Kao
+Husam Ibrahim <39692071+HusamIbrahim@users.noreply.github.com>
+hydai
+Hyung-Kyu Hqueue Choi
+Ian Macalinao
+Ian Norden
Isidoro Ghezzi
+Iskander (Alex) Sharipov
Ivan Daniluk
+Ivo Georgiev
Jae Kwon
Jamie Pitts
+Janos Guljas
Janoš Guljaš
Jason Carver
+Javier Peletier
+Javier Peletier
+Javier Sagredo
+Jay
Jay Guo
+Jaynti Kanani
+Jeff Prestes
Jeff R. Allen
+Jeffery Robert Walsh
Jeffrey Wilcke
Jens Agerberg
+Jeremy McNevin
+Jeremy Schlatter
+Jerzy Lasyk
Jia Chenhui
Jim McDonald
+jkcomment
Joel Burget
+John C. Vernaleo
+Johns Beharry
+Jonas
Jonathan Brown
+JoranHonig
+Jordan Krage
Joseph Chow
+jtakalai
+JU HYEONG PARK
Justin Clark-Casey
Justin Drake
+jwasinger
+ken10100147
Kenji Siu
+Kenso Trabing
+Kenso Trabing
+Kevin
+kevin.xu
+kiel barry
+kimmylin <30611210+kimmylin@users.noreply.github.com>
+Kitten King <53072918+kittenking@users.noreply.github.com>
+knarfeh
Kobi Gurkan
Konrad Feldmeier
+Kris Shinn
Kurkó Mihály
+Kushagra Sharma
+Kwuaint <34888408+kwuaint@users.noreply.github.com>
Kyuntae Ethan Kim
+ledgerwatch
Lefteris Karapetsas
Leif Jurvetson
Leo Shklovskii
+LeoLiao
Lewis Marshall
+lhendre
+Liang Ma
+Liang Ma
+Liang ZOU
+libotony
+ligi
Lio李欧
+Lorenzo Manacorda
Louis Holbrook
Luca Zeug
Magicking
+manlio
Maran Hidskes
Marek Kotewicz
+Marius van der Wijden
Mark
+Mark Rushakoff
+mark.lin
+Martin Alex Philip Dawson
Martin Holst Swende
+Martin Klepsch
+Mats Julian Olsen
+Matt K <1036969+mkrump@users.noreply.github.com>
Matthew Di Ferrante
+Matthew Halpern
+Matthew Halpern
Matthew Wampler-Doty
+Max Sistemich
Maximilian Meister
Micah Zoltu
Michael Ruminer
Miguel Mota
Miya Chen
+Mohanson
+mr_franklin
+Mymskmkt <1847234666@qq.com>
+Nalin Bhardwaj
Nchinda Nchinda
+necaremus
+needkane <604476380@qq.com>
+Nguyen Kien Trung
+Nguyen Sy Thanh Son
Nick Dodson
Nick Johnson
Nicolas Guillaume
+Nilesh Trivedi