chef-infra-api 0.9.1 → 0.10.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f1a019204906d755e2df904227b405895b18997286a0e01391c38e860c8f8eb
4
- data.tar.gz: 8da7a860ead9c3a62ae286829b08e0edc9f039daa2664dd67864142efa929101
3
+ metadata.gz: c8ca98919801b5c0d0baf4ef0e2b4523efb24b3ee2aa65e04fc9d5473ec6c373
4
+ data.tar.gz: eff96d984676e726e4a4c0a5b67b9dca76800a4e373d71b8e50b0e5f0fec9b58
5
5
  SHA512:
6
- metadata.gz: 0ed650663f51d8abc528c664aa62b947612e068924fa6a734f571a4a9ab48052a27b993d855ae627d6e1ace68a2debcd87b2eef8f41d84a23b2551212982da48
7
- data.tar.gz: 7f955aecd324dd67821d5c82d8753cfb6eb010300b8dfd6565ee631def443a627aef218998a1e730c1a744fa9832889d8c4d323da26b4c115de102ebfd58f6a1
6
+ metadata.gz: 1647ff4a3dda7b6e8179417cfbb0c7ba1c56cc0707848e8d65ea4046d6c212c3c0c2e4331e2560a9773e64f261b56c35c93a4c8bf3de1a1e98611333719d25ef
7
+ data.tar.gz: c6f799df264a08315a6688887be7da5a2c5b516e4b24645fc54d22470c3faac7e1669002b6ae286a073efe6a70a0571ade14c63e585c20d9dcab87a412381c32
@@ -1,21 +1,21 @@
1
- require 'json'
2
- require 'logify'
3
- require 'pathname'
4
- require 'chef-api/version'
1
+ require "json" unless defined?(JSON)
2
+ require "pathname" unless defined?(Pathname)
3
+ require_relative "chef-api/log"
4
+ require_relative "chef-api/version"
5
5
 
6
6
  module ChefAPI
7
- autoload :Authentication, 'chef-api/authentication'
8
- autoload :Boolean, 'chef-api/boolean'
9
- autoload :Configurable, 'chef-api/configurable'
10
- autoload :Connection, 'chef-api/connection'
11
- autoload :Defaults, 'chef-api/defaults'
12
- autoload :Error, 'chef-api/errors'
13
- autoload :ErrorCollection, 'chef-api/error_collection'
14
- autoload :Multipart, 'chef-api/multipart'
15
- autoload :Resource, 'chef-api/resource'
16
- autoload :Schema, 'chef-api/schema'
17
- autoload :Util, 'chef-api/util'
18
- autoload :Validator, 'chef-api/validator'
7
+ autoload :Authentication, "chef-api/authentication"
8
+ autoload :Boolean, "chef-api/boolean"
9
+ autoload :Configurable, "chef-api/configurable"
10
+ autoload :Connection, "chef-api/connection"
11
+ autoload :Defaults, "chef-api/defaults"
12
+ autoload :Error, "chef-api/errors"
13
+ autoload :ErrorCollection, "chef-api/error_collection"
14
+ autoload :Multipart, "chef-api/multipart"
15
+ autoload :Resource, "chef-api/resource"
16
+ autoload :Schema, "chef-api/schema"
17
+ autoload :Util, "chef-api/util"
18
+ autoload :Validator, "chef-api/validator"
19
19
 
20
20
  #
21
21
  # @todo Document this and why it's important
@@ -35,7 +35,7 @@ module ChefAPI
35
35
  # the log level to set
36
36
  #
37
37
  def log_level=(level)
38
- Logify.level = level
38
+ ChefAPI::Log.level = level
39
39
  end
40
40
 
41
41
  #
@@ -44,7 +44,7 @@ module ChefAPI
44
44
  # @return [Symbol]
45
45
  #
46
46
  def log_level
47
- Logify.level
47
+ ChefAPI::Log.level
48
48
  end
49
49
 
50
50
  #
@@ -54,7 +54,7 @@ module ChefAPI
54
54
  # @return [Pathname]
55
55
  #
56
56
  def root
57
- @root ||= Pathname.new(File.expand_path('../../', __FILE__))
57
+ @root ||= Pathname.new(File.expand_path("../../", __FILE__))
58
58
  end
