diff --git a/README.md b/README.md index bffb0f1..24e7003 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,15 @@ ipni find -i cid.contact --cid bafybeigvgzoolc3drupxhlevdp2ugqcrbcsqfmcek2zxiw5w ```sh ipni provider --all -i dev.cid.contact -id | ipni provider -invert -i cid.contact -id ``` +- Get combined information from multiple providers: +``` +$ ipni provider --all -i alva.dev.cid.contact -i cora.dev.cid.contact --id-only | wc -l + 405 +$ ipni provider --all -i alva.dev.cid.contact --id-only | wc -l + 209 +> ipni provider --all -i cora.dev.cid.contact --id-only | wc -l + 196 +``` ### `spaddr` - Get p2p ID and multiaddrs of storage provider identified by storage provider ID "t01000": diff --git a/go.mod b/go.mod index f2a1c1c..26ae7c9 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/ipfs/go-datastore v0.6.0 github.com/ipld/go-car/v2 v2.10.0 github.com/ipld/go-ipld-prime v0.20.0 - github.com/ipni/go-libipni v0.2.8 + github.com/ipni/go-libipni v0.2.9-0.20230710075659-3294e83aca2f github.com/libp2p/go-libp2p v0.28.1 github.com/mattn/go-isatty v0.0.19 github.com/montanaflynn/stats v0.7.0 diff --git a/go.sum b/go.sum index b933885..f3765d6 100644 --- a/go.sum +++ b/go.sum @@ -286,8 +286,8 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= -github.com/ipni/go-libipni v0.2.8 h1:PNiMpE/b9QgDOIbrRsv1c5Y5kVvwFClUz6VwEx5P+Hk= -github.com/ipni/go-libipni v0.2.8/go.mod h1:dhBH9HwxT6HzQPRZ8ikWv+ccqF8ucMIoGiiTSrHA4tw= +github.com/ipni/go-libipni v0.2.9-0.20230710075659-3294e83aca2f h1:sSkioQPX8pa5PnPJHOL1u/Oq2v6TIe6MCidcWJk1HuE= +github.com/ipni/go-libipni v0.2.9-0.20230710075659-3294e83aca2f/go.mod h1:dhBH9HwxT6HzQPRZ8ikWv+ccqF8ucMIoGiiTSrHA4tw= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= diff --git a/pkg/find/find.go b/pkg/find/find.go index 98d072e..63b6da6 100644 --- a/pkg/find/find.go +++ b/pkg/find/find.go @@ -39,12 +39,11 @@ var findFlags = []cli.Flag{ Usage: "Specify CID to use as indexer key, multiple OK", Required: false, }, - &cli.StringFlag{ + &cli.StringSliceFlag{ Name: "indexer", - Usage: "URL of indexer to query", - EnvVars: []string{"INDEXER"}, + Usage: "URL of indexer to query. Multiple OK to specify providers info sources.", Aliases: []string{"i"}, - Value: "http://localhost:3000", + Value: cli.NewStringSlice("http://localhost:3000"), }, &cli.StringFlag{ Name: "dhstore", @@ -96,8 +95,11 @@ func findAction(cctx *cli.Context) error { } func dhFind(cctx *cli.Context, mhs []multihash.Multihash) error { - cl, err := client.NewDHashClient(cctx.String("indexer"), - client.WithDHStoreURL(cctx.String("dhstore"))) + cl, err := client.NewDHashClient( + client.WithProvidersURL(cctx.StringSlice("indexer")...), + client.WithDHStoreURL(cctx.String("dhstore")), + client.WithPcacheTTL(0), + ) if err != nil { return err } @@ -129,7 +131,7 @@ func dhFind(cctx *cli.Context, mhs []multihash.Multihash) error { func clearFind(cctx *cli.Context, mhs []multihash.Multihash) error { idxr := cctx.String("dhstore") if idxr == "" { - idxr = cctx.String("indexer") + idxr = cctx.StringSlice("indexer")[0] } cl, err := client.New(idxr) if err != nil { diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index 8624233..9626413 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -10,8 +10,8 @@ import ( "github.com/ipfs/go-cid" "github.com/ipni/go-libipni/apierror" - "github.com/ipni/go-libipni/find/client" "github.com/ipni/go-libipni/find/model" + "github.com/ipni/go-libipni/pcache" "github.com/ipni/ipni-cli/pkg/adpub" "github.com/libp2p/go-libp2p/core/peer" "github.com/mattn/go-isatty" @@ -34,12 +34,11 @@ Here is an example that shows using the output of one provider command to filter } var providerFlags = []cli.Flag{ - &cli.StringFlag{ + &cli.StringSliceFlag{ Name: "indexer", Usage: "Indexer URL", - EnvVars: []string{"INDEXER"}, Aliases: []string{"i"}, - Value: "http://localhost:3000", + Value: cli.NewStringSlice("http://localhost:3000"), }, &cli.StringSliceFlag{ Name: "pid", @@ -121,18 +120,24 @@ func providerAction(cctx *cli.Context) error { peerIDs = append(peerIDs, peerID) } - cl, err := client.New(cctx.String("indexer")) - if err != nil { - return err - } - if cctx.Bool("invert") { return listProviders(cctx, peerIDs) } + var pc *pcache.ProviderCache + var err error + if len(peerIDs) > 1 { + pc, err = pcache.New(pcache.WithSourceURL(cctx.StringSlice("indexer")...)) + } else { + pc, err = pcache.New(pcache.WithPreload(false), pcache.WithSourceURL(cctx.StringSlice("indexer")...)) + } + if err != nil { + return err + } + var errCount int for _, peerID := range peerIDs { - err = getProvider(cctx, cl, peerID) + err = getProvider(cctx, pc, peerID) if err != nil { fmt.Fprintf(os.Stderr, "Error getting provider %s: %s\n", peerID, err) errCount++ @@ -145,8 +150,8 @@ func providerAction(cctx *cli.Context) error { return nil } -func getProvider(cctx *cli.Context, cl *client.Client, peerID peer.ID) error { - prov, err := cl.GetProvider(cctx.Context, peerID) +func getProvider(cctx *cli.Context, pc *pcache.ProviderCache, peerID peer.ID) error { + prov, err := pc.Get(cctx.Context, peerID) if err != nil { var ae *apierror.Error if errors.As(err, &ae) && ae.Status() == http.StatusNotFound { @@ -168,27 +173,32 @@ func getProvider(cctx *cli.Context, cl *client.Client, peerID peer.ID) error { } func countProviders(cctx *cli.Context) error { - cl, err := client.New(cctx.String("indexer")) - if err != nil { - return err - } - provs, err := cl.ListProviders(cctx.Context) + pcache, err := pcache.New(pcache.WithSourceURL(cctx.StringSlice("indexer")...)) if err != nil { return err } + provs := pcache.List() fmt.Println(len(provs)) return nil } func listProviders(cctx *cli.Context, peerIDs []peer.ID) error { - cl, err := client.New(cctx.String("indexer")) - if err != nil { - return err - } - provs, err := cl.ListProviders(cctx.Context) + pc, err := pcache.New(pcache.WithSourceURL(cctx.StringSlice("indexer")...)) if err != nil { return err } + + /* + cl, err := client.New(cctx.String("indexer")) + if err != nil { + return err + } + provs, err := cl.ListProviders(cctx.Context) + if err != nil { + return err + } + */ + provs := pc.List() if len(provs) == 0 { fmt.Println("No providers registered with indexer") return nil