forked from kramphub/kiya
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
118 lines (104 loc) · 3.2 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
package main
import (
"flag"
"fmt"
"log"
"os"
"github.com/atotto/clipboard"
"strconv"
cloudstore "cloud.google.com/go/storage"
"github.com/emicklei/tre"
"golang.org/x/net/context"
cloudkms "google.golang.org/api/cloudkms/v1"
)
var version = "v1.2.0"
func main() {
flag.Parse()
loadConfiguration()
if *oVersion {
fmt.Println("kiya version", version)
os.Exit(0)
}
if len(flag.Args()) < 2 {
fmt.Println("kiya [flags] [profile] [get|put|delete|list|template|copy|paste|move|generate] [|parent/key] [|value] [|template-filename] [|secret-length]")
fmt.Println(" if value, template-filename or secret length is needed, but missing, it is read from stdin")
flag.PrintDefaults()
os.Exit(0)
}
// Create the KMS client.
kmsService, err := cloudkms.New(newAuthenticatedClient())
if err != nil {
log.Fatal(err)
}
// Create the Bucket client
storageService, err := cloudstore.NewClient(context.Background())
if err != nil {
log.Fatalf("failed to create client [%v]", err)
}
profileName := flag.Arg(0)
target, ok := profiles[profileName]
if !ok {
log.Fatalf("no such profile [%s] please check your .kiya file", profileName)
}
// what command?
switch flag.Arg(1) {
case "put":
key := flag.Arg(2)
value := valueOrReadFrom(flag.Arg(3), os.Stdin)
command_put_paste_generate(kmsService, storageService, target, "put", key, value)
case "paste":
key := flag.Arg(2)
value, err := clipboard.ReadAll()
if err != nil {
log.Fatal(tre.New(err, "clipboard read failed", "key", key))
}
command_put_paste_generate(kmsService, storageService, target, "paste", key, value)
case "generate":
key := flag.Arg(2)
value := valueOrReadFrom(flag.Arg(3), os.Stdin)
secretLength, err := strconv.Atoi(value)
if err != nil {
log.Fatal(tre.New(err, "generate failed", "key", key, "err", err))
}
secret, err := GenerateSecret(secretLength, target.SecretRunes)
if err != nil {
log.Fatal(tre.New(err, "generate failed", "key", key, "err", err))
}
command_put_paste_generate(kmsService, storageService, target, "generate", key, secret)
case "copy":
key := flag.Arg(2)
value, err := getValueByKey(kmsService, storageService, key, target)
if err != nil {
log.Fatal(tre.New(err, "get failed", "key", key, "err", err))
}
if err := clipboard.WriteAll(value); err != nil {
log.Fatal(tre.New(err, "copy failed", "key", key, "err", err))
}
case "get":
key := flag.Arg(2)
value, err := getValueByKey(kmsService, storageService, key, target)
if err != nil {
log.Fatal(tre.New(err, "get failed", "key", key, "err", err))
}
fmt.Println(value)
case "delete":
key := flag.Arg(2)
command_delete(kmsService, storageService, target, key)
case "list":
command_list(storageService, target)
case "template":
command_template(kmsService, storageService, target)
case "move":
// kiya [source] move [source-key] [target] [|target-key]
sourceProfile := profiles[flag.Arg(0)]
sourceKey := flag.Arg(2)
targetProfile := profiles[flag.Arg(3)]
targetKey := sourceKey
if len(flag.Args()) == 5 {
targetKey = flag.Arg(4)
}
command_move(kmsService, storageService, sourceProfile, sourceKey, targetProfile, targetKey)
default:
fmt.Println("unknown command", flag.Arg(1))
}
}