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("ipfs-path", true, false, "IPFS path of the obejct to be published.").EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("resolve", "Resolve given path before publishing (default=true)."), cmds.StringOption("lifetime", "t", `Time duration that the record will be valid for. Default: 24h. This accepts durations such as "300s", "1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". `), cmds.StringOption("ttl", "Time duration this record should be cached for (caution: experimental)."), }, 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)
func TestArgumentParsing(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("stdin handling doesnt yet work on windows") } 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, fi *os.File, 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!"}, nil, "provided an arg, but command didn't define any") test([]string{"onearg", "value!"}, nil, []string{"value!"}) testFail([]string{"onearg"}, nil, "didn't provide any args, arg is required") test([]string{"twoargs", "value1", "value2"}, nil, []string{"value1", "value2"}) testFail([]string{"twoargs", "value!"}, nil, "only provided 1 arg, needs 2") testFail([]string{"twoargs"}, nil, "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"}, nil, "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"}, nil, "didn't provide any args, 1 required") testFail([]string{"optionalsecond", "value1", "value2", "value3"}, nil, "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"}, nil, "didn't provide any args, 1 required") testFail([]string{"reversedoptional", "value1", "value2", "value3"}, nil, "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"}) testFail([]string{"stdinenablednotvariadic2args"}, fstdin, "cant use stdin for non stdin arg") fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"noarg"}, fstdin, []string{}) fstdin = fileToSimulateStdin(t, "stdin1") test([]string{"optionalsecond", "value1", "value2"}, fstdin, []string{"value1", "value2"}) }
bar baz/ giraffe $ ipfs add -r foo ... added QmegHcnrPgMwC7tBiMxChD54fgQMBUecNw9nE9UUU4x1bz foo $ OBJ_A=QmegHcnrPgMwC7tBiMxChD54fgQMBUecNw9nE9UUU4x1bz $ echo "different content" > foo/bar $ ipfs add -r foo ... added QmcmRptkSPWhptCttgHg27QNDmnV33wAJyUkCnAvqD3eCD foo $ OBJ_B=QmcmRptkSPWhptCttgHg27QNDmnV33wAJyUkCnAvqD3eCD $ ipfs object diff -v $OBJ_A $OBJ_B changed "bar" from QmNgd5cz2jNftnAHBhcRUGdtiaMzb5Rhjqd4etondHHST8 to QmRfFVsjSXkhFxrfWnLpMae2M4GBVsry6VAuYYcji5MiZb `, }, Arguments: []cmds.Argument{ cmds.StringArg("obj_a", true, false, "object to diff against"), cmds.StringArg("obj_b", true, false, "object to diff"), }, Options: []cmds.Option{ cmds.BoolOption("verbose", "v", "Produce verbose output"), }, Run: func(req cmds.Request, res cmds.Response) { node, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } a := req.Arguments()[0] b := req.Arguments()[1]
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 }
Helptext: cmds.HelpText{ Tagline: "Append data to the data segment of a dag node.", ShortDescription: ` Append data to what already exists in the data segment in the given object. Example: $ echo "hello" | ipfs object patch $HASH append-data NOTE: This does not append data to a file - it modifies the actual raw data within an object. Objects have a max size of 1MB and objects larger than the limit will not be respected by the network. `, }, Arguments: []cmds.Argument{ cmds.StringArg("root", true, false, "The hash of the node to modify."), cmds.FileArg("data", true, false, "Data to append.").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { nd, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } root, err := path.ParsePath(req.Arguments()[0]) if err != nil { res.SetError(err, cmds.ErrNormal) return }
Objects []LsObject } var LsCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "List links from an object.", ShortDescription: ` Retrieves the object named by <ipfs-or-ipns-path> and displays the links it contains, with the following format: <link base58 hash> <link size in bytes> <link name> `, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to list links from").EnableStdin(), }, Options: []cmds.Option{ cmds.BoolOption("headers", "v", "Print table headers (Hash, Name, Size)"), }, Run: func(req cmds.Request, res cmds.Response) { node, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } // get options early -> exit early in case of error if _, _, err := req.Option("headers").Bool(); 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("format", "f", "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 } var id peer.ID if len(req.Arguments()) > 0 { id = peer.ID(b58.Decode(req.Arguments()[0])) if len(id) == 0 {
var patchAppendDataCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Append data to the data segment of a dag node.", ShortDescription: ` Append data to what already exists in the data segment in the given object. EXAMPLE: $ echo "hello" | ipfs object patch $HASH append-data note: this does not append data to a 'file', it modifies the actual raw data within an object. Objects have a max size of 1MB and objects larger than the limit will not be respected by the network. `, }, Arguments: []cmds.Argument{ cmds.StringArg("root", true, false, "the hash of the node to modify"), cmds.FileArg("data", true, false, "data to append").EnableStdin(), }, Run: func(req cmds.Request, res cmds.Response) { nd, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } root, err := path.ParsePath(req.Arguments()[0]) 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
o := res.Output().(*coreunix.AddedObject) return strings.NewReader(o.Hash + "\n"), 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)
"mkdir": FilesMkdirCmd, "stat": FilesStatCmd, "rm": FilesRmCmd, "flush": FilesFlushCmd, }, } var formatError = errors.New("Format was set by multiple options. Only one format option is allowed") var FilesStatCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Display file status.", }, Arguments: []cmds.Argument{ cmds.StringArg("path", true, false, "Path to node to stat."), }, Options: []cmds.Option{ cmds.StringOption("format", "Print statistics in given format. Allowed tokens: "+ "<hash> <size> <cumulsize> <type> <childs>. Conflicts with other format options.").Default( `<hash> Size: <size> CumulativeSize: <cumulsize> ChildBlocks: <childs> Type: <type>`), cmds.BoolOption("hash", "Print only hash. Implies '--format=<hash>'. Conflicts with other format options.").Default(false), cmds.BoolOption("size", "Print only size. Implies '--format=<cumulsize>'. Conflicts with other format options.").Default(false), }, Run: func(req cmds.Request, res cmds.Response) { _, err := statGetFormatOptions(req)
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 {
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.Context().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
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))
} 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, sends pings, waits for pongs, and prints 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 {
}, } 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 }
) 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
o := res.Output().(*coreunix.AddedObject) return strings.NewReader(o.Hash + "\n"), 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."), }, 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 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
Tagline: "Download IPFS objects", ShortDescription: ` Retrieves the object named by <ipfs-or-ipns-path> and stores the data to disk. By default, the output will be stored at ./<ipfs-path>, but an alternate path can be specified with '--output=<path>' or '-o=<path>'. To output a TAR archive instead of unpacked files, use '--archive' or '-a'. To compress the output with GZIP compression, use '--compress' or '-C'. You may also specify the level of compression by specifying '-l=<1-9>'. `, }, Arguments: []cmds.Argument{ cmds.StringArg("ipfs-path", true, false, "The path to the IPFS object(s) to be outputted").EnableStdin(), }, Options: []cmds.Option{ cmds.StringOption("output", "o", "The path where output should be stored"), cmds.BoolOption("archive", "a", "Output a TAR archive"), cmds.BoolOption("compress", "C", "Compress the output with GZIP compression"), cmds.IntOption("compression-level", "l", "The level of compression (1-9)"), }, PreRun: func(req cmds.Request) error { _, err := getCompressOptions(req) return err }, Run: func(req cmds.Request, res cmds.Response) { cmplvl, err := getCompressOptions(req) if err != nil { res.SetError(err, cmds.ErrClient)
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 } unlock := n.Blockstore.PinLock() defer unlock()
}, } 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
Resolve the value of another name recursively: > ipfs resolve -r /ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj Resolve the value of an IPFS DAG path: > ipfs resolve /ipfs/QmeZy1fGbwgVSrqbfh9fKQrAWgeyRnj7h8fsHS1oy3k99x/beep/boop /ipfs/QmYRMjyvAiHKN9UTi8Bzt1HUspmSRD8T8DwxfSMzLgBon1 `, }, 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 {
"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.").Default(false), }, 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 {
Resolve the value of another name: > ipfs name resolve QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ /ipfs/QmSiTko9JZyabH56y2fussEt1A5oDqsFXB3CkvAqraFryz Resolve the value of a reference: > ipfs name resolve ipfs.io /ipfs/QmaBvfZooxWkrv7D3r8LS9moNjzD2o525XMZze69hhoxf5 `, }, Arguments: []cmds.Argument{ cmds.StringArg("name", false, false, "The IPNS name to resolve. Defaults to your node's peerID."), }, Options: []cmds.Option{ cmds.BoolOption("recursive", "r", "Resolve until the result is not an IPNS name.").Default(false), cmds.BoolOption("nocache", "n", "Do not use cached entries.").Default(false), }, 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()
type KeyOutput struct { Name string Id string } var KeyGenCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Create a new keypair", }, Options: []cmds.Option{ cmds.StringOption("type", "t", "type of the key to create"), cmds.IntOption("size", "s", "size of the key to generate"), }, Arguments: []cmds.Argument{ cmds.StringArg("name", true, false, "name of key to create"), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } typ, f, err := req.Option("type").String() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !f {
var blockStatCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Print information of a raw IPFS block.", ShortDescription: ` 'ipfs block stat' is a plumbing command for retrieving 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."), }, 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().B58String(), Size: len(b.Data()), }) }, Type: BlockStat{}, Marshalers: cmds.MarshalerMap{
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 }
Tagline: "Outputs the raw bytes in an IPFS object.", ShortDescription: ` 'ipfs object data' is a plumbing command for retrieving 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 retrieving 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()))
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("ipfs-path", true, false, "IPFS path of the object to be published."), }, Options: []cmds.Option{ cmds.BoolOption("resolve", "Resolve given path before publishing.").Default(true), cmds.StringOption("lifetime", "t", `Time duration that the record will be valid for. <default> This accepts durations such as "300s", "1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".`).Default("24h"), cmds.StringOption("ttl", "Time duration this record should be cached for (caution: experimental)."), }, 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