diff --git a/cmd/ipfs2/init.go b/cmd/ipfs2/init.go index 22091c9ab..495c3c401 100644 --- a/cmd/ipfs2/init.go +++ b/cmd/ipfs2/init.go @@ -50,40 +50,112 @@ var initCmd = &cmds.Command{ nBitsForKeypair = 4096 } - return nil, doInit(req.Context().ConfigRoot, dspathOverride, force, nBitsForKeypair) + return doInit(req.Context().ConfigRoot, dspathOverride, force, nBitsForKeypair) }, } +var errCannotInitConfigExists = errors.New(`ipfs configuration file already exists! +Reinitializing would overwrite your keys. +(use -f to force overwrite) +`) + +var welcomeMsg = `Hello and Welcome to IPFS! + +██╗██████╗ ███████╗███████╗ +██║██╔══██╗██╔════╝██╔════╝ +██║██████╔╝█████╗ ███████╗ +██║██╔═══╝ ██╔══╝ ╚════██║ +██║██║ ██║ ███████║ +╚═╝╚═╝ ╚═╝ ╚══════╝ + +If you're seeing this, you have successfully installed +IPFS and are now interfacing with the ipfs merkledag! + +For a short demo of what you can do, enter 'ipfs tour' +` + // TODO add default welcome hash: eaa68bedae247ed1e5bd0eb4385a3c0959b976e4 // NB: if dspath is not provided, it will be retrieved from the config -func doInit(configRoot string, dspathOverride string, force bool, nBitsForKeypair int) error { +func doInit(configRoot string, dspathOverride string, force bool, nBitsForKeypair int) (interface{}, error) { u.POut("initializing ipfs node at %s\n", configRoot) configFilename, err := config.Filename(configRoot) if err != nil { - return errors.New("Couldn't get home directory path") + return nil, errors.New("Couldn't get home directory path") } fi, err := os.Lstat(configFilename) if fi != nil || (err != nil && !os.IsNotExist(err)) { if !force { // TODO multi-line string - return errors.New("ipfs configuration file already exists!\nReinitializing would overwrite your keys.\n(use -f to force overwrite)") + return nil, errCannotInitConfigExists } } + conf, err := initConfig(configFilename, dspathOverride, nBitsForKeypair) + if err != nil { + return nil, err + } + + nd, err := core.NewIpfsNode(conf, false) + if err != nil { + return nil, err + } + defer nd.Close() + + // Set up default file + reader := bytes.NewBufferString(welcomeMsg) + + defnd, err := imp.BuildDagFromReader(reader, nd.DAG, nd.Pinning.GetManual(), chunk.DefaultSplitter) + if err != nil { + return nil, err + } + + k, _ := defnd.Key() + fmt.Printf("done.\nto test, enter: ipfs cat %s\n", k) + return nil, nil +} + +func datastoreConfig(dspath string) (config.Datastore, error) { + ds := config.Datastore{} + if len(dspath) == 0 { + var err error + dspath, err = config.DataStorePath("") + if err != nil { + return ds, err + } + } + ds.Path = dspath + ds.Type = "leveldb" + + // Construct the data store if missing + if err := os.MkdirAll(dspath, os.ModePerm); err != nil { + return ds, err + } + + // Check the directory is writeable + if f, err := os.Create(filepath.Join(dspath, "._check_writeable")); err == nil { + os.Remove(f.Name()) + } else { + return ds, errors.New("Datastore '" + dspath + "' is not writeable") + } + + return ds, nil +} + +func initConfig(configFilename string, dspathOverride string, nBitsForKeypair int) (*config.Config, error) { ds, err := datastoreConfig(dspathOverride) if err != nil { - return err + return nil, err } identity, err := identityConfig(nBitsForKeypair) if err != nil { - return err + return nil, err } - conf := config.Config{ + conf := &config.Config{ // setup the node addresses. Addresses: config.Addresses{ @@ -114,61 +186,11 @@ func doInit(configRoot string, dspathOverride string, force bool, nBitsForKeypai Version: config.VersionDefaultValue(), } - err = config.WriteConfigFile(configFilename, conf) - if err != nil { - return err + if err := config.WriteConfigFile(configFilename, conf); err != nil { + return nil, err } - nd, err := core.NewIpfsNode(&conf, false) - if err != nil { - return err - } - defer nd.Close() - - // Set up default file - msg := `Hello and Welcome to IPFS! -If you're seeing this, that means that you have successfully -installed ipfs and are now interfacing with the wonderful -world of DAGs and hashes! -` - reader := bytes.NewBufferString(msg) - - defnd, err := imp.BuildDagFromReader(reader, nd.DAG, nd.Pinning.GetManual(), chunk.DefaultSplitter) - if err != nil { - return err - } - - k, _ := defnd.Key() - fmt.Printf("Default file key: %s\n", k) - - return nil -} - -func datastoreConfig(dspath string) (config.Datastore, error) { - ds := config.Datastore{} - if len(dspath) == 0 { - var err error - dspath, err = config.DataStorePath("") - if err != nil { - return ds, err - } - } - ds.Path = dspath - ds.Type = "leveldb" - - // Construct the data store if missing - if err := os.MkdirAll(dspath, os.ModePerm); err != nil { - return ds, err - } - - // Check the directory is writeable - if f, err := os.Create(filepath.Join(dspath, "._check_writeable")); err == nil { - os.Remove(f.Name()) - } else { - return ds, errors.New("Datastore '" + dspath + "' is not writeable") - } - - return ds, nil + return conf, nil } func identityConfig(nbits int) (config.Identity, error) { @@ -178,7 +200,7 @@ func identityConfig(nbits int) (config.Identity, error) { return ident, errors.New("Bitsize less than 1024 is considered unsafe.") } - fmt.Println("generating key pair...") + fmt.Printf("generating key pair...") sk, pk, err := ci.GenerateKeyPair(ci.RSA, nbits) if err != nil { return ident, err