From 6989686b8beb0b0381e9c3df766cae1d3e232214 Mon Sep 17 00:00:00 2001 From: Siva Chandran Date: Tue, 19 Apr 2016 14:53:17 +0530 Subject: [PATCH] Implements repository initialization with default config Modified init command to receive default configuration from stdin. The changes enable us to use existing key-pair, datastore configuration while initializing new ipfs node. License: MIT Signed-off-by: Sivachandran --- cmd/ipfs/init.go | 37 +++++++++++++++---- test/sharness/t0022-init-default.sh | 55 +++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 7 deletions(-) create mode 100755 test/sharness/t0022-init-default.sh diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index 627dd769f..78f33befc 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "errors" "fmt" "io" @@ -30,7 +31,9 @@ at ~/.ipfs. To change the repo location, set the $IPFS_PATH environment variable export IPFS_PATH=/path/to/ipfsrepo `, }, - + Arguments: []cmds.Argument{ + cmds.FileArg("default-config", false, false, "Initialize with the given configuration.").EnableStdin(), + }, Options: []cmds.Option{ cmds.IntOption("bits", "b", fmt.Sprintf("Number of bits to use in the generated RSA private key (defaults to %d)", nBitsForKeypairDefault)), cmds.BoolOption("empty-repo", "e", "Don't add and pin help files to the local storage."), @@ -77,7 +80,24 @@ at ~/.ipfs. To change the repo location, set the $IPFS_PATH environment variable nBitsForKeypair = nBitsForKeypairDefault } - if err := doInit(os.Stdout, req.InvocContext().ConfigRoot, empty, nBitsForKeypair); err != nil { + var conf *config.Config + + f := req.Files() + if f != nil { + confFile, err := f.NextFile() + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + + conf = &config.Config{} + if err := json.NewDecoder(confFile).Decode(conf); err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + } + + if err := doInit(os.Stdout, req.InvocContext().ConfigRoot, empty, nBitsForKeypair, conf); err != nil { res.SetError(err, cmds.ErrNormal) return } @@ -89,10 +109,10 @@ Reinitializing would overwrite your keys. `) func initWithDefaults(out io.Writer, repoRoot string) error { - return doInit(out, repoRoot, false, nBitsForKeypairDefault) + return doInit(out, repoRoot, false, nBitsForKeypairDefault, nil) } -func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int) error { +func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int, conf *config.Config) error { if _, err := fmt.Fprintf(out, "initializing ipfs node at %s\n", repoRoot); err != nil { return err } @@ -105,9 +125,12 @@ func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int) err return errRepoExists } - conf, err := config.Init(out, nBitsForKeypair) - if err != nil { - return err + if conf == nil { + var err error + conf, err = config.Init(out, nBitsForKeypair) + if err != nil { + return err + } } if err := fsrepo.Init(repoRoot, conf); err != nil { diff --git a/test/sharness/t0022-init-default.sh b/test/sharness/t0022-init-default.sh new file mode 100755 index 000000000..a26910f90 --- /dev/null +++ b/test/sharness/t0022-init-default.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Copyright (c) 2014 Christian Couder +# MIT Licensed; see the LICENSE file in this repository. +# + +test_description="Test init command with default config" + +. lib/test-lib.sh + +cfg_key="Addresses.API" +cfg_val="/ip4/0.0.0.0/tcp/5001" + +# test that init succeeds +test_expect_success "ipfs init succeeds" ' + export IPFS_PATH="$(pwd)/.ipfs" && + echo "IPFS_PATH: \"$IPFS_PATH\"" && + BITS="2048" && + ipfs init --bits="$BITS" >actual_init || + test_fsh cat actual_init +' + +test_expect_success ".ipfs/config has been created" ' + test -f "$IPFS_PATH"/config || + test_fsh ls -al .ipfs +' + +test_expect_success "ipfs config succeeds" ' + ipfs config $cfg_flags "$cfg_key" "$cfg_val" +' + +test_expect_success "ipfs read config succeeds" ' + IPFS_DEFAULT_CONFIG=$(cat "$IPFS_PATH"/config) +' + +test_expect_success "clean up ipfs dir" ' + rm -rf "$IPFS_PATH" +' + +test_expect_success "ipfs init default config succeeds" ' + echo $IPFS_DEFAULT_CONFIG | ipfs init >actual_init || + test_fsh cat actual_init +' + +test_expect_success "ipfs config output looks good" ' + echo "$cfg_val" >expected && + ipfs config "$cfg_key" >actual && + test_cmp expected actual +' + +test_launch_ipfs_daemon + +test_kill_ipfs_daemon + +test_done