corl 0.5.11 → 0.5.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,64 +3,110 @@ module Nucleon
3
3
  module Action
4
4
  module Node
5
5
  class Identity < Nucleon.plugin_class(:nucleon, :cloud_action)
6
-
6
+
7
7
  #-----------------------------------------------------------------------------
8
8
  # Info
9
-
9
+
10
10
  def self.describe
11
11
  super(:node, :identity, 700)
12
12
  end
13
-
13
+
14
14
  #-----------------------------------------------------------------------------
15
15
  # Settings
16
-
16
+
17
17
  def configure
18
18
  super do
19
- codes :identity_upload_failure
20
-
21
- register_str :name
19
+ codes :identity_required, :identity_upload_failure
20
+
21
+ register_str :name, nil
22
22
  register_project :identity
23
- register_nodes :identity_nodes
23
+ register_nodes :identity_nodes
24
+
25
+ register_bool :delete, false
24
26
  end
25
27
  end
26
-
28
+
27
29
  #---
28
-
30
+
29
31
  def ignore
30
32
  [ :nodes ]
31
33
  end
32
-
34
+
33
35
  def arguments
34
36
  [ :name, :identity_nodes ]
35
37
  end
36
38
 
37
39
  #-----------------------------------------------------------------------------
38
40
  # Operations
39
-
41
+
40
42
  def execute
41
43
  super do |local_node|
42
44
  ensure_network do
43
- builder = network.identity_builder({ settings[:name] => settings[:identity] })
44
-
45
- if builder.build(local_node)
45
+ if settings[:identity]
46
+ # Get identity builder
47
+ builder = network.identity_builder({ settings[:name] => settings[:identity] })
48
+ else
49
+ # Search for identity
50
+ builder = network.identity_builder
46
51
  identity_directory = File.join(builder.build_directory, settings[:name])
47
-
52
+
53
+ if File.directory?(identity_directory)
54
+ identity_nucleon_file = File.join(identity_directory, '.nucleon')
55
+
56
+ if File.exists?(identity_nucleon_file)
57
+ json_data = Util::Disk.read(identity_nucleon_file)
58
+ project_info = symbol_map(Util::Data.parse_json(json_data))
59
+ settings[:identity] = "#{project_info[:provider]}:::#{project_info[:edit]}[#{project_info[:revision]}]"
60
+ end
61
+ end
62
+
63
+ if settings[:identity]
64
+ # Get identity builder
65
+ info('using_identity', { :identity => settings[:identity], :directory => identity_directory })
66
+ builder = network.identity_builder({ settings[:name] => settings[:identity] })
67
+ else
68
+ warn('identity_required')
69
+ myself.status = code.identity_required
70
+ end
71
+ end
72
+
73
+ # Build identity into local network project
74
+ if myself.status == code.success && ( settings[:delete] || builder.build(local_node) )
75
+ identity_directory = File.join(builder.build_directory, settings[:name])
76
+
77
+ # Loop over all nodes to assign identity to (or delete)
48
78
  success = network.batch(settings[:identity_nodes], settings[:node_provider], settings[:parallel]) do |node|
