dropgz/cmd/payload.go (112 lines of code) (raw):
package cmd
import (
"fmt"
"github.com/Azure/azure-container-networking/dropgz/pkg/embed"
"github.com/Azure/azure-container-networking/dropgz/pkg/hash"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"go.uber.org/zap"
)
// list subcommand
var list = &cobra.Command{
Use: "list",
RunE: func(*cobra.Command, []string) error {
if err := setLogLevel(); err != nil {
return err
}
contents, err := embed.Contents()
if err != nil {
return err
}
for _, c := range contents {
fmt.Printf("\t%s\n", c)
}
return nil
},
}
func checksum(srcs, dests []string) error {
if len(srcs) != len(dests) {
return errors.Wrapf(embed.ErrArgsMismatched, "%d and %d", len(srcs), len(dests))
}
rc, err := embed.Extract("sum.txt")
if err != nil {
return errors.Wrap(err, "failed to extract checksum file")
}
defer rc.Close()
checksums, err := hash.Parse(rc)
if err != nil {
return errors.Wrap(err, "failed to parse checksums")
}
for i := range srcs {
valid, err := checksums.Check(srcs[i], dests[i])
if err != nil {
return errors.Wrapf(err, "failed to validate file at %s", dests[i])
}
if !valid {
return errors.Errorf("%s checksum validation failed", dests[i])
}
}
return nil
}
var (
skipVerify bool
outs []string
)
// deploy subcommand
var deploy = &cobra.Command{
Use: "deploy",
RunE: func(_ *cobra.Command, srcs []string) error {
if err := setLogLevel(); err != nil {
return err
}
if len(outs) == 0 {
outs = srcs
}
if len(srcs) != len(outs) {
return errors.Wrapf(embed.ErrArgsMismatched, "%d files, %d outputs", len(srcs), len(outs))
}
log := z.With(zap.Strings("sources", srcs), zap.Strings("outputs", outs), zap.String("cmd", "deploy"))
if err := embed.Deploy(log, srcs, outs); err != nil {
return errors.Wrapf(err, "failed to deploy %s", srcs)
}
log.Info("successfully wrote files")
if skipVerify {
return nil
}
if err := checksum(srcs, outs); err != nil {
return err
}
log.Info("verified file integrity")
return nil
},
Args: cobra.OnlyValidArgs,
}
// verify subcommand
var verify = &cobra.Command{
Use: "verify",
RunE: func(_ *cobra.Command, srcs []string) error {
if err := setLogLevel(); err != nil {
return err
}
if len(outs) == 0 {
outs = srcs
}
if len(srcs) != len(outs) {
return errors.Wrapf(embed.ErrArgsMismatched, "%d sources, %d destinations", len(srcs), len(outs))
}
log := z.With(zap.Strings("sources", srcs), zap.Strings("outputs", outs), zap.String("cmd", "verify"))
if err := checksum(srcs, outs); err != nil {
return err
}
log.Info("verified files")
return nil
},
Args: cobra.OnlyValidArgs,
}
func init() {
root.AddCommand(list)
verify.ValidArgs, _ = embed.Contents()
verify.Flags().StringSliceVarP(&outs, "output", "o", []string{}, "output file path")
root.AddCommand(verify)
deploy.ValidArgs, _ = embed.Contents() // setting this after the command is initialized is required
deploy.Flags().BoolVar(&skipVerify, "skip-verify", false, "set to disable checksum validation")
deploy.Flags().StringSliceVarP(&outs, "output", "o", []string{}, "output file path")
root.AddCommand(deploy)
}