forj 1.0.11 → 1.0.12

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
  SHA1:
3
- metadata.gz: 5c59dea68c4b93b5a88af774d515d0d5c6aece5a
4
- data.tar.gz: ba80c68baec1fada231973d365f7bc3d46cb6306
3
+ metadata.gz: 998ddeee3c77bd0d8e98530ff7cff93a8fcc984c
4
+ data.tar.gz: bc302480b7d7f348f6d6a014c42b2084d728ff28
5
5
  SHA512:
6
- metadata.gz: d8f0791f66cb366aef89a6845e0a8ac13869e08e3e27e659824513b0056b27950503f2c354ddf4d5b00798ea60c34e3a0d94d2e56a6da992dc6bb290319f5e12
7
- data.tar.gz: de46007515850844f71c4dbc2d7375991c58c2be4c9118b39b432694ecb7939a9c552945fc3a5cb19d830f953c77158f7f5096228e534828647418b65e45e9cb
6
+ metadata.gz: 54cbd2285c243d19bdac2dfa2a23abb7eb0844309c1bfcf71f5aa1d8a88c5e1d36dab36f4c6c341533a169e4c17120fa21714995e1e5a533eab48b321b045862
7
+ data.tar.gz: 3f942f2dfde94c97074488914c0ffd42ce7fe463a5a26dbd8f5d11b3a096867090678b741e45d1e3864d1c24fccf437bedf5ec4afb7fbd7d66c1d21766b60566
data/bin/forj CHANGED
@@ -173,6 +173,9 @@ If you want to check/updated them, use `forj get [-a account]`
173
173
  method_option :extra_metadata, :aliases => '-e', :desc => 'Custom' \
174
174
  ' server metadata format key1=value1,key2=value2...,keyN=valueN'
175
175
 
176
+ method_option :ca_root_cert, :desc => 'Certificate Authorities file used by'\
177
+ ' your compagny to authenticate your intranet servers.'
178
+
176
179
  def boot(blueprint, on_or_name, old_accountname = nil, as = nil,
177
180
  old_name = nil)
178
181
  Forj::Settings.common_options(options)
data/forj.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.name = 'forj'
20
20
  s.homepage = 'https://www.forj.io'
21
21
 
22
- s.version = '1.0.11'
22
+ s.version = '1.0.12'
23
23
  s.date = '2015-05-22'
24
24
  s.summary = 'forj command line'
25
25
  s.description = 'forj cli - See https://www.forj.io for documentation/information'
data/lib/boot.rb CHANGED
@@ -141,6 +141,7 @@ module Forj
141
141
  :branch => :branch,
142
142
  :test_box => :test_box,
143
143
  :tb_path => :test_box_path,
144
+ :ca_root_cert => :ca_root_cert,
144
145
  :extra_metadata => :extra_metadata }
145
146
 
146
147
  load_options(options, options_map) { |k, v| complete_boot_options(k, v) }
@@ -171,6 +172,8 @@ module Forj
171
172
  value = tb_repo_detect(value)
172
173
  when :tb_path
173
174
  value = tb_bin_detect(value)
175
+ when :ca_root_cert
176
+ value = ca_root_file_detect(value)
174
177
  end
175
178
  value
176
179
  end
@@ -245,5 +248,21 @@ pwd
245
248
  return script if File.executable?(script)
246
249
  nil
247
250
  end
