added command context initialization
Juan Batiz-Benet committed
Oct 2, 2014 at 02:47 UTC
2bd843123e5b3b840a0f975896599862d2861d10
3 files changed
+69
-55
cmd/ipfs/ipfs.go
+50
@@ -8,9 +8,11 @@ import (
8
9
flag "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag"
10
commander "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
11
+ ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
12
13
config "github.com/jbenet/go-ipfs/config"
14
core "github.com/jbenet/go-ipfs/core"
15
+ daemon "github.com/jbenet/go-ipfs/daemon"
16
u "github.com/jbenet/go-ipfs/util"
17
)
18
@@ -100,6 +102,7 @@ func main() {
102
return
103
}
104
105
+// localNode constructs a node
106
func localNode(confdir string, online bool) (*core.IpfsNode, error) {
107
filename, err := config.Filename(confdir)
108
if err != nil {
@@ -131,3 +134,50 @@ func getConfigDir(c *commander.Command) (string, error) {
134
135
return u.TildeExpansion(confStr)
136
}
137
+
138
+// cmdContext is a wrapper structure that keeps a node, a daemonlistener, and
139
+// a config directory together. These three are needed for most commands.
140
+type cmdContext struct {
141
+ node *core.IpfsNode
142
+ daemon *daemon.DaemonListener
143
+ configDir string
144
+}
145
+
146
+// setupCmdContext initializes a cmdContext structure from a given command.
147
+func setupCmdContext(c *commander.Command, online bool) (cc cmdContext, err error) {
148
+ cc.configDir, err = getConfigDir(c.Parent.Parent)
149
+ if err != nil {
150
+ return
151
+ }
152
+
153
+ cc.node, err = localNode(cc.configDir, online)
154
+ if err != nil {
155
+ return
156
+ }
157
+
158
+ cc.daemon, err = setupDaemon(cc.configDir, cc.node)
159
+ if err != nil {
160
+ return
161
+ }
162
+
163
+ return
164
+}
165
+
166
+// setupDaemon sets up the daemon corresponding to given node.
167
+func setupDaemon(confdir string, node *core.IpfsNode) (*daemon.DaemonListener, error) {
168
+ if node.Config.Addresses.API == "" {
169
+ return nil, errors.New("no config.Addresses.API endpoint supplied")
170
+ }
171
+
172
+ maddr, err := ma.NewMultiaddr(node.Config.Addresses.API)
173
+ if err != nil {
174
+ return nil, err
175
+ }
176
+
177
+ dl, err := daemon.NewDaemonListener(node, maddr, confdir)
178
+ if err != nil {
179
+ return nil, err
180
+ }
181
+ go dl.Listen()
182
+ return dl, nil
183
+}
cmd/ipfs/run.go
+10
-22
@@ -1,12 +1,12 @@
1
package main
2
3
import (
4
- "errors"
4
+ "os"
5
+ "os/signal"
6
+ "syscall"
7
8
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag"
9
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
8
- ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
9
- "github.com/jbenet/go-ipfs/daemon"
10
)
11
12
var cmdIpfsRun = &commander.Command{
@@ -19,30 +19,18 @@ var cmdIpfsRun = &commander.Command{
19
}
20
21
func runCmd(c *commander.Command, inp []string) error {
22
- conf, err := getConfigDir(c.Parent)
23
- if err != nil {
24
- return err
25
- }
26
- n, err := localNode(conf, true)
22
+ cc, err := setupCmdContext(c, true)
23
if err != nil {
24
return err
25
}
26
31
- // launch the RPC endpoint.
32
- if n.Config.Addresses.API == "" {
33
- return errors.New("no config.Addresses.API endpoint supplied")
34
- }
27
+ sigc := make(chan os.Signal, 1)
28
+ signal.Notify(sigc, syscall.SIGHUP, syscall.SIGINT,
29
+ syscall.SIGTERM, syscall.SIGQUIT)
30
36
- maddr, err := ma.NewMultiaddr(n.Config.Addresses.API)
37
- if err != nil {
38
- return err
39
- }
31
+ // wait until we get a signal to exit.
32
+ <-sigc
33
41
- dl, err := daemon.NewDaemonListener(n, maddr, conf)
42
- if err != nil {
43
- return err
44
- }
45
- dl.Listen()
46
- dl.Close()
34
+ cc.daemon.Close()
35
return nil
36
}
cmd/ipfs/serve.go
+9
-33
@@ -1,14 +1,12 @@
1
package main
2
3
import (
4
- "errors"
4
"fmt"
5
6
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag"
7
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
8
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
9
11
- "github.com/jbenet/go-ipfs/daemon"
10
h "github.com/jbenet/go-ipfs/server/http"
11
)
12
@@ -16,58 +14,36 @@ var cmdIpfsServe = &commander.Command{
14
UsageLine: "serve",
15
Short: "Serve an interface to ipfs",
16
Subcommands: []*commander.Command{
19
- cmdIpfsServeHttp,
17
+ cmdIpfsServeHTTP,
18
},
19
Flag: *flag.NewFlagSet("ipfs-serve", flag.ExitOnError),
20
}
21
24
-var cmdIpfsServeHttp = &commander.Command{
22
+var cmdIpfsServeHTTP = &commander.Command{
23
UsageLine: "http",
24
Short: "Serve an HTTP API",
25
Long: `ipfs serve http - Serve an http gateway into ipfs.`,
28
- Run: serveHttpCmd,
26
+ Run: serveHTTPCmd,
27
Flag: *flag.NewFlagSet("ipfs-serve-http", flag.ExitOnError),
28
}
29
30
func init() {
33
- cmdIpfsServeHttp.Flag.String("address", "/ip4/127.0.0.1/tcp/8080", "Listen Address")
31
+ cmdIpfsServeHTTP.Flag.String("address", "/ip4/127.0.0.1/tcp/8080", "Listen Address")
32
}
33
36
-func serveHttpCmd(c *commander.Command, _ []string) error {
37
- conf, err := getConfigDir(c.Parent.Parent)
34
+func serveHTTPCmd(c *commander.Command, _ []string) error {
35
+ cc, err := setupCmdContext(c, true)
36
if err != nil {
37
return err
38
}
41
-
42
- n, err := localNode(conf, true)
43
- if err != nil {
44
- return err
45
- }
46
-
47
- // launch the API RPC endpoint.
48
- if n.Config.Addresses.API == "" {
49
- return errors.New("no config.RPCAddress endpoint supplied")
50
- }
51
-
52
- maddr, err := ma.NewMultiaddr(n.Config.Addresses.API)
53
- if err != nil {
54
- return err
55
- }
56
-
57
- dl, err := daemon.NewDaemonListener(n, maddr, conf)
58
- if err != nil {
59
- fmt.Println("Failed to create daemon listener.")
60
- return err
61
- }
62
- go dl.Listen()
63
- defer dl.Close()
39
+ defer cc.daemon.Close()
40
41
address := c.Flag.Lookup("address").Value.Get().(string)
66
- maddr, err = ma.NewMultiaddr(address)
42
+ maddr, err := ma.NewMultiaddr(address)
43
if err != nil {
44
return err
45
}
46
47
fmt.Printf("Serving on %s\n", address)
72
- return h.Serve(maddr, n)
48
+ return h.Serve(maddr, cc.node)
49
}