adminclient.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package guardiand
  2. import (
  3. "context"
  4. "fmt"
  5. publicrpcv1 "github.com/certusone/wormhole/node/pkg/proto/publicrpc/v1"
  6. "github.com/spf13/pflag"
  7. "io/ioutil"
  8. "log"
  9. "time"
  10. "github.com/spf13/cobra"
  11. "github.com/status-im/keycard-go/hexutils"
  12. "google.golang.org/grpc"
  13. "google.golang.org/protobuf/encoding/prototext"
  14. nodev1 "github.com/certusone/wormhole/node/pkg/proto/node/v1"
  15. )
  16. var (
  17. clientSocketPath *string
  18. )
  19. func init() {
  20. // Shared flags for all admin commands
  21. pf := pflag.NewFlagSet("commonAdminFlags", pflag.ContinueOnError)
  22. clientSocketPath = pf.String("socket", "", "gRPC admin server socket to connect to")
  23. err := cobra.MarkFlagRequired(pf, "socket")
  24. if err != nil {
  25. panic(err)
  26. }
  27. AdminClientInjectGuardianSetUpdateCmd.Flags().AddFlagSet(pf)
  28. AdminClientListNodes.Flags().AddFlagSet(pf)
  29. AdminCmd.AddCommand(AdminClientInjectGuardianSetUpdateCmd)
  30. AdminCmd.AddCommand(AdminClientGovernanceVAAVerifyCmd)
  31. AdminCmd.AddCommand(AdminClientListNodes)
  32. }
  33. var AdminCmd = &cobra.Command{
  34. Use: "admin",
  35. Short: "Guardian node admin commands",
  36. }
  37. var AdminClientInjectGuardianSetUpdateCmd = &cobra.Command{
  38. Use: "governance-vaa-inject [FILENAME]",
  39. Short: "Inject and sign a governance VAA from a prototxt file (see docs!)",
  40. Run: runInjectGovernanceVAA,
  41. Args: cobra.ExactArgs(1),
  42. }
  43. func getAdminClient(ctx context.Context, addr string) (*grpc.ClientConn, error, nodev1.NodePrivilegedServiceClient) {
  44. conn, err := grpc.DialContext(ctx, fmt.Sprintf("unix:///%s", addr), grpc.WithInsecure())
  45. if err != nil {
  46. log.Fatalf("failed to connect to %s: %v", addr, err)
  47. }
  48. c := nodev1.NewNodePrivilegedServiceClient(conn)
  49. return conn, err, c
  50. }
  51. func getPublicRPCServiceClient(ctx context.Context, addr string) (*grpc.ClientConn, error, publicrpcv1.PublicRPCServiceClient) {
  52. conn, err := grpc.DialContext(ctx, fmt.Sprintf("unix:///%s", addr), grpc.WithInsecure())
  53. if err != nil {
  54. log.Fatalf("failed to connect to %s: %v", addr, err)
  55. }
  56. c := publicrpcv1.NewPublicRPCServiceClient(conn)
  57. return conn, err, c
  58. }
  59. func runInjectGovernanceVAA(cmd *cobra.Command, args []string) {
  60. path := args[0]
  61. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  62. defer cancel()
  63. conn, err, c := getAdminClient(ctx, *clientSocketPath)
  64. defer conn.Close()
  65. if err != nil {
  66. log.Fatalf("failed to get admin client: %v", err)
  67. }
  68. b, err := ioutil.ReadFile(path)
  69. if err != nil {
  70. log.Fatalf("failed to read file: %v", err)
  71. }
  72. var msg nodev1.InjectGovernanceVAARequest
  73. err = prototext.Unmarshal(b, &msg)
  74. if err != nil {
  75. log.Fatalf("failed to deserialize: %v", err)
  76. }
  77. resp, err := c.InjectGovernanceVAA(ctx, &msg)
  78. if err != nil {
  79. log.Fatalf("failed to submit governance VAA: %v", err)
  80. }
  81. log.Printf("VAA successfully injected with digest %s", hexutils.BytesToHex(resp.Digest))
  82. }