49
- info('start', { :provider => node.plugin_provider, :name => node.plugin_name })
50
-
51
- remote_network_directory = node.lookup(:corl_network)
52
-
53
- remote_config_directory = File.join(remote_network_directory, network.config_directory.sub(/#{network.directory}#{File::SEPARATOR}/, ''))
79
+ if settings[:delete]
80
+ info('start_delete', { :provider => node.plugin_provider, :name => node.plugin_name })
81
+ else
82
+ info('start_add', { :provider => node.plugin_provider, :name => node.plugin_name })
83
+ end
84
+
85
+ # Lookup remote network path
86
+ success = true
87
+ remote_network_directory = node.lookup(:corl_network)
88
+ remote_config_directory = File.join(remote_network_directory, network.config_directory.sub(/#{network.directory}#{File::SEPARATOR}/, ''))
54
89
  remote_identity_base_directory = File.join(remote_network_directory, builder.build_directory.sub(/#{network.directory}#{File::SEPARATOR}/, ''))
55
90
  remote_identity_directory = File.join(remote_identity_base_directory, settings[:name])
56
-
57
- node.cli.mkdir('-p', remote_identity_base_directory)
58
- node.cli.rm('-Rf', remote_identity_directory)
59
-
60
- if success = node.send_files(identity_directory, remote_identity_directory, nil, '0700')
61
- dbg('we were successful!')
62
- end
63
- success
91
+
92
+ # Ensure proper remote directories are ready for identity
93
+ result = node.cli.mkdir('-p', remote_identity_base_directory)
94
+ success = false unless result.status == code.success
95
+
96
+ if success
97
+ result = node.cli.rm('-Rf', remote_identity_directory)
98
+ success = false unless result.status == code.success
99
+
100
+ # Send identity through SCP to remote machine
101
+ success = node.send_files(identity_directory, remote_identity_directory, nil, '0700') if success && ! settings[:delete]
102
+ end
103
+ success
104
+ end
105
+
106
+ if success && settings[:delete]
107
+ # Remove local identity last
108
+ info('local_delete', { :directory => identity_directory })
109
+ FileUtils.rm_rf(identity_directory)
64
110
  end
65
111
  end
66
112
  myself.status = code.batch_error unless success
@@ -3,79 +3,81 @@ module Nucleon
3
3
  module Action
4
4
  module Node
5
5
  class Keypair < Nucleon.plugin_class(:nucleon, :cloud_action)
6
-
6
+
7
7
  include Mixin::Action::Keypair
8
-
8
+
9
9
  #-----------------------------------------------------------------------------
10
10
  # Info
11
-
11
+
12
12
  def self.describe
13
13
  super(:node, :keypair, 545)
14
14
  end
15
-
15
+
16
16
  #----------------------------------------------------------------------------
17
17
  # Settings
18
-
18
+
19
19
  def configure
20
20
  super do
21
21
  codes :key_failure
22
-
22
+
23
23
  register :json, :bool, true
24
24
  register :both, :bool, false
25
25
  keypair_config
26
26
  end
27
27
  end
28
-
28
+
29
29
  #---
30
-
30
+
31
31
  def ignore
32
32
  node_ignore
33
33
  end
34
-
34
+
35
35
  #-----------------------------------------------------------------------------
36
36
  # Operations
37
-
37
+
38
38
  def execute
39
39
  super do |node|
40
40
  if keys = keypair
41
41
  ui.info("\n", { :prefix => false })
42
- ui_group(Util::Console.cyan("#{keys.type.upcase} SSH keypair")) do |ui|
43
- render_json = lambda do
42
+ ui_group(Util::Console.cyan("#{keys.type.upcase} SSH keypair")) do |ui|
43
+ render_json = lambda do
44
44
  private_key = Util::Console.blue(Util::Data.to_json(keys.encrypted_key, true))
45
- ssh_key = keys.ssh_key.gsub(/^ssh\-[a-z]+\s+/, '')
45
+ ssh_key = keys.ssh_key.gsub(/^ssh\-[a-z]+\s+/, '')
46
46
  ssh_key = Util::Console.green(Util::Data.to_json(ssh_key, true))
47
-
47
+
48
48
  ui.info("-----------------------------------------------------")
49
49
  ui.info(yellow("SSH JSON string"))
50
- ui.info("SSH private key:\n#{private_key}")
51
- ui.info("SSH public key:\n#{ssh_key}")
52
- ui.info("\n", { :prefix => false })
50
+ ui.info("\n", { :prefix => false })
51
+ ui.info("SSH private key:\n#{private_key}", { :prefix => false })
52
+ ui.info("SSH public key:\n#{ssh_key}", { :prefix => false })
53
+ ui.info("\n", { :prefix => false })
53
54
  end
54
-
55
+
55
56
  render_file = lambda do
56
57
  private_key = Util::Console.blue(keys.encrypted_key)
57
58
  ssh_key = Util::Console.green(keys.ssh_key)
58
-
59
+
59
60
  ui.info("-----------------------------------------------------")
60
61
  ui.info(yellow("SSH file rendering"))
61
- ui.info("SSH private key:\n#{private_key}")
62
- ui.info("SSH public key:\n#{ssh_key}")
63
- ui.info("\n", { :prefix => false })
62
+ ui.info("\n", { :prefix => false })
63
+ ui.info("SSH private key:\n#{private_key}", { :prefix => false })
64
+ ui.info("SSH public key:\n#{ssh_key}", { :prefix => false })
65
+ ui.info("\n", { :prefix => false })
64
66
  end
65
-
67
+
66
68
  if settings[:both]
67
69
  render_json.call
68
- render_file.call
70
+ render_file.call
69
71
  else
70
72
  if settings[:json]
71
73
  render_json.call
72
74
  else
73
- render_file.call
75
+ render_file.call
74
76
  end
75
77
  end
76
- end
78
+ end
77
79
  else
78
- myself.status = code.key_failure
80
+ myself.status = code.key_failure
79
81
  end
80
82
  end
81
83
  end
@@ -3,51 +3,51 @@ module Nucleon
3
3
  module Action
4
4
  module Node
5
5
  class Revoke < Nucleon.plugin_class(:nucleon, :cloud_action)
6
-
6
+
7
7
  #-----------------------------------------------------------------------------
8
8
  # Info
9
-
9
+
10
10
  def self.describe
11
11
  super(:node, :revoke, 550)
12
12
  end
13
-
13
+
14
14
  #-----------------------------------------------------------------------------
15
15
  # Settings
16
-
16
+
17
17
  def configure
18
18
  super do
19
19
  codes :key_remove_failure
20
-
20
+
21
21
  register :public_key, :str, nil
22
22
  end
23
23
  end
24
-
24
+
25
25
  #---
26
-
26
+
27
27
  def arguments
28
28
  [ :public_key ]
29
29
  end
30
30
 
31
31
  #-----------------------------------------------------------------------------
32
32
  # Operations
33
-
33
+
34
34
  def execute
35
35
  super do |node|
36
36
  info('corl.actions.revoke.start')
37
-
37
+
38
38
  ensure_node(node) do
39
39
  ssh_path = Util::SSH.key_path
40
- authorized_keys = File.join(ssh_path, 'authorized_keys')
40
+ authorized_keys = File.join(ssh_path, 'authorized_keys')
41
41
  public_key = settings[:public_key].strip
42
42
  output_keys = []
43
-
43
+
44
44
  if File.exists?(authorized_keys)
45
45
  Util::Disk.read(authorized_keys).split("\n").each do |line|
46
46
  if line.strip.include?(public_key)
47
47
  key_found = true
48
48
  else
49
- output_keys << public_key
50
- end
49
+ output_keys << line
50
+ end
51
51
  end
52
52
  end
53
53
  unless key_found
data/locales/en.yml CHANGED
@@ -121,7 +121,7 @@ en:
121
121
  success:
122
122
  saved: |-
123
123
  Plugin successfully saved to %{file}
124
- cloud:
124
+ network:
125
125
  create:
126
126
  description: |-
127
127
  Create a new network project
@@ -159,7 +159,7 @@ en:
159
159
  help: |-
160
160
  Inspect any defined network configuration. It is not intended to access or
161
161
  set the node configurations defined in the config directory, which you can use the `node lookup` and
162
- `cloud config` actions.
162
+ `network config` actions.
163
163
 
164
164
  Nested configurations can be accessed by specifying the nested keys in sequence in the arguments.
165
165
 
@@ -537,6 +537,19 @@ en:
537
537
  Reinitializing network
538
538
  updating: |-
539
539
  Updating node network configurations
540
+ identity:
541
+ warn:
542
+ identity_required: |-
543
+ Identity option `--identity` required or identity needs to exist locally when adding identities to the network
544
+ info:
545
+ using_identity: |-
546
+ Using local identity %{identity} at %{directory}
547
+ start_add: |-
548
+ Setting identity on %{provider} machine %{name}
549
+ start_delete: |-
550
+ Removing identity from %{provider} machine %{name}
551
+ local_delete: |-
552
+ Removing the local identity from %{directory}
540
553
  build:
541
554
  description: |-
542
555
  Build projects into the network project or global filesystem
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: corl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.11
4
+ version: 0.5.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Webb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-18 00:00:00.000000000 Z
11
+ date: 2015-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nucleon
@@ -266,15 +266,15 @@ files:
266
266
  - lib/facter/custom_facts.rb
267
267
  - lib/facter/vagrant_exists.rb
268
268
  - lib/hiera/corl_logger.rb
269
- - lib/nucleon/action/cloud/config.rb
270
- - lib/nucleon/action/cloud/create.rb
271
- - lib/nucleon/action/cloud/images.rb
272
- - lib/nucleon/action/cloud/inspect.rb
273
- - lib/nucleon/action/cloud/machines.rb
274
- - lib/nucleon/action/cloud/regions.rb
275
- - lib/nucleon/action/cloud/remote.rb
276
- - lib/nucleon/action/cloud/settings.rb
277
- - lib/nucleon/action/cloud/vagrantfile.rb
269
+ - lib/nucleon/action/network/config.rb
270
+ - lib/nucleon/action/network/create.rb
271
+ - lib/nucleon/action/network/images.rb
272
+ - lib/nucleon/action/network/inspect.rb
273
+ - lib/nucleon/action/network/machines.rb
274
+ - lib/nucleon/action/network/regions.rb
275
+ - lib/nucleon/action/network/remote.rb
276
+ - lib/nucleon/action/network/settings.rb
277
+ - lib/nucleon/action/network/vagrantfile.rb
278
278
  - lib/nucleon/action/node/IP.rb
279
279
  - lib/nucleon/action/node/SSH.rb
280
280
  - lib/nucleon/action/node/authorize.rb