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:
@ -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)
|
||||||
|
profiles, _ := req.Options[initProfileOptionKwd].(string)
|
||||||
|
var conf *config.Config
|
||||||
|
|
||||||
cfg := cctx.ConfigRoot
|
if cfgLocation != "" {
|
||||||
if !fsrepo.IsInitialized(cfg) {
|
if conf, err = cserial.Load(cfgLocation); err != nil {
|
||||||
profiles, _ := req.Options[initProfileOptionKwd].(string)
|
|
||||||
|
|
||||||
err := initWithDefaults(os.Stdout, cfg, profiles)
|
|
||||||
if 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
|
||||||
|
@ -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,15 +150,8 @@ 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]
|
return err
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("invalid configuration profile: %s", profile)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := transformer.Transform(conf); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := fsrepo.Init(repoRoot, conf); err != nil {
|
if err := fsrepo.Init(repoRoot, conf); err != nil {
|
||||||
@ -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) {
|
||||||
|
@ -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=$!
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -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"
|
||||||
'
|
'
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user