Skip to content

Commit

Permalink
adm: add dump-names command
Browse files Browse the repository at this point in the history
$ ./bin/neofs-adm morph dump-names -r https://rpc5.morph.t5.fs.neo.org:51331 -d neofs
neofs             2023-07-18 19:01:01.326 +0300 MSK
alphabet0.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet1.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet2.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet3.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet4.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet5.neofs   2023-07-18 19:01:16.974 +0300 MSK
alphabet6.neofs   2023-07-18 19:01:16.974 +0300 MSK
audit.neofs       2023-07-18 19:01:16.974 +0300 MSK
balance.neofs     2023-07-18 19:01:16.974 +0300 MSK
container.neofs   2023-07-18 19:01:16.974 +0300 MSK
group.neofs       2023-07-18 19:01:16.974 +0300 MSK
neofsid.neofs     2023-07-18 19:01:16.974 +0300 MSK
netmap.neofs      2023-07-18 19:01:16.974 +0300 MSK
proxy.neofs       2023-07-18 19:01:16.974 +0300 MSK
reputation.neofs  2023-07-18 19:01:16.974 +0300 MSK
subnet.neofs      2023-07-18 19:01:16.974 +0300 MSK

Signed-off-by: Roman Khimov <[email protected]>
  • Loading branch information
roman-khimov committed Jun 24, 2023
1 parent 85a31ff commit 818f8a3
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Changelog for NeoFS Node

### Added
- Embedded Neo contracts in `contracts` dir (#2391)
- `dump-names` command for adm

### Fixed

Expand Down
33 changes: 21 additions & 12 deletions cmd/neofs-adm/internal/modules/morph/dump_hashes.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,20 +269,29 @@ func fillContractExpiration(cmd *cobra.Command, c Client, infos []contractDumpIn
if err != nil {
continue // OK for NNS itself, for example.
}
elems := props.Value().([]stackitem.MapElement)
for _, e := range elems {
k, err := e.Key.TryBytes()
if err != nil {
continue
}
exp, err := expirationFromProperties(props)
if err != nil {
continue // Should be there, but who knows.
}
infos[i].expiration = exp
}
}

func expirationFromProperties(props *stackitem.Map) (int64, error) {
elems := props.Value().([]stackitem.MapElement)
for _, e := range elems {
k, err := e.Key.TryBytes()
if err != nil {
continue
}

if string(k) == "expiration" {
v, err := e.Value.TryInteger()
if err != nil || !v.IsInt64() {
continue
}
infos[i].expiration = v.Int64()
if string(k) == "expiration" {
v, err := e.Value.TryInteger()
if err != nil || !v.IsInt64() {
continue
}
return v.Int64(), nil
}
}
return 0, errors.New("not found")
}
90 changes: 90 additions & 0 deletions cmd/neofs-adm/internal/modules/morph/dump_names.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package morph

import (
"bytes"
"fmt"
"sort"
"strings"
"text/tabwriter"
"time"

"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep11"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

const (
nameDomainFlag = "domain"
)

type nameExp struct {
name string
exp int64
}

func dumpNames(cmd *cobra.Command, _ []string) error {
c, err := getN3Client(viper.GetViper())
if err != nil {
return fmt.Errorf("can't create N3 client: %w", err)
}
cs, err := c.GetContractStateByID(1) // NNS.
if err != nil {
return err
}
var n11r = nep11.NewNonDivisibleReader(invoker.New(c, nil), cs.Hash)
tokIter, err := n11r.Tokens()
if err != nil {
return err
}
zone, _ := cmd.Flags().GetString(nameDomainFlag)
var res = make([]nameExp, 0)
for toks, err := tokIter.Next(10); len(toks) != 0 && err == nil; toks, err = tokIter.Next(10) {
for i := range toks {
var name = string(toks[i])
if zone != "" && name != zone && !strings.HasSuffix(name, "."+zone) {
continue
}
props, err := n11r.Properties(toks[i])
if err != nil {
cmd.PrintErrf("Error getting properties for %s: %v\n", name, err)
continue
}
exp, err := expirationFromProperties(props)
if err != nil {
cmd.PrintErrf("Error getting expiration from properties for %s: %v\n", name, err)
continue
}
res = append(res, nameExp{name: name, exp: exp})
}
}

sort.Slice(res, func(i, j int) bool {
var (
iParts = strings.Split(res[i].name, ".")
jParts = strings.Split(res[j].name, ".")
)
if len(iParts) != len(jParts) {
return len(iParts) < len(jParts)
}
for k := len(iParts) - 1; k >= 0; k-- {
var c = strings.Compare(iParts[k], jParts[k])
if c != 0 {
return c == -1
}
}
return false
})

buf := bytes.NewBuffer(nil)
tw := tabwriter.NewWriter(buf, 0, 2, 2, ' ', 0)
for i := range res {
_, _ = tw.Write([]byte(fmt.Sprintf("%s\t%s\n",
res[i].name, time.UnixMilli(res[i].exp).String())))
}
_ = tw.Flush()

cmd.Print(buf.String())

return nil
}
13 changes: 13 additions & 0 deletions cmd/neofs-adm/internal/modules/morph/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,15 @@ var (
RunE: dumpContractHashes,
}

dumpNamesCmd = &cobra.Command{
Use: "dump-names",
Short: "Dump known registred NNS names and expirations",
PreRun: func(cmd *cobra.Command, _ []string) {
_ = viper.BindPFlag(endpointFlag, cmd.Flags().Lookup(endpointFlag))
},
RunE: dumpNames,
}

dumpNetworkConfigCmd = &cobra.Command{
Use: "dump-config",
Short: "Dump NeoFS network config",
Expand Down Expand Up @@ -271,6 +280,10 @@ func init() {
dumpContractHashesCmd.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")
dumpContractHashesCmd.Flags().String(customZoneFlag, "", "Custom zone to search.")

RootCmd.AddCommand(dumpNamesCmd)
dumpNamesCmd.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")
dumpNamesCmd.Flags().StringP(nameDomainFlag, "d", "", "Filter by domain")

RootCmd.AddCommand(dumpNetworkConfigCmd)
dumpNetworkConfigCmd.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")

Expand Down
2 changes: 2 additions & 0 deletions docs/cli-adm.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ credentials: # passwords for consensus node / alphabet wallets

#### Network maintenance

- `dump-names` allows to walk through NNS names and see their expirations.

- `set-config` add/update configuration values in the Netmap contract.

- `force-new-epoch` increments NeoFS epoch number and executes new epoch
Expand Down

0 comments on commit 818f8a3

Please sign in to comment.