diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index b868f2b91dcc9b5c4d4a47265f5471fd081f6b98..d70b6f3f9f98d16694c120dfbdf6a4d8da891d46 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -92,6 +92,12 @@ func initCmd(c *commander.Command, inp []string) error { API: "/ip4/127.0.0.1/tcp/5001", } + // setup the node mount points. + cfg.Mounts = config.Mounts{ + IPFS: "/ipfs", + IPNS: "/ipns", + } + nbits, ok := c.Flag.Lookup("b").Value.Get().(int) if !ok { return errors.New("failed to get bits flag") diff --git a/cmd/ipfs/mount_unix.go b/cmd/ipfs/mount_unix.go index 03515ad5fb7ec034e67937160c36fe77326c483d..1b4e8709a4291e848fa863a34d8c831772024cef 100644 --- a/cmd/ipfs/mount_unix.go +++ b/cmd/ipfs/mount_unix.go @@ -3,14 +3,12 @@ package main import ( - "errors" "fmt" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - "github.com/jbenet/go-ipfs/daemon" + core "github.com/jbenet/go-ipfs/core" ipns "github.com/jbenet/go-ipfs/fuse/ipns" rofs "github.com/jbenet/go-ipfs/fuse/readonly" ) @@ -30,59 +28,64 @@ var cmdIpfsMount = &commander.Command{ } func init() { + cmdIpfsMount.Flag.String("f", "", "specify a mountpoint for ipfs") cmdIpfsMount.Flag.String("n", "", "specify a mountpoint for ipns") - cmdIpfsMount.Flag.String("f", "/ipfs", "specify a mountpoint for ipfs") } func mountCmd(c *commander.Command, inp []string) error { - conf, err := getConfigDir(c.Parent) - if err != nil { - fmt.Println("Couldnt get config dir") - return err - } - n, err := localNode(conf, true) + + cc, err := setupCmdContext(c, true) if err != nil { - fmt.Println("Local node creation failed.") return err } + defer cc.daemon.Close() - // launch the API RPC endpoint. - if n.Config.Addresses.API == "" { - return errors.New("no config.RPCAddress endpoint supplied") + // update fsdir with flag. + fsdir := cc.node.Config.Mounts.IPFS + if val, ok := c.Flag.Lookup("f").Value.Get().(string); ok && val != "" { + fsdir = val } + fsdone := mountIpfs(cc.node, fsdir) - maddr, err := ma.NewMultiaddr(n.Config.Addresses.API) - if err != nil { - return err + // get default mount points + nsdir := cc.node.Config.Mounts.IPNS + if val, ok := c.Flag.Lookup("n").Value.Get().(string); ok && val != "" { + nsdir = val } + nsdone := mountIpns(cc.node, nsdir, fsdir) - dl, err := daemon.NewDaemonListener(n, maddr, conf) - if err != nil { - fmt.Println("Failed to create daemon listener.") - return err - } - go dl.Listen() - defer dl.Close() - - mp := c.Flag.Lookup("f").Value.Get().(string) - fmt.Printf("Mounting at %s\n", mp) - - var ipnsDone chan struct{} - ns, ok := c.Flag.Lookup("n").Value.Get().(string) - if ok && ns != "" { - ipnsDone = make(chan struct{}) - go func() { - err = ipns.Mount(n, ns, mp) - if err != nil { - fmt.Printf("Error mounting ipns: %s\n", err) - } - ipnsDone <- struct{}{} - }() - } + // wait till mounts are done. + err1 := <-fsdone + err2 := <-nsdone - err = rofs.Mount(n, mp) - if ipnsDone != nil { - <-ipnsDone + if err1 != nil { + return err1 } - return err + return err2 +} + +func mountIpfs(node *core.IpfsNode, fsdir string) <-chan error { + done := make(chan error) + fmt.Printf("mounting ipfs at %s\n", fsdir) + + go func() { + err := rofs.Mount(node, fsdir) + done <- err + close(done) + }() + + return done +} + +func mountIpns(node *core.IpfsNode, nsdir, fsdir string) <-chan error { + done := make(chan error) + fmt.Printf("mounting ipns at %s\n", nsdir) + + go func() { + err := ipns.Mount(node, nsdir, fsdir) + done <- err + close(done) + }() + + return done } diff --git a/config/config.go b/config/config.go index 5c8f202a7b98bbba2f130fc1b8bd09e0671c1acd..5a25118bdd307f2991c2c52e6fa40fff142b8eab 100644 --- a/config/config.go +++ b/config/config.go @@ -29,6 +29,12 @@ type Addresses struct { API string // address for the local API (RPC) } +// Mounts stores the (string) mount points +type Mounts struct { + IPFS string + IPNS string +} + // BootstrapPeer is a peer used to bootstrap the network. type BootstrapPeer struct { Address string @@ -40,6 +46,7 @@ type Config struct { Identity Identity // local node's peer identity Datastore Datastore // local node's storage Addresses Addresses // local node's addresses + Mounts Mounts // local node's mount points Bootstrap []*BootstrapPeer // local nodes's bootstrap peers }