onering-client 0.0.99 → 0.1.1

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.
@@ -2,7 +2,7 @@ $: << File.expand_path(File.dirname(__FILE__))
2
2
 
3
3
  module Onering
4
4
  module Client
5
- VERSION = "0.0.99"
5
+ VERSION = "0.1.1"
6
6
 
7
7
  class Error < Exception; end
8
8
  class FatalError < Error; end
@@ -212,14 +212,7 @@ module Onering
212
212
  # -----------------------------------------------------------------------------
213
213
  def _setup_auth()
214
214
  type = Onering::Config.get('authentication.type', :auto)
215
-
216
- case type.to_sym
217
- when :token
218
- _setup_auth_token()
219
-
220
- else
221
- _setup_auth_ssl()
222
- end
215
+ _setup_auth_token()
223
216
  end
224
217
 
225
218
  # -----------------------------------------------------------------------------
@@ -230,33 +223,19 @@ module Onering
230
223
  end
231
224
 
232
225
  # -----------------------------------------------------------------------------
233
- def _setup_auth_ssl()
234
- begin
235
- Onering::Logger.info("Using SSL authentication mechanism", "Onering::API")
236
-
237
- # get first keyfile found
238
- key = (([Onering::Config.get('authentication.keyfile')] + DEFAULT_CLIENT_PEM).compact.select{|i|
239
- rv = (File.readable?(File.expand_path(i)) rescue false)
240
- Onering::Logger.debug("SSL keyfile found at #{File.expand_path(i)}", "Onering::API") if rv === true
241
- rv
242
- }).first
243
-
244
- # SSL client key not found, attempt autoregistration...
245
- if key.nil?
246
- if Onering::Config.get('authentication.autoregister', true)
247
- Onering::Logger.warn("SSL keyfile not found, attempting to autoregister client", "Onering::API")
248
-
249
- validation_key = Onering::Config.get('authentication.validation_keyfile', DEFAULT_VALIDATION_PEM)
250
- validation_key = (File.expand_path(validation_key) rescue validation_key)
226
+ def _setup_auth_token()
227
+ Onering::Logger.info("Using token authentication mechanism", "Onering::API")
251
228
 
252
- # if validation key exists, autoregister
253
- if File.size?(validation_key)
254
- Onering::Logger.debug("Using validation key at #{validation_key}", "Onering::API")
229
+ # get first keyfile found
230
+ key = Onering::Config.get('authentication.key', Onering::Config.get('authentication.keyfile'))
255
231
 
256
- # set the authentication PEM to validation.pem
257
- Onering::API.pem(File.read(validation_key))
232
+ if key.nil?
233
+ if Onering::Config.get('authentication.bootstrap.enabled', true)
234
+ Onering::Logger.warn("Authentication token not found, attempting to autoregister client", "Onering::API")
258
235
 
