提交 cec3af28 作者: Overbool

commands/ping: use new cmds lib

License: MIT
Signed-off-by: 's avatarOverbool <overbool.xu@gmail.com>
上级 f65a5eaa
package commands package commands
import ( import (
"bytes"
"context" "context"
"errors" "errors"
"fmt" "fmt"
...@@ -9,14 +8,14 @@ import ( ...@@ -9,14 +8,14 @@ import (
"strings" "strings"
"time" "time"
cmds "github.com/ipfs/go-ipfs/commands"
"github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/core"
"github.com/ipfs/go-ipfs/core/commands/cmdenv"
u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" cmds "gx/ipfs/QmSXUokcP4TJpFfqozT69AVAYRtzXVMUjzQVkYX41R9Svs/go-ipfs-cmds"
ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr" ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr"
"gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer"
pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore"
"gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit" cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
) )
const kPingTimeout = 10 * time.Second const kPingTimeout = 10 * time.Second
...@@ -49,72 +48,52 @@ trip latency information. ...@@ -49,72 +48,52 @@ trip latency information.
Options: []cmdkit.Option{ Options: []cmdkit.Option{
cmdkit.IntOption(pingCountOptionName, "n", "Number of ping messages to send.").WithDefault(10), cmdkit.IntOption(pingCountOptionName, "n", "Number of ping messages to send.").WithDefault(10),
}, },
Marshalers: cmds.MarshalerMap{ Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
cmds.Text: func(res cmds.Response) (io.Reader, error) { n, err := cmdenv.GetNode(env)
v, err := unwrapOutput(res.Output())
if err != nil { if err != nil {
return nil, err return err
}
obj, ok := v.(*PingResult)
if !ok {
return nil, u.ErrCast()
}
buf := new(bytes.Buffer)
if len(obj.Text) > 0 {
buf = bytes.NewBufferString(obj.Text + "\n")
} else if obj.Success {
fmt.Fprintf(buf, "Pong received: time=%.2f ms\n", obj.Time.Seconds()*1000)
} else {
fmt.Fprintf(buf, "Pong failed\n")
}
return buf, nil
},
},
Run: func(req cmds.Request, res cmds.Response) {
ctx := req.Context()
n, err := req.InvocContext().GetNode()
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
} }
// Must be online! // Must be online!
if !n.OnlineMode() { if !n.OnlineMode() {
res.SetError(ErrNotOnline, cmdkit.ErrClient) return ErrNotOnline
return
} }
addr, peerID, err := ParsePeerParam(req.Arguments()[0]) addr, peerID, err := ParsePeerParam(req.Arguments[0])
if err != nil { if err != nil {
res.SetError(fmt.Errorf("failed to parse peer address '%s': %s", req.Arguments()[0], err), cmdkit.ErrNormal) return fmt.Errorf("failed to parse peer address '%s': %s", req.Arguments[0], err)
return
} }
if peerID == n.Identity { if peerID == n.Identity {
res.SetError(ErrPingSelf, cmdkit.ErrNormal) return ErrPingSelf
return
} }
if addr != nil { if addr != nil {
n.Peerstore.AddAddr(peerID, addr, pstore.TempAddrTTL) // temporary n.Peerstore.AddAddr(peerID, addr, pstore.TempAddrTTL) // temporary
} }
numPings, _, err := req.Option(pingCountOptionName).Int() numPings, _ := req.Options[pingCountOptionName].(int)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
if numPings <= 0 { if numPings <= 0 {
res.SetError(fmt.Errorf("error: ping count must be greater than 0, was %d", numPings), cmdkit.ErrNormal) return fmt.Errorf("error: ping count must be greater than 0, was %d", numPings)
} }
outChan := pingPeer(ctx, n, peerID, numPings) outChan := pingPeer(req.Context, n, peerID, numPings)
res.SetOutput(outChan)
return res.Emit(outChan)
}, },
Type: PingResult{}, Type: PingResult{},
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *PingResult) error {
if len(out.Text) > 0 {
fmt.Fprintln(w, out.Text)
} else if out.Success {
fmt.Fprintf(w, "Pong received: time=%.2f ms\n", out.Time.Seconds()*1000)
} else {
fmt.Fprintf(w, "Pong failed\n")
}
return nil
}),
},
} }
func pingPeer(ctx context.Context, n *core.IpfsNode, pid peer.ID, numPings int) <-chan interface{} { func pingPeer(ctx context.Context, n *core.IpfsNode, pid peer.ID, numPings int) <-chan interface{} {
......
...@@ -136,7 +136,7 @@ var rootSubcommands = map[string]*cmds.Command{ ...@@ -136,7 +136,7 @@ var rootSubcommands = map[string]*cmds.Command{
"name": name.NameCmd, "name": name.NameCmd,
"object": ocmd.ObjectCmd, "object": ocmd.ObjectCmd,
"pin": lgc.NewCommand(PinCmd), "pin": lgc.NewCommand(PinCmd),
"ping": lgc.NewCommand(PingCmd), "ping": PingCmd,
"p2p": lgc.NewCommand(P2PCmd), "p2p": lgc.NewCommand(P2PCmd),
"refs": lgc.NewCommand(RefsCmd), "refs": lgc.NewCommand(RefsCmd),
"resolve": ResolveCmd, "resolve": ResolveCmd,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论