lnd/cmd/lncli/peersrpc_active.go
Carla Kirk-Cohen 3cc8e81121
lncli/bugfix: use int64slice for update node announcement features
As is, we'll never get any add/remove features because the flag is
set as an int 64 slice but accessed as an int slice (which has no
value, and the cli doesn't fail if the flag doesn't exist).
2023-02-14 15:53:56 -05:00

162 lines
4.1 KiB
Go

//go:build peersrpc
// +build peersrpc
package main
import (
"fmt"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/peersrpc"
"github.com/urfave/cli"
)
// peersCommands will return the set of commands to enable for peersrpc
// builds.
func peersCommands() []cli.Command {
return []cli.Command{
{
Name: "peers",
Category: "Peers",
Usage: "Interacts with the other nodes of the " +
"network",
Subcommands: []cli.Command{
updateNodeAnnouncementCommand,
},
},
}
}
func getPeersClient(ctx *cli.Context) (peersrpc.PeersClient, func()) {
conn := getClientConn(ctx, false)
cleanUp := func() {
conn.Close()
}
return peersrpc.NewPeersClient(conn), cleanUp
}
var updateNodeAnnouncementCommand = cli.Command{
Name: "updatenodeannouncement",
Category: "Peers",
Usage: "update and brodcast a new node announcement",
Description: `
Update the node's information and broadcast a new node announcement.
Add or remove addresses where your node can be reached at, change the
alias/color of the node or enable/disable supported feature bits without
restarting the node. A node announcement with the new information will
be created and brodcasted to the network.`,
ArgsUsage: "[--address_add=] [--address_remove=] [--alias=] " +
"[--color=] [--feature_bit_add=] [--feature_bit_remove=]",
Flags: []cli.Flag{
cli.StringSliceFlag{
Name: "address_add",
Usage: "a new address that should be added to the " +
"set of URIs of this node. Can be set " +
"multiple times in the same command",
},
cli.StringSliceFlag{
Name: "address_remove",
Usage: "an address that needs to be removed from the " +
"set of URIs of this node. Can be set " +
"multiple times in the same command",
},
cli.StringFlag{
Name: "alias",
Usage: "the new alias for this node, e.g. \"bob\"",
},
cli.StringFlag{
Name: "color",
Usage: "the new color for this node, e.g. #c42a81",
},
cli.Int64SliceFlag{
Name: "feature_bit_add",
Usage: "a feature bit index that needs to be enabled. " +
"Can be set multiple times in the same command",
},
cli.Int64SliceFlag{
Name: "feature_bit_remove",
Usage: "a feature bit that needs to be disabled" +
"Can be set multiple times in the same command",
},
},
Action: actionDecorator(updateNodeAnnouncement),
}
func updateNodeAnnouncement(ctx *cli.Context) error {
ctxc := getContext()
client, cleanUp := getPeersClient(ctx)
defer cleanUp()
change := false
req := &peersrpc.NodeAnnouncementUpdateRequest{}
if ctx.IsSet("address_add") {
change = true
for _, addr := range ctx.StringSlice("address_add") {
action := &peersrpc.UpdateAddressAction{
Action: peersrpc.UpdateAction_ADD,
Address: addr,
}
req.AddressUpdates = append(req.AddressUpdates, action)
}
}
if ctx.IsSet("address_remove") {
change = true
for _, addr := range ctx.StringSlice("address_remove") {
action := &peersrpc.UpdateAddressAction{
Action: peersrpc.UpdateAction_REMOVE,
Address: addr,
}
req.AddressUpdates = append(req.AddressUpdates, action)
}
}
if ctx.IsSet("alias") {
change = true
req.Alias = ctx.String("alias")
}
if ctx.IsSet("color") {
change = true
req.Color = ctx.String("color")
}
if ctx.IsSet("feature_bit_add") {
change = true
for _, feature := range ctx.Int64Slice("feature_bit_add") {
action := &peersrpc.UpdateFeatureAction{
Action: peersrpc.UpdateAction_ADD,
FeatureBit: lnrpc.FeatureBit(feature),
}
req.FeatureUpdates = append(req.FeatureUpdates, action)
}
}
if ctx.IsSet("feature_bit_remove") {
change = true
for _, feature := range ctx.Int64Slice("feature_bit_remove") {
action := &peersrpc.UpdateFeatureAction{
Action: peersrpc.UpdateAction_REMOVE,
FeatureBit: lnrpc.FeatureBit(feature),
}
req.FeatureUpdates = append(req.FeatureUpdates, action)
}
}
if !change {
return fmt.Errorf("no changes for the node information " +
"detected")
}
resp, err := client.UpdateNodeAnnouncement(ctxc, req)
if err != nil {
return err
}
printRespJSON(resp)
return nil
}