cl-magic 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +47 -0
- data/README.md +211 -0
- data/bin/cl +17 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/cl-magic.gemspec +38 -0
- data/lib/cl/magic/cl +97 -0
- data/lib/cl/magic/cl-auth +109 -0
- data/lib/cl/magic/cl-aws-okta-auth +52 -0
- data/lib/cl/magic/cl-aws-okta-env +79 -0
- data/lib/cl/magic/cl-dk +402 -0
- data/lib/cl/magic/cl-envkey +70 -0
- data/lib/cl/magic/cl-gc-sql +135 -0
- data/lib/cl/magic/cl-gc-tags +171 -0
- data/lib/cl/magic/cl-glab-commit +68 -0
- data/lib/cl/magic/cl-history +44 -0
- data/lib/cl/magic/cl-kube-cp +99 -0
- data/lib/cl/magic/cl-kube-deployment +120 -0
- data/lib/cl/magic/cl-kube-ktx +60 -0
- data/lib/cl/magic/cl-kube-logs +114 -0
- data/lib/cl/magic/cl-kube-restart +84 -0
- data/lib/cl/magic/cl-kube-search +111 -0
- data/lib/cl/magic/cl-kube-search-all +97 -0
- data/lib/cl/magic/cl-kube-ssh +94 -0
- data/lib/cl/magic/cl-poll +51 -0
- data/lib/cl/magic/cl-sandbox +49 -0
- data/lib/cl/magic/cl-vault +84 -0
- data/lib/cl/magic/common/common_options.rb +16 -0
- data/lib/cl/magic/common/gcloud.rb +71 -0
- data/lib/cl/magic/common/kubectl.rb +236 -0
- data/lib/cl/magic/common/logging.rb +25 -0
- data/lib/cl/magic/common/parse_and_pick.rb +81 -0
- data/lib/cl/magic/version.rb +7 -0
- data/lib/cl/magic.rb +9 -0
- metadata +180 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
|
7
|
+
require 'cl/magic/common/common_options.rb'
|
8
|
+
require 'cl/magic/common/logging.rb'
|
9
|
+
require 'cl/magic/common/gcloud.rb'
|
10
|
+
require 'cl/magic/common/kubectl.rb'
|
11
|
+
|
12
|
+
@logger = get_logger()
|
13
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
14
|
+
|
15
|
+
#
|
16
|
+
# Features
|
17
|
+
#
|
18
|
+
|
19
|
+
def do_work(options)
|
20
|
+
if TTY::Prompt.new.yes?("Are you sure you want to restart #{options[:deployment]}?")
|
21
|
+
cmd = "kubectl rollout restart deployment/#{options[:deployment]} --namespace=#{options[:namespace]}"
|
22
|
+
@logger.puts
|
23
|
+
@logger.wait cmd
|
24
|
+
exec(cmd)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Options
|
30
|
+
#
|
31
|
+
|
32
|
+
options = {}
|
33
|
+
global_banner = <<DOC
|
34
|
+
|
35
|
+
Restart a deployment for a service to refresh all the containers
|
36
|
+
|
37
|
+
Usage: #{@cl_cmd_name} [options]
|
38
|
+
|
39
|
+
DOC
|
40
|
+
|
41
|
+
global = OptionParser.new do |g|
|
42
|
+
g.banner = global_banner
|
43
|
+
add_help_and_verbose(g)
|
44
|
+
|
45
|
+
g.on("-c", "--context CONTEXT", "a kubectl context name") do |v|
|
46
|
+
options[:kube_context] = v
|
47
|
+
end
|
48
|
+
|
49
|
+
g.on("-n", "--namespace NAMESPACE", "a kubectl namespace in the current context's cluster") do |v|
|
50
|
+
options[:namespace] = v
|
51
|
+
end
|
52
|
+
|
53
|
+
g.on("-d", "--deployment DEPLOYMENT", "a kubectl deployment") do |v|
|
54
|
+
options[:deployment] = v
|
55
|
+
end
|
56
|
+
|
57
|
+
g.on("-x", "use magic tools context") do |v|
|
58
|
+
options[:ktx] = v
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# Run
|
65
|
+
#
|
66
|
+
|
67
|
+
global.parse(ARGV)
|
68
|
+
|
69
|
+
# set: context and namespace
|
70
|
+
set_context_and_namespace(options)
|
71
|
+
set_ktx(options)
|
72
|
+
|
73
|
+
# set: deployment
|
74
|
+
options[:deployment] = pick_kubectl_deployment(options).first
|
75
|
+
|
76
|
+
# display full command
|
77
|
+
@logger.puts ""
|
78
|
+
write_history("""#{@cl_cmd_name} \\
|
79
|
+
--context=#{options[:kube_context]}
|
80
|
+
--namespace=#{options[:namespace]}
|
81
|
+
--deployment=#{options[:deployment]}
|
82
|
+
""")
|
83
|
+
|
84
|
+
do_work(options)
|
@@ -0,0 +1,111 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
|
6
|
+
require 'cl/magic/common/common_options.rb'
|
7
|
+
require 'cl/magic/common/logging.rb'
|
8
|
+
require 'cl/magic/common/kubectl.rb'
|
9
|
+
|
10
|
+
@logger = get_logger()
|
11
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
12
|
+
|
13
|
+
#
|
14
|
+
# Features
|
15
|
+
#
|
16
|
+
|
17
|
+
def do_search(options)
|
18
|
+
|
19
|
+
# k8 api-resources
|
20
|
+
unless options[:kube_service_name]
|
21
|
+
@logger.puts ""
|
22
|
+
cmd = "kubectl api-resources --verbs=list --namespaced -o name | grep -v events.events.k8s.io | grep -v events | sort | uniq"
|
23
|
+
@logger.wait cmd
|
24
|
+
api_resources = TTY::Command.new(:printer => :null).run(cmd).collect { |line| line.split() }
|
25
|
+
options[:kube_service_name] = pick_single_result(api_resources, "Pick a resource").first
|
26
|
+
end
|
27
|
+
|
28
|
+
# display full command
|
29
|
+
write_history("""#{@cl_cmd_name} \\
|
30
|
+
--context=#{options[:kube_context]} \\
|
31
|
+
--service=#{options[:kube_service_name]} \\
|
32
|
+
--namespace=#{options[:namespace]}
|
33
|
+
""")
|
34
|
+
|
35
|
+
# get resources
|
36
|
+
@logger.puts ""
|
37
|
+
namespace = options[:namespace] ? "-n #{options[:namespace]}" : "--all-namespaces"
|
38
|
+
cmd = "kubectl get #{namespace} --ignore-not-found #{options[:kube_service_name]}"
|
39
|
+
cmd += " | grep #{options[:pattern]}" if options[:pattern]
|
40
|
+
@logger.wait cmd
|
41
|
+
result = TTY::Command.new(:printer => :null).run(cmd).out
|
42
|
+
only_one_result = options[:pattern] ? result.lines.count == 1 : result.lines.count == 2
|
43
|
+
|
44
|
+
# print resources
|
45
|
+
unless only_one_result
|
46
|
+
puts result
|
47
|
+
@logger.puts
|
48
|
+
end
|
49
|
+
|
50
|
+
# describe resource
|
51
|
+
if only_one_result or TTY::Prompt.new.yes?("Describe one of these resources?")
|
52
|
+
num_headers = options[:pattern] ? 0 : 1
|
53
|
+
resources_by_type = parse_table_results(cmd, "No resources found", num_headers=num_headers)
|
54
|
+
selection_index = 1
|
55
|
+
resource = pick_single_result(resources_by_type, "show resource?", nil, nil, selection_index)
|
56
|
+
cmd = "kubectl describe #{options[:kube_service_name]} #{resource[0]} --namespace=#{options[:namespace]}"
|
57
|
+
@logger.puts
|
58
|
+
@logger.wait cmd
|
59
|
+
puts TTY::Command.new(:printer => :null).run(cmd)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# Options
|
65
|
+
#
|
66
|
+
|
67
|
+
options = {}
|
68
|
+
global_banner = <<DOC
|
69
|
+
|
70
|
+
Search for k8 resources
|
71
|
+
|
72
|
+
Usage: #{@cl_cmd_name} [options]
|
73
|
+
|
74
|
+
DOC
|
75
|
+
|
76
|
+
global = OptionParser.new do |g|
|
77
|
+
g.banner = global_banner
|
78
|
+
add_help_and_verbose(g)
|
79
|
+
|
80
|
+
g.on("-c", "--context CONTEXT", "a kubectl context name") do |v|
|
81
|
+
options[:kube_context] = v
|
82
|
+
end
|
83
|
+
|
84
|
+
g.on("-s", "--service SERVICE_NAME", "a kubectl api-service name") do |v|
|
85
|
+
options[:kube_service_name] = v
|
86
|
+
end
|
87
|
+
|
88
|
+
g.on("-n", "--namespace NAMESPACE", "a kubectl namespace in the current context's cluster") do |v|
|
89
|
+
options[:namespace] = v
|
90
|
+
end
|
91
|
+
|
92
|
+
g.on("-p", "--pattern PATTERN", "pattern to grep for") do |v|
|
93
|
+
options[:pattern] = v
|
94
|
+
end
|
95
|
+
|
96
|
+
g.on("-x", "use magic tools context") do |v|
|
97
|
+
options[:ktx] = v
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# Run
|
103
|
+
#
|
104
|
+
|
105
|
+
global.parse(ARGV)
|
106
|
+
|
107
|
+
# set: context
|
108
|
+
set_context_and_namespace(options) if options[:ktx]
|
109
|
+
options[:kube_context] = pick_kubectl_context(options[:kube_context])
|
110
|
+
|
111
|
+
do_search(options)
|
@@ -0,0 +1,97 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
require 'json'
|
7
|
+
require 'pastel'
|
8
|
+
|
9
|
+
require 'cl/magic/common/common_options.rb'
|
10
|
+
require 'cl/magic/common/logging.rb'
|
11
|
+
require 'cl/magic/common/kubectl.rb'
|
12
|
+
|
13
|
+
@logger = get_logger()
|
14
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
15
|
+
|
16
|
+
#
|
17
|
+
# Features
|
18
|
+
#
|
19
|
+
|
20
|
+
def do_search(options)
|
21
|
+
|
22
|
+
# k8 api-resources
|
23
|
+
unless options[:kube_service_name]
|
24
|
+
@logger.puts ""
|
25
|
+
cmd = "kubectl api-resources --verbs=list --namespaced -o name | grep -v events.events.k8s.io | grep -v events | sort | uniq"
|
26
|
+
@logger.wait cmd
|
27
|
+
api_resources = TTY::Command.new(:printer => :null).run(cmd).collect { |line| line.split() }
|
28
|
+
options[:kube_service_name] = pick_single_result(api_resources, "Pick a resource").first
|
29
|
+
end
|
30
|
+
|
31
|
+
get_kubectl_contexts().each do |context|
|
32
|
+
|
33
|
+
context_name = context[1]
|
34
|
+
|
35
|
+
# set context
|
36
|
+
cmd = "kubectl config use-context #{context_name}"
|
37
|
+
TTY::Command.new(:printer => :null).run(cmd)
|
38
|
+
|
39
|
+
# searching in
|
40
|
+
puts "searching: #{context_name}"
|
41
|
+
|
42
|
+
# grep services
|
43
|
+
cmd = "kubectl get --all-namespaces --ignore-not-found #{options[:kube_service_name]}"
|
44
|
+
cmd += " | grep #{options[:pattern]}" if options[:pattern]
|
45
|
+
|
46
|
+
results = TTY::Command.new(:printer => :null).run!(cmd) do |out, err|
|
47
|
+
unless out.nil?
|
48
|
+
puts out
|
49
|
+
@logger.puts ""
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Options
|
58
|
+
#
|
59
|
+
|
60
|
+
options = {}
|
61
|
+
global_banner = <<DOC
|
62
|
+
|
63
|
+
Grep across all clusters and namespaces
|
64
|
+
|
65
|
+
Usage: #{@cl_cmd_name} [filter-name] [options]
|
66
|
+
|
67
|
+
DOC
|
68
|
+
|
69
|
+
global = OptionParser.new do |g|
|
70
|
+
g.banner = global_banner
|
71
|
+
|
72
|
+
g.on("-s", "--service SERVICE_NAME", "a kubectl api-service name; defaults to 'services'") do |v|
|
73
|
+
options[:kube_service_name] = v
|
74
|
+
end
|
75
|
+
|
76
|
+
g.on("-p", "--pattern PATTERN", "pattern to grep for") do |v|
|
77
|
+
options[:pattern] = v
|
78
|
+
end
|
79
|
+
|
80
|
+
g.on("-x", "use magic tools context") do |v|
|
81
|
+
options[:ktx] = v
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Run
|
87
|
+
#
|
88
|
+
|
89
|
+
global.parse(ARGV)
|
90
|
+
|
91
|
+
# display full command
|
92
|
+
write_history("""#{@cl_cmd_name} \\
|
93
|
+
--grep=#{options[:pattern]} \\
|
94
|
+
--service=#{options[:kube_service_name]}
|
95
|
+
""")
|
96
|
+
|
97
|
+
do_search(options)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
require 'json'
|
7
|
+
require 'pastel'
|
8
|
+
|
9
|
+
require 'cl/magic/common/common_options.rb'
|
10
|
+
require 'cl/magic/common/logging.rb'
|
11
|
+
require 'cl/magic/common/kubectl.rb'
|
12
|
+
|
13
|
+
@logger = get_logger()
|
14
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
15
|
+
|
16
|
+
#
|
17
|
+
# Features
|
18
|
+
#
|
19
|
+
|
20
|
+
def visit_pod(options)
|
21
|
+
shell_command = options[:bash] ? "bash" : "sh"
|
22
|
+
cmd = "kubectl exec -it #{options[:pod_name]} --container #{options[:container_name]} --namespace #{options[:namespace]} -- #{shell_command}"
|
23
|
+
@logger.puts
|
24
|
+
@logger.wait cmd
|
25
|
+
exec(cmd)
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Options
|
30
|
+
#
|
31
|
+
|
32
|
+
options = {}
|
33
|
+
global_banner = <<DOC
|
34
|
+
|
35
|
+
Ssh into a container
|
36
|
+
|
37
|
+
Usage: #{@cl_cmd_name} [options]
|
38
|
+
|
39
|
+
DOC
|
40
|
+
|
41
|
+
global = OptionParser.new do |g|
|
42
|
+
g.banner = global_banner
|
43
|
+
|
44
|
+
g.on("-c", "--context CONTEXT", "a kubectl context name") do |v|
|
45
|
+
options[:kube_context] = v
|
46
|
+
end
|
47
|
+
|
48
|
+
g.on("-n", "--namespace NAMESPACE", "a kubectl namespace in the current context's cluster") do |v|
|
49
|
+
options[:namespace] = v
|
50
|
+
end
|
51
|
+
|
52
|
+
g.on("-d", "--deployment NAME", "a kubernetes deployment name") do |v|
|
53
|
+
options[:deployment_name] = v
|
54
|
+
end
|
55
|
+
|
56
|
+
g.on("-p", "--pod POD_NAME", "a kubernetes pod name") do |v|
|
57
|
+
options[:pod_name] = v
|
58
|
+
end
|
59
|
+
|
60
|
+
g.on("--container CONTAINER_NAME", "a kubernetes container you'd like to visit") do |v|
|
61
|
+
options[:container_name] = v
|
62
|
+
end
|
63
|
+
|
64
|
+
g.on("-x", "use magic tools context") do |v|
|
65
|
+
options[:ktx] = v
|
66
|
+
end
|
67
|
+
|
68
|
+
g.on("-b", "--bash", "bash instead of shell") do |v|
|
69
|
+
options[:bash] = v
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Run
|
75
|
+
#
|
76
|
+
|
77
|
+
global.parse(ARGV)
|
78
|
+
|
79
|
+
# set everything
|
80
|
+
set_context_namespace_deployment_pod_container_options(options)
|
81
|
+
set_ktx(options)
|
82
|
+
|
83
|
+
# display full command
|
84
|
+
write_history("""#{@cl_cmd_name} \\
|
85
|
+
--context=#{options[:kube_context]} \\
|
86
|
+
--namespace=#{options[:namespace]} \\
|
87
|
+
--deployment=#{options[:deployment_name]} \\
|
88
|
+
--pod=#{options[:pod_name]} \\
|
89
|
+
--container=#{options[:container_name]} \\
|
90
|
+
#{options[:bash] ? "--bash" : ""}
|
91
|
+
""")
|
92
|
+
|
93
|
+
# visit pod
|
94
|
+
visit_pod(options)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
|
7
|
+
require 'cl/magic/common/common_options.rb'
|
8
|
+
require 'cl/magic/common/logging.rb'
|
9
|
+
require 'cl/magic/common/gcloud.rb'
|
10
|
+
require 'cl/magic/common/kubectl.rb'
|
11
|
+
|
12
|
+
@logger = get_logger()
|
13
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
14
|
+
|
15
|
+
#
|
16
|
+
# Features
|
17
|
+
#
|
18
|
+
|
19
|
+
def do_work(options)
|
20
|
+
while true
|
21
|
+
tty_command = TTY::Command.new(printer: :null)
|
22
|
+
out, err = tty_command.run(ARGV.join(' '))
|
23
|
+
puts out
|
24
|
+
puts
|
25
|
+
sleep(1)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Options
|
31
|
+
#
|
32
|
+
|
33
|
+
options = {}
|
34
|
+
global_banner = <<DOC
|
35
|
+
|
36
|
+
A sandbox to try things
|
37
|
+
|
38
|
+
Usage: #{@cl_cmd_name} [options]
|
39
|
+
|
40
|
+
DOC
|
41
|
+
|
42
|
+
global = OptionParser.new do |g|
|
43
|
+
g.banner = global_banner
|
44
|
+
add_help_and_verbose(g)
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Run
|
49
|
+
#
|
50
|
+
|
51
|
+
do_work(options)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
|
7
|
+
require 'cl/magic/common/common_options.rb'
|
8
|
+
require 'cl/magic/common/logging.rb'
|
9
|
+
require 'cl/magic/common/gcloud.rb'
|
10
|
+
require 'cl/magic/common/kubectl.rb'
|
11
|
+
|
12
|
+
@logger = get_logger()
|
13
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
14
|
+
|
15
|
+
#
|
16
|
+
# Features
|
17
|
+
#
|
18
|
+
|
19
|
+
def do_work(options)
|
20
|
+
write_history("""#{@cl_cmd_name}""")
|
21
|
+
@logger.success "Hello World"
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Options
|
26
|
+
#
|
27
|
+
|
28
|
+
options = {}
|
29
|
+
global_banner = <<DOC
|
30
|
+
|
31
|
+
A sandbox to try things
|
32
|
+
|
33
|
+
Usage: #{@cl_cmd_name} [options]
|
34
|
+
|
35
|
+
DOC
|
36
|
+
|
37
|
+
global = OptionParser.new do |g|
|
38
|
+
g.banner = global_banner
|
39
|
+
add_help_and_verbose(g)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Run
|
44
|
+
#
|
45
|
+
|
46
|
+
@working_dir = ENV['CL_WORKING_DIR'] # passed through cl-magic to here
|
47
|
+
global.parse(ARGV)
|
48
|
+
|
49
|
+
do_work(options)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/subcommand'
|
4
|
+
require 'tty-command'
|
5
|
+
require 'tty-prompt'
|
6
|
+
|
7
|
+
require 'cl/magic/common/common_options.rb'
|
8
|
+
require 'cl/magic/common/logging.rb'
|
9
|
+
require 'cl/magic/common/gcloud.rb'
|
10
|
+
require 'cl/magic/common/kubectl.rb'
|
11
|
+
|
12
|
+
@logger = get_logger()
|
13
|
+
@cl_cmd_name = File.basename(__FILE__).split('-').join(' ')
|
14
|
+
|
15
|
+
#
|
16
|
+
# Features
|
17
|
+
#
|
18
|
+
|
19
|
+
def transverse_vault_path(path)
|
20
|
+
|
21
|
+
# list the folder
|
22
|
+
cmd = "vault list #{path}"
|
23
|
+
results = parse_table_results(cmd, "no secrets", num_headers=2)
|
24
|
+
selected_path = pick_single_result(results, "").first
|
25
|
+
new_path = File.join(path, selected_path)
|
26
|
+
|
27
|
+
if new_path.end_with? '/'
|
28
|
+
transverse_vault_path(new_path) # another folder, recurse
|
29
|
+
else
|
30
|
+
return new_path # picked a file
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def print_secret(secret_path)
|
35
|
+
|
36
|
+
write_history("""#{@cl_cmd_name} \\
|
37
|
+
--secret=#{secret_path}
|
38
|
+
""")
|
39
|
+
|
40
|
+
cmd = "vault read #{secret_path}"
|
41
|
+
puts TTY::Command.new(:printer => :null).run(cmd).out
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Options
|
46
|
+
#
|
47
|
+
|
48
|
+
options = {}
|
49
|
+
global_banner = <<DOC
|
50
|
+
|
51
|
+
Browse secrets path and print a secret
|
52
|
+
|
53
|
+
Usage: #{@cl_cmd_name} [options]
|
54
|
+
|
55
|
+
DOC
|
56
|
+
|
57
|
+
global = OptionParser.new do |g|
|
58
|
+
g.banner = global_banner
|
59
|
+
add_help_and_verbose(g)
|
60
|
+
|
61
|
+
g.on("-p", "--path PATH", "a vault path to start from") do |v|
|
62
|
+
options[:vault_path] = v
|
63
|
+
end
|
64
|
+
|
65
|
+
g.on("-s", "--secret SECRET_PATH", "an exact secret to get") do |v|
|
66
|
+
options[:exact_secret_path] = v
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Run
|
72
|
+
#
|
73
|
+
|
74
|
+
global.parse(ARGV)
|
75
|
+
|
76
|
+
if options[:vault_path].nil?
|
77
|
+
options[:vault_path] = "secret"
|
78
|
+
end
|
79
|
+
|
80
|
+
if options[:exact_secret_path].nil?
|
81
|
+
options[:exact_secret_path] = transverse_vault_path(options[:vault_path])
|
82
|
+
end
|
83
|
+
|
84
|
+
print_secret(options[:exact_secret_path])
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'tty-command'
|
3
|
+
require 'tty-prompt'
|
4
|
+
require 'cl/magic/common/logging.rb'
|
5
|
+
require 'cl/magic/common/parse_and_pick.rb'
|
6
|
+
|
7
|
+
#
|
8
|
+
# gcloud GET
|
9
|
+
#
|
10
|
+
|
11
|
+
def get_gcloud_projects(filter=nil)
|
12
|
+
filter_option = "--filter #{filter}" if filter
|
13
|
+
command = "gcloud projects list #{filter_option}"
|
14
|
+
error_message = "No gcloud projects? Are you authenticated?"
|
15
|
+
return parse_table_results(command, error_message)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_current_gcloud_project()
|
19
|
+
command = "gcloud config get-value project"
|
20
|
+
return TTY::Command.new(:printer => :null).run(command).out.strip.chomp
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_sql_instances()
|
24
|
+
command = "gcloud sql instances list"
|
25
|
+
return parse_table_results(command, 'No sql instances. :(')
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_sql_users(instance)
|
29
|
+
command = "gcloud sql users list --instance=#{instance.first}"
|
30
|
+
return parse_table_results(command, 'No sql users. :(')
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_sql_databases(instance)
|
34
|
+
command = "gcloud sql databases list --instance=#{instance.first}"
|
35
|
+
return parse_table_results(command, 'No sql databases. :(')
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Misc
|
40
|
+
#
|
41
|
+
|
42
|
+
def pick_gcloud_project(filter=nil)
|
43
|
+
|
44
|
+
prev_project = get_current_gcloud_project()
|
45
|
+
|
46
|
+
# pick content
|
47
|
+
projects = get_gcloud_projects(filter)
|
48
|
+
selected_project = pick_single_result(projects, 'Pick a project', nil, prev_project)
|
49
|
+
|
50
|
+
# change context
|
51
|
+
if selected_project.first != prev_project
|
52
|
+
command = "gcloud config set project #{selected_project.first}"
|
53
|
+
@logger.wait command
|
54
|
+
TTY::Command.new(:printer => :null).run(command)
|
55
|
+
else
|
56
|
+
@logger.info "project already set to #{selected_project.first}"
|
57
|
+
end
|
58
|
+
|
59
|
+
return selected_project
|
60
|
+
end
|
61
|
+
|
62
|
+
def check_gcloud_project(project)
|
63
|
+
command = "gcloud info"
|
64
|
+
result = TTY::Command.new(:printer => :null).run(command)
|
65
|
+
|
66
|
+
current_project = result.select {|line| line.include? 'Project'}.first.split(': ').last
|
67
|
+
if current_project != "[#{current_project}]"
|
68
|
+
@logger.warn "Incorrect gcloud project: #{current_project}"
|
69
|
+
@logger.warn "Use `gcloud config set project #{project}` and try again."
|
70
|
+
end
|
71
|
+
end
|