lotus/cli/cmd.go

149 lines
3.1 KiB
Go
Raw Normal View History

package cli
import (
"context"
2019-07-23 18:49:09 +00:00
"net/http"
"os"
"os/signal"
"syscall"
2019-07-23 18:49:09 +00:00
logging "github.com/ipfs/go-log"
2019-11-21 16:10:04 +00:00
"github.com/mitchellh/go-homedir"
2019-07-10 17:28:49 +00:00
manet "github.com/multiformats/go-multiaddr-net"
2019-07-26 11:45:25 +00:00
"golang.org/x/xerrors"
"gopkg.in/urfave/cli.v2"
2019-07-10 17:28:49 +00:00
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/api/client"
"github.com/filecoin-project/lotus/lib/jsonrpc"
"github.com/filecoin-project/lotus/node/repo"
)
2019-07-23 18:49:09 +00:00
var log = logging.Logger("cli")
const (
metadataTraceConetxt = "traceContext"
)
// ApiConnector returns API instance
2019-07-24 00:09:34 +00:00
type ApiConnector func() api.FullNode
2019-07-08 19:07:16 +00:00
2019-11-21 16:10:04 +00:00
func RepoInfo(ctx *cli.Context, repoFlag string) (string, string, error) {
p, err := homedir.Expand(ctx.String(repoFlag))
2019-07-10 17:28:49 +00:00
if err != nil {
2019-11-21 16:10:04 +00:00
return "", "", err
}
r, err := repo.NewFS(p)
if err != nil {
return "", "", err
2019-07-10 17:28:49 +00:00
}
ma, err := r.APIEndpoint()
if err != nil {
2019-11-21 18:38:43 +00:00
return "", "", xerrors.Errorf("failed to get api endpoint: (%s) %w", p, err)
2019-07-10 17:28:49 +00:00
}
_, addr, err := manet.DialArgs(ma)
2019-11-21 16:10:04 +00:00
if err != nil {
return "", "", err
}
return p, addr, nil
}
2019-11-21 18:38:43 +00:00
func GetRawAPI(ctx *cli.Context, repoFlag string) (string, http.Header, error) {
2019-11-21 16:10:04 +00:00
rdir, addr, err := RepoInfo(ctx, repoFlag)
if err != nil {
return "", nil, err
}
r, err := repo.NewFS(rdir)
2019-07-11 11:52:07 +00:00
if err != nil {
return "", nil, err
2019-07-11 11:52:07 +00:00
}
2019-11-21 16:10:04 +00:00
2019-07-23 18:49:09 +00:00
var headers http.Header
token, err := r.APIToken()
if err != nil {
log.Warnf("Couldn't load CLI token, capabilities may be limited: %w", err)
} else {
2019-07-23 20:05:44 +00:00
headers = http.Header{}
2019-07-23 18:49:09 +00:00
headers.Add("Authorization", "Bearer "+string(token))
}
return "ws://" + addr + "/rpc/v0", headers, nil
}
2019-10-03 18:12:30 +00:00
func GetAPI(ctx *cli.Context) (api.Common, jsonrpc.ClientCloser, error) {
2019-08-02 16:18:44 +00:00
f := "repo"
if ctx.String("storagerepo") != "" {
f = "storagerepo"
}
2019-11-21 18:38:43 +00:00
addr, headers, err := GetRawAPI(ctx, f)
2019-08-02 16:18:44 +00:00
if err != nil {
2019-10-03 18:12:30 +00:00
return nil, nil, err
2019-08-02 16:18:44 +00:00
}
return client.NewCommonRPC(addr, headers)
}
2019-10-03 18:12:30 +00:00
func GetFullNodeAPI(ctx *cli.Context) (api.FullNode, jsonrpc.ClientCloser, error) {
2019-11-21 18:38:43 +00:00
addr, headers, err := GetRawAPI(ctx, "repo")
if err != nil {
2019-10-03 18:12:30 +00:00
return nil, nil, err
}
return client.NewFullNodeRPC(addr, headers)
}
2019-10-03 18:12:30 +00:00
func GetStorageMinerAPI(ctx *cli.Context) (api.StorageMiner, jsonrpc.ClientCloser, error) {
2019-11-21 18:38:43 +00:00
addr, headers, err := GetRawAPI(ctx, "storagerepo")
if err != nil {
2019-10-03 18:12:30 +00:00
return nil, nil, err
}
return client.NewStorageMinerRPC(addr, headers)
}
2019-09-17 18:36:06 +00:00
func DaemonContext(cctx *cli.Context) context.Context {
if mtCtx, ok := cctx.App.Metadata[metadataTraceConetxt]; ok {
return mtCtx.(context.Context)
}
return context.Background()
}
2019-07-18 23:16:23 +00:00
// ReqContext returns context for cli execution. Calling it for the first time
// installs SIGTERM handler that will close returned context.
// Not safe for concurrent execution.
2019-07-18 23:16:23 +00:00
func ReqContext(cctx *cli.Context) context.Context {
2019-09-17 18:36:06 +00:00
tCtx := DaemonContext(cctx)
ctx, done := context.WithCancel(tCtx)
sigChan := make(chan os.Signal, 2)
go func() {
<-sigChan
done()
}()
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
return ctx
2019-07-08 19:07:16 +00:00
}
var Commands = []*cli.Command{
2019-09-18 17:53:48 +00:00
authCmd,
2019-07-09 15:19:27 +00:00
chainCmd,
2019-07-20 21:55:51 +00:00
clientCmd,
createMinerCmd,
2019-10-04 19:55:33 +00:00
fetchParamCmd,
2019-07-20 21:55:51 +00:00
mpoolCmd,
2019-07-08 19:07:16 +00:00
netCmd,
paychCmd,
sendCmd,
stateCmd,
syncCmd,
versionCmd,
2019-07-13 00:41:32 +00:00
walletCmd,
}