aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/swarm
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/swarm')
-rw-r--r--cmd/swarm/cleandb.go38
-rw-r--r--cmd/swarm/db.go116
-rw-r--r--cmd/swarm/main.go61
-rw-r--r--cmd/swarm/run_test.go1
-rw-r--r--cmd/swarm/upload_test.go2
5 files changed, 175 insertions, 43 deletions
diff --git a/cmd/swarm/cleandb.go b/cmd/swarm/cleandb.go
deleted file mode 100644
index 268076062..000000000
--- a/cmd/swarm/cleandb.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum 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 General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
-
-package main
-
-import (
- "github.com/ethereum/go-ethereum/cmd/utils"
- "github.com/ethereum/go-ethereum/swarm/storage"
- "gopkg.in/urfave/cli.v1"
-)
-
-func cleandb(ctx *cli.Context) {
- args := ctx.Args()
- if len(args) != 1 {
- utils.Fatalf("Need path to chunks database as the first and only argument")
- }
-
- chunkDbPath := args[0]
- hash := storage.MakeHashFunc("SHA3")
- dbStore, err := storage.NewDbStore(chunkDbPath, hash, 10000000, 0)
- if err != nil {
- utils.Fatalf("Cannot initialise dbstore: %v", err)
- }
- dbStore.Cleanup()
-}
diff --git a/cmd/swarm/db.go b/cmd/swarm/db.go
new file mode 100644
index 000000000..dfd2d069b
--- /dev/null
+++ b/cmd/swarm/db.go
@@ -0,0 +1,116 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/swarm/storage"
+ "gopkg.in/urfave/cli.v1"
+)
+
+func dbExport(ctx *cli.Context) {
+ args := ctx.Args()
+ if len(args) != 2 {
+ utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database) and <file> (path to write the tar archive to, - for stdout)")
+ }
+
+ store, err := openDbStore(args[0])
+ if err != nil {
+ utils.Fatalf("error opening local chunk database: %s", err)
+ }
+ defer store.Close()
+
+ var out io.Writer
+ if args[1] == "-" {
+ out = os.Stdout
+ } else {
+ f, err := os.Create(args[1])
+ if err != nil {
+ utils.Fatalf("error opening output file: %s", err)
+ }
+ defer f.Close()
+ out = f
+ }
+
+ count, err := store.Export(out)
+ if err != nil {
+ utils.Fatalf("error exporting local chunk database: %s", err)
+ }
+
+ log.Info(fmt.Sprintf("successfully exported %d chunks", count))
+}
+
+func dbImport(ctx *cli.Context) {
+ args := ctx.Args()
+ if len(args) != 2 {
+ utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database) and <file> (path to read the tar archive from, - for stdin)")
+ }
+
+ store, err := openDbStore(args[0])
+ if err != nil {
+ utils.Fatalf("error opening local chunk database: %s", err)
+ }
+ defer store.Close()
+
+ var in io.Reader
+ if args[1] == "-" {
+ in = os.Stdin
+ } else {
+ f, err := os.Open(args[1])
+ if err != nil {
+ utils.Fatalf("error opening input file: %s", err)
+ }
+ defer f.Close()
+ in = f
+ }
+
+ count, err := store.Import(in)
+ if err != nil {
+ utils.Fatalf("error importing local chunk database: %s", err)
+ }
+
+ log.Info(fmt.Sprintf("successfully imported %d chunks", count))
+}
+
+func dbClean(ctx *cli.Context) {
+ args := ctx.Args()
+ if len(args) != 1 {
+ utils.Fatalf("invalid arguments, please specify <chunkdb> (path to a local chunk database)")
+ }
+
+ store, err := openDbStore(args[0])
+ if err != nil {
+ utils.Fatalf("error opening local chunk database: %s", err)
+ }
+ defer store.Close()
+
+ store.Cleanup()
+}
+
+func openDbStore(path string) (*storage.DbStore, error) {
+ if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil {
+ return nil, fmt.Errorf("invalid chunkdb path: %s", err)
+ }
+ hash := storage.MakeHashFunc("SHA3")
+ return storage.NewDbStore(path, hash, 10000000, 0)
+}
diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go
index 4ae06a1c9..603fd9b94 100644
--- a/cmd/swarm/main.go
+++ b/cmd/swarm/main.go
@@ -25,6 +25,7 @@ import (
"os"
"os/signal"
"runtime"
+ "sort"
"strconv"
"strings"
"syscall"
@@ -240,15 +241,69 @@ Removes a path from the manifest
},
},
{
- Action: cleandb,
+ Name: "db",
+ Usage: "manage the local chunk database",
+ ArgsUsage: "db COMMAND",
+ Description: `
+Manage the local chunk database.
+`,
+ Subcommands: []cli.Command{
+ {
+ Action: dbExport,
+ Name: "export",
+ Usage: "export a local chunk database as a tar archive (use - to send to stdout)",
+ ArgsUsage: "<chunkdb> <file>",
+ Description: `
+Export a local chunk database as a tar archive (use - to send to stdout).
+
+ swarm db export ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar
+
+The export may be quite large, consider piping the output through the Unix
+pv(1) tool to get a progress bar:
+
+ swarm db export ~/.ethereum/swarm/bzz-KEY/chunks - | pv > chunks.tar
+`,
+ },
+ {
+ Action: dbImport,
+ Name: "import",
+ Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)",
+ ArgsUsage: "<chunkdb> <file>",
+ Description: `
+Import chunks from a tar archive into a local chunk database (use - to read from stdin).
+
+ swarm db import ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar
+
+The import may be quite large, consider piping the input through the Unix
+pv(1) tool to get a progress bar:
+
+ pv chunks.tar | swarm db import ~/.ethereum/swarm/bzz-KEY/chunks -
+`,
+ },
+ {
+ Action: dbClean,
+ Name: "clean",
+ Usage: "remove corrupt entries from a local chunk database",
+ ArgsUsage: "<chunkdb>",
+ Description: `
+Remove corrupt entries from a local chunk database.
+`,
+ },
+ },
+ },
+ {
+ Action: func(ctx *cli.Context) {
+ utils.Fatalf("ERROR: 'swarm cleandb' has been removed, please use 'swarm db clean'.")
+ },
Name: "cleandb",
- Usage: "Cleans database of corrupted entries",
+ Usage: "DEPRECATED: use 'swarm db clean'",
ArgsUsage: " ",
Description: `
-Cleans database of corrupted entries.
+DEPRECATED: use 'swarm db clean'.
`,
},
}
+ sort.Sort(cli.CommandsByName(app.Commands))
app.Flags = []cli.Flag{
utils.IdentityFlag,
diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go
index 05cbb27f1..aaaf9e1e5 100644
--- a/cmd/swarm/run_test.go
+++ b/cmd/swarm/run_test.go
@@ -161,6 +161,7 @@ func newTestNode(t *testing.T, dir string) *testNode {
conf := &node.Config{
DataDir: dir,
IPCPath: "bzzd.ipc",
+ NoUSB: true,
}
n, err := node.New(conf)
if err != nil {
diff --git a/cmd/swarm/upload_test.go b/cmd/swarm/upload_test.go
index 5b74dd4f1..5656186e1 100644
--- a/cmd/swarm/upload_test.go
+++ b/cmd/swarm/upload_test.go
@@ -27,8 +27,6 @@ import (
// TestCLISwarmUp tests that running 'swarm up' makes the resulting file
// available from all nodes via the HTTP API
func TestCLISwarmUp(t *testing.T) {
- t.Skip("flaky test")
-
// start 3 node cluster
t.Log("starting 3 node cluster")
cluster := newTestCluster(t, 3)