1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-08-06 19:44:01 +08:00

Merge pull request #6489 from djdv/feat/init-with-config-file

feat: add ability to use existing config during init
This commit is contained in:
Steven Allen
2019-08-28 16:19:36 -07:00
committed by GitHub
5 changed files with 96 additions and 42 deletions

View File

@ -13,6 +13,8 @@ import (
"sync" "sync"
version "github.com/ipfs/go-ipfs" version "github.com/ipfs/go-ipfs"
config "github.com/ipfs/go-ipfs-config"
cserial "github.com/ipfs/go-ipfs-config/serialize"
utilmain "github.com/ipfs/go-ipfs/cmd/ipfs/util" utilmain "github.com/ipfs/go-ipfs/cmd/ipfs/util"
oldcmds "github.com/ipfs/go-ipfs/commands" oldcmds "github.com/ipfs/go-ipfs/commands"
"github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/core"
@ -26,11 +28,11 @@ import (
migrate "github.com/ipfs/go-ipfs/repo/fsrepo/migrations" migrate "github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
"github.com/ipfs/go-ipfs-cmds" cmds "github.com/ipfs/go-ipfs-cmds"
mprome "github.com/ipfs/go-metrics-prometheus" mprome "github.com/ipfs/go-metrics-prometheus"
goprocess "github.com/jbenet/goprocess" goprocess "github.com/jbenet/goprocess"
ma "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr"
"github.com/multiformats/go-multiaddr-net" manet "github.com/multiformats/go-multiaddr-net"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -38,6 +40,7 @@ const (
adjustFDLimitKwd = "manage-fdlimit" adjustFDLimitKwd = "manage-fdlimit"
enableGCKwd = "enable-gc" enableGCKwd = "enable-gc"
initOptionKwd = "init" initOptionKwd = "init"
initConfigOptionKwd = "init-config"
initProfileOptionKwd = "init-profile" initProfileOptionKwd = "init-profile"
ipfsMountKwd = "mount-ipfs" ipfsMountKwd = "mount-ipfs"
ipnsMountKwd = "mount-ipns" ipnsMountKwd = "mount-ipns"
@ -154,6 +157,7 @@ Headers.
Options: []cmds.Option{ Options: []cmds.Option{
cmds.BoolOption(initOptionKwd, "Initialize ipfs with default settings if not already initialized"), cmds.BoolOption(initOptionKwd, "Initialize ipfs with default settings if not already initialized"),
cmds.StringOption(initConfigOptionKwd, "Path to existing configuration file to be loaded during --init"),
cmds.StringOption(initProfileOptionKwd, "Configuration profiles to apply for --init. See ipfs init --help for more"), cmds.StringOption(initProfileOptionKwd, "Configuration profiles to apply for --init. See ipfs init --help for more"),
cmds.StringOption(routingOptionKwd, "Overrides the routing option").WithDefault(routingOptionDefaultKwd), cmds.StringOption(routingOptionKwd, "Overrides the routing option").WithDefault(routingOptionDefaultKwd),
cmds.BoolOption(mountKwd, "Mounts IPFS to the filesystem"), cmds.BoolOption(mountKwd, "Mounts IPFS to the filesystem"),
@ -229,17 +233,20 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
// first, whether user has provided the initialization flag. we may be // first, whether user has provided the initialization flag. we may be
// running in an uninitialized state. // running in an uninitialized state.
initialize, _ := req.Options[initOptionKwd].(bool) initialize, _ := req.Options[initOptionKwd].(bool)
if initialize { if initialize && !fsrepo.IsInitialized(cctx.ConfigRoot) {
cfgLocation, _ := req.Options[initConfigOptionKwd].(string)
cfg := cctx.ConfigRoot
if !fsrepo.IsInitialized(cfg) {
profiles, _ := req.Options[initProfileOptionKwd].(string) profiles, _ := req.Options[initProfileOptionKwd].(string)
var conf *config.Config
err := initWithDefaults(os.Stdout, cfg, profiles) if cfgLocation != "" {
if err != nil { if conf, err = cserial.Load(cfgLocation); err != nil {
return err return err
} }
} }
if err = doInit(os.Stdout, cctx.ConfigRoot, false, nBitsForKeypairDefault, profiles, conf); err != nil {
return err
}
} }
// acquire the repo lock _before_ constructing a node. we need to make // acquire the repo lock _before_ constructing a node. we need to make

View File

@ -7,7 +7,7 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"path" "path/filepath"
"strings" "strings"
assets "github.com/ipfs/go-ipfs/assets" assets "github.com/ipfs/go-ipfs/assets"
@ -16,9 +16,9 @@ import (
namesys "github.com/ipfs/go-ipfs/namesys" namesys "github.com/ipfs/go-ipfs/namesys"
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
"github.com/ipfs/go-ipfs-cmds" cmds "github.com/ipfs/go-ipfs-cmds"
"github.com/ipfs/go-ipfs-config" config "github.com/ipfs/go-ipfs-config"
"github.com/ipfs/go-ipfs-files" files "github.com/ipfs/go-ipfs-files"
) )
const ( const (
@ -28,6 +28,10 @@ const (
profileOptionName = "profile" profileOptionName = "profile"
) )
var errRepoExists = errors.New(`ipfs configuration file already exists!
Reinitializing would overwrite your keys.
`)
var initCmd = &cmds.Command{ var initCmd = &cmds.Command{
Helptext: cmds.HelpText{ Helptext: cmds.HelpText{
Tagline: "Initializes ipfs config file.", Tagline: "Initializes ipfs config file.",
@ -102,31 +106,30 @@ environment variable:
} }
} }
profile, _ := req.Options[profileOptionName].(string) profiles, _ := req.Options[profileOptionName].(string)
var profiles []string
if profile != "" {
profiles = strings.Split(profile, ",")
}
return doInit(os.Stdout, cctx.ConfigRoot, empty, nBitsForKeypair, profiles, conf) return doInit(os.Stdout, cctx.ConfigRoot, empty, nBitsForKeypair, profiles, conf)
}, },
} }
var errRepoExists = errors.New(`ipfs configuration file already exists! func applyProfiles(conf *config.Config, profiles string) error {
Reinitializing would overwrite your keys. if profiles == "" {
`) return nil
func initWithDefaults(out io.Writer, repoRoot string, profile string) error {
var profiles []string
if profile != "" {
profiles = strings.Split(profile, ",")
} }
return doInit(out, repoRoot, false, nBitsForKeypairDefault, profiles, nil) for _, profile := range strings.Split(profiles, ",") {
transformer, ok := config.Profiles[profile]
if !ok {
return fmt.Errorf("invalid configuration profile: %s", profile)
}
if err := transformer.Transform(conf); err != nil {
return err
}
}
return nil
} }
func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int, confProfiles []string, conf *config.Config) error { func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int, confProfiles string, conf *config.Config) error {
if _, err := fmt.Fprintf(out, "initializing IPFS node at %s\n", repoRoot); err != nil { if _, err := fmt.Fprintf(out, "initializing IPFS node at %s\n", repoRoot); err != nil {
return err return err
} }
@ -147,16 +150,9 @@ func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int, con
} }
} }
for _, profile := range confProfiles { if err := applyProfiles(conf, confProfiles); err != nil {
transformer, ok := config.Profiles[profile]
if !ok {
return fmt.Errorf("invalid configuration profile: %s", profile)
}
if err := transformer.Transform(conf); err != nil {
return err return err
} }
}
if err := fsrepo.Init(repoRoot, conf); err != nil { if err := fsrepo.Init(repoRoot, conf); err != nil {
return err return err
@ -175,7 +171,7 @@ func checkWritable(dir string) error {
_, err := os.Stat(dir) _, err := os.Stat(dir)
if err == nil { if err == nil {
// dir exists, make sure we can write to it // dir exists, make sure we can write to it
testfile := path.Join(dir, "test") testfile := filepath.Join(dir, "test")
fi, err := os.Create(testfile) fi, err := os.Create(testfile)
if err != nil { if err != nil {
if os.IsPermission(err) { if os.IsPermission(err) {

View File

@ -212,12 +212,12 @@ test_set_address_vars() {
test_launch_ipfs_daemon() { test_launch_ipfs_daemon() {
args="$@" args=("$@")
test "$TEST_ULIMIT_PRESET" != 1 && ulimit -n 2048 test "$TEST_ULIMIT_PRESET" != 1 && ulimit -n 2048
test_expect_success "'ipfs daemon' succeeds" ' test_expect_success "'ipfs daemon' succeeds" '
ipfs daemon $args >actual_daemon 2>daemon_err & ipfs daemon "${args[@]}" >actual_daemon 2>daemon_err &
IPFS_PID=$! IPFS_PID=$!
' '

View File

@ -163,6 +163,20 @@ test_expect_success "'ipfs config Addresses.API' looks good" '
test $(cat actual_config) = "/ip4/127.0.0.1/tcp/0" test $(cat actual_config) = "/ip4/127.0.0.1/tcp/0"
' '
test_expect_success "ipfs init from existing config succeeds" '
export ORIG_PATH=$IPFS_PATH
export IPFS_PATH=$(pwd)/.ipfs-clone
ipfs init "$ORIG_PATH/config" &&
ipfs config Addresses.API > actual_config &&
test $(cat actual_config) = "/ip4/127.0.0.1/tcp/0"
'
test_expect_success "clean up ipfs clone dir and reset IPFS_PATH" '
rm -rf "$IPFS_PATH" &&
export IPFS_PATH=$ORIG_PATH
'
test_expect_success "clean up ipfs dir" ' test_expect_success "clean up ipfs dir" '
rm -rf "$IPFS_PATH" rm -rf "$IPFS_PATH"
' '

View File

@ -8,6 +8,43 @@ test_description="Test daemon command"
. lib/test-lib.sh . lib/test-lib.sh
test_expect_success "test environment initialized" '
export ORIG_IPFS_PATH="$IPFS_PATH"
export ORIG_PATH="$(pwd)/.ipfs"
export IPFS_PATH="$ORIG_PATH"
export CLONE_PATH="$(pwd)/.ipfs-clone"
ipfs init --profile=badgerds > /dev/null
'
export IPFS_PATH=$CLONE_PATH
test_launch_ipfs_daemon --init --init-config="$ORIG_PATH/config"
test_kill_ipfs_daemon
test_expect_success "daemon initialization with existing config works" '
ipfs config "Datastore.Spec.child.path" >actual &&
test $(cat actual) = "badgerds"
'
test_expect_success "clean up daemon clone" '
rm -rf "$CLONE_PATH"
'
test_launch_ipfs_daemon --init --init-config="$ORIG_PATH/config" --init-profile=randomports
test_kill_ipfs_daemon
test_expect_failure "daemon initialization with existing config + profiles works" '
ipfs config Addresses >clone_conf &&
IPFS_PATH=$ORIG_PATH &&
ipfs config Addresses >orig_conf &&
test_cmp clone_conf orig_conf
'
test_expect_success "clean up test environment" '
rm -rf "$CLONE_PATH"
rm -rf "$ORIG_PATH"
export IPFS_PATH=$ORIG_IPFS_PATH
'
test_init_ipfs test_init_ipfs
test_launch_ipfs_daemon test_launch_ipfs_daemon