251
+
252
+ def self.ca_root_file_detect(param)
253
+ res_found = param.match(/^(.*)#(.*)$/)
254
+
255
+ if res_found
256
+ cert_file = res_found[1]
257
+ else
258
+ cert_file = param
259
+ end
260
+
261
+ unless File.readable?(cert_file)
262
+ PrcLib.error("Unable to read the Root Certificate file '%s'", cert_file)
263
+ return nil
264
+ end
265
+ param
266
+ end
248
267
  end
249
268
  end
@@ -158,6 +158,7 @@
158
158
  :pre_step_function: :forj_dns_settings?
159
159
  :ask_step: :dns_config
160
160
 
161
+ # Defines maestro environment.
161
162
  :maestro:
162
163
  :tenant_name:
163
164
  :desc: "Tenant name required by fog/openstack on gardener"
@@ -252,7 +253,13 @@
252
253
  :bootstrap_extra_dir:
253
254
  :desc: "Additional bootstrap directory to add in the bootstrap loop, before :bootstrap_dirs and after maestro default bootstrap directory."
254
255
 
255
- # As forj_core is based on lorj_cloud, we have to disable Lorj_cloud data defaults.
256
+
257
+ # Defines certificates
258
+
259
+ :certs:
260
+ :ca_root_cert:
261
+ :desc: "Certificate Authority file to add to servers."
262
+ # As forj_core is based on lorj_cloud, we have to disable Lorj_cloud data defaults.
256
263
  :server:
257
264
  :network_name:
258
265
  :set: false
@@ -0,0 +1,100 @@
1
+ # encoding: UTF-8
2
+
3
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ # Functions for test-box
18
+ class ForjCoreProcess
19
+ # This function detects if the server requires the certificate file to be sent
20
+
21
+ def ca_root_detect(hParams, log_output)
22
+ return unless hParams['certs#ca_root_cert'] && !config.exist?(:cert_error)
23
+ cert_file = hParams['certs#ca_root_cert']
24
+
25
+ re = /forj-cli: ca-root-cert=(.*)/
26
+ res = log_output.split("\n")[-4].match(re)
27
+
28
+ return unless res
29
+
30
+ res_found = cert_file.match(/^(.*)#(.*)$/)
31
+
32
+ if res_found
33
+ cert_file = res_found[1]
34
+ dest_file = "/tmp/#{File.basename(res_found[2])}"
35
+ else
36
+ dest_file = File.basename(cert_file)
37
+ end
38
+
39
+ unless File.readable?(cert_file)
40
+ PrcLib.error("Unable to read the Root Certificate file '%s'"\
41
+ "You will need install it yourself in /tmp + '"\
42
+ ".done' flag file", cert_file)
43
+ config[:cert_error] = true
44
+ return
45
+ end
46
+
47
+ server = hParams[:server, :name]
48
+ public_ip = hParams[:public_ip, :public_ip]
49
+ identity = File.join(hParams[:keypairs, :keypair_path],
50
+ hParams[:keypairs, :private_key_name])
51
+ # Get ssh user
52
+ user = hParams[:image, :ssh_user]
53
+
54
+ PrcLib.info("Copying local file '#{cert_file}' to #{server}:#{dest_file}")
55
+
56
+ ssh_options = '-o StrictHostKeyChecking=no -o ServerAliveInterval=180'
57
+ ssh_options += " -i #{identity}"
58
+
59
+ cmd = "scp #{ssh_options} #{cert_file} #{user}@#{public_ip}:#{dest_file}"
60
+ PrcLib.debug("Running command '%s'", cmd)
61
+ res = `#{cmd}`
62
+
63
+ # For any reason, $CHILD_STATUS is empty, while $? is not.
64
+ # Ruby bug. tested with:
65
+ # ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
66
+ # rubocop: disable Style/SpecialGlobalVars
67
+ unless $?.exitstatus == 0
68
+ # rubocop: enable Style/SpecialGlobalVars
69
+ PrcLib.error("Unable to send the Root Certificate file '%s' "\
70
+ "You will need install it yourself in /tmp + '"\
71
+ ".done' flag file\n%s", cert_file, res)
72
+ config[:cert_error] = true
73
+ return
74
+ end
75
+
76
+ PrcLib.debug('Flagging the server copy.')
77
+ `ssh #{ssh_options} #{user}@#{public_ip} touch #{dest_file}.done`
78
+ end
79
+
80
+ # function to add extra meta data to support ca_root_cert
81
+ #
82
+ # * *Args*:
83
+ # - metadata : Hash. Hash structure to update.
84
+ #
85
+ # * * returns*:
86
+ # - nothing
87
+ def ca_root_metadata(hParams, metadata)
88
+ return unless hParams.exist?('certs#ca_root_cert')
89
+
90
+ res_found = hParams['certs#ca_root_cert'].match(/^(.*)#(.*)$/)
91
+
92
+ if res_found
93
+ dest_file = "#{res_found[2]}"
94
+ else
95
+ dest_file = File.basename(cert_file)
96
+ end
97
+
98
+ metadata['CA_ROOT_CERT'] = dest_file
99
+ end
100
+ end
@@ -69,6 +69,7 @@ class Lorj::BaseDefinition # rubocop: disable Style/ClassAndModuleChildren
69
69
  obj_needs :data, 'dns#dns_tenant_id'
70
70
  obj_needs :data, :test_box
71
71
  obj_needs :data, :test_box_path
72
+ obj_needs :data, 'certs#ca_root_cert'
72
73
 
73
74
  # If requested by user, ask Maestro to instantiate a blueprint.
74
75
  obj_needs :data, :blueprint
@@ -114,6 +115,10 @@ class Lorj::BaseDefinition # rubocop: disable Style/ClassAndModuleChildren
114
115
  # Adding support of test-box script
115
116
  obj_needs :data, :test_box, :for => [:create_e]
116
117
  obj_needs :data, :test_box_path, :for => [:create_e]
118
+
119
+ # Adding support of ca-root-cert file to send out.
120
+ obj_needs :data, 'certs#ca_root_cert', :for => [:create_e]
121
+
117
122
  # Defines how cli will control FORJ features
118
123
  # boot/down/ssh/...
119
124
 
@@ -124,12 +129,8 @@ class Lorj::BaseDefinition # rubocop: disable Style/ClassAndModuleChildren
124
129
 
125
130
  :create_e => :ssh_connection
126
131
  )
127
- obj_needs :CloudObject, :forge
128
- obj_needs :data, :instance_name
129
- obj_needs :data, 'credentials#keypair_name'
130
- obj_needs :data, :keypair_path
132
+ obj_needs :data, :server
131
133
 
132
134
  obj_needs_optional
133
- obj_needs :data, :forge_server
134
135
  obj_needs :data, :ssh_user
135
136
  end
@@ -297,6 +297,7 @@ class ForjCoreProcess
297
297
  i_cur_act = output_options[:cur_act]
298
298
 
299
299
  tb_detect(hParams, o_old_log)
300
+ ca_root_detect(hParams, o_old_log)
300
301
 
301
302
  if pending_count == 60
302
303
  image = server_get_image o_server
@@ -618,7 +619,8 @@ class ForjCoreProcess
618
619
  end
619
620
  end
620
621
 
621
- tb_metadata hParams, h_meta
622
+ tb_metadata(hParams, h_meta)
623
+ ca_root_metadata(hParams, h_meta)
622
624
 
623
625
  h_meta
624
626
  end
@@ -1449,13 +1451,10 @@ end
1449
1451
  # Functions for ssh
1450
1452
  class ForjCoreProcess
1451
1453
  def ssh_connection(sObjectType, hParams)
1452
- o_forge = hParams[:forge]
1453
-
1454
1454
  # Get server information
1455
1455
  PrcLib.state('Getting server information')
1456
- o_server = o_forge[:servers, hParams[:forge_server]]
1456
+ o_server = hParams[:server, :ObjectData]
1457
1457
  register(o_server)
1458
-
1459
1458
  public_ip = ssh_server_public_ip(o_server)
1460
1459
 
1461
1460
  ssh_options = ssh_keypair(o_server)
@@ -1469,9 +1468,7 @@ class ForjCoreProcess
1469
1468
 
1470
1469
  begin
1471
1470
  PrcLib.state("creating ssh connection with '%s' box", o_server[:name])
1472
- session = Net::SSH.start(public_ip, user, ssh_options) do |_ssh|
1473
- ssh_login(ssh_options, user, public_ip)
1474
- end
1471
+ ssh_login(ssh_options, user, public_ip)
1475
1472
  PrcLib.debug('Error closing ssh connection, box %s ',
1476
1473
  o_server[:name]) unless session
1477
1474
  rescue => e
@@ -19,7 +19,7 @@ FORJCORE_PATH = File.expand_path(File.dirname(__FILE__))
19
19
 
20
20
  # Define model
21
21
 
22
- lorj_objects = %w(forj_process test_box declare)
22
+ lorj_objects = %w(forj_process test_box ca_root_cert declare)
23
23
 
24
24
  lorj_objects.each do |name|
25
25
  load File.join(FORJCORE_PATH, 'forj_core', 'process', name + '.rb')
data/lib/ssh.rb CHANGED
@@ -41,7 +41,7 @@ module Forj
41
41
  o_server = validate_server_name(name, account, o_forge)
42
42
 
43
43
  if !o_server.nil?
44
- ssh_connection(account, o_cloud, name, o_server[:id])
44
+ ssh_connection(account, o_cloud, name, o_server)
45
45
  else
46
46
  PrcLib.debug("server '%s.%s' was not found",
47
47
  account[:box_ssh], name)
@@ -49,14 +49,9 @@ module Forj
49
49
  account[:box_ssh], name)
50
50
  end
51
51
  else
52
- o_server_number = select_forge_server(o_forge)
53
-
54
- ssh_connection(
55
- account,
56
- o_cloud,
57
- name,
58
- o_forge[:servers][o_server_number][:id]
59
- )
52
+ server = select_forge_server(o_forge)
53
+
54
+ ssh_connection(account, o_cloud, name, server)
60
55
  end
61
56
  else
62
57
  PrcLib.high_level_msg("No server(s) found for instance name '%s' \n",
@@ -67,37 +62,27 @@ module Forj
67
62
  def self.select_forge_server(o_forge)
68
63
  # Ask the user to get server(s) to create ssh connection
69
64
  server_list = []
70
- index = 0
65
+ servers = []
71
66
  s_default = nil
72
- o_forge[:servers].each do |server|
73
- server_list[index] = server[:name]
74
- s_default = server[:name] if server[:name].include? 'maestro'
75
- index += 1
67
+
68
+ o_forge[:servers].each do |server_type, server|
69
+ server_list << server[:name]
70
+ servers << server
71
+ s_default = server[:name] if server_type == 'maestro'
76
72
  end
77
73
 
78
- say(format(
79
- 'Select box for ssh connection %s',
80
- ((s_default.nil?) ? '' : format(
81
- 'Default: ' + "|%s|\n", s_default
82
- ))
83
- )
84
- )
74
+ say(format('Select box for ssh connection %s',
75
+ ((s_default.nil?) ? '' : "Default: #{s_default}")))
85
76
  value = choose do |q|
86
77
  q.choices(*server_list)
87
78
  q.default = s_default unless s_default.nil?
88
79
  end
89
80
 
90
- o_server_number = server_list.index(value)
91
- o_server_number
81
+ servers[server_list.index(value)]
92
82
  end
93
83
 
94
- def self.ssh_connection(account, o_cloud, name, server_id)
95
- # Property for :forge
96
- account.set(:instance_name, name)
97
- # Property for :ssh
98
- account.set(:forge_server, server_id)
99
-
100
- o_cloud.create(:ssh)
84
+ def self.ssh_connection(_account, o_cloud, _name, server)
85
+ o_cloud.create(:ssh, :server => server)
101
86
  end
102
87
 
103
88
  def self.validate_server_name(name, account, o_forge)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.11
4
+ version: 1.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - forj team
@@ -208,6 +208,7 @@ files:
208
208
  - lib/get.rb
209
209
  - lib/process/forj_core/data.yaml
210
210
  - lib/process/forj_core/defaults.yaml
211
+ - lib/process/forj_core/process/ca_root_cert.rb
211
212
  - lib/process/forj_core/process/declare.rb
212
213
  - lib/process/forj_core/process/forj_process.rb
213
214
  - lib/process/forj_core/process/test_box.rb