259
- # attempt to create client.pem from least-specific to most, first writable path wins
236
+ if not (bootstrap = Onering::Config.get('authentication.bootstrap.key')).nil?
237
+ if bootstrap.to_s =~ /[0-9a-f]{32,64}/
238
+ # attempt to create key.yml from least-specific to most, first writable path wins
260
239
  clients = [{
261
240
  :path => "/etc/onering",
262
241
  :name => fact('hardwareid'),
@@ -273,54 +252,54 @@ module Onering
273
252
  clients.each do |client|
274
253
  # expand and assemble path
275
254
  client[:path] = (File.expand_path(client[:path]) rescue client[:path])
276
- keyfile = File.join(client[:path], 'client.pem')
255
+ keyfile = File.join(client[:path], 'key.yml')
277
256
 
278
257
  # skip this if we can't write to the parent directory
279
258
  next unless File.writable?(client[:path])
280
259
  Dir.mkdir(client[:path]) unless File.directory?(client[:path])
281
260
  next if File.exists?(keyfile)
282
261
 
262
+ self.class.headers({
263
+ 'X-Auth-Bootstrap-Token' => bootstrap
264
+ })
265
+
283
266
  # attempt to create/download the keyfile
284
- Onering::Logger.debug("Requesting SSL keyfile as client #{client[:name].strip}, key #{client[:keyname]}", "Onering::API")
285
- response = self.class.get("/api/users/#{client[:name].strip}/keys/#{client[:keyname]}")
267
+ Onering::Logger.debug("Requesting authentication token for #{client[:name].strip}; #{bootstrap}", "Onering::API")
268
+ response = self.class.get("/api/users/#{client[:name].strip}/tokens/#{client[:keyname]}")
286
269
 
287
270
  # if successful, write the file
288
271
  if response.code < 400 and response.body
289
- File.open(keyfile, 'w').puts(response.body)
290
- raise Actions::Retry.new
272
+ File.open(keyfile, 'w').puts(YAML.dump({
273
+ 'authentication' => {
274
+ 'key' => response.body.strip.chomp
275
+ }
276
+ }))
277
+
278
+ key = response.body.strip.chomp
279
+
291
280
  else
292
281
  # all errors are fatal at this stage
293
282
  Onering::Logger.fatal!("Cannot autoregister client: HTTP #{response.code} - #{(response.parsed_response || {}).get('error.message', 'Unknown error')}", "Onering::API")
294
283
  end
295
- end
296
284
 
297
- # it is an error to not have created a client.pem by now
298
- raise Errors::AuthenticationMissing.new("Cannot autoregister client: keyfile not created")
285
+ self.class.headers({})
299
286
 
287
+ # we're done here...
288
+ break
289
+ end
300
290
  else
301
- # cannot autoregister without a validation.pem
302
- raise Errors::AuthenticationMissing.new("Cannot autoregister client: validation keyfile is missing")
291
+ raise Errors::AuthenticationMissing.new("Autoregistration failed: invalid bootstrap token specified")
303
292
  end
293
+
304
294
  else
305
- raise Errors::AuthenticationMissing.new("Cannot find SSL key and autoregistration is disabled")
295
+ raise Errors::AuthenticationMissing.new("Autoregistration failed: no bootstrap token specified")
306
296
  end
297
+
307
298
  else
308
- Onering::API.pem(File.read((File.expand_path(key) rescue key)))
309
- Onering::Logger.debug("Using SSL keyfile #{File.expand_path(key) rescue key}", "Onering::API")
299
+ raise Errors::AuthenticationMissing.new("Authentication token not found, and autoregistration disabled")
310
300
  end
311
-
312
- rescue Actions::Retry
313
- retry
314
301
  end
315
- end
316
-
317
302
 
318
- # -----------------------------------------------------------------------------
319
- def _setup_auth_token()
320
- Onering::Logger.info("Using token authentication mechanism", "Onering::API")
321
-
322
- # get first keyfile found
323
- key = Onering::Config.get('authentication.key', Onering::Config.get('authentication.keyfile'))
324
303
  raise Errors::AuthenticationMissing.new("Token authentication specified, but cannot find a token config or as a command line argument") if key.nil?
325
304
 
326
305
  # set auth mechanism
@@ -332,4 +311,4 @@ module Onering
332
311
  _default_param(:token, key)
333
312
  end
334
313
  end
335
- end
314
+ end
@@ -5,7 +5,7 @@ module Onering
5
5
  class Config
6
6
  class<<self
7
7
  DEFAULT_CONFIG={}
8
- DEFAULT_OPTIONS_FILE=["~/.onering/cli.yml", "/etc/onering/cli.yml"]
8
+ DEFAULT_OPTIONS_FILE=["~/.onering/cli.yml", "~/.onering/key.yml", "/etc/onering/cli.yml", "/etc/onering/key.yml"]
9
9
 
10
10
  def load(configfile=nil, config={})
11
11
  if configfile.nil?
@@ -56,4 +56,4 @@ module Onering
56
56
  end
57
57
  end
58
58
  end
59
- end
59
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onering-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.99
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: facter
16
- requirement: &20444300 !ruby/object:Gem::Requirement
16
+ requirement: &24589080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.7.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *20444300
24
+ version_requirements: *24589080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: deep_merge
27
- requirement: &20443800 !ruby/object:Gem::Requirement
27
+ requirement: &24588580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *20443800
35
+ version_requirements: *24588580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: addressable
38
- requirement: &20442380 !ruby/object:Gem::Requirement
38
+ requirement: &24588080 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.3.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *20442380
46
+ version_requirements: *24588080
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: httparty
49
- requirement: &20457580 !ruby/object:Gem::Requirement
49
+ requirement: &24587560 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.11.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *20457580
57
+ version_requirements: *24587560
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hashlib
60
- requirement: &20456440 !ruby/object:Gem::Requirement
60
+ requirement: &24587060 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.0.35
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *20456440
68
+ version_requirements: *24587060
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: multi_json
71
- requirement: &20454860 !ruby/object:Gem::Requirement
71
+ requirement: &24586560 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - =
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.7.9
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *20454860
79
+ version_requirements: *24586560
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rainbow
82
- requirement: &20453980 !ruby/object:Gem::Requirement
82
+ requirement: &24586080 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - <=
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 1.1.4
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *20453980
90
+ version_requirements: *24586080
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: trollop
93
- requirement: &20452860 !ruby/object:Gem::Requirement
93
+ requirement: &24606560 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - =
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '2.0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *20452860
101
+ version_requirements: *24606560
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: xml-simple
104
- requirement: &20451600 !ruby/object:Gem::Requirement
104
+ requirement: &24606100 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - =
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 1.1.2
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *20451600
112
+ version_requirements: *24606100
113
113
  description: A Ruby wrapper for Onering
114
114
  email: ghetzel@outbrain.com
115
115
  executables:
@@ -117,22 +117,22 @@ executables:
117
117
  extensions: []
118
118
  extra_rdoc_files: []
119
119
  files:
120
- - lib/onering.rb
120
+ - lib/onering/config.rb
121
121
  - lib/onering/logger.rb
122
122
  - lib/onering/cli.rb
123
- - lib/onering/config.rb
124
- - lib/onering/api.rb
125
- - lib/onering/util.rb
126
- - lib/onering/plugins/authentication.rb
127
- - lib/onering/plugins/reporter.rb
128
123
  - lib/onering/plugins/devices.rb
124
+ - lib/onering/plugins/reporter.rb
125
+ - lib/onering/plugins/authentication.rb
129
126
  - lib/onering/plugins/automation.rb
130
- - lib/onering/cli/reporter.rb
131
127
  - lib/onering/cli/devices.rb
128
+ - lib/onering/cli/reporter.rb
132
129
  - lib/onering/cli/config.rb
133
- - lib/onering/cli/automation.rb
134
130
  - lib/onering/cli/fact.rb
131
+ - lib/onering/cli/automation.rb
135
132
  - lib/onering/cli/call.rb
133
+ - lib/onering/api.rb
134
+ - lib/onering/util.rb
135
+ - lib/onering.rb
136
136
  - bin/onering
137
137
  homepage: https://github.com/outbrain/onering-ruby
138
138
  licenses: []