SecureValueRecovery2/host/cmd/control/main.go
2023-05-05 16:25:12 -06:00

74 lines
1.7 KiB
Go

// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
package main
import (
"flag"
"fmt"
"os"
"github.com/signalapp/svr2/web/client"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
pb "github.com/signalapp/svr2/proto"
)
var (
addr = flag.String("addr", "localhost:8081", "Address (hostname:port) where control server is listening")
binary = flag.Bool("bin", false, "If true, assume a binary formatted proto file. Otherwise, protojson")
)
func main() {
flag.Usage = func() {
fmt.Fprint(flag.CommandLine.Output(), "Issue a control command for a HostToEnclaveRequest proto \n")
fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [flags] proto_filename \n", os.Args[0])
flag.PrintDefaults()
}
flag.Parse()
if flag.NArg() == 0 {
flag.Usage()
os.Exit(1)
}
bs, err := requestBody(flag.Args()[0])
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
cc := client.ControlClient{Addr: *addr}
resp, err := cc.DoJSON(bs)
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
fmt.Fprintln(os.Stderr, "successfully executed control request")
fmt.Println(protojson.Format(resp))
}
func requestBody(filename string) ([]byte, error) {
bs, err := os.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("failed to read file : %v", err)
}
request := pb.HostToEnclaveRequest{}
if *binary {
err = proto.Unmarshal(bs, &request)
} else {
err = protojson.Unmarshal(bs, &request)
}
if err != nil {
return nil, fmt.Errorf("failed to parse proto : %v", err)
}
if !*binary {
return bs, nil
}
if bs, err = protojson.Marshal(&request); err != nil {
return nil, fmt.Errorf("failed to marshal proto : %v", err)
}
return bs, nil
}