117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// 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)
							 | 
						||
| 
								 | 
							
								}
							 |