mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-10 14:34:24 +08:00
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
|
|
"github.com/jbenet/go-ipfs/core/commands"
|
|
"github.com/jbenet/go-ipfs/daemon"
|
|
u "github.com/jbenet/go-ipfs/util"
|
|
)
|
|
|
|
// command is the descriptor of an ipfs daemon command.
|
|
// Used with makeCommand to proxy over commands via the daemon.
|
|
type command struct {
|
|
name string
|
|
args int
|
|
flags []string
|
|
online bool
|
|
cmdFn commands.CmdFunc
|
|
argFilter func(string) (string, error)
|
|
}
|
|
|
|
// commanderFunc is a function that can be passed into the Commander library as
|
|
// a command handler. Defined here because commander lacks this definition.
|
|
type commanderFunc func(*commander.Command, []string) error
|
|
|
|
// makeCommand Wraps a commands.CmdFunc so that it may be safely run by the
|
|
// commander library
|
|
func makeCommand(cmdDesc command) commanderFunc {
|
|
return func(c *commander.Command, inp []string) error {
|
|
if len(inp) < cmdDesc.args {
|
|
u.POut(c.Long)
|
|
return nil
|
|
}
|
|
confdir, err := getConfigDir(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cmd := daemon.NewCommand()
|
|
cmd.Command = cmdDesc.name
|
|
if cmdDesc.argFilter != nil {
|
|
for _, a := range inp {
|
|
s, err := cmdDesc.argFilter(a)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cmd.Args = append(cmd.Args, s)
|
|
}
|
|
} else {
|
|
cmd.Args = inp
|
|
}
|
|
|
|
for _, a := range cmdDesc.flags {
|
|
cmd.Opts[a] = c.Flag.Lookup(a).Value.Get()
|
|
}
|
|
|
|
err = daemon.SendCommand(cmd, confdir)
|
|
if err != nil {
|
|
log.Info("Executing command locally: %s", err)
|
|
// Do locally
|
|
n, err := localNode(confdir, cmdDesc.online)
|
|
if err != nil {
|
|
return fmt.Errorf("Local node creation failed: %v", err)
|
|
}
|
|
|
|
return cmdDesc.cmdFn(n, cmd.Args, cmd.Opts, os.Stdout)
|
|
}
|
|
return nil
|
|
}
|
|
}
|