This is an automated email from the ASF dual-hosted git repository. ccollins pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-imgmod.git
commit 8dc320157933ebc82c86a9a3be97ab0807f445f7 Author: Christopher Collins <ccoll...@apache.org> AuthorDate: Thu Jun 27 13:23:36 2019 -0700 Remove all dependencies on the newt repo The imgmod tool was using the util package in the newt repo (mynewt.apache.org/newt/util). This commit removes this dependency. --- cli/image_cmds.go | 103 ++++++++++++++++++++++++------------------------------ cli/mfg_cmds.go | 79 +++++++++++++++++------------------------ cli/util.go | 36 +++++++++---------- go.mod | 9 +++-- go.sum | 35 +++++++++++++++++++ iimg/iimg.go | 9 +++-- imfg/imfg.go | 31 ++++++++-------- imgmod.go | 34 ++++-------------- iutil/iutil.go | 37 ++++++++++++++++++++ 9 files changed, 196 insertions(+), 177 deletions(-) diff --git a/cli/image_cmds.go b/cli/image_cmds.go index 2b5852e..a010f1b 100644 --- a/cli/image_cmds.go +++ b/cli/image_cmds.go @@ -25,16 +25,17 @@ import ( "io/ioutil" "os" "sort" + "strconv" - "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/apache/mynewt-artifact/errors" "github.com/apache/mynewt-artifact/image" "github.com/apache/mynewt-artifact/manifest" "github.com/apache/mynewt-artifact/sec" "mynewt.apache.org/imgmod/iimg" - "mynewt.apache.org/newt/util" + "mynewt.apache.org/imgmod/iutil" ) func tlvStr(tlv image.ImageTlv) string { @@ -62,21 +63,21 @@ func writeImage(img image.Image, filename string) error { return err } - util.StatusMessage(util.VERBOSITY_DEFAULT, "Wrote image %s\n", filename) + iutil.Printf("Wrote image %s\n", filename) return nil } func parseTlvArgs(typeArg string, filenameArg string) (image.ImageTlv, error) { - tlvType, err := util.AtoiNoOct(typeArg) + tlvType, err := strconv.Atoi(typeArg) if err != nil || tlvType < 0 { - return image.ImageTlv{}, util.FmtNewtError( - "Invalid TLV type integer: %s", typeArg) + return image.ImageTlv{}, errors.Errorf( + "invalid TLV type integer: %s", typeArg) } data, err := ioutil.ReadFile(filenameArg) if err != nil { - return image.ImageTlv{}, util.FmtNewtError( - "Error reading TLV data file: %s", err.Error()) + return image.ImageTlv{}, errors.Wrapf(err, + "error reading TLV data file") } return image.ImageTlv{ @@ -103,7 +104,7 @@ func runShowCmd(cmd *cobra.Command, args []string) { if err != nil { ImgmodUsage(nil, err) } - fmt.Printf("%s\n", s) + iutil.Printf("%s\n", s) } func runBriefCmd(cmd *cobra.Command, args []string) { @@ -121,15 +122,15 @@ func runBriefCmd(cmd *cobra.Command, args []string) { ImgmodUsage(nil, err) } - fmt.Printf("%8d| Header\n", offsets.Header) - fmt.Printf("%8d| Body\n", offsets.Body) - fmt.Printf("%8d| Trailer\n", offsets.Trailer) + iutil.Printf("%8d| Header\n", offsets.Header) + iutil.Printf("%8d| Body\n", offsets.Body) + iutil.Printf("%8d| Trailer\n", offsets.Trailer) for i, tlv := range img.Tlvs { - fmt.Printf("%8d| TLV%d: type=%s(%d)\n", + iutil.Printf("%8d| TLV%d: type=%s(%d)\n", offsets.Tlvs[i], i, image.ImageTlvTypeName(tlv.Header.Type), tlv.Header.Type) } - fmt.Printf("Total=%d\n", offsets.TotalSize) + iutil.Printf("Total=%d\n", offsets.TotalSize) } func runSignCmd(cmd *cobra.Command, args []string) { @@ -155,8 +156,8 @@ func runSignCmd(cmd *cobra.Command, args []string) { hash, err := img.Hash() if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Failed to read hash from specified image: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, + "failed to read hash from specified image")) } tlvs, err := image.BuildSigTlvs(keys, hash) @@ -189,8 +190,8 @@ func runAddTlvsCmd(cmd *cobra.Command, args []string) { tlvArgs := args[1:] if len(tlvArgs)%2 != 0 { - ImgmodUsage(cmd, util.FmtNewtError( - "Invalid argument count; each TLV requires two arguments")) + ImgmodUsage(cmd, errors.Errorf( + "invalid argument count; each TLV requires two arguments")) } tlvs := []image.ImageTlv{} @@ -229,20 +230,20 @@ func runRmtlvsCmd(cmd *cobra.Command, args []string) { tlvIndices := []int{} idxMap := map[int]struct{}{} for _, arg := range args[1:] { - idx, err := util.AtoiNoOct(arg) + idx, err := strconv.Atoi(arg) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError("Invalid TLV index: %s", arg)) + ImgmodUsage(cmd, errors.Errorf("invalid TLV index: %s", arg)) } if idx < 0 || idx >= len(img.Tlvs) { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "TLV index %s out of range; "+ "must be in range [0, %d] for this image", arg, len(img.Tlvs)-1)) } if _, ok := idxMap[idx]; ok { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "TLV index %d specified more than once", idx)) } idxMap[idx] = struct{}{} @@ -254,8 +255,7 @@ func runRmtlvsCmd(cmd *cobra.Command, args []string) { sort.Sort(sort.Reverse(sort.IntSlice(tlvIndices))) for _, idx := range tlvIndices { tlv := img.Tlvs[idx] - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Removing TLV%d: %s\n", idx, tlvStr(tlv)) + iutil.Printf("Removing TLV%d: %s\n", idx, tlvStr(tlv)) img.Tlvs = append(img.Tlvs[0:idx], img.Tlvs[idx+1:]...) } @@ -301,7 +301,7 @@ func runHashableCmd(cmd *cobra.Command, args []string) { } if OptOutFilename == "" { - ImgmodUsage(cmd, util.FmtNewtError("--outfile (-o) option required")) + ImgmodUsage(cmd, errors.Errorf("--outfile (-o) option required")) } inFilename := args[0] @@ -313,28 +313,25 @@ func runHashableCmd(cmd *cobra.Command, args []string) { } if (img.Header.Flags & image.IMAGE_F_ENCRYPTED) != 0 { - util.StatusMessage(util.VERBOSITY_QUIET, + fmt.Fprintf(os.Stderr, "* Warning: extracting hashable content from an encrypted image\n") } f, err := os.Create(outFilename) if err != nil { - ImgmodUsage(nil, util.ChildNewtError(err)) + ImgmodUsage(nil, errors.Wrapf(err, "failed to create hashable output")) } defer f.Close() if err := binary.Write(f, binary.LittleEndian, &img.Header); err != nil { - ImgmodUsage(nil, util.FmtNewtError( - "Error writing image header: %s", err.Error())) + ImgmodUsage(nil, errors.Wrapf(err, "error writing image header")) } _, err = f.Write(img.Body) if err != nil { - ImgmodUsage(nil, util.FmtNewtError( - "Error writing image body: %s", err.Error())) + ImgmodUsage(nil, errors.Wrapf(err, "error writing image body")) } - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Wrote hashable content to %s\n", outFilename) + iutil.Printf("Wrote hashable content to %s\n", outFilename) } func runAddsigCmd(cmd *cobra.Command, args []string) { @@ -346,12 +343,11 @@ func runAddsigCmd(cmd *cobra.Command, args []string) { keyFilename := args[1] sigFilename := args[2] - sigType, err := util.AtoiNoOct(args[3]) + sigType, err := strconv.Atoi(args[3]) if err != nil || sigType < 0 || sigType > 255 || !image.ImageTlvTypeIsSig(uint8(sigType)) { - ImgmodUsage(cmd, util.FmtNewtError( - "Invalid signature type: %s", args[3])) + ImgmodUsage(cmd, errors.Errorf("invalid signature type: %s", args[3])) } outFilename, err := CalcOutFilename(imgFilename) @@ -366,14 +362,12 @@ func runAddsigCmd(cmd *cobra.Command, args []string) { keyData, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } sigData, err := ioutil.ReadFile(sigFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading signature file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading signature file")) } // ECDSA256 signatures need to be padded out to >=72 bytes. @@ -386,8 +380,7 @@ func runAddsigCmd(cmd *cobra.Command, args []string) { // Build and append key hash TLV. keyHashTlv := image.BuildKeyHashTlv(keyData) - util.StatusMessage(util.VERBOSITY_DEFAULT, "Adding TLV%d (%s)\n", - len(img.Tlvs), tlvStr(keyHashTlv)) + iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(keyHashTlv)) img.Tlvs = append(img.Tlvs, keyHashTlv) // Build and append signature TLV. @@ -398,8 +391,7 @@ func runAddsigCmd(cmd *cobra.Command, args []string) { }, Data: sigData, } - util.StatusMessage(util.VERBOSITY_DEFAULT, "Adding TLV%d (%s)\n", - len(img.Tlvs), tlvStr(sigTlv)) + iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(sigTlv)) img.Tlvs = append(img.Tlvs, sigTlv) if err := writeImage(img, outFilename); err != nil { @@ -427,8 +419,7 @@ func runDecryptCmd(cmd *cobra.Command, args []string) { keyBytes, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } img, err = iimg.DecryptImage(img, keyBytes) @@ -461,8 +452,7 @@ func runDecryptFullCmd(cmd *cobra.Command, args []string) { keyBytes, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } img, err = iimg.DecryptImageFull(img, keyBytes) @@ -494,8 +484,7 @@ func runEncryptCmd(cmd *cobra.Command, args []string) { keyBytes, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } img, err = iimg.EncryptImage(img, keyBytes) @@ -528,8 +517,7 @@ func runEncryptFullCmd(cmd *cobra.Command, args []string) { keyBytes, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } img, err = iimg.EncryptImageFull(img, keyBytes) @@ -588,8 +576,7 @@ func runVerifyCmd(cmd *cobra.Command, args []string) { iss, err := sec.ReadPubSignKeys(OptSignKeys) if err != nil { - ImgmodUsage(nil, errors.Wrapf(err, - "error reading signing key file")) + ImgmodUsage(nil, errors.Wrapf(err, "error reading signing key file")) } sigs, err := img.CollectSigs() @@ -627,10 +614,10 @@ func runVerifyCmd(cmd *cobra.Command, args []string) { } } - fmt.Printf(" structure: %s\n", st) - fmt.Printf(" hash: %s\n", ha) - fmt.Printf("signatures: %s\n", si) - fmt.Printf(" manifest: %s\n", ma) + iutil.Printf(" structure: %s\n", st) + iutil.Printf(" hash: %s\n", ha) + iutil.Printf("signatures: %s\n", si) + iutil.Printf(" manifest: %s\n", ma) if anyFails { os.Exit(94) // EBADMSG diff --git a/cli/mfg_cmds.go b/cli/mfg_cmds.go index 9ce7108..1cd95fc 100644 --- a/cli/mfg_cmds.go +++ b/cli/mfg_cmds.go @@ -25,6 +25,7 @@ import ( "io/ioutil" "os" "sort" + "strconv" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -35,7 +36,7 @@ import ( "github.com/apache/mynewt-artifact/mfg" "github.com/apache/mynewt-artifact/sec" "mynewt.apache.org/imgmod/imfg" - "mynewt.apache.org/newt/util" + "mynewt.apache.org/imgmod/iutil" ) const MAX_SIG_LEN = 1024 // Bytes. @@ -43,8 +44,7 @@ const MAX_SIG_LEN = 1024 // Bytes. func readMfgBin(filename string) ([]byte, error) { bin, err := ioutil.ReadFile(filename) if err != nil { - return nil, util.FmtChildNewtError(err, - "Failed to read manufacturing image: %s", err.Error()) + return nil, errors.Wrapf(err, "failed to read manufacturing image") } return bin, nil @@ -89,13 +89,13 @@ func extractFlashAreas(mman manifest.MfgManifest) ([]flash.FlashArea, error) { areas := flash.SortFlashAreasByDevOff(mman.FlashAreas) if len(areas) == 0 { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "Boot loader manifest does not contain flash map")) } overlaps, conflicts := flash.DetectErrors(areas) if len(overlaps) > 0 || len(conflicts) > 0 { - return nil, util.NewNewtError(flash.ErrorText(overlaps, conflicts)) + return nil, errors.New(flash.ErrorText(overlaps, conflicts)) } if err := imfg.VerifyAreas(areas); err != nil { @@ -115,8 +115,8 @@ func createNameBlobMap(binDir string, filename := fmt.Sprintf("%s/%s.bin", binDir, area.Name) bin, err := readMfgBin(filename) if err != nil { - if !util.IsNotExist(err) { - return nil, util.ChildNewtError(err) + if !os.IsNotExist(errors.Cause(err)) { + return nil, errors.Wrapf(err, "could not read mfgimage binary") } } else { mm[area.Name] = bin @@ -132,10 +132,9 @@ func runMfgShowCmd(cmd *cobra.Command, args []string) { } inFilename := args[0] - metaEndOff, err := util.AtoiNoOct(args[1]) + metaEndOff, err := strconv.Atoi(args[1]) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "invalid meta offset \"%s\"", args[1])) + ImgmodUsage(cmd, errors.Errorf("invalid meta offset \"%s\"", args[1])) } bin, err := readMfgBin(inFilename) @@ -149,16 +148,15 @@ func runMfgShowCmd(cmd *cobra.Command, args []string) { } if m.Meta == nil { - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Manufacturing image %s does not contain an MMR\n", inFilename) + iutil.Printf("Manufacturing image %s does not contain an MMR\n", + inFilename) } else { s, err := m.Meta.Json(metaEndOff) if err != nil { ImgmodUsage(nil, err) } - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Manufacturing image %s contains an MMR with "+ - "the following properties:\n%s\n", inFilename, s) + iutil.Printf("Manufacturing image %s contains an MMR with "+ + "the following properties:\n%s\n", inFilename, s) } } @@ -191,7 +189,7 @@ func runSplitCmd(cmd *cobra.Command, args []string) { } if err := os.Mkdir(outDir, os.ModePerm); err != nil { - ImgmodUsage(nil, util.ChildNewtError(err)) + ImgmodUsage(nil, errors.Wrapf(err, "failed to make output directory")) } for name, data := range nbmap { @@ -215,11 +213,6 @@ func runJoinCmd(cmd *cobra.Command, args []string) { splitDir := args[0] outDir := args[1] - if util.NodeExist(outDir) { - ImgmodUsage(nil, util.FmtNewtError( - "Destination \"%s\" already exists", outDir)) - } - mm, err := readManifest(splitDir + "/mfg") if err != nil { ImgmodUsage(cmd, err) @@ -246,8 +239,8 @@ func runJoinCmd(cmd *cobra.Command, args []string) { infos, err := ioutil.ReadDir(splitDir + "/mfg") if err != nil { - ImgmodUsage(nil, util.FmtNewtError( - "Error reading source mfg directory: %s", err.Error())) + ImgmodUsage(nil, errors.Wrapf(err, + "Error reading source mfg directory: %s")) } for _, info := range infos { if info.Name() != mfg.MFG_BIN_IMG_FILENAME { @@ -291,20 +284,18 @@ func genSwapKeyCmd(cmd *cobra.Command, args []string, isKek bool) { bin, err := readMfgBin(mfgimgFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Failed to read mfgimg file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, + "failed to read mfgimg file: %s")) } okey, err := ioutil.ReadFile(okeyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Failed to read old key der: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "failed to read old key der: %s")) } nkey, err := ioutil.ReadFile(nkeyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Failed to read new key der: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "failed to read new key der: %s")) } if isKek { @@ -335,7 +326,7 @@ func runMfgHashableCmd(cmd *cobra.Command, args []string) { } if OptOutFilename == "" { - ImgmodUsage(cmd, util.FmtNewtError("--outfile (-o) option required")) + ImgmodUsage(cmd, errors.Errorf("--outfile (-o) option required")) } mfgDir := args[0] @@ -475,18 +466,16 @@ func runAddsigMfgCmd(cmd *cobra.Command, args []string) { // Read public key. keyBytes, err := ioutil.ReadFile(keyFilename) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError( - "Error reading key file: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file")) } // Read signature. sig, err := ioutil.ReadFile(sigFilename) if err != nil { - ImgmodUsage(cmd, util.FmtChildNewtError(err, - "Failed to read signature: %s", err.Error())) + ImgmodUsage(cmd, errors.Wrapf(err, "failed to read signature")) } if len(sig) > MAX_SIG_LEN { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "signature larger than arbitrary maximum length (%d > %d)", len(sig), MAX_SIG_LEN)) } @@ -539,20 +528,20 @@ func runRmtlvsMfgCmd(cmd *cobra.Command, args []string) { tlvIndices := []int{} idxMap := map[int]struct{}{} for _, arg := range args[1:] { - idx, err := util.AtoiNoOct(arg) + idx, err := strconv.Atoi(arg) if err != nil { - ImgmodUsage(cmd, util.FmtNewtError("Invalid TLV index: %s", arg)) + ImgmodUsage(cmd, errors.Errorf("invalid TLV index: %s", arg)) } if idx < 0 || idx >= numTlvs { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "TLV index %s out of range; "+ "must be in range [0, %d] for this mfgimage", arg, numTlvs-1)) } if _, ok := idxMap[idx]; ok { - ImgmodUsage(nil, util.FmtNewtError( + ImgmodUsage(nil, errors.Errorf( "TLV index %d specified more than once", idx)) } idxMap[idx] = struct{}{} @@ -564,8 +553,7 @@ func runRmtlvsMfgCmd(cmd *cobra.Command, args []string) { sort.Sort(sort.Reverse(sort.IntSlice(tlvIndices))) for _, idx := range tlvIndices { tlv := m.Meta.Tlvs[idx] - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Removing TLV%d: %s\n", idx, mfgTlvStr(tlv)) + iutil.Printf("Removing TLV%d: %s\n", idx, mfgTlvStr(tlv)) tlvSz := mfg.META_TLV_HEADER_SZ + len(tlv.Data) m.MetaOff += tlvSz @@ -622,8 +610,7 @@ func runVerifyMfgCmd(cmd *cobra.Command, args []string) { iss, err := sec.ReadPubSignKeys(OptSignKeys) if err != nil { - ImgmodUsage(nil, errors.Wrapf(err, - "error reading signing key file")) + ImgmodUsage(nil, errors.Wrapf(err, "error reading signing key file")) } si := "" @@ -641,9 +628,9 @@ func runVerifyMfgCmd(cmd *cobra.Command, args []string) { } } - fmt.Printf(" structure: %s\n", st) - fmt.Printf("signatures: %s\n", si) - fmt.Printf(" manifest: %s\n", ma) + iutil.Printf(" structure: %s\n", st) + iutil.Printf("signatures: %s\n", si) + iutil.Printf(" manifest: %s\n", ma) if anyFails { os.Exit(94) // EBADMSG diff --git a/cli/util.go b/cli/util.go index 74d8ebf..ae934fd 100644 --- a/cli/util.go +++ b/cli/util.go @@ -24,10 +24,11 @@ import ( "io/ioutil" "os" + "github.com/apache/mynewt-artifact/errors" + "github.com/otiai10/copy" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - - "mynewt.apache.org/newt/util" + "mynewt.apache.org/imgmod/iutil" ) var OptOutFilename string @@ -43,7 +44,7 @@ func ImgmodUsage(cmd *cobra.Command, err error) { } if cmd != nil { - fmt.Printf("%s - ", cmd.Name()) + fmt.Fprintf(os.Stderr, "%s - ", cmd.Name()) cmd.Help() } os.Exit(1) @@ -52,7 +53,7 @@ func ImgmodUsage(cmd *cobra.Command, err error) { func CalcOutFilename(inFilename string) (string, error) { if OptOutFilename != "" { if OptInPlace { - return "", util.FmtNewtError( + return "", errors.Errorf( "Only one of --outfile (-o) or --inplace (-i) options allowed") } @@ -60,7 +61,7 @@ func CalcOutFilename(inFilename string) (string, error) { } if !OptInPlace { - return "", util.FmtNewtError( + return "", errors.Errorf( "--outfile (-o) or --inplace (-i) option required") } @@ -68,14 +69,12 @@ func CalcOutFilename(inFilename string) (string, error) { } func CopyDir(src string, dst string) error { - if err := util.CopyDir(src, dst); err != nil { - return util.FmtNewtError( - "Failed to copy directory \"%s\" to \"%s\": %s", - src, dst, err.Error()) + if err := copy.Copy(src, dst); err != nil { + return errors.Wrapf(err, + "failed to copy directory \"%s\" to \"%s\"", src, dst) } - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Copied directory \"%s\" to \"%s\"\n", src, dst) + iutil.Printf("Copied directory \"%s\" to \"%s\"\n", src, dst) return nil } @@ -91,23 +90,20 @@ func EnsureOutDir(inDir, outDir string) error { } func CopyFile(src string, dst string) error { - if err := util.CopyFile(src, dst); err != nil { - return util.FmtNewtError( - "Failed to copy file \"%s\" to \"%s\": %s", - src, dst, err.Error()) + if err := copy.Copy(src, dst); err != nil { + return errors.Wrapf(err, + "failed to copy file \"%s\" to \"%s\"", src, dst) } - util.StatusMessage(util.VERBOSITY_DEFAULT, - "Copied file \"%s\" to \"%s\"\n", src, dst) + iutil.Printf("Copied file \"%s\" to \"%s\"\n", src, dst) return nil } func WriteFile(data []byte, filename string) error { if err := ioutil.WriteFile(filename, data, os.ModePerm); err != nil { - return util.FmtNewtError( - "Failed to write file \"%s\": %s", filename, err.Error()) + return errors.Wrapf(err, "failed to write file \"%s\"") } - util.StatusMessage(util.VERBOSITY_DEFAULT, "Wrote file \"%s\"\n", filename) + iutil.Printf("Wrote file \"%s\"\n", filename) return nil } diff --git a/go.mod b/go.mod index 795ba11..dd3a838 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,9 @@ module mynewt.apache.org/imgmod require ( - github.com/apache/mynewt-artifact v0.0.2 + github.com/apache/mynewt-artifact v0.0.3 + github.com/otiai10/copy v1.0.1 github.com/pkg/errors v0.8.1 - github.com/sirupsen/logrus v1.4.0 - github.com/spf13/cobra v0.0.3 - github.com/spf13/pflag v1.0.3 // indirect - mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d + github.com/sirupsen/logrus v1.4.2 + github.com/spf13/cobra v0.0.5 ) diff --git a/go.sum b/go.sum index 6df6f34..fc13c8d 100644 --- a/go.sum +++ b/go.sum @@ -1,37 +1,67 @@ +bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NickBall/go-aes-key-wrap v0.0.0-20170929221519-1c3aa3e4dfc5 h1:5BIUS5hwyLM298mOf8e8TEgD3cCYqc86uaJdQCYZo/o= github.com/NickBall/go-aes-key-wrap v0.0.0-20170929221519-1c3aa3e4dfc5/go.mod h1:w5D10RxC0NmPYxmQ438CC1S07zaC1zpvuNW7s5sUk2Q= github.com/apache/mynewt-artifact v0.0.2 h1:2tBlf84kyAifrEilcw1kQFQ8kpq4wBSudXpO8BEOXhw= github.com/apache/mynewt-artifact v0.0.2/go.mod h1:vFUd47t74KPQMzSBhQ2qp5Hc7D29OU/Tl3xHtFwN3k8= +github.com/apache/mynewt-artifact v0.0.3 h1:760wpGruGSOPjslEo0fgs9PYJ58IAvyjuJqno1t4iOc= +github.com/apache/mynewt-artifact v0.0.3/go.mod h1:vFUd47t74KPQMzSBhQ2qp5Hc7D29OU/Tl3xHtFwN3k8= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/otiai10/copy v1.0.1 h1:gtBjD8aq4nychvRZ2CyJvFWAw0aja+VHazDdruZKGZA= +github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc= +github.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.4.0 h1:yKenngtzGh+cUSSh6GWbxW2abRqhYUSR/t/6+2QqNvE= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -41,9 +71,14 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/sys v0.0.0-20180707002001-3c6ecd8f22c6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d h1:dnv0EBSSD88NahC0Pow+5DOH7gy4D5xj5n1iCIxA2NY= mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d/go.mod h1:lFsPYOHxMMWA11pydOeh0GVFiXtx0A9VnzOQ6SiRR88= diff --git a/iimg/iimg.go b/iimg/iimg.go index 29dd8a2..d4e7c9a 100644 --- a/iimg/iimg.go +++ b/iimg/iimg.go @@ -27,7 +27,6 @@ import ( "github.com/apache/mynewt-artifact/errors" "github.com/apache/mynewt-artifact/image" "github.com/apache/mynewt-artifact/sec" - "mynewt.apache.org/newt/util" ) func GetDupSigs(img image.Image) []string { @@ -77,7 +76,7 @@ func DetectInvalidSigTlvs(img image.Image) error { } if len(errStrs) > 0 { - return util.FmtNewtError("%s", strings.Join(errStrs, "\n")) + return errors.New(strings.Join(errStrs, "\n")) } return nil @@ -98,7 +97,7 @@ func VerifyImage(img image.Image) error { s += fmt.Sprintf("\n %s", d) } - return util.FmtNewtError("%s", s) + return errors.New(s) } return nil @@ -106,7 +105,7 @@ func VerifyImage(img image.Image) error { func PadEcdsa256Sig(sig []byte) ([]byte, error) { if len(sig) < 70 { - return nil, util.FmtNewtError( + return nil, errors.Errorf( "Invalid ECDSA256 signature; length (%d) less than 70", len(sig)) } @@ -121,7 +120,7 @@ func PadEcdsa256Sig(sig []byte) ([]byte, error) { func ExtractSecret(img *image.Image) ([]byte, error) { tlvs := img.RemoveTlvsWithType(image.IMAGE_TLV_ENC_RSA) if len(tlvs) != 1 { - return nil, util.FmtNewtError( + return nil, errors.Errorf( "Image contains invalid count of ENC_RSA TLVs: %d; must contain 1", len(tlvs)) } diff --git a/imfg/imfg.go b/imfg/imfg.go index 28dab7a..93a0187 100644 --- a/imfg/imfg.go +++ b/imfg/imfg.go @@ -26,9 +26,10 @@ import ( "sort" "strings" + "github.com/apache/mynewt-artifact/errors" "github.com/apache/mynewt-artifact/flash" "github.com/apache/mynewt-artifact/mfg" - "mynewt.apache.org/newt/util" + "mynewt.apache.org/imgmod/iutil" ) type NameBlobMap map[string][]byte @@ -43,7 +44,7 @@ func errInvalidArea(areaName string, format string, args ...interface{}) error { suffix := fmt.Sprintf(format, args...) - return util.FmtNewtError("Invalid flash area \"%s\": %s", areaName, suffix) + return errors.Errorf("invalid flash area \"%s\": %s", areaName, suffix) } func verifyArea(area flash.FlashArea, minOffset int) error { @@ -84,7 +85,7 @@ func Split(mfgBin []byte, deviceNum int, for _, area := range areas { if _, ok := mm[area.Name]; ok { - return nil, util.FmtNewtError( + return nil, errors.Errorf( "two or more flash areas with same name: \"%s\"", area.Name) } @@ -136,8 +137,7 @@ func Join(mm NameBlobMap, eraseVal byte, if len(bin) >= 4 { binstr = fmt.Sprintf("%x", bin[:4]) } - util.StatusMessage(util.VERBOSITY_DEFAULT, - "inserting %s (%s) at offset %d (0x%x)\n", + iutil.Printf("inserting %s (%s) at offset %d (0x%x)\n", area.Name, binstr, len(joined), len(joined)) joined = append(joined, bin...) } @@ -151,7 +151,7 @@ func Join(mm NameBlobMap, eraseVal byte, } sort.Strings(names) - return nil, util.FmtNewtError( + return nil, errors.Errorf( "unprocessed flash areas: %s", strings.Join(names, ", ")) } @@ -163,23 +163,22 @@ func Join(mm NameBlobMap, eraseVal byte, func replaceKey(mfgBin []byte, okey []byte, nkey []byte) (int, error) { if len(okey) > len(mfgBin) { - return 0, util.FmtNewtError( + return 0, errors.Errorf( "key longer than flash section (%d > %d)", len(okey), len(mfgBin)) } idx := bytes.Index(mfgBin, okey) if idx == -1 { - return 0, util.FmtNewtError("old key not present in flash section") + return 0, errors.Errorf("old key not present in flash section") } lastIdx := bytes.LastIndex(mfgBin, okey) if idx != lastIdx { - return 0, util.FmtNewtError( + return 0, errors.Errorf( "multiple instances of old key in flash section") } - util.StatusMessage(util.VERBOSITY_VERBOSE, - "Replacing key at offset %d\n", idx) + iutil.PrintfVerbose("Replacing key at offset %d\n", idx) copy(mfgBin[idx:idx+len(okey)], nkey) @@ -188,7 +187,7 @@ func replaceKey(mfgBin []byte, okey []byte, nkey []byte) (int, error) { func ReplaceIsk(mfgBin []byte, okey []byte, nkey []byte) error { if len(nkey) != len(okey) { - return util.FmtNewtError( + return errors.Errorf( "key lengths differ (%d != %d)", len(nkey), len(okey)) } @@ -201,7 +200,7 @@ func ReplaceIsk(mfgBin []byte, okey []byte, nkey []byte) error { func ReplaceKek(mfgBin []byte, okey []byte, nkey []byte) error { if len(nkey) > len(okey) { - return util.FmtNewtError( + return errors.Errorf( "new key longer than old key (%d > %d)", len(nkey), len(okey)) } @@ -215,11 +214,11 @@ func ReplaceKek(mfgBin []byte, okey []byte, nkey []byte) error { klIdx := keyIdx - 4 buf := bytes.NewBuffer(mfgBin[klIdx : klIdx+4]) if err := binary.Read(buf, binary.LittleEndian, &kl); err != nil { - return util.ChildNewtError(err) + return errors.Wrapf(err, "failed to read key length") } if int(kl) != len(okey) { - return util.FmtNewtError( + return errors.Errorf( "embedded key length (off=%d) has unexpected value; "+ "want=%d have=%d", klIdx, len(okey), kl) @@ -228,7 +227,7 @@ func ReplaceKek(mfgBin []byte, okey []byte, nkey []byte) error { buf = &bytes.Buffer{} kl = uint32(len(nkey)) if err := binary.Write(buf, binary.LittleEndian, kl); err != nil { - return util.ChildNewtError(err) + return errors.Wrapf(err, "failed to write key length") } copy(mfgBin[klIdx:klIdx+4], buf.Bytes()) diff --git a/imgmod.go b/imgmod.go index 1677525..14f3692 100644 --- a/imgmod.go +++ b/imgmod.go @@ -20,19 +20,14 @@ package main import ( - "fmt" - + "github.com/apache/mynewt-artifact/errors" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "mynewt.apache.org/imgmod/cli" - "mynewt.apache.org/newt/util" + "mynewt.apache.org/imgmod/iutil" ) -var ImgmodLogLevel log.Level -var imgmodSilent bool -var imgmodQuiet bool -var imgmodVerbose bool var imgmodVersion = "0.0.2" func main() { @@ -46,24 +41,11 @@ func main() { Long: imgmodHelpText, Example: imgmodHelpEx, PersistentPreRun: func(cmd *cobra.Command, args []string) { - verbosity := util.VERBOSITY_DEFAULT - if imgmodSilent { - verbosity = util.VERBOSITY_SILENT - } else if imgmodQuiet { - verbosity = util.VERBOSITY_QUIET - } else if imgmodVerbose { - verbosity = util.VERBOSITY_VERBOSE - } - logLevel, err := log.ParseLevel(logLevelStr) if err != nil { - cli.ImgmodUsage(nil, util.ChildNewtError(err)) - } - ImgmodLogLevel = logLevel - - if err := util.Init(ImgmodLogLevel, "", verbosity); err != nil { - cli.ImgmodUsage(nil, err) + cli.ImgmodUsage(nil, errors.Wrapf(err, "failed to parse log level")) } + log.SetLevel(logLevel) }, Run: func(cmd *cobra.Command, args []string) { @@ -71,12 +53,10 @@ func main() { }, } - imgmodCmd.PersistentFlags().BoolVarP(&imgmodVerbose, "verbose", "v", false, + imgmodCmd.PersistentFlags().BoolVarP(&iutil.Verbose, "verbose", "v", false, "Enable verbose output when executing commands") - imgmodCmd.PersistentFlags().BoolVarP(&imgmodQuiet, "quiet", "q", false, + imgmodCmd.PersistentFlags().BoolVarP(&iutil.Quiet, "quiet", "q", false, "Be quiet; only display error output") - imgmodCmd.PersistentFlags().BoolVarP(&imgmodSilent, "silent", "s", false, - "Be silent; don't output anything") imgmodCmd.PersistentFlags().StringVarP(&logLevelStr, "loglevel", "l", "WARN", "Log level") @@ -88,7 +68,7 @@ func main() { Long: versHelpText, Example: versHelpEx, Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("%s\n", imgmodVersion) + iutil.Printf("%s\n", imgmodVersion) }, } imgmodCmd.AddCommand(versCmd) diff --git a/iutil/iutil.go b/iutil/iutil.go new file mode 100644 index 0000000..4e07607 --- /dev/null +++ b/iutil/iutil.go @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package iutil + +import "fmt" + +var Quiet bool +var Verbose bool + +func Printf(format string, args ...interface{}) { + if !Quiet { + fmt.Printf(format, args...) + } +} + +func PrintfVerbose(format string, args ...interface{}) { + if Verbose { + fmt.Printf(format, args...) + } +}