aboutsummaryrefslogtreecommitdiff
path: root/generate.go
diff options
context:
space:
mode:
Diffstat (limited to 'generate.go')
-rw-r--r--generate.go62
1 files changed, 41 insertions, 21 deletions
diff --git a/generate.go b/generate.go
index 81a8104..74c24e5 100644
--- a/generate.go
+++ b/generate.go
@@ -1,51 +1,71 @@
package main
import (
+ "context"
"encoding"
"flag"
+ "log"
"os"
"dim13.org/signify/ask"
"dim13.org/signify/b64file"
"dim13.org/signify/key"
+ "github.com/google/subcommands"
)
// Usage: signify -G [-n] [-c comment] -p pubkey -s seckey
-func generate(args []string) error {
- opts := flag.NewFlagSet("generate", flag.ExitOnError)
- var (
- nopass = opts.Bool("n", false, "No key passphrase")
- comment = opts.String("c", "signify", "Comment")
- pubFile = opts.String("p", "", "Public key file (required)")
- secFile = opts.String("s", "", "Secret key file (required)")
- )
- opts.Parse(args)
- if *pubFile == "" || *secFile == "" {
- opts.Usage()
- return nil
+type generateCommand struct {
+ nopass bool
+ comment string
+ pubFile string
+ secFile string
+}
+
+func (g *generateCommand) Name() string { return "generate" }
+func (g *generateCommand) Synopsis() string { return "generate key" }
+func (g *generateCommand) Usage() string {
+ return "generate [-n] [-c comment] -p pubkey -s seckey\n"
+}
+
+func (g *generateCommand) SetFlags(f *flag.FlagSet) {
+ f.BoolVar(&g.nopass, "n", false, "no key passphrase")
+ f.StringVar(&g.comment, "c", "signify", "comment")
+ f.StringVar(&g.pubFile, "p", "", "public key file (required)")
+ f.StringVar(&g.secFile, "s", "", "secret key file (required)")
+}
+
+func (g *generateCommand) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus {
+ if g.pubFile == "" || g.secFile == "" {
+ f.Usage()
+ return subcommands.ExitUsageError
}
- if err := ValidateNames(*pubFile, *secFile); err != nil {
- return err
+ if err := ValidateNames(g.pubFile, g.secFile); err != nil {
+ log.Println(err)
+ return subcommands.ExitFailure
}
var der key.Deriver
- if !*nopass {
+ if !g.nopass {
der = ask.Confirmed{}
}
pubKey, secKey, err := key.Generate(der)
if err != nil {
- return err
+ log.Println(err)
+ return subcommands.ExitFailure
}
- if err := writeFile(*secFile, *comment+" secret key", secKey, ModeSec); err != nil {
- return err
+ if err := writeFile(g.secFile, g.comment+" secret key", secKey, ModeSec); err != nil {
+ log.Println(err)
+ return subcommands.ExitFailure
}
- if err := writeFile(*pubFile, *comment+" public key", pubKey, ModePub); err != nil {
- return err
+ if err := writeFile(g.pubFile, g.comment+" public key", pubKey, ModePub); err != nil {
+ log.Println(err)
+ return subcommands.ExitFailure
}
- return nil
+
+ return subcommands.ExitSuccess
}
func writeFile(fname, comment string, u encoding.BinaryMarshaler, mode os.FileMode) error {