bimbly 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 625f0de85f00930077c15f0be3765f5c5706b6bf
4
+ data.tar.gz: 0bbc8dc1fafa56a469177de5e19bd170d8b955b3
5
+ SHA512:
6
+ metadata.gz: 22b8f0d267adcb5c43906d8f6cac5298d435187f214325b3d9719124f280d2d08eb006032c4d497a1f0f2fbc68c9f64e21b3463f9a45ddc5214400018c8967e7
7
+ data.tar.gz: 0e8622895288b12d10734acb48be2eb09f8e5fcb9c4a3b5003796f81584c9bf53b5b3c79abfeb2055316c7726dee5f0aa23edb0362adefe7d1965f06cacff5e3
data/lib/bimbly.rb ADDED
@@ -0,0 +1,239 @@
1
+ require 'rest_client'
2
+ require 'yaml'
3
+ require 'json'
4
+ require 'pathname'
5
+ require 'pp'
6
+
7
+ class Bimbly
8
+ attr_reader :data_type, :error_codes, :error_names, :obj_sets
9
+ attr_accessor :array, :base_url, :cert, :doc_pointer, :file, :file_select, :headers, :menu,
10
+ :param_pointer, :password, :pointer, :port, :user, :verb
11
+
12
+ def initialize(opts = {})
13
+ # Read in setup files
14
+ @error_codes = YAML.load(File.read("#{File.dirname(__FILE__)}/errors_by_code.yml"))
15
+ @error_names = YAML.load(File.read("#{File.dirname(__FILE__)}/errors_by_name.yml"))
16
+ @obj_sets = YAML.load(File.read("#{File.dirname(__FILE__)}/object_sets.yml"))
17
+ @data_type = YAML.load(File.read("#{File.dirname(__FILE__)}/data_types.yml"))
18
+
19
+ @base_url = "NotConnected"
20
+ @menu = []
21
+ @param_pointer = @obj_sets
22
+ @doc_pointer = @obj_sets
23
+ gen_methods
24
+ new_connection(opts)
25
+ end
26
+
27
+ def call(opts = {})
28
+ verb = @verb
29
+ payload = @payload
30
+ uri = @uri
31
+ reset
32
+
33
+ raise StandardError, "Instantiate a connection to an array" if @array.nil?
34
+
35
+ raise StandardError, "Method to be used has not been loaded" if verb.nil?
36
+
37
+ # Check if url is valid
38
+ raise ArgumentError, "Invalid URL: #{uri}" unless uri =~ /\A#{URI::regexp}\z/
39
+
40
+ payload = payload.to_json if payload.class == Hash
41
+
42
+ begin
43
+ response = RestClient::Request.execute(
44
+ method: verb.to_sym,
45
+ url: uri,
46
+ ssl_ca_file: @cert,
47
+ headers: @headers,
48
+ payload: payload
49
+ )
50
+ rescue RestClient::ExceptionWithResponse => e
51
+ puts "Response Code: #{e.response.code}"
52
+ puts "Response Headers:"
53
+ pp e.response.headers
54
+ puts "Response Body:"
55
+ pp e.response.body
56
+ puts "Response Object:"
57
+ pp e.response.request.inspect
58
+ end
59
+
60
+ begin
61
+ JSON.parse(response.body) unless response.nil? || response.body == ''
62
+ rescue JSON::ParserError => e
63
+ puts e
64
+ end
65
+ end
66
+
67
+ def new_connection(opts = {})
68
+ @file = opts[:file]
69
+ @file_select = opts[:file_select]
70
+ @array = opts[:array]
71
+ @cert = opts[:cert]
72
+ @port = opts[:port]
73
+ @user = opts[:user]
74
+ @password = opts[:password]
75
+
76
+ return if opts.empty?
77
+
78
+ if @file
79
+ conn_data = YAML.load(File.read(File.expand_path(@file)))
80
+ puts File.expand_path(@file)
81
+ puts conn_data
82
+ conn_data = conn_data[@file_select] if @file_select
83
+ @array = conn_data["array"]
84
+ @cert = conn_data["cert"]
85
+ @user = conn_data["user"]
86
+ @password = conn_data["password"]
87
+ end
88
+
89
+ @port = "5392" if @port.nil?
90
+
91
+ raise ArgumentError, "You must provide an array" if @array.nil?
92
+ raise ArgumentError, "You must provide a CA cert" if @cert.nil?
93
+ raise ArgumentError, "You must provide a user" if @user.nil?
94
+ raise ArgumentError, "You must provide a password" if @password.nil?
95
+
96
+ @base_url = "https://#{array}:#{port}"
97
+ @uri = "#{@base_url}/v1/tokens"
98
+
99
+ # Get initial connection credentials
100
+ creds = { data: {
101
+ username: @user,
102
+ password: @password
103
+ }
104
+ }
105
+
106
+ begin
107
+ response = RestClient::Request.execute(
108
+ method: :post,
109
+ url: @uri,
110
+ payload: creds.to_json,
111
+ ssl_ca_file: @cert,
112
+ ssl_ciphers: 'AESGCM:!aNULL'
113
+ )
114
+ rescue RestClient::ExceptionWithResponse => e
115
+ puts "Response Code: #{e.response.code}"
116
+ puts "Response Headers: #{e.response.headers}"
117
+ puts "Response Body: #{e.response.body}"
118
+ puts "Response Object: #{e.response.request.inspect}"
119
+ end
120
+
121
+ token = JSON.parse(response)["data"]["session_token"]
122
+ @headers = { 'X-Auth-Token' => token }
123
+ end
124
+
125
+ def reset
126
+ @verb = nil
127
+ @payload = nil
128
+ @uri = nil
129
+ @doc_pointer = @obj_sets
130
+ @param_pointer = @obj_sets
131
+ end
132
+
133
+ def details
134
+ puts "URI: #{@uri}"
135
+ puts "Verb: #{@verb}"
136
+ puts "Payload: #{@payload}"
137
+ end
138
+
139
+ def doc
140
+ puts @doc_pointer.to_yaml
141
+ end
142
+
143
+ def parameters
144
+ @param_pointer
145
+ end
146
+
147
+ def available_methods
148
+ self.methods - Object.methods
149
+ end
150
+
151
+ def data_types(type = nil)
152
+ if type
153
+ return @data_type[type]
154
+ elsif @param_pointer.nil?
155
+ return @data_type
156
+ else
157
+ @param_pointer.each { |key,value|
158
+ puts "[#{key}]"
159
+ @data_type[value].each { |key, value|
160
+ puts "#{key}: #{value}"
161
+ }
162
+ puts ""
163
+ }
164
+ end
165
+
166
+ return nil
167
+ end
168
+
169
+ def build_params(hash)
170
+ raise ArgumentError, "Please provide a valid hash for parameters" unless
171
+ hash.instance_of? Hash and hash != {}
172
+ url_params = "?"
173
+ size_count = 0
174
+ hash.each { |key, value|
175
+ url_params = "#{url_params}#{key}=#{value}"
176
+ size_count += 1
177
+ url_params = "#{url_params}&" unless size_count == hash.size
178
+ }
179
+ url_params
180
+ end
181
+
182
+ def gen_uri(opts = {})
183
+ url_params = build_params(opts[:params]) if opts[:params]
184
+ uri = "#{@base_url}/#{opts[:url_suffix]}#{url_params}"
185
+ end
186
+
187
+ def gen_method_hash
188
+ method_hash = {}
189
+ name = ""
190
+ @obj_sets.each { |obj_key, obj_value|
191
+ obj_value.each { |op_key, op_value|
192
+ method_suffix = ""
193
+ op_value.each { |key, value|
194
+ next if not key.match(/DELETE|GET|POST|PUT/)
195
+ if key.match(/id/)
196
+ method_suffix = "_by_id"
197
+ elsif key.match(/detail/)
198
+ method_suffix = "_detailed"
199
+ end
200
+ verb, url_suffix = key.split(' ')
201
+ hash = {}
202
+ hash[:verb] = verb.downcase.to_sym
203
+ hash[:url_suffix] = url_suffix
204
+ hash[:avail_params] = value
205
+ hash[:object] = obj_key
206
+ hash[:op] = op_key
207
+
208
+ name = "#{op_key}_#{obj_key}#{method_suffix}"
209
+ method_hash[name.to_sym] = hash
210
+ @menu.push name
211
+ }
212
+ }
213
+ }
214
+ method_hash
215
+ end
216
+
217
+ def gen_methods
218
+ method_hash = gen_method_hash
219
+ method_hash.each { |method_name, hash|
220
+ define_singleton_method(method_name) { |opts = {}|
221
+ raise ArgumentError, "Please provide id" if method_name.match(/id/) and opts[:id].nil?
222
+ url_suffix = hash[:url_suffix]
223
+ url_suffix = url_suffix.gsub(/\/id/, "/#{opts[:id]}") if method_name.match(/id/)
224
+
225
+ @param_pointer = hash[:avail_params]
226
+
227
+ uri = gen_uri(url_suffix: url_suffix,
228
+ params: opts[:params])
229
+
230
+ @uri = uri
231
+ @verb = hash[:verb]
232
+ @payload = opts[:payload]
233
+ @doc_pointer = @obj_sets[hash[:object]][hash[:op]]
234
+
235
+ self
236
+ }
237
+ }
238
+ end
239
+ end