-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
143 lines (114 loc) · 2.97 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
package main
import (
"bufio"
"context"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
coreV1 "k8s.io/api/core/v1"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
coreV1Types "k8s.io/client-go/kubernetes/typed/core/v1"
"sigs.k8s.io/yaml"
_ "k8s.io/client-go/plugin/pkg/client/auth"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
var secretsClient coreV1Types.SecretInterface
func main() {
secretfile := flag.NewFlagSet("local", flag.ExitOnError)
fname := secretfile.String("f", "", "specify file name with -f")
k8ssecname := flag.NewFlagSet("k8s", flag.ExitOnError)
secname := k8ssecname.String("s", "", "secret name with -s")
namespace := k8ssecname.String("n", "", "namespace with -n")
kubeconfig := k8ssecname.String("kubeconfig", filepath.Join(homedir.HomeDir(), ".kube", "config"), "(optional) absolute path to the kubeconfig file")
if len(os.Args) < 2 {
fmt.Println("expected 'k8s', 'local' and 'read' subcommands")
os.Exit(1)
}
switch os.Args[1] {
case "local":
secretfile.Parse(os.Args[2:])
if *fname == "" {
secretfile.Usage()
os.Exit(1)
}
fromSecretFile(*fname)
case "k8s":
k8ssecname.Parse(os.Args[2:])
if *secname == "" || *namespace == "" {
k8ssecname.Usage()
os.Exit(1)
}
fromKubeSecret(*secname, *namespace, *kubeconfig)
case "read":
fromStdInput()
default:
fmt.Println("expected 'k8s', 'local' and 'read' subcommands")
os.Exit(1)
}
}
func fromSecretFile(name string) {
bytes, err := ioutil.ReadFile(name)
if err != nil {
panic(err.Error())
}
var secretSpec coreV1.Secret
err = yaml.Unmarshal(bytes, &secretSpec)
if err != nil {
panic(err.Error())
}
secretName := secretSpec.ObjectMeta.Name
secretData := secretSpec.Data
fmt.Println("secretName:", secretName)
for key, value := range secretData {
fmt.Printf("%s=%s\n", key, value)
}
}
func fromKubeSecret(secname, namespace, kubeconfig string) *coreV1.Secret {
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
secretsClient = clientset.CoreV1().Secrets(namespace)
secret, err := secretsClient.Get(context.TODO(), secname, metaV1.GetOptions{})
if err != nil {
log.Fatal(err)
}
fmt.Println("data: ")
for key, value := range secret.Data {
fmt.Printf(" %s=%s\n", key, value)
}
return secret
}
func fromStdInput() {
var out []byte
scanner := bufio.NewReader(os.Stdin)
for {
input, err := scanner.ReadByte()
if err != nil && err == io.EOF {
break
}
out = append(out, input)
}
var secretSpec coreV1.Secret
err := yaml.Unmarshal(out, &secretSpec)
if err != nil {
panic(err.Error())
}
secretName := secretSpec.ObjectMeta.Name
secretData := secretSpec.Data
fmt.Println("secretName:", secretName)
for key, value := range secretData {
fmt.Printf("%s=%s\n", key, value)
}
}