Skip to content

Commit b1805a7

Browse files
committed
cmd: validate repo/api file and print nicer error message
License: MIT Signed-off-by: Jakub Sztandera <[email protected]>
1 parent 3722e90 commit b1805a7

File tree

5 files changed

+55
-29
lines changed

5 files changed

+55
-29
lines changed

cmd/ipfs/daemon.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ import (
1111
"sort"
1212
"sync"
1313

14-
"gx/ipfs/QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7/go-multiaddr-net"
15-
_ "gx/ipfs/QmV3NSS3A1kX5s28r7yLczhDsXzkgo65cqRgKFXYunWZmD/metrics/runtime"
16-
17-
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
18-
1914
cmds "github.com/ipfs/go-ipfs/commands"
2015
"github.com/ipfs/go-ipfs/core"
2116
commands "github.com/ipfs/go-ipfs/core/commands"
@@ -25,10 +20,15 @@ import (
2520
nodeMount "github.com/ipfs/go-ipfs/fuse/node"
2621
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
2722
migrate "github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
23+
24+
"gx/ipfs/QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7/go-multiaddr-net"
2825
conn "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/conn"
26+
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
2927
util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
3028
pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore"
3129
prometheus "gx/ipfs/QmdhsRK1EK2fvAz2i2SH5DEfkL6seDuyMYEsxKa9Braim3/client_golang/prometheus"
30+
31+
_ "gx/ipfs/QmV3NSS3A1kX5s28r7yLczhDsXzkgo65cqRgKFXYunWZmD/metrics/runtime"
3232
)
3333

3434
const (
@@ -435,7 +435,7 @@ func serveHTTPApi(req cmds.Request) (error, <-chan error) {
435435
return fmt.Errorf("serveHTTPApi: ConstructNode() failed: %s", err), nil
436436
}
437437

438-
if err := node.Repo.SetAPIAddr(apiMaddr.String()); err != nil {
438+
if err := node.Repo.SetAPIAddr(apiMaddr); err != nil {
439439
return fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %s", err), nil
440440
}
441441

cmd/ipfs/main.go

+30-15
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ import (
1717
"syscall"
1818
"time"
1919

20-
manet "gx/ipfs/QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7/go-multiaddr-net"
21-
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
22-
23-
logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
24-
u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
25-
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
26-
2720
cmds "github.com/ipfs/go-ipfs/commands"
2821
cmdsCli "github.com/ipfs/go-ipfs/commands/cli"
2922
cmdsHttp "github.com/ipfs/go-ipfs/commands/http"
@@ -32,7 +25,13 @@ import (
3225
repo "github.com/ipfs/go-ipfs/repo"
3326
config "github.com/ipfs/go-ipfs/repo/config"
3427
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
28+
29+
manet "gx/ipfs/QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7/go-multiaddr-net"
30+
logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
3531
loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables"
32+
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
33+
u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
34+
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
3635
)
3736

3837
// log is the command logger
@@ -591,21 +590,37 @@ func profileIfEnabled() (func(), error) {
591590
return func() {}, nil
592591
}
593592

593+
var apiFileErrorFmt string = `Failed to parse %[1]s/api file.
594+
error: %[2]s
595+
If there is no daemon running, it is safe to delete it.
596+
You can do it with:
597+
ps aux | grep ipfs # check there is no ipfs daemon
598+
rm %[1]s/api
599+
`
600+
594601
// getApiClient checks the repo, and the given options, checking for
595602
// a running API service. if there is one, it returns a client.
596603
// otherwise, it returns errApiNotRunning, or another error.
597604
func getApiClient(repoPath, apiAddrStr string) (cmdsHttp.Client, error) {
598-
599-
if apiAddrStr == "" {
600-
var err error
601-
if apiAddrStr, err = fsrepo.APIAddr(repoPath); err != nil {
605+
var addr ma.Multiaddr
606+
var err error
607+
if len(apiAddrStr) != 0 {
608+
addr, err = ma.NewMultiaddr(apiAddrStr)
609+
if err != nil {
610+
return nil, err
611+
}
612+
} else {
613+
addr, err = fsrepo.APIAddr(repoPath)
614+
if err == repo.ErrApiNotRunning {
602615
return nil, err
603616
}
604-
}
605617

606-
addr, err := ma.NewMultiaddr(apiAddrStr)
607-
if err != nil {
608-
return nil, err
618+
if err != nil {
619+
return nil, fmt.Errorf(apiFileErrorFmt, repoPath, err.Error())
620+
}
621+
}
622+
if len(addr.Protocols()) == 0 {
623+
return nil, fmt.Errorf(apiFileErrorFmt, repoPath, "multiaddr doesn't provide any protocols")
609624
}
610625

611626
return apiClientForAddr(addr)

repo/fsrepo/fsrepo.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import (
1818
mfsr "github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
1919
serialize "github.com/ipfs/go-ipfs/repo/fsrepo/serialize"
2020
dir "github.com/ipfs/go-ipfs/thirdparty/dir"
21+
2122
logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
23+
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
2224
util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
2325
"gx/ipfs/QmeqtHtxGfcsfXiou7wqHJARWPKUTUcPdtSfSYYHp48dtQ/go-ds-measure"
2426
)
@@ -274,17 +276,17 @@ func LockedByOtherProcess(repoPath string) (bool, error) {
274276
// in the fsrepo. This is a concurrent operation, meaning that any
275277
// process may read this file. modifying this file, therefore, should
276278
// use "mv" to replace the whole file and avoid interleaved read/writes.
277-
func APIAddr(repoPath string) (string, error) {
279+
func APIAddr(repoPath string) (ma.Multiaddr, error) {
278280
repoPath = filepath.Clean(repoPath)
279281
apiFilePath := filepath.Join(repoPath, apiFile)
280282

281283
// if there is no file, assume there is no api addr.
282284
f, err := os.Open(apiFilePath)
283285
if err != nil {
284286
if os.IsNotExist(err) {
285-
return "", repo.ErrApiNotRunning
287+
return nil, repo.ErrApiNotRunning
286288
}
287-
return "", err
289+
return nil, err
288290
}
289291
defer f.Close()
290292

@@ -293,16 +295,21 @@ func APIAddr(repoPath string) (string, error) {
293295
buf := make([]byte, 2048)
294296
n, err := f.Read(buf)
295297
if err != nil && err != io.EOF {
296-
return "", err
298+
return nil, err
297299
}
298300

299301
s := string(buf[:n])
300302
s = strings.TrimSpace(s)
301-
return s, nil
303+
m, err := ma.NewMultiaddr(s)
304+
if err != nil {
305+
return nil, err
306+
}
307+
return m, nil
302308
}
303309

304310
// SetAPIAddr writes the API Addr to the /api file.
305-
func (r *FSRepo) SetAPIAddr(addr string) error {
311+
func (r *FSRepo) SetAPIAddr(maddr ma.Multiaddr) error {
312+
addr := maddr.String()
306313
f, err := os.Create(filepath.Join(r.path, apiFile))
307314
if err != nil {
308315
return err

repo/mock.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"errors"
55

66
"github.com/ipfs/go-ipfs/repo/config"
7+
8+
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
79
)
810

911
var errTODO = errors.New("TODO: mock repo")
@@ -37,4 +39,4 @@ func (m *Mock) GetStorageUsage() (uint64, error) { return 0, nil }
3739

3840
func (m *Mock) Close() error { return errTODO }
3941

40-
func (m *Mock) SetAPIAddr(addr string) error { return errTODO }
42+
func (m *Mock) SetAPIAddr(addr ma.Multiaddr) error { return errTODO }

repo/repo.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"io"
66

77
config "github.com/ipfs/go-ipfs/repo/config"
8+
9+
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
810
ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore"
911
)
1012

@@ -23,7 +25,7 @@ type Repo interface {
2325
GetStorageUsage() (uint64, error)
2426

2527
// SetAPIAddr sets the API address in the repo.
26-
SetAPIAddr(addr string) error
28+
SetAPIAddr(addr ma.Multiaddr) error
2729

2830
io.Closer
2931
}

0 commit comments

Comments
 (0)