59
59
 
60
60
  #
@@ -93,4 +93,3 @@ end
93
93
 
94
94
  # Load the initial default values
95
95
  ChefAPI.setup
96
-
@@ -1,7 +1,7 @@
1
1
  module ChefAPI
2
2
  module AclAble
3
3
  def acl_path
4
- self.resource_path + '/_acl'
4
+ resource_path + "/_acl"
5
5
  end
6
6
 
7
7
  def load_acl
@@ -14,7 +14,7 @@ module ChefAPI
14
14
 
15
15
  def acl
16
16
  unless @acl
17
- self.load_acl
17
+ load_acl
18
18
  end
19
19
  @acl
20
20
  end
@@ -22,14 +22,14 @@ module ChefAPI
22
22
  def save!
23
23
  super
24
24
  if @acl != @orig_acl_data
25
- %w(create update grant read delete).each{|action|
25
+ %w{create update grant read delete}.each { |action|
26
26
  if @acl[action] != @orig_acl_data[action]
27
- url = "#{self.acl_path}/#{action}"
28
- self.class.connection.put(url, {action => @acl[action]}.to_json)
27
+ url = "#{acl_path}/#{action}"
28
+ self.class.connection.put(url, { action => @acl[action] }.to_json)
29
29
  end
30
30
  }
31
31
  end
32
32
  end
33
33
  end
34
-
34
+
35
35
  end
@@ -1,7 +1,7 @@
1
- require 'base64'
2
- require 'digest'
3
- require 'openssl'
4
- require 'time'
1
+ require "base64" unless defined?(Base64)
2
+ require "digest" unless defined?(Digest)
3
+ require "openssl" unless defined?(OpenSSL)
4
+ require "time" unless defined?(Time)
5
5
 
6
6
  #
7
7
  # DEBUG steps:
@@ -11,20 +11,19 @@ require 'time'
11
11
 
12
12
  module ChefAPI
13
13
  class Authentication
14
- include Logify
15
14
 
16
15
  # @todo: Enable this in the future when Mixlib::Authentication supports
17
16
  # signing the full request body instead of just the uploaded file parameter.
18
17
  SIGN_FULL_BODY = false
19
18
 
20
- SIGNATURE = 'algorithm=sha1;version=1.0;'.freeze
19
+ SIGNATURE = "algorithm=sha1;version=1.0;".freeze
21
20
 
22
21
  # Headers
23
- X_OPS_SIGN = 'X-Ops-Sign'.freeze
24
- X_OPS_USERID = 'X-Ops-Userid'.freeze
25
- X_OPS_TIMESTAMP = 'X-Ops-Timestamp'.freeze
26
- X_OPS_CONTENT_HASH = 'X-Ops-Content-Hash'.freeze
27
- X_OPS_AUTHORIZATION = 'X-Ops-Authorization'.freeze
22
+ X_OPS_SIGN = "X-Ops-Sign".freeze
23
+ X_OPS_USERID = "X-Ops-Userid".freeze
24
+ X_OPS_TIMESTAMP = "X-Ops-Timestamp".freeze
25
+ X_OPS_CONTENT_HASH = "X-Ops-Content-Hash".freeze
26
+ X_OPS_AUTHORIZATION = "X-Ops-Authorization".freeze
28
27
 
29
28
  class << self
30
29
  #
@@ -96,9 +95,9 @@ module ChefAPI
96
95
  #
97
96
  def headers
98
97
  {
99
- X_OPS_SIGN => SIGNATURE,
100
- X_OPS_USERID => @user,
101
- X_OPS_TIMESTAMP => canonical_timestamp,
98
+ X_OPS_SIGN => SIGNATURE,
99
+ X_OPS_USERID => @user,
100
+ X_OPS_TIMESTAMP => canonical_timestamp,
102
101
  X_OPS_CONTENT_HASH => content_hash,
103
102
  }.merge(signature_lines)
104
103
  end
@@ -114,7 +113,7 @@ module ChefAPI
114
113
  return @content_hash if @content_hash
115
114
 
116
115
  if SIGN_FULL_BODY
117
- @content_hash = hash(@body || '').chomp
116
+ @content_hash = hash(@body || "").chomp
118
117
  else
119
118
  if @body.is_a?(Multipart::MultiIO)
120
119
  filepart = @body.ios.find { |io| io.is_a?(Multipart::MultiIO) }
@@ -122,7 +121,7 @@ module ChefAPI
122
121
 
123
122
  @content_hash = hash(file).chomp
124
123
  else
125
- @content_hash = hash(@body || '').chomp
124
+ @content_hash = hash(@body || "").chomp
126
125
  end
127
126
  end
128
127
 
@@ -148,29 +147,28 @@ module ChefAPI
148
147
  def canonical_key
149
148
  return @canonical_key if @canonical_key
150
149
 
151
- log.info "Parsing private key..."
150
+ ChefAPI::Log.info "Parsing private key..."
152
151
 
153
152
  if @key.nil?
154
- log.warn "No private key given!"
155
- raise 'No private key given!'
153
+ ChefAPI::Log.warn "No private key given!"
154
+ raise "No private key given!"
156
155
  end
157
156
 
158
157
  if @key.is_a?(OpenSSL::PKey::RSA)
159
- log.debug "Detected private key is an OpenSSL Ruby object"
158
+ ChefAPI::Log.debug "Detected private key is an OpenSSL Ruby object"
160
159
  @canonical_key = @key
161
- elsif @key =~ /(.+)\.pem$/ || File.exists?(File.expand_path(@key))
162
- log.debug "Detected private key is the path to a file"
160
+ elsif @key =~ /(.+)\.pem$/ || File.exist?(File.expand_path(@key))
161
+ ChefAPI::Log.debug "Detected private key is the path to a file"
163
162
  contents = File.read(File.expand_path(@key))
164
163
  @canonical_key = OpenSSL::PKey::RSA.new(contents)
165
164
  else
166
- log.debug "Detected private key was the literal string key"
165
+ ChefAPI::Log.debug "Detected private key was the literal string key"
167
166
  @canonical_key = OpenSSL::PKey::RSA.new(@key)
168
167
  end
169
168
 
170
169
  @canonical_key
171
170
  end
172
171
 
173
-
174
172
  #
175
173
  # The canonical path, with duplicate and trailing slashes removed. This
176
174
  # value is then hashed.
@@ -181,7 +179,7 @@ module ChefAPI
181
179
  # @return [String]
182
180
  #
183
181
  def canonical_path
184
- @canonical_path ||= hash(@path.squeeze('/').gsub(/(\/)+$/,'')).chomp
182
+ @canonical_path ||= hash(@path.squeeze("/").gsub(%r{(/)+$}, "")).chomp
185
183
  end
186
184
 
187
185
  #
@@ -11,20 +11,20 @@ module ChefAPI
11
11
  # @return [Array<Symbol>]
12
12
  #
13
13
  def keys
14
- @keys ||= [
15
- :endpoint,
16
- :flavor,
17
- :client,
18
- :key,
19
- :proxy_address,
20
- :proxy_password,
21
- :proxy_port,
22
- :proxy_username,
23
- :ssl_pem_file,
24
- :ssl_verify,
25
- :user_agent,
26
- :read_timeout,
27
- ]
14
+ @keys ||= %i{
15
+ endpoint
16
+ flavor
17
+ client
18
+ key
19
+ proxy_address
20
+ proxy_password
21
+ proxy_port
22
+ proxy_username
23
+ ssl_pem_file
24
+ ssl_verify
25
+ user_agent
26
+ read_timeout
27
+ }
28
28
  end
29
29
  end
30
30
 
@@ -1,7 +1,7 @@
1
- require 'net/http'
2
- require 'net/https'
3
- require 'openssl'
4
- require 'uri'
1
+ require "net/http" unless defined?(Net::HTTP)
2
+ require "openssl" unless defined?(OpenSSL)
3
+ require "uri" unless defined?(URI)
4
+ require "cgi" unless defined?(CGI)
5
5
 
6
6
  module ChefAPI
7
7
  #
@@ -34,22 +34,21 @@ module ChefAPI
34
34
  end
35
35
  end
36
36
 
37
- include Logify
38
37
  include ChefAPI::Configurable
39
38
 
40
- proxy :clients, 'Resource::Client'
41
- proxy :cookbooks, 'Resource::Cookbook'
42
- proxy :data_bags, 'Resource::DataBag'
43
- proxy :data_bag_item, 'Resource::DataBagItem'
44
- proxy :environments, 'Resource::Environment'
45
- proxy :groups, 'Resource::Group'
46
- proxy :nodes, 'Resource::Node'
47
- proxy :partial_search, 'Resource::PartialSearch'
48
- proxy :principals, 'Resource::Principal'
49
- proxy :roles, 'Resource::Role'
50
- proxy :search, 'Resource::Search'
51
- proxy :users, 'Resource::User'
52
- proxy :organizations, 'Resource::Organization'
39
+ proxy :clients, "Resource::Client"
40
+ proxy :cookbooks, "Resource::Cookbook"
41
+ proxy :data_bags, "Resource::DataBag"
42
+ proxy :data_bag_item, "Resource::DataBagItem"
43
+ proxy :environments, "Resource::Environment"
44
+ proxy :groups, "Resource::Group"
45
+ proxy :nodes, "Resource::Node"
46
+ proxy :partial_search, "Resource::PartialSearch"
47
+ proxy :principals, "Resource::Principal"
48
+ proxy :roles, "Resource::Role"
49
+ proxy :search, "Resource::Search"
50
+ proxy :users, "Resource::User"
51
+ proxy :organizations, "Resource::Organization"
53
52
 
54
53
  #
55
54
  # Create a new ChefAPI Connection with the given options. Any options
@@ -75,9 +74,9 @@ module ChefAPI
75
74
  # Use any options given, but fall back to the defaults set on the module
76
75
  ChefAPI::Configurable.keys.each do |key|
77
76
  value = if options[key].nil?
78
- ChefAPI.instance_variable_get(:"@#{key}")
79
- else
80
- options[key]
77
+ ChefAPI.instance_variable_get(:"@#{key}")
78
+ else
79
+ options[key]
81
80
  end
82
81
 
83
82
  instance_variable_set(:"@#{key}", value)
@@ -198,11 +197,11 @@ module ChefAPI
198
197
  # the response body
199
198
  #
200
199
  def request(verb, path, data = {}, params = {}, request_options = {})
201
- log.info "#{verb.to_s.upcase} #{path}..."
202
- log.debug "Chef flavor: #{flavor.inspect}"
200
+ ChefAPI::Log.info "#{verb.to_s.upcase} #{path}..."
201
+ ChefAPI::Log.debug "Chef flavor: #{flavor.inspect}"
203
202
 
204
203
  # Build the URI and request object from the given information
205
- if [:delete, :get].include?(verb)
204
+ if %i{delete get}.include?(verb)
206
205
  uri = build_uri(verb, path, data)
207
206
  else
208
207
  uri = build_uri(verb, path, params)
@@ -213,38 +212,38 @@ module ChefAPI
213
212
  add_request_headers(request)
214
213
 
215
214
  # Setup PATCH/POST/PUT
216
- if [:patch, :post, :put].include?(verb)
215
+ if %i{patch post put}.include?(verb)
217
216
  if data.respond_to?(:read)
218
- log.info "Detected file/io presence"
217
+ ChefAPI::Log.info "Detected file/io presence"
219
218
  request.body_stream = data
220
219
  elsif data.is_a?(Hash)
221
220
  # If any of the values in the hash are File-like, assume this is a
222
221
  # multi-part post
223
222
  if data.values.any? { |value| value.respond_to?(:read) }
224
- log.info "Detected multipart body"
223
+ ChefAPI::Log.info "Detected multipart body"
225
224
 
226
225
  multipart = Multipart::Body.new(data)
227
226
 
228
- log.debug "Content-Type: #{multipart.content_type}"
229
- log.debug "Content-Length: #{multipart.content_length}"
227
+ ChefAPI::Log.debug "Content-Type: #{multipart.content_type}"
228
+ ChefAPI::Log.debug "Content-Length: #{multipart.content_length}"
230
229
 
231
230
  request.content_length = multipart.content_length
232
231
  request.content_type = multipart.content_type
233
232
 
234
233
  request.body_stream = multipart.stream
235
234
  else
236
- log.info "Detected form data"
235
+ ChefAPI::Log.info "Detected form data"
237
236
  request.form_data = data
238
237
  end
239
238
  else
240
- log.info "Detected regular body"
239
+ ChefAPI::Log.info "Detected regular body"
241
240
  request.body = data
242
241
  end
243
242
  end
244
243
 
245
244
  # Sign the request
246
245
  if request_options[:sign] == false
247
- log.info "Skipping signed header authentication (user requested)..."
246
+ ChefAPI::Log.info "Skipping signed header authentication (user requested)..."
248
247
  else
249
248
  add_signing_headers(verb, uri.path, request)
250
249
  end
@@ -261,7 +260,7 @@ module ChefAPI
261
260
  connection.read_timeout = read_timeout if read_timeout
262
261
 
263
262
  # Apply SSL, if applicable
264
- if uri.scheme == 'https'
263
+ if uri.scheme == "https"
265
264
  # Turn on SSL
266
265
  connection.use_ssl = true
267
266
 
@@ -276,8 +275,8 @@ module ChefAPI
276
275
  # Naughty, naughty, naughty! Don't blame when when someone hops in
277
276
  # and executes a MITM attack!
278
277
  unless ssl_verify
279
- log.warn "Disabling SSL verification..."
280
- log.warn "Neither ChefAPI nor the maintainers are responsible for " \
278
+ ChefAPI::Log.warn "Disabling SSL verification..."
279
+ ChefAPI::Log.warn "Neither ChefAPI nor the maintainers are responsible for " \
281
280
  "damages incurred as a result of disabling SSL verification. " \
282
281
  "Please use this with extreme caution, or consider specifying " \
283
282
  "a custom certificate using `config.ssl_pem_file'."
@@ -290,13 +289,13 @@ module ChefAPI
290
289
  connection.start do |http|
291
290
  response = http.request(request)
292
291
 
293
- log.debug "Raw response:"
294
- log.debug response.body
292
+ ChefAPI::Log.debug "Raw response:"
293
+ ChefAPI::Log.debug response.body
295
294
 
296
295
  case response
297
296
  when Net::HTTPRedirection
298
- redirect = URI.parse(response['location']).to_s
299
- log.debug "Performing HTTP redirect to #{redirect}"
297
+ redirect = URI.parse(response["location"]).to_s
298
+ ChefAPI::Log.debug "Performing HTTP redirect to #{redirect}"
300
299
  request(verb, redirect, data)
301
300
  when Net::HTTPSuccess
302
301
  success(response)
@@ -305,7 +304,7 @@ module ChefAPI
305
304
  end
306
305
  end
307
306
  rescue SocketError, Errno::ECONNREFUSED, EOFError
308
- log.warn "Unable to reach the Chef Server"
307
+ ChefAPI::Log.warn "Unable to reach the Chef Server"
309
308
  raise Error::HTTPServerUnavailable.new
310
309
  end
311
310
 
@@ -328,14 +327,14 @@ module ChefAPI
328
327
  # @return [URI]
329
328
  #
330
329
  def build_uri(verb, path, params = {})
331
- log.info "Building URI..."
330
+ ChefAPI::Log.info "Building URI..."
332
331
 
333
332
  # Add any query string parameters
334
333
  if querystring = to_query_string(params)
335
- log.debug "Detected verb deserves a querystring"
336
- log.debug "Building querystring using #{params.inspect}"
337
- log.debug "Compiled querystring is #{querystring.inspect}"
338
- path = [path, querystring].compact.join('?')
334
+ ChefAPI::Log.debug "Detected verb deserves a querystring"
335
+ ChefAPI::Log.debug "Building querystring using #{params.inspect}"
336
+ ChefAPI::Log.debug "Compiled querystring is #{querystring.inspect}"
337
+ path = [path, querystring].compact.join("?")
339
338
  end
340
339
 
341
340
  # Parse the URI
@@ -343,8 +342,8 @@ module ChefAPI
343
342
 
344
343
  # Don't merge absolute URLs
345
344
  unless uri.absolute?
346
- log.debug "Detected URI is relative"
347
- log.debug "Appending #{path} to #{endpoint}"
345
+ ChefAPI::Log.debug "Detected URI is relative"
346
+ ChefAPI::Log.debug "Appending #{path} to #{endpoint}"
348
347
  uri = URI.parse(File.join(endpoint, path))
349
348
  end
350
349
 
@@ -377,8 +376,8 @@ module ChefAPI
377
376
  #
378
377
  def to_query_string(hash)
379
378
  hash.map do |key, value|
380
- "#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
381
- end.join('&')[/.+/]
379
+ "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
380
+ end.join("&")[/.+/]
382
381
  end
383
382
 
384
383
  private
@@ -395,15 +394,15 @@ module ChefAPI
395
394
  # the parsed response, as an object
396
395
  #
397
396
  def success(response)
398
- log.info "Parsing response as success..."
397
+ ChefAPI::Log.info "Parsing response as success..."
399
398
 
400
- case response['Content-Type']
399
+ case response["Content-Type"]
401
400
  when /json/
402
- log.debug "Detected response as JSON"
403
- log.debug "Parsing response body as JSON"
401
+ ChefAPI::Log.debug "Detected response as JSON"
402
+ ChefAPI::Log.debug "Parsing response body as JSON"
404
403
  JSON.parse(response.body)
405
404
  else
406
- log.debug "Detected response as text/plain"
405
+ ChefAPI::Log.debug "Detected response as text/plain"
407
406
  response.body
408
407
  end
409
408
  end
@@ -416,15 +415,15 @@ module ChefAPI
416
415
  # the response object from the request
417
416
  #
418
417
  def error(response)
419
- log.info "Parsing response as error..."
418
+ ChefAPI::Log.info "Parsing response as error..."
420
419
 
421
- case response['Content-Type']
420
+ case response["Content-Type"]
422
421
  when /json/
423
- log.debug "Detected error response as JSON"
424
- log.debug "Parsing error response as JSON"
422
+ ChefAPI::Log.debug "Detected error response as JSON"
423
+ ChefAPI::Log.debug "Parsing error response as JSON"
425
424
  message = JSON.parse(response.body)
426
425
  else
427
- log.debug "Detected response as text/plain"
426
+ ChefAPI::Log.debug "Detected response as text/plain"
428
427
  message = response.body
429
428
  end
430
429
 
@@ -456,19 +455,19 @@ module ChefAPI
456
455
  # @param [Net::HTTP::Request] request
457
456
  #
458
457
  def add_request_headers(request)
459
- log.info "Adding request headers..."
458
+ ChefAPI::Log.info "Adding request headers..."
460
459
 
461
460
  headers = {
462
- 'Accept' => 'application/json',
463
- 'Content-Type' => 'application/json',
464
- 'Connection' => 'keep-alive',
465
- 'Keep-Alive' => '30',
466
- 'User-Agent' => user_agent,
467
- 'X-Chef-Version' => '11.4.0',
461
+ "Accept" => "application/json",
462
+ "Content-Type" => "application/json",
463
+ "Connection" => "keep-alive",
464
+ "Keep-Alive" => "30",
465
+ "User-Agent" => user_agent,
466
+ "X-Chef-Version" => "11.4.0",
468
467
  }
469
468
 
470
469
  headers.each do |key, value|
471
- log.debug "#{key}: #{value}"
470
+ ChefAPI::Log.debug "#{key}: #{value}"
472
471
  request[key] = value
473
472
  end
474
473
  end
@@ -484,18 +483,18 @@ module ChefAPI
484
483
  # @param [Net::HTTP::Request] request
485
484
  #
486
485
  def add_signing_headers(verb, path, request)
487
- log.info "Adding signed header authentication..."
486
+ ChefAPI::Log.info "Adding signed header authentication..."
488
487
 
489
488
  authentication = Authentication.from_options(
490
489
  user: client,
491
490
  key: key,
492
491
  verb: verb,
493
492
  path: path,
494
- body: request.body || request.body_stream,
493
+ body: request.body || request.body_stream
495
494
  )
496
495
 
497
496
  authentication.headers.each do |key, value|
498
- log.debug "#{key}: #{value}"
497
+ ChefAPI::Log.debug "#{key}: #{value}"
499
498
  request[key] = value
500
499
  end
501
500