o := res.Output().(*AddedObject) return strings.NewReader(o.Hash), nil }, }, } var tarCatCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "export a tar file from ipfs", ShortDescription: ` 'ipfs tar cat' will export a tar file from a previously imported one in ipfs `, }, Arguments: []cmds.Argument{ cmds.StringArg("path", true, false, "ipfs path of archive to export").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { nd, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } p, err := path.ParsePath(req.Arguments()[0]) if err != nil { res.SetError(err, cmds.ErrNormal) return } root, err := core.Resolve(req.Context(), nd, p)
var blockStatCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Print information of a raw IPFS block", ShortDescription: ` 'ipfs block stat' is a plumbing command for retreiving information on raw ipfs blocks. It outputs the following to stdout: Key - the base58 encoded multihash Size - the size of the block in bytes `, }, Arguments: []cmds.Argument{ cmds.StringArg("key", true, false, "The base58 multihash of an existing block to get").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { b, err := getBlockForKey(req, req.Arguments()[0]) if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetOutput(&BlockStat{ Key: b.Key().Pretty(), Size: len(b.Data), }) }, Type: BlockStat{}, Marshalers: cmds.MarshalerMap{
) var tourCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "An introduction to IPFS", ShortDescription: ` This is a tour that takes you through various IPFS concepts, features, and tools to make sure you get up to speed with IPFS very quickly. To start, run: ipfs tour `, }, Arguments: []cmds.Argument{ cmds.StringArg("id", false, false, "The id of the topic you would like to tour"), }, Subcommands: map[string]*cmds.Command{ "list": cmdIpfsTourList, "next": cmdIpfsTourNext, "restart": cmdIpfsTourRestart, }, Run: tourRunFunc, } func tourRunFunc(req cmds.Request, res cmds.Response) { cfg, err := req.InvocContext().GetConfig() if err != nil { res.SetError(err, cmds.ErrNormal) return
Helptext: cmds.HelpText{ Tagline: "Show IPFS Node ID info", ShortDescription: ` Prints out information about the specified peer, if no peer is specified, prints out local peers info. ipfs id supports the format option for output with the following keys: <id> : the peers id <aver>: agent version <pver>: protocol version <pubkey>: public key <addrs>: addresses (newline delimited) `, }, Arguments: []cmds.Argument{ cmds.StringArg("peerid", false, false, "peer.ID of node to look up").EnableStdin(), }, Options: []cmds.Option{ cmds.StringOption("f", "format", "optional output format"), }, Run: func(req cmds.Request, res cmds.Response) { node, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if len(req.Arguments()) == 0 { output, err := printSelf(node) if err != nil { res.SetError(err, cmds.ErrNormal)
func TestArgumentParsing(t *testing.T) { rootCmd := &commands.Command{ Subcommands: map[string]*commands.Command{ "noarg": {}, "onearg": { Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg"), }, }, "twoargs": { Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg"), commands.StringArg("b", true, false, "another arg"), }, }, "variadic": { Arguments: []commands.Argument{ commands.StringArg("a", true, true, "some arg"), }, }, "optional": { Arguments: []commands.Argument{ commands.StringArg("b", false, true, "another arg"), }, }, "optionalsecond": { Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg"), commands.StringArg("b", false, false, "another arg"), }, }, "reversedoptional": { Arguments: []commands.Argument{ commands.StringArg("a", false, false, "some arg"), commands.StringArg("b", true, false, "another arg"), }, }, "stdinenabled": { Arguments: []commands.Argument{ commands.StringArg("a", true, true, "some arg").EnableStdin(), }, }, "stdinenabled2args": &commands.Command{ Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg"), commands.StringArg("b", true, true, "another arg").EnableStdin(), }, }, "stdinenablednotvariadic": &commands.Command{ Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg").EnableStdin(), }, }, "stdinenablednotvariadic2args": &commands.Command{ Arguments: []commands.Argument{ commands.StringArg("a", true, false, "some arg"), commands.StringArg("b", true, false, "another arg").EnableStdin(), }, }, }, } test := func(cmd words, f *os.File, res words) { if f != nil { if _, err := f.Seek(0, os.SEEK_SET); err != nil { t.Fatal(err) } } req, _, _, err := Parse(cmd, f, rootCmd) if err != nil { t.Errorf("Command '%v' should have passed parsing: %v", cmd, err) } if !sameWords(req.Arguments(), res) { t.Errorf("Arguments parsed from '%v' are '%v' instead of '%v'", cmd, req.Arguments(), res) } } testFail := func(cmd words, msg string) { _, _, _, err := Parse(cmd, nil, rootCmd) if err == nil { t.Errorf("Should have failed: %v", msg) } } test([]string{"noarg"}, nil, []string{}) testFail([]string{"noarg", "value!"}, "provided an arg, but command didn't define any") test([]string{"onearg", "value!"}, nil, []string{"value!"}) testFail([]string{"onearg"}, "didn't provide any args, arg is required") test([]string{"twoargs", "value1", "value2"}, nil, []string{"value1", "value2"}) testFail([]string{"twoargs", "value!"}, "only provided 1 arg, needs 2") testFail([]string{"twoargs"}, "didn't provide any args, 2 required") test([]string{"variadic", "value!"}, nil, []string{"value!"}) test([]string{"variadic", "value1", "value2", "value3"}, nil, []string{"value1", "value2", "value3"}) testFail([]string{"variadic"}, "didn't provide any args, 1 required") test([]string{"optional", "value!"}, nil, []string{"value!"}) test([]string{"optional"}, nil, []string{}) test([]string{"optional", "value1", "value2"}, nil, []string{"value1", "value2"}) test([]string{"optionalsecond", "value!"}, nil, []string{"value!"}) test([]string{"optionalsecond", "value1", "value2"}, nil, []string{"value1", "value2"}) testFail([]string{"optionalsecond"}, "didn't provide any args, 1 required") testFail([]string{"optionalsecond", "value1", "value2", "value3"}, "provided too many args, takes 2 maximum") test([]string{"reversedoptional", "value1", "value2"}, nil, []string{"value1", "value2"}) test([]string{"reversedoptional", "value!"}, nil, []string{"value!"}) testFail([]string{"reversedoptional"}, "didn't provide any args, 1 required") testFail([]string{"reversedoptional", "value1", "value2", "value3"}, "provided too many args, only takes 1") // Use a temp file to simulate stdin fileToSimulateStdin := func(t *testing.T, content string) *os.File { fstdin, err := ioutil.TempFile("", "") if err != nil { t.Fatal(err) } defer os.Remove(fstdin.Name()) if _, err := io.WriteString(fstdin, content); err != nil { t.Fatal(err) } return fstdin } test([]string{"stdinenabled", "value1", "value2"}, nil, []string{"value1", "value2"}) fstdin := fileToSimulateStdin(t, "stdin1") test([]string{"stdinenabled"}, fstdin, []string{"stdin1"}) test([]string{"stdinenabled", "value1"}, fstdin, []string{"value1"}) test([]string{"stdinenabled", "value1", "value2"}, fstdin, []string{"value1", "value2"}) fstdin = fileToSimulateStdin(t, "stdin1\nstdin2") test([]string{"stdinenabled"}, fstdin, []string{"stdin1", "stdin2"}) fstdin = fileToSimulateStdin(t, "stdin1\nstdin2\nstdin3") test([]string{"stdinenabled"}, fstdin, []string{"stdin1", "stdin2", "stdin3"}) test([]string{"stdinenabled2args", "value1", "value2"}, nil, []string{"value1", "value2"}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"stdinenabled2args", "value1"}, fstdin, []string{"value1", "stdin1"}) test([]string{"stdinenabled2args", "value1", "value2"}, fstdin, []string{"value1", "value2"}) test([]string{"stdinenabled2args", "value1", "value2", "value3"}, fstdin, []string{"value1", "value2", "value3"}) fstdin = fileToSimulateStdin(t, "stdin1\nstdin2") test([]string{"stdinenabled2args", "value1"}, fstdin, []string{"value1", "stdin1", "stdin2"}) test([]string{"stdinenablednotvariadic", "value1"}, nil, []string{"value1"}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"stdinenablednotvariadic"}, fstdin, []string{"stdin1"}) test([]string{"stdinenablednotvariadic", "value1"}, fstdin, []string{"value1"}) test([]string{"stdinenablednotvariadic2args", "value1", "value2"}, nil, []string{"value1", "value2"}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"stdinenablednotvariadic2args", "value1"}, fstdin, []string{"value1", "stdin1"}) test([]string{"stdinenablednotvariadic2args", "value1", "value2"}, fstdin, []string{"value1", "value2"}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"noarg"}, fstdin, []string{}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"optionalsecond", "value1", "value2"}, fstdin, []string{"value1", "value2"}) }
var LsCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "List directory contents for Unix-filesystem objects", ShortDescription: ` Retrieves the object named by <ipfs-or-ipns-path> and displays the contents. The JSON output contains size information. For files, the child size is the total size of the file contents. For directories, the child size is the IPFS link size. `, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to list links from").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { node, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } paths := req.Arguments() output := LsOutput{ Arguments: map[string]string{}, Objects: map[string]*LsObject{}, }
Resolve the value of your identity: > ipfs name resolve QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy Resolve the value of another name: > ipfs name resolve QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy `, }, Arguments: []cmds.Argument{ cmds.StringArg("name", false, false, "The IPNS name to resolve. Defaults to your node's peerID.").EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("recursive", "r", "Resolve until the result is not an IPNS name"), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !n.OnlineMode() { err := n.SetupOfflineRouting() if err != nil {
}, } var swarmConnectCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Open connection to a given address", ShortDescription: ` 'ipfs swarm connect' opens a new direct connection to a peer address. The address format is an ipfs multiaddr: ipfs swarm connect /ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ `, }, Arguments: []cmds.Argument{ cmds.StringArg("address", true, true, "address of peer to connect to").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { ctx := req.Context() n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } addrs := req.Arguments() if n.PeerHost == nil { res.SetError(errNotOnline, cmds.ErrClient) return
} var PingCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "send echo request packets to IPFS hosts", Synopsis: ` Send pings to a peer using the routing system to discover its address `, ShortDescription: ` ipfs ping is a tool to test sending data to other nodes. It finds nodes via the routing system, send pings, wait for pongs, and print out round- trip latency information. `, }, Arguments: []cmds.Argument{ cmds.StringArg("peer ID", true, true, "ID of peer to be pinged").EnableStdin(), }, Options: []cmds.Option{ cmds.IntOption("count", "n", "number of ping messages to send"), }, Marshalers: cmds.MarshalerMap{ cmds.Text: func(res cmds.Response) (io.Reader, error) { outChan, ok := res.Output().(<-chan interface{}) if !ok { fmt.Println(reflect.TypeOf(res.Output())) return nil, u.ErrCast() } marshal := func(v interface{}) (io.Reader, error) { obj, ok := v.(*PingResult) if !ok {
Tagline: "A set of commands to manipulate the bitswap agent", ShortDescription: ``, }, Subcommands: map[string]*cmds.Command{ "wantlist": showWantlistCmd, "stat": bitswapStatCmd, "unwant": unwantCmd, }, } var unwantCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Remove a given block from your wantlist", }, Arguments: []cmds.Argument{ cmds.StringArg("key", true, true, "key to remove from your wantlist").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { nd, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !nd.OnlineMode() { res.SetError(errNotOnline, cmds.ErrClient) return } bs, ok := nd.Exchange.(*bitswap.Bitswap) if !ok {
file inside your IPFS repository. EXAMPLES: Get the value of the 'datastore.path' key: ipfs config datastore.path Set the value of the 'datastore.path' key: ipfs config datastore.path ~/.ipfs/datastore `, }, Arguments: []cmds.Argument{ cmds.StringArg("key", true, false, "The key of the config entry (e.g. \"Addresses.API\")"), cmds.StringArg("value", false, false, "The value to set the config entry to"), }, Options: []cmds.Option{ cmds.BoolOption("bool", "Set a boolean value"), cmds.BoolOption("json", "Parse stringified JSON"), }, Run: func(req cmds.Request, res cmds.Response) { args := req.Arguments() key := args[0] r, err := fsrepo.Open(req.InvocContext().ConfigRoot) if err != nil { res.SetError(err, cmds.ErrNormal) return }
ipfs object data is a plumbing command for retreiving the raw bytes stored in a DAG node. It outputs to stdout, and <key> is a base58 encoded multihash. `, LongDescription: ` ipfs object data is a plumbing command for retreiving the raw bytes stored in a DAG node. It outputs to stdout, and <key> is a base58 encoded multihash. Note that the "--encoding" option does not affect the output, since the output is the raw data of the object. `, }, Arguments: []cmds.Argument{ cmds.StringArg("key", true, false, "Key of the object to retrieve, in base58-encoded multihash format").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } fpath := path.Path(req.Arguments()[0]) node, err := core.Resolve(req.Context(), n, fpath) if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetOutput(bytes.NewReader(node.Data))
Helptext: cmds.HelpText{ Tagline: "Lists links (references) from an object", ShortDescription: ` Retrieves the object named by <ipfs-path> and displays the link hashes it contains, with the following format: <link base58 hash> Note: list all refs recursively with -r. `, }, Subcommands: map[string]*cmds.Command{ "local": RefsLocalCmd, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, true, "Path to the object(s) to list refs from").EnableStdin(), }, Options: []cmds.Option{ cmds.StringOption("format", "Emit edges with given format. tokens: <src> <dst> <linkname>"), cmds.BoolOption("edges", "e", "Emit edge format: `<from> -> <to>`"), cmds.BoolOption("unique", "u", "Omit duplicate refs from output"), cmds.BoolOption("recursive", "r", "Recursively list links of child nodes"), }, Run: func(req cmds.Request, res cmds.Response) { ctx := req.Context() n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return }
"query": queryDhtCmd, "findprovs": findProvidersDhtCmd, "findpeer": findPeerDhtCmd, "get": getValueDhtCmd, "put": putValueDhtCmd, }, } var queryDhtCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Run a 'findClosestPeers' query through the DHT", ShortDescription: ``, }, Arguments: []cmds.Argument{ cmds.StringArg("peerID", true, true, "The peerID to run the query against"), }, Options: []cmds.Option{ cmds.BoolOption("verbose", "v", "Write extra information"), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } dht, ok := n.Routing.(*ipdht.IpfsDHT) if !ok { res.SetError(ErrNotDHT, cmds.ErrNormal) return
"list": bootstrapListCmd, "add": bootstrapAddCmd, "rm": bootstrapRemoveCmd, }, } var bootstrapAddCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Add peers to the bootstrap list", ShortDescription: `Outputs a list of peers that were added (that weren't already in the bootstrap list). ` + bootstrapSecurityWarning, }, Arguments: []cmds.Argument{ cmds.StringArg("peer", false, true, peerOptionDesc).EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("default", "add default bootstrap nodes"), }, Run: func(req cmds.Request, res cmds.Response) { inputPeers, err := config.ParseBootstrapPeers(req.Arguments()) if err != nil { res.SetError(err, cmds.ErrNormal) return } r, err := fsrepo.Open(req.InvocContext().ConfigRoot) if err != nil {
}, } var logLevelCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Change the logging level", ShortDescription: ` 'ipfs log level' is a utility command used to change the logging output of a running daemon. `, }, Arguments: []cmds.Argument{ // TODO use a different keyword for 'all' because all can theoretically // clash with a subsystem name cmds.StringArg("subsystem", true, false, fmt.Sprintf("the subsystem logging identifier. Use '%s' for all subsystems.", logAllKeyword)), cmds.StringArg("level", true, false, "one of: debug, info, warning, error, fatal, panic"), }, Run: func(req cmds.Request, res cmds.Response) { args := req.Arguments() subsystem, level := args[0], args[1] if subsystem == logAllKeyword { subsystem = "*" } if err := logging.SetLogLevel(subsystem, level); err != nil { res.SetError(err, cmds.ErrNormal) return }
Publish an <ipfs-path> to your identity name: > ipfs name publish /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy Publish an <ipfs-path> to another public key (not implemented): > ipfs name publish /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy `, }, Arguments: []cmds.Argument{ cmds.StringArg("name", false, false, "The IPNS name to publish to. Defaults to your node's peerID"), cmds.StringArg("ipfs-path", true, false, "IPFS path of the obejct to be published at <name>").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { log.Debug("Begin Publish") n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !n.OnlineMode() { err := n.SetupOfflineRouting() if err != nil { res.SetError(err, cmds.ErrNormal) return
type clearlineReader struct { io.Reader out io.Writer } var CatCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Show IPFS object data", ShortDescription: ` Retrieves the object named by <ipfs-or-ipns-path> and outputs the data it contains. `, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to be outputted").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { node, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } readers, length, err := cat(req.Context(), node, req.Arguments()) if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetLength(length)
Resolve the value of another name: > ipfs resolve /ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n /ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy Resolve the value of another name recursively: > ipfs resolve -r /ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj `, }, Arguments: []cmds.Argument{ cmds.StringArg("name", true, false, "The name to resolve.").EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("recursive", "r", "Resolve until the result is an IPFS name"), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !n.OnlineMode() { err := n.SetupOfflineRouting() if err != nil {
type PinOutput struct { Pinned []key.Key } var addPinCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Pins objects to local storage", ShortDescription: ` Retrieves the object named by <ipfs-path> and stores it locally on disk. `, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, true, "Path to object(s) to be pinned").EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("recursive", "r", "Recursively pin the object linked to by the specified object(s)"), }, Type: PinOutput{}, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } // set recursive flag recursive, found, err := req.Option("recursive").Bool() if err != nil {