This repository has been archived by the owner on Jan 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.rb
executable file
·174 lines (149 loc) · 3.98 KB
/
cli.rb
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/usr/bin/env ruby
# frozon_string_literal: true
require 'uri'
require 'net/https'
require 'json'
require 'optparse'
require 'fileutils'
class CLI
def initialize(argv)
@argv = Array(argv)
@name = ENV.fetch('COVFEFE_APPNAME', nil)
@endpoint = ENV.fetch('COVFEFE_ENDPOINT', nil)
end
def perform
case @argv.first
when 'set'
parser = OptionParser.new do |opts|
common_options opts
end
remainings = parser.parse @argv[1..-1]
Set.new(build_requestor, @name, remainings).perform
when 'unset'
parser = OptionParser.new do |opts|
common_options opts
end
remainings = parser.parse @argv[1..-1]
Unset.new(build_requestor, @name, remainings).perform
else
options = { format: :json }
parser = OptionParser.new do |opts|
common_options opts
opts.on('-s') { options[:format] = :shell }
opts.on('-d OUTPUT_PATH') do |v|
options[:format] = :envdir
options[:path] = v
end
opts.on('-j') { options[:format] = :json_array }
end
parser.parse @argv
Show.new(build_requestor, { name: @name }.merge(options)).perform
end
end
def build_requestor
Requestor.new @endpoint
end
def common_options(opts)
opts.on('-a NAME') { |v| @name = v }
opts.on('-e ENDPOINT') { |v| @endpoint = v }
opts
end
class Show
attr_reader :requestor, :options
def initialize(requestor, options)
@requestor = requestor
@options = options
end
def perform
response = request
exit! unless response.code == '200'
response_body = JSON.parse response.body
case options[:format]
when :json
puts JSON.pretty_generate response_body
when :json_array
puts JSON.pretty_generate(response_body.map { |name, value| { name: name, value: value } })
when :shell
puts response_body.map { |key, val|
if val.empty?
%(#{key}=)
else
%(#{key}='#{val}')
end
}.join("\n") << "\n"
when :envdir
path = File.expand_path options[:path]
FileUtils.mkdir_p path
response_body.each do |key, val|
File.binwrite File.join(path, key), val
end
end
end
def request
requestor.perform Net::HTTP::Get.new "/#{options[:name]}"
end
end
class Set
attr_reader :requestor, :name, :data
def initialize(requestor, name, data)
@requestor = requestor
@name = name
@data = data
end
def perform
response = request
exit! unless response.code == '200'
puts JSON.pretty_generate JSON.parse(response.body)
end
def request
requestor.perform generate_request
end
def generate_request
Net::HTTP::Post.new("/#{name}/set").tap do |request|
request.body = generate_body
end
end
def generate_body
data.map { |datum| datum.split('=', 2).map(&:to_s) }.to_h.to_json
end
end
class Unset
attr_reader :requestor, :name, :data
def initialize(requestor, name, data)
@requestor = requestor
@name = name
@data = data
end
def perform
response = request
exit! unless response.code == '200'
puts JSON.pretty_generate JSON.parse(response.body)
end
def request
requestor.perform generate_request
end
def generate_request
Net::HTTP::Post.new("/#{name}/unset").tap do |request|
request.body = generate_body
end
end
def generate_body
data.map { |datum| [datum, ''] }.to_h.to_json
end
end
class Requestor
attr_reader :uri
def initialize(endpoint)
@uri = URI(endpoint)
end
def perform(request)
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |client|
request.basic_auth(uri.user.to_s, uri.password.to_s) if uri.user || uri.password
client.request request
end
end
end
end
if __FILE__ == $PROGRAM_NAME
CLI.new(ARGV).perform
end