Files
blackbox/cmd/blackbox/cli.go
Tom Limoncelli 1c77c87555 Implement blackbox in Golang (#250)
* Initial release
2020-07-24 14:21:33 -04:00

227 lines
5.8 KiB
Go

package main
// cli.go -- Create urfave/cli datastructures and apply them.
import (
"fmt"
"syscall"
"github.com/urfave/cli/v2"
)
func flags() *cli.App {
app := cli.NewApp()
app.Version = "2.0.0"
app.Usage = "Maintain encrypted files in a VCS (Git, Hg, Svn)"
defUmask := syscall.Umask(0)
syscall.Umask(defUmask)
defUmaskS := fmt.Sprintf("%04o", defUmask)
app.Flags = []cli.Flag{
// &cli.BoolFlag{
// Name: "dry-run",
// Aliases: []string{"n"},
// Usage: "show what would have been done",
// Destination: &dryRun,
// },
&cli.StringFlag{
Name: "vcs",
Usage: "Use this VCS (GIT, NONE) rather than autodetect",
EnvVars: []string{"BLACKBOX_VCS"},
},
&cli.StringFlag{
Name: "crypto",
Usage: "Crypto back-end plugin",
Value: "GnuPG",
EnvVars: []string{"BLACKBOX_CRYPTO"},
},
&cli.StringFlag{
Name: "config",
Usage: "Path to config",
//Value: ".blackbox",
EnvVars: []string{"BLACKBOX_CONFIGDIR", "BLACKBOXDATA"},
},
&cli.StringFlag{
Name: "team",
Usage: "Use .blackbox-$TEAM as the configdir",
EnvVars: []string{"BLACKBOX_TEAM"},
},
&cli.StringFlag{
Name: "editor",
Usage: "editor to use",
Value: "vi",
EnvVars: []string{"EDITOR", "BLACKBOX_EDITOR"},
},
&cli.StringFlag{
Name: "umask",
Usage: "umask to set when decrypting",
Value: defUmaskS,
EnvVars: []string{"BLACKBOX_UMASK", "DECRYPT_UMASK"},
},
&cli.BoolFlag{
Name: "debug",
Usage: "Show debug output",
EnvVars: []string{"BLACKBOX_DEBUG"},
},
}
app.Commands = []*cli.Command{
// List items in the order they appear in the help menu.
{
Name: "decrypt",
Aliases: []string{"de", "start"},
Usage: "Decrypt file(s)",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "all", Usage: "All registered files"},
&cli.BoolFlag{Name: "agentcheck", Usage: "Do not check for gpg-agent when using --all"},
&cli.StringFlag{Name: "group", Usage: "Set group ownership"},
&cli.BoolFlag{Name: "overwrite", Usage: "Overwrite plaintext if it exists"},
},
Action: func(c *cli.Context) error { return cmdDecrypt(c) },
},
{
Name: "encrypt",
Aliases: []string{"en", "end"},
Usage: "Encrypts file(s)",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "shred", Usage: "Remove plaintext afterwords"},
},
Action: func(c *cli.Context) error { return cmdEncrypt(c) },
},
{
Name: "edit",
Aliases: []string{"vi"},
Usage: "Runs $EDITOR on file(s) (decrypt if needed)",
Action: func(c *cli.Context) error { return cmdEdit(c) },
},
{
Name: "cat",
Usage: "Output plaintext to stderr (decrypt if needed)",
Action: func(c *cli.Context) error { return cmdCat(c) },
},
{
Name: "diff",
Usage: "Diffs against encrypted version",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "all", Usage: "all files"},
},
Action: func(c *cli.Context) error { return cmdDiff(c) },
},
{
Name: "init",
Category: "ADMINISTRATIVE",
Usage: "Initialized blackbox for this repo",
Action: func(c *cli.Context) error { return cmdInit(c) },
},
{
Name: "admin",
Category: "ADMINISTRATIVE",
Usage: "Add/list/remove administrators",
Subcommands: []*cli.Command{
{
Name: "add",
Usage: "Adds admin(s)",
Action: func(c *cli.Context) error { return cmdAdminAdd(c) },
},
{
Name: "list",
Usage: "Lists admins",
Action: func(c *cli.Context) error { return cmdAdminList(c) },
},
{
Name: "remove",
Usage: "Remove admin(s)",
Action: func(c *cli.Context) error { return cmdAdminRemove(c) },
},
},
},
{
Name: "file",
Category: "ADMINISTRATIVE",
Usage: "Add/list/remove files from the registry",
Subcommands: []*cli.Command{
{
Name: "add",
Usage: "Registers file with the system",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "shred", Usage: "Remove plaintext afterwords"},
},
Action: func(c *cli.Context) error { return cmdFileAdd(c) },
},
{
Name: "list",
Usage: "Lists the registered files",
Action: func(c *cli.Context) error { return cmdFileList(c) },
},
{
Name: "remove",
Usage: "Deregister file from the system",
Action: func(c *cli.Context) error { return cmdFileRemove(c) },
},
},
},
{
Name: "info",
Category: "DEBUG",
Usage: "Report what we know about this repo",
Action: func(c *cli.Context) error { return cmdInfo(c) },
},
{
Name: "shred",
Usage: "Shred files, or --all for all registered files",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "all", Usage: "All registered files"},
},
Action: func(c *cli.Context) error { return cmdShred(c) },
},
{
Name: "status",
Category: "ADMINISTRATIVE",
Usage: "Print status of files",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "name-only", Usage: "Show only names of the files"},
&cli.BoolFlag{Name: "all", Usage: "All registered files"},
&cli.StringFlag{Name: "type", Usage: "only list if status matching this string"},
},
Action: func(c *cli.Context) error { return cmdStatus(c) },
},
{
Name: "reencrypt",
Usage: "Decrypt then re-encrypt files (erases any plaintext)",
Category: "ADMINISTRATIVE",
Flags: []cli.Flag{
&cli.BoolFlag{Name: "all", Usage: "All registered files"},
&cli.BoolFlag{Name: "overwrite", Usage: "Overwrite plaintext if it exists"},
&cli.BoolFlag{Name: "agentcheck", Usage: "Do not check for gpg-agent when using --all"},
},
Action: func(c *cli.Context) error { return cmdReencrypt(c) },
},
{
Name: "testing_init",
Usage: "For use with integration test",
Category: "INTEGRATION TEST",
Action: func(c *cli.Context) error { return testingInit(c) },
},
//
}
return app
}