adminclient.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package guardiand
  2. import (
  3. "context"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "time"
  8. "github.com/spf13/cobra"
  9. "github.com/status-im/keycard-go/hexutils"
  10. "google.golang.org/grpc"
  11. "google.golang.org/protobuf/encoding/prototext"
  12. nodev1 "github.com/certusone/wormhole/bridge/pkg/proto/node/v1"
  13. )
  14. var clientSocketPath *string
  15. func init() {
  16. pf := AdminClientInjectGuardianSetUpdateCmd.Flags()
  17. clientSocketPath = pf.String("socket", "", "gRPC admin server socket to connect to")
  18. err := cobra.MarkFlagRequired(pf, "socket")
  19. if err != nil {
  20. panic(err)
  21. }
  22. AdminCmd.AddCommand(AdminClientInjectGuardianSetUpdateCmd)
  23. AdminCmd.AddCommand(AdminClientGuardianSetTemplateCmd)
  24. AdminCmd.AddCommand(AdminClientGuardianSetVerifyCmd)
  25. }
  26. var AdminCmd = &cobra.Command{
  27. Use: "admin",
  28. Short: "Guardian node admin commands",
  29. }
  30. var AdminClientInjectGuardianSetUpdateCmd = &cobra.Command{
  31. Use: "guardian-set-update-inject",
  32. Short: "Inject and sign a guardian set update from a prototxt file (see docs!)",
  33. Run: runInjectGuardianSetUpdate,
  34. Args: cobra.ExactArgs(1),
  35. }
  36. func getAdminClient(ctx context.Context, addr string) (*grpc.ClientConn, error, nodev1.NodePrivilegedClient) {
  37. conn, err := grpc.DialContext(ctx, fmt.Sprintf("unix:///%s", addr), grpc.WithInsecure())
  38. if err != nil {
  39. log.Fatalf("failed to connect to %s: %v", addr, err)
  40. }
  41. c := nodev1.NewNodePrivilegedClient(conn)
  42. return conn, err, c
  43. }
  44. func runInjectGuardianSetUpdate(cmd *cobra.Command, args []string) {
  45. path := args[0]
  46. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  47. defer cancel()
  48. conn, err, c := getAdminClient(ctx, *clientSocketPath)
  49. defer conn.Close()
  50. b, err := ioutil.ReadFile(path)
  51. if err != nil {
  52. log.Fatalf("failed to read file: %v", err)
  53. }
  54. var msg nodev1.GuardianSetUpdate
  55. err = prototext.Unmarshal(b, &msg)
  56. if err != nil {
  57. log.Fatalf("failed to deserialize: %v", err)
  58. }
  59. resp, err := c.SubmitGuardianSetVAA(ctx, &nodev1.SubmitGuardianSetVAARequest{GuardianSet: &msg})
  60. if err != nil {
  61. log.Fatalf("failed to submit guardian set update: %v", err)
  62. }
  63. log.Printf("VAA successfully injected with digest %s", hexutils.BytesToHex(resp.Digest))
  64. }