-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
80 lines (69 loc) · 2.22 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
package main
import (
"flag"
"github.com/spf13/cast"
"github.com/subscan-explorer/kubectl-d/pkg"
"github.com/subscan-explorer/kubectl-d/pkg/args"
"k8s.io/client-go/util/homedir"
"path/filepath"
)
type arrayFlags []string
func (i *arrayFlags) String() string {
return "my string representation"
}
func (i *arrayFlags) Set(value string) error {
*i = append(*i, value)
return nil
}
type Params struct {
ns string
pod string
containerName string
capabilities arrayFlags
image string
kubeconfig string
}
var (
param = new(Params)
)
func Panic(err error) {
if err != nil {
panic(err)
}
}
func interface2String(val interface{}, err error) (string, error) {
return cast.ToString(val), err
}
func interface2StringArray(val interface{}, err error) ([]string, error) {
return val.([]string), err
}
func main() {
flag.StringVar(¶m.ns, "n", "default", "namespace")
flag.StringVar(¶m.pod, "p", "", "pod name")
flag.StringVar(¶m.containerName, "c", "", "container name, if not specified, the first container will be selected")
flag.StringVar(¶m.image, "image", "nicolaka/netshoot", "use image to create ephemeral container")
flag.Var(¶m.capabilities, "capabilities", "add capabilities to the container, default is SYS_PTRACE")
flag.StringVar(¶m.kubeconfig, "kubeconfig", filepath.Join(homedir.HomeDir(), ".kube", "config"), "kubeconfig file path")
flag.Parse()
if len(param.capabilities) == 0 {
param.capabilities = append(param.capabilities, "SYS_PTRACE")
}
client := pkg.InitK8sClient(param.kubeconfig)
if client == nil {
return
}
if param.pod == "" {
var err error
param.ns, err = interface2String(args.NewNsOptions(client).Ask())
Panic(err)
param.pod, err = interface2String(args.NewPodOptions(param.ns, client).Ask())
Panic(err)
param.containerName, err = interface2String(args.NewContainersOptions(param.ns, client, cast.ToString(param.pod)).Ask())
Panic(err)
param.capabilities, err = interface2StringArray(args.NewCapabilitiesOptions().Ask())
Panic(err)
param.image, err = interface2String(args.NewImageOptions().Ask())
Panic(err)
}
Panic(pkg.NewEphemeralContainer(param.pod, param.containerName, param.ns, param.image, param.capabilities).Do(client))
}