bimbly 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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