-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
149 lines (125 loc) · 3.47 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/mitchellh/go-homedir"
"gopkg.in/urfave/cli.v1"
)
func main() {
app := cli.NewApp()
app.Name = "envdo"
app.Usage = "Manage environment variables efficiently."
app.Version = "0.1.4"
app.Author = "Anton Lindstrom"
homeDir, err := homedir.Dir()
if err != nil {
fmt.Fprintf(os.Stderr, "homedir: %s\n", err)
os.Exit(2)
}
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "directory,d",
Value: homeDir + "/.envdo",
Usage: "path to directory with environment variables",
EnvVar: "ENVDO_DIR",
},
cli.StringFlag{
Name: "gpg-recipient,r",
Usage: "GPG recipient to encrypt or decrypt environment variables (email or ID)",
EnvVar: "ENVDO_GPG_RECIPIENT",
},
cli.BoolFlag{
Name: "preserve-env,E",
Usage: "preserve user environment when running command",
},
}
app.Action = func(c *cli.Context) error {
if c.NArg() == 0 {
return cli.ShowAppHelp(c)
}
if c.NArg() < 2 {
fmt.Printf("usage: %s <profile> <command>\n", os.Args[0])
fmt.Println("\nExample usage:")
fmt.Println(" envdo Business/cheese-whiz env # Run env with profile Business/cheese-whiz.")
fmt.Println(" envdo Home/backup ls -1 -h # Run ls -1 -h with profile Home/backup.")
fmt.Println("")
return nil
}
var gpgRecipient *string
if c.GlobalIsSet("gpg-recipient") {
gpgRecipient = func(s string) *string { return &s }(c.GlobalString("gpg-recipient"))
}
profileEnvVars, err := fetchEnv(c.GlobalString("directory"), c.Args()[0], gpgRecipient)
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
err = executeCmd(c.Args()[1], c.Args()[2:], c.GlobalBool("preserve-env"), profileEnvVars)
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
return nil
}
app.Commands = []cli.Command{
addCmd,
lsCmd,
}
err = app.Run(os.Args)
if err != nil {
fmt.Println(err)
}
}
var lsCmd = cli.Command{
Name: "ls",
Usage: "List all profiles",
Flags: []cli.Flag{
cli.BoolFlag{
Name: "plain",
Usage: "plain text, without colors or indent",
},
},
Action: func(c *cli.Context) error {
var extraPath string
if len(c.Args()) > 0 {
extraPath = "/" + c.Args()[0]
}
if c.Bool("plain") {
files, err := readFiles(c.GlobalString("directory") + extraPath)
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
for _, f := range files {
fmt.Println(profileName(c.GlobalString("directory")+extraPath, f))
}
return nil
}
printTree(c.GlobalString("directory") + extraPath)
return nil
},
}
var addCmd = cli.Command{
Name: "add",
Usage: "add a GPG2 encrypted environment variable file",
Action: func(c *cli.Context) error {
if c.GlobalString("gpg-recipient") == "" {
return cli.NewExitError("error: gpg recipient is required (-r)", 1)
}
profileName := c.Args()[0] + ".gpg"
absoluteProfile := fmt.Sprintf("%s/%s", c.GlobalString("directory"), profileName)
file := filepath.Base(profileName)
directory := strings.TrimSuffix(absoluteProfile, file)
err := os.MkdirAll(directory, 0700)
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
fmt.Printf("Format for environment variables is `KEY=value`.\n")
fmt.Printf("Enter contents for %s and press Ctrl+D when finished:\n", profileName)
gpgArgs := []string{"-e", "-r", c.GlobalString("gpg-recipient"), "-o", absoluteProfile}
err = executeCmd("gpg2", gpgArgs, true, nil)
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
return nil
},
}