bcome 0.0.7 → 0.0.8
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.
- checksums.yaml +4 -4
- data/bin/bcome +15 -3
- data/lib/bcome/version.rb +1 -1
- data/lib/become_object.rb +0 -1
- data/lib/helpers/environment_ssh.rb +66 -15
- data/lib/helpers/instance_ssh.rb +5 -5
- data/lib/nodes/base.rb +39 -0
- data/lib/nodes/environment.rb +19 -0
- data/lib/nodes/estate.rb +36 -0
- data/lib/nodes/instance.rb +37 -0
- data/lib/nodes/platform.rb +17 -0
- data/lib/object.rb +0 -60
- data/lib/ssh.rb +4 -4
- data/lib/stack/base.rb +97 -0
- data/lib/stack/environment.rb +31 -59
- data/lib/stack/estate.rb +51 -0
- data/lib/stack/instance.rb +36 -28
- data/lib/stack/platform.rb +10 -3
- metadata +9 -3
- data/lib/boot.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d99a4af143d2075b4f499a92601ccc27a94dd96
|
4
|
+
data.tar.gz: 282f22fcfc8fd304bd8f860ee1a727d42e26ab2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd94a30b7aa4c68c3735bf3c60e788745bd330723823cb8e62fd9458175a4185dd359835ccaa6e3373ea0f13e20645ddbaa9b081da29e831169a85e0f47b2bac
|
7
|
+
data.tar.gz: 44daa435ece36665e1cc1c9e9e9abe4cdd9412ab6119fb41fa7ba9e5fb31c214c304bb042ad4c52b3a88100d8b37646c93912c737f4f519660bbeb17c84f15c8
|
data/bin/bcome
CHANGED
@@ -33,7 +33,7 @@ Dir[Dir.pwd + "/bcome/filters/**/*.rb"].each {|file| load file }
|
|
33
33
|
quick_contexts = []
|
34
34
|
|
35
35
|
BECOME = ::Bcome::WorkspaceContext.new
|
36
|
-
|
36
|
+
ESTATE = ::Bcome::Stack::Estate.new
|
37
37
|
RENDER = ::Bcome::RenderIrb.new
|
38
38
|
|
39
39
|
###########################
|
@@ -50,7 +50,7 @@ if ARGV[0]
|
|
50
50
|
exit 1
|
51
51
|
end
|
52
52
|
|
53
|
-
unless platform =
|
53
|
+
unless platform = ESTATE.resource_for_identifier(platform_key)
|
54
54
|
puts "Cannot find platform named #{platform_key}".failure
|
55
55
|
exit
|
56
56
|
end
|
@@ -73,13 +73,23 @@ IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
|
|
73
73
|
## QUICK CONTEXT & BOOT #
|
74
74
|
#########################
|
75
75
|
|
76
|
-
context_object =
|
76
|
+
context_object = ESTATE
|
77
77
|
|
78
78
|
if quick_contexts.any?
|
79
|
+
|
80
|
+
is_first_context = true
|
81
|
+
|
79
82
|
spawn = false
|
80
83
|
quick_contexts.each do |resource_context_key|
|
81
84
|
next_context_resource = context_object.resource_for_identifier(resource_context_key)
|
82
85
|
|
86
|
+
# Initialize our object namespace, but only from our lowest level namespace object. This
|
87
|
+
# ensure we don't load more than we need.
|
88
|
+
if is_first_context
|
89
|
+
next_context_resource.init
|
90
|
+
is_first_context = false
|
91
|
+
end
|
92
|
+
|
83
93
|
if next_context_resource.nil?
|
84
94
|
puts "Cannot find any resources object named: #{resource_context_key}. Please check your quick contexts and try again".failure
|
85
95
|
exit
|
@@ -88,6 +98,8 @@ if quick_contexts.any?
|
|
88
98
|
BECOME.set(next_context_resource, context_object, spawn)
|
89
99
|
context_object = next_context_resource
|
90
100
|
end
|
101
|
+
else
|
102
|
+
ESTATE.init
|
91
103
|
end
|
92
104
|
|
93
105
|
##################
|
data/lib/bcome/version.rb
CHANGED
data/lib/become_object.rb
CHANGED
@@ -9,46 +9,97 @@ module ::Bcome::EnvironmentSSH
|
|
9
9
|
return "ssh -W %h:%p #{bastion_ip_address}"
|
10
10
|
end
|
11
11
|
|
12
|
-
def execute_command(commands,
|
12
|
+
def execute_command(commands, instance)
|
13
13
|
begin
|
14
|
-
return execute_cmd(commands,
|
14
|
+
return execute_cmd(commands, instance, proxy)
|
15
15
|
rescue Net::SSH::AuthenticationFailed
|
16
|
-
raise "Could not authenticate connection to #{
|
16
|
+
raise "Could not authenticate connection to #{instance.identifier}".failure
|
17
17
|
rescue Net::SSH::Disconnect
|
18
|
-
raise "SSH connection to #{
|
18
|
+
raise "SSH connection to #{instance.identifier} was disconnected".failure
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def execute_cmd(raw_commands,
|
22
|
+
def execute_cmd(raw_commands, instance, proxy)
|
23
23
|
commands = raw_commands.collect{|raw_command|
|
24
|
-
raw_command.is_a?(::Bcome::Command) ? raw_command : ::Bcome::Command.new(raw_command,
|
24
|
+
raw_command.is_a?(::Bcome::Command) ? raw_command : ::Bcome::Command.new(raw_command, instance)
|
25
25
|
}
|
26
26
|
|
27
|
-
ssh = ::Bcome::Ssh.new(commands, proxy,
|
27
|
+
ssh = ::Bcome::Ssh.new(commands, proxy, instance)
|
28
28
|
ssh.execute!
|
29
29
|
return
|
30
30
|
end
|
31
31
|
|
32
|
-
def execute_scp_upload(files, remote_path,
|
32
|
+
def execute_scp_upload(files, remote_path, instance)
|
33
33
|
begin
|
34
|
-
scp = ::Bcome::Scp.new(proxy,
|
34
|
+
scp = ::Bcome::Scp.new(proxy, instance)
|
35
35
|
scp.upload!(files, remote_path)
|
36
36
|
rescue Net::SSH::AuthenticationFailed
|
37
|
-
raise "Could not authenticate connection to #{
|
37
|
+
raise "Could not authenticate connection to #{instance.identifier}".failure
|
38
38
|
rescue Net::SSH::Disconnect
|
39
|
-
raise "SSH connection to #{
|
39
|
+
raise "SSH connection to #{instance.identifier} was disconnected".failure
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def execute_scp_download(remote_path, local_path,
|
43
|
+
def execute_scp_download(remote_path, local_path, instance)
|
44
44
|
begin
|
45
|
-
scp = ::Bcome::Scp.new(proxy,
|
45
|
+
scp = ::Bcome::Scp.new(proxy, instance)
|
46
46
|
scp.download!(remote_path, local_path)
|
47
47
|
rescue Net::SSH::AuthenticationFailed
|
48
|
-
raise "Could not authenticate connection to #{
|
48
|
+
raise "Could not authenticate connection to #{instance.identifier}".failure
|
49
49
|
rescue Net::SSH::Disconnect
|
50
|
-
raise "SSH connection to #{
|
50
|
+
raise "SSH connection to #{instance.identifier} was disconnected".failure
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
def bastion_server
|
55
|
+
instances.select{|instance| instance.identifier == @ssh_mode[:jump_host_identifier] }.first
|
56
|
+
end
|
57
|
+
|
58
|
+
def ssh_mode_type
|
59
|
+
ssh_mode_type = @ssh_mode[:type]
|
60
|
+
raise "Invalid ssh mode type #{ssh_mode_type}. Should be one of #{valid_ssh_modes.join(", ")}".failure unless valid_ssh_modes.include?(ssh_mode_type)
|
61
|
+
return @ssh_mode[:type]
|
62
|
+
end
|
63
|
+
|
64
|
+
def ssh_mode_user
|
65
|
+
return @ssh_mode[:ssh_user]
|
66
|
+
end
|
67
|
+
|
68
|
+
def ssh_nat_user
|
69
|
+
return @ssh_mode[:nat_user]
|
70
|
+
end
|
71
|
+
|
72
|
+
def ssh_key_path
|
73
|
+
return @ssh_mode[:ssh_key_path]
|
74
|
+
end
|
75
|
+
|
76
|
+
def valid_ssh_modes
|
77
|
+
[::SSH_JUMP_MODE_IDENTIFIER, ::SSH_DIRECT_MODE_IDENTIFIER]
|
78
|
+
end
|
79
|
+
|
80
|
+
def bastion_ip_address
|
81
|
+
if dynamic_network_lookup?
|
82
|
+
return bastion_server.public_ip_address
|
83
|
+
else
|
84
|
+
bastion_ip_address = @ssh_mode[:jump_host_ip_address]
|
85
|
+
raise "No jump_host_ip_address specified in your configuration.".failure unless bastion_ip_address
|
86
|
+
return bastion_ip_address
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def network_lookup
|
91
|
+
raise "Missing network lookup in networks_environment configuration".failure unless @network_lookup
|
92
|
+
return @network_lookup
|
93
|
+
end
|
94
|
+
|
95
|
+
def network_lookup_type
|
96
|
+
type = network_lookup[:type]
|
97
|
+
raise "Unknown network lookup type '#{type}" unless ["dynamic", "static"].include?(type)
|
98
|
+
return type
|
99
|
+
end
|
100
|
+
|
101
|
+
def dynamic_network_lookup?
|
102
|
+
return network_lookup_type == "dynamic"
|
103
|
+
end
|
104
|
+
|
54
105
|
end
|
data/lib/helpers/instance_ssh.rb
CHANGED
@@ -31,16 +31,16 @@ module ::Bcome::InstanceSsh
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def nat_user
|
34
|
-
return
|
34
|
+
return environment.ssh_nat_user ? environment.ssh_nat_user : ssh_user
|
35
35
|
end
|
36
36
|
|
37
37
|
def ssh_user
|
38
38
|
# defined by the environment or we fall back to the local user
|
39
|
-
return
|
39
|
+
return environment.ssh_mode_user ? environment.ssh_mode_user : `whoami`.gsub("\n","")
|
40
40
|
end
|
41
41
|
|
42
42
|
def ssh_key_path
|
43
|
-
return
|
43
|
+
return environment.ssh_key_path ? environment.ssh_key_path : "~/.ssh/id_rsa"
|
44
44
|
end
|
45
45
|
|
46
46
|
def keys
|
@@ -48,7 +48,7 @@ module ::Bcome::InstanceSsh
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def bastion_ip_address
|
51
|
-
return
|
51
|
+
return environment.bastion_ip_address
|
52
52
|
end
|
53
53
|
|
54
54
|
def is_direct_ssh?
|
@@ -64,7 +64,7 @@ module ::Bcome::InstanceSsh
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def is_ssh_jump_host?
|
67
|
-
@
|
67
|
+
@role == ::SSH_JUMP_HOST_ROLE_IDENTIFIER
|
68
68
|
end
|
69
69
|
|
70
70
|
end
|
data/lib/nodes/base.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module ::Bcome::Node
|
2
|
+
class Base
|
3
|
+
|
4
|
+
include ::Bcome::CommandHelper
|
5
|
+
|
6
|
+
attr_reader :meta_data
|
7
|
+
|
8
|
+
def machines
|
9
|
+
raise "Should be overriden"
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(meta_data)
|
13
|
+
construct(meta_data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method_sym, *arguments, &block)
|
17
|
+
if instance_variable_defined?("@#{method_sym}")
|
18
|
+
return instance_variable_get("@#{method_sym}")
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_parent_reference(parent, parent_reference_key, collection_key)
|
25
|
+
instance_variable_get("@#{collection_key}").map{|collection_item|
|
26
|
+
collection_item.instance_variable_set("@#{parent_reference_key}", parent)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def construct(meta_data = {})
|
33
|
+
meta_data.each do |key, value|
|
34
|
+
self.instance_variable_set("@#{key}", value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ::Bcome::Node
|
2
|
+
class Environment < ::Bcome::Node::Base
|
3
|
+
|
4
|
+
include ::Bcome::EnvironmentSSH
|
5
|
+
|
6
|
+
def machines
|
7
|
+
instances
|
8
|
+
end
|
9
|
+
|
10
|
+
def identifier
|
11
|
+
@environment
|
12
|
+
end
|
13
|
+
|
14
|
+
def namespace
|
15
|
+
"#{platform.namespace}/#{identifier}"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/nodes/estate.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module ::Bcome::Node
|
2
|
+
class Estate < ::Bcome::Node::Base
|
3
|
+
|
4
|
+
include ::Bcome::Selections
|
5
|
+
|
6
|
+
def machines
|
7
|
+
platforms.collect(&:machines).flatten
|
8
|
+
end
|
9
|
+
|
10
|
+
def namespace
|
11
|
+
""
|
12
|
+
end
|
13
|
+
|
14
|
+
def environments
|
15
|
+
@environments ||= platforms.collect(&:environments).flatten
|
16
|
+
end
|
17
|
+
|
18
|
+
def list_all
|
19
|
+
estate_machine_list = "\n"
|
20
|
+
platforms.each do |platform|
|
21
|
+
estate_machine_list += "* #{platform.identifier}\n"
|
22
|
+
platform.environments.each do |environment|
|
23
|
+
estate_machine_list += "\t- #{environment.identifier}\n"
|
24
|
+
environment.instances.each do |instance|
|
25
|
+
estate_machine_list += "\t\t / #{instance.identifier} (#{instance.public_ip_address})\n"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
puts estate_machine_list.colorize(:green)
|
31
|
+
|
32
|
+
return ""
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ::Bcome::Node
|
2
|
+
class Instance < ::Bcome::Node::Base
|
3
|
+
|
4
|
+
include ::Bcome::InstanceCommand
|
5
|
+
include ::Bcome::InstanceSsh
|
6
|
+
include ::Bcome::InstanceCommand
|
7
|
+
|
8
|
+
def machines
|
9
|
+
[self] # for completion
|
10
|
+
end
|
11
|
+
|
12
|
+
def identifier
|
13
|
+
@identifier
|
14
|
+
end
|
15
|
+
|
16
|
+
def ip_address
|
17
|
+
@environment.ssh_mode_type == ::SSH_DIRECT_MODE_IDENTIFIER ? public_ip_address : @external_network_interface_address
|
18
|
+
end
|
19
|
+
|
20
|
+
def public_ip_address
|
21
|
+
@public_ip_address
|
22
|
+
end
|
23
|
+
|
24
|
+
def role
|
25
|
+
@role
|
26
|
+
end
|
27
|
+
|
28
|
+
def namespace
|
29
|
+
"#{environment.namespace}/#{identifier}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def local_download_path
|
33
|
+
"#{Dir.pwd}#{@environment.namespace}/#{identifier}"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/lib/object.rb
CHANGED
@@ -1,19 +1,4 @@
|
|
1
1
|
class Object
|
2
|
-
|
3
|
-
include ::Bcome::CommandHelper
|
4
|
-
|
5
|
-
def list
|
6
|
-
BOOT.send(:list) ### Our starting point in the hierarchy... maybe this is all ultimately configurable?
|
7
|
-
end
|
8
|
-
alias :ls :list
|
9
|
-
|
10
|
-
def become_identifier
|
11
|
-
::START_PROMPT
|
12
|
-
end
|
13
|
-
|
14
|
-
def become(object)
|
15
|
-
BECOME.set(object, self)
|
16
|
-
end
|
17
2
|
|
18
3
|
def toggle_sudo
|
19
4
|
@sudo = @sudo.nil? ? true : (@sudo ? false : true)
|
@@ -29,51 +14,6 @@ class Object
|
|
29
14
|
is_sudo? ? "on" : "off"
|
30
15
|
end
|
31
16
|
|
32
|
-
def workon(identifier)
|
33
|
-
resource = resource_for_identifier(identifier)
|
34
|
-
|
35
|
-
unless resource
|
36
|
-
puts "No matching #{collection_key} for identifier '#{identifier}'. #{available_resources_options_string}".failure
|
37
|
-
else
|
38
|
-
puts "\\ \nFrom #{resource.reference_key}, working on #{identifier}\n".command
|
39
|
-
become(resource)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
alias :w :workon
|
43
|
-
alias :cd :workon
|
44
|
-
|
45
|
-
def menu_items
|
46
|
-
[
|
47
|
-
{ :command => "list / ls", :description => "List all available resources at the current context." },
|
48
|
-
{ :command => "describe", :description => "Describe the resource object at the current context." },
|
49
|
-
{ :command => "cd / workon / w", :description => "Select a resource object, and switch to its context.", :usage => "cd 'identifier'" },
|
50
|
-
{ :command => "exit", :description => "Return to the previous context" },
|
51
|
-
{ :command => "exit!", :description => "Close all contexts, and exit Become."},
|
52
|
-
{ :command => "local", :description => "Execute a shell command on your local machine.", :usage => 'local "command"'}
|
53
|
-
]
|
54
|
-
end
|
55
|
-
|
56
|
-
def menu
|
57
|
-
::RENDER.menu(menu_items)
|
58
|
-
end
|
59
|
-
|
60
|
-
def highlight?
|
61
|
-
false ## override in stack objects that should be highlighted within a list, e.g. instance objects at the environment level that have been selected to workon on
|
62
|
-
end
|
63
|
-
|
64
|
-
def available_resources_options_string
|
65
|
-
"Please select from one of '#{all_items.join(', ')}'"
|
66
|
-
end
|
67
|
-
|
68
|
-
def describe
|
69
|
-
if self.respond_to?(:do_describe)
|
70
|
-
message = "\nCollection Key: #{reference_key}\n\nResource: #{self.do_describe}".colorize(:green)
|
71
|
-
else
|
72
|
-
message = "\nNothing to describe. Use 'list' to see namespace options".headsup unless self.respond_to?(:do_describe)
|
73
|
-
end
|
74
|
-
puts message
|
75
|
-
end
|
76
|
-
|
77
17
|
def set_irb_prompt(conf)
|
78
18
|
conf[:PROMPT][:CUSTOM] = {
|
79
19
|
:PROMPT_N => "\e[1m:\e[m ",
|
data/lib/ssh.rb
CHANGED
@@ -2,16 +2,16 @@ class ::Bcome::Ssh
|
|
2
2
|
|
3
3
|
attr_reader :commands
|
4
4
|
|
5
|
-
def initialize(commands, proxy,
|
5
|
+
def initialize(commands, proxy, instance)
|
6
6
|
@commands = commands
|
7
7
|
@proxy = proxy
|
8
|
-
@
|
8
|
+
@instance = instance
|
9
9
|
end
|
10
10
|
|
11
11
|
def execute!
|
12
|
-
::Net::SSH.start(@
|
12
|
+
::Net::SSH.start(@instance.ip_address, @instance.ssh_user, :proxy => @proxy, :keys => @instance.keys, :paranoid => false) do |ssh|
|
13
13
|
@commands.each do |command|
|
14
|
-
puts "(#{@
|
14
|
+
puts "(#{@instance.identifier}) #{@user}$ #{command.raw_command}".command
|
15
15
|
ssh_exec!(ssh, command)
|
16
16
|
|
17
17
|
puts command.output
|
data/lib/stack/base.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
module ::Bcome::Stack
|
2
|
+
class Base
|
3
|
+
|
4
|
+
def machines
|
5
|
+
node.machines
|
6
|
+
end
|
7
|
+
|
8
|
+
###
|
9
|
+
## Construction & Initialisation
|
10
|
+
##
|
11
|
+
|
12
|
+
def node
|
13
|
+
@node ||= construct_node
|
14
|
+
end
|
15
|
+
|
16
|
+
def construct_node
|
17
|
+
node_attributes = meta_data
|
18
|
+
|
19
|
+
node_attributes.merge!({
|
20
|
+
collection_key => resources.collect(&:node)
|
21
|
+
}) if respond_to?(:collection_key)
|
22
|
+
|
23
|
+
this_node = node_level_klass.new(node_attributes)
|
24
|
+
|
25
|
+
this_node.set_parent_reference(this_node, child_reference_key, collection_key) if respond_to?(:collection_key) && respond_to?(:child_reference_key)
|
26
|
+
return this_node
|
27
|
+
end
|
28
|
+
|
29
|
+
def node_level_klass
|
30
|
+
raise "Should be overidden in derived stack type"
|
31
|
+
end
|
32
|
+
|
33
|
+
def init
|
34
|
+
puts "loading resources ... "
|
35
|
+
node
|
36
|
+
end
|
37
|
+
|
38
|
+
###
|
39
|
+
## Core workspace behaviour
|
40
|
+
##
|
41
|
+
|
42
|
+
def become_identifier
|
43
|
+
::START_PROMPT
|
44
|
+
end
|
45
|
+
|
46
|
+
def become(object)
|
47
|
+
BECOME.set(object, self)
|
48
|
+
end
|
49
|
+
|
50
|
+
def workon(identifier)
|
51
|
+
resource = resource_for_identifier(identifier)
|
52
|
+
|
53
|
+
unless resource
|
54
|
+
puts "No matching #{collection_key} for identifier '#{identifier}'. #{available_resources_options_string}".failure
|
55
|
+
else
|
56
|
+
puts "Working on #{identifier} from #{resource.reference_key}".informational
|
57
|
+
become(resource)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
alias :w :workon
|
61
|
+
alias :cd :workon
|
62
|
+
|
63
|
+
def menu
|
64
|
+
::RENDER.menu(menu_items)
|
65
|
+
end
|
66
|
+
|
67
|
+
def menu_items
|
68
|
+
[
|
69
|
+
{ :command => "list / ls", :description => "List all available resources at the current context." },
|
70
|
+
{ :command => "describe", :description => "Describe the resource object at the current context." },
|
71
|
+
{ :command => "cd / workon / w", :description => "Select a resource object, and switch to its context.", :usage => "cd 'identifier'" },
|
72
|
+
{ :command => "exit", :description => "Return to the previous context" },
|
73
|
+
{ :command => "exit!", :description => "Close all contexts, and exit Become."},
|
74
|
+
{ :command => "local", :description => "Execute a shell command on your local machine.", :usage => 'local "command"'},
|
75
|
+
{ :command => "machines", :description => "Return all servers below the current level to the console. These objects can be manipulated directly" }
|
76
|
+
]
|
77
|
+
end
|
78
|
+
|
79
|
+
def highlight?
|
80
|
+
false ## override in stack objects that should be highlighted within a list, e.g. instance objects at the environment level that have been selected to workon on
|
81
|
+
end
|
82
|
+
|
83
|
+
def available_resources_options_string
|
84
|
+
"Please select from one of '#{all_items.join(', ')}'"
|
85
|
+
end
|
86
|
+
|
87
|
+
def describe
|
88
|
+
if self.respond_to?(:do_describe)
|
89
|
+
message = "\nCollection Key: #{reference_key}\n\nResource: #{self.do_describe}".colorize(:green)
|
90
|
+
else
|
91
|
+
message = "\nNothing to describe. Use 'list' to see namespace options".headsup unless self.respond_to?(:do_describe)
|
92
|
+
end
|
93
|
+
puts message
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
data/lib/stack/environment.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module ::Bcome::Stack
|
2
|
-
class Environment
|
2
|
+
class Environment < ::Bcome::Stack::Base
|
3
3
|
|
4
4
|
include ::Bcome::BecomeObject
|
5
5
|
include ::Bcome::Selections
|
@@ -39,61 +39,6 @@ module ::Bcome::Stack
|
|
39
39
|
{ :command => 'functions', :description => "List all available custom functions" }
|
40
40
|
]
|
41
41
|
end
|
42
|
-
|
43
|
-
def bastion_server
|
44
|
-
resources.select{|resource| resource.identifier == @meta_data[:ssh_mode][:jump_host_identifier] }.first
|
45
|
-
end
|
46
|
-
|
47
|
-
def ssh_mode_type
|
48
|
-
ssh_mode_type = @meta_data[:ssh_mode][:type]
|
49
|
-
raise "Invalid ssh mode type #{ssh_mode_type}. Should be one of #{valid_ssh_modes.join(", ")}".failure unless valid_ssh_modes.include?(ssh_mode_type)
|
50
|
-
return @meta_data[:ssh_mode][:type]
|
51
|
-
end
|
52
|
-
|
53
|
-
def ssh_mode_user
|
54
|
-
return @meta_data[:ssh_mode][:ssh_user]
|
55
|
-
end
|
56
|
-
|
57
|
-
def ssh_nat_user
|
58
|
-
return @meta_data[:ssh_mode][:nat_user]
|
59
|
-
end
|
60
|
-
|
61
|
-
def ssh_key_path
|
62
|
-
return @meta_data[:ssh_mode][:ssh_key_path]
|
63
|
-
end
|
64
|
-
|
65
|
-
def sudo
|
66
|
-
toggle_sudo
|
67
|
-
end
|
68
|
-
|
69
|
-
def valid_ssh_modes
|
70
|
-
[::SSH_JUMP_MODE_IDENTIFIER, ::SSH_DIRECT_MODE_IDENTIFIER]
|
71
|
-
end
|
72
|
-
|
73
|
-
def bastion_ip_address
|
74
|
-
if dynamic_network_lookup?
|
75
|
-
return bastion_server.public_ip_address
|
76
|
-
else
|
77
|
-
bastion_ip_address = @meta_data[:ssh_mode][:jump_host_ip_address]
|
78
|
-
raise "No jump_host_ip_address specified in your configuration.".failure unless bastion_ip_address
|
79
|
-
return bastion_ip_address
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def network_lookup
|
84
|
-
raise "Missing network lookup in networks_environment configuration".failure unless @meta_data[:network_lookup]
|
85
|
-
return @meta_data[:network_lookup]
|
86
|
-
end
|
87
|
-
|
88
|
-
def network_lookup_type
|
89
|
-
type = network_lookup[:type]
|
90
|
-
raise "Unknown network lookup type '#{type}" unless ["dynamic", "static"].include?(type)
|
91
|
-
return type
|
92
|
-
end
|
93
|
-
|
94
|
-
def dynamic_network_lookup?
|
95
|
-
return network_lookup_type == "dynamic"
|
96
|
-
end
|
97
42
|
|
98
43
|
def do_load_resources
|
99
44
|
if dynamic_network_lookup?
|
@@ -111,9 +56,9 @@ module ::Bcome::Stack
|
|
111
56
|
end
|
112
57
|
|
113
58
|
def do_describe
|
114
|
-
desc = "#{identifier}"
|
115
|
-
desc += "\t[ Net lookup: #{network_lookup_type}"
|
116
|
-
desc += "\t * SSH Mode: #{ssh_mode_type} ]"
|
59
|
+
desc = "#{node.identifier}"
|
60
|
+
desc += "\t[ Net lookup: #{node.network_lookup_type}"
|
61
|
+
desc += "\t * SSH Mode: #{node.ssh_mode_type} ]"
|
117
62
|
end
|
118
63
|
|
119
64
|
def collection_klass
|
@@ -124,9 +69,36 @@ module ::Bcome::Stack
|
|
124
69
|
:environments
|
125
70
|
end
|
126
71
|
|
72
|
+
def child_reference_key
|
73
|
+
:environment
|
74
|
+
end
|
75
|
+
|
127
76
|
def collection_key
|
128
77
|
:instances
|
129
78
|
end
|
130
79
|
|
80
|
+
def node_level_klass
|
81
|
+
::Bcome::Node::Environment
|
82
|
+
end
|
83
|
+
|
84
|
+
def network_lookup
|
85
|
+
raise "Missing network lookup in networks_environment configuration".failure unless @meta_data[:network_lookup]
|
86
|
+
return @meta_data[:network_lookup]
|
87
|
+
end
|
88
|
+
|
89
|
+
def network_lookup_type
|
90
|
+
type = network_lookup[:type]
|
91
|
+
raise "Unknown network lookup type '#{type}" unless ["dynamic", "static"].include?(type)
|
92
|
+
return type
|
93
|
+
end
|
94
|
+
|
95
|
+
def dynamic_network_lookup?
|
96
|
+
return network_lookup_type == "dynamic"
|
97
|
+
end
|
98
|
+
|
99
|
+
def sudo
|
100
|
+
toggle_sudo
|
101
|
+
end
|
102
|
+
|
131
103
|
end
|
132
104
|
end
|
data/lib/stack/estate.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module ::Bcome::Stack
|
2
|
+
class Estate < ::Bcome::Stack::Base
|
3
|
+
|
4
|
+
include ::Bcome::BecomeObject
|
5
|
+
include ::Bcome::CommandHelper
|
6
|
+
|
7
|
+
def config_path
|
8
|
+
"#{CONFIGS_PATH}/platform.yml"
|
9
|
+
end
|
10
|
+
|
11
|
+
def collection_klass
|
12
|
+
::PLATFORM_STACK_KLASS
|
13
|
+
end
|
14
|
+
|
15
|
+
def collection_key
|
16
|
+
:platforms
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"Estate"
|
21
|
+
end
|
22
|
+
|
23
|
+
def become_identifier
|
24
|
+
::START_PROMPT
|
25
|
+
end
|
26
|
+
|
27
|
+
def namespace
|
28
|
+
starting_namespace
|
29
|
+
end
|
30
|
+
|
31
|
+
def starting_namespace
|
32
|
+
"" # Used to determine where to store downloaded file - this is the start point directory, relative to the bcome install directory
|
33
|
+
end
|
34
|
+
|
35
|
+
def init
|
36
|
+
puts "loading resources ... "
|
37
|
+
n = ::Bcome::Node::Estate.new({ :platforms => resources.collect(&:node) })
|
38
|
+
n.set_parent_reference(n, :estate, :platforms)
|
39
|
+
return n
|
40
|
+
end
|
41
|
+
|
42
|
+
def node
|
43
|
+
@node ||= init
|
44
|
+
end
|
45
|
+
|
46
|
+
def menu_items
|
47
|
+
super
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
data/lib/stack/instance.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
module ::Bcome::Stack
|
2
|
-
class Instance
|
2
|
+
class Instance < ::Bcome::Stack::Base
|
3
3
|
|
4
4
|
include ::Bcome::BecomeObject
|
5
|
-
include ::Bcome::InstanceSsh
|
6
|
-
include ::Bcome::InstanceCommand
|
7
5
|
include ::Bcome::Functions
|
8
6
|
|
9
7
|
class << self
|
@@ -32,13 +30,34 @@ module ::Bcome::Stack
|
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
35
|
-
attr_reader :environment
|
36
|
-
|
33
|
+
attr_reader :environment, :meta_data
|
34
|
+
|
37
35
|
def initialize(meta_data, parent)
|
38
36
|
@meta_data = meta_data
|
39
37
|
@environment = parent
|
40
38
|
end
|
41
39
|
|
40
|
+
def identifier
|
41
|
+
node.identifier
|
42
|
+
end
|
43
|
+
|
44
|
+
## Commands
|
45
|
+
def ssh
|
46
|
+
node.ssh
|
47
|
+
end
|
48
|
+
|
49
|
+
def put(*params)
|
50
|
+
node.put(*params)
|
51
|
+
end
|
52
|
+
|
53
|
+
def run(*params)
|
54
|
+
node.run(*params)
|
55
|
+
end
|
56
|
+
|
57
|
+
def get(*params)
|
58
|
+
node.get(*params)
|
59
|
+
end
|
60
|
+
|
42
61
|
def menu_items
|
43
62
|
super + [
|
44
63
|
{ :command => "run", :description => "Execute a command.", :usage => "run 'command'" },
|
@@ -58,10 +77,6 @@ module ::Bcome::Stack
|
|
58
77
|
toggle_sudo
|
59
78
|
end
|
60
79
|
|
61
|
-
def namespace
|
62
|
-
"#{@environment.namespace}/#{identifier}"
|
63
|
-
end
|
64
|
-
|
65
80
|
def is_sudo?
|
66
81
|
super || @environment.is_sudo?
|
67
82
|
end
|
@@ -70,38 +85,31 @@ module ::Bcome::Stack
|
|
70
85
|
false
|
71
86
|
end
|
72
87
|
|
73
|
-
def identifier
|
74
|
-
@meta_data[:identifier]
|
75
|
-
end
|
76
|
-
|
77
|
-
def ip_address
|
78
|
-
@environment.ssh_mode_type == ::SSH_DIRECT_MODE_IDENTIFIER ? public_ip_address : @meta_data[:external_network_interface_address]
|
79
|
-
end
|
80
|
-
|
81
|
-
def public_ip_address
|
82
|
-
@meta_data[:public_ip_address]
|
83
|
-
end
|
84
|
-
|
85
|
-
def role
|
86
|
-
@meta_data[:role]
|
87
|
-
end
|
88
|
-
|
89
88
|
def reference_key
|
90
89
|
:instances
|
91
90
|
end
|
92
91
|
|
92
|
+
def child_reference_key
|
93
|
+
:instance
|
94
|
+
end
|
95
|
+
|
93
96
|
def highlight?
|
94
97
|
@environment.object_in_selections?(self)
|
95
98
|
end
|
96
99
|
|
97
100
|
def do_describe
|
98
|
-
description = "#{identifier}#{ is_sudo? ? " MODE: sudo " : "" }"
|
101
|
+
description = "#{node.identifier}#{ is_sudo? ? " MODE: sudo " : "" }"
|
99
102
|
description += "\n\t* Internal IP #{@meta_data[:external_network_interface_address]}"
|
100
|
-
description += "\n\t* External IP #{public_ip_address}" if public_ip_address
|
101
|
-
description += "\n\t* #{role}" if role
|
103
|
+
description += "\n\t* External IP #{node.public_ip_address}" if node.public_ip_address
|
104
|
+
description += "\n\t* #{node.role}" if node.role
|
102
105
|
description += "\n"
|
103
106
|
return description
|
104
107
|
end
|
105
108
|
|
109
|
+
def node_level_klass
|
110
|
+
::Bcome::Node::Instance
|
111
|
+
end
|
112
|
+
|
113
|
+
|
106
114
|
end
|
107
115
|
end
|
data/lib/stack/platform.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module ::Bcome::Stack
|
2
|
-
class Platform
|
2
|
+
class Platform < ::Bcome::Stack::Base
|
3
3
|
|
4
4
|
include ::Bcome::BecomeObject
|
5
5
|
|
@@ -14,8 +14,7 @@ module ::Bcome::Stack
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
attr_reader :identifier
|
18
|
-
attr_reader :quick_contexts
|
17
|
+
attr_reader :identifier, :meta_data, :quick_contexts
|
19
18
|
|
20
19
|
def initialize(identifier, meta_data)
|
21
20
|
@identifier = identifier
|
@@ -43,6 +42,10 @@ module ::Bcome::Stack
|
|
43
42
|
:platforms
|
44
43
|
end
|
45
44
|
|
45
|
+
def child_reference_key
|
46
|
+
:platform
|
47
|
+
end
|
48
|
+
|
46
49
|
def collection_key
|
47
50
|
:environments
|
48
51
|
end
|
@@ -57,6 +60,10 @@ module ::Bcome::Stack
|
|
57
60
|
raise "Multiple quick context matches found on platform #{@identifier} for context key #{context_reference}. Cannot load quick context - selection is ambiguous." if matches.size > 1
|
58
61
|
return matches.first
|
59
62
|
end
|
63
|
+
|
64
|
+
def node_level_klass
|
65
|
+
::Bcome::Node::Platform
|
66
|
+
end
|
60
67
|
|
61
68
|
end
|
62
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bcome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Roderick (Webzakimbo)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -125,7 +125,6 @@ files:
|
|
125
125
|
- lib/bcome.rb
|
126
126
|
- lib/bcome/version.rb
|
127
127
|
- lib/become_object.rb
|
128
|
-
- lib/boot.rb
|
129
128
|
- lib/command.rb
|
130
129
|
- lib/filters/base.rb
|
131
130
|
- lib/filters/ec2_filter.rb
|
@@ -136,12 +135,19 @@ files:
|
|
136
135
|
- lib/helpers/instance_command.rb
|
137
136
|
- lib/helpers/instance_ssh.rb
|
138
137
|
- lib/helpers/selections.rb
|
138
|
+
- lib/nodes/base.rb
|
139
|
+
- lib/nodes/environment.rb
|
140
|
+
- lib/nodes/estate.rb
|
141
|
+
- lib/nodes/instance.rb
|
142
|
+
- lib/nodes/platform.rb
|
139
143
|
- lib/object.rb
|
140
144
|
- lib/patches/string.rb
|
141
145
|
- lib/render_irb.rb
|
142
146
|
- lib/scp.rb
|
143
147
|
- lib/ssh.rb
|
148
|
+
- lib/stack/base.rb
|
144
149
|
- lib/stack/environment.rb
|
150
|
+
- lib/stack/estate.rb
|
145
151
|
- lib/stack/instance.rb
|
146
152
|
- lib/stack/platform.rb
|
147
153
|
- lib/workspace_context.rb
|
data/lib/boot.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
class ::Bcome::Boot
|
2
|
-
|
3
|
-
include ::Bcome::BecomeObject
|
4
|
-
|
5
|
-
def config_path
|
6
|
-
"#{CONFIGS_PATH}/platform.yml"
|
7
|
-
end
|
8
|
-
|
9
|
-
def collection_klass
|
10
|
-
::PLATFORM_STACK_KLASS
|
11
|
-
end
|
12
|
-
|
13
|
-
def collection_key
|
14
|
-
:platforms
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_s
|
18
|
-
"Bootup"
|
19
|
-
end
|
20
|
-
|
21
|
-
def become_identifier
|
22
|
-
::START_PROMPT
|
23
|
-
end
|
24
|
-
|
25
|
-
def namespace
|
26
|
-
starting_namespace
|
27
|
-
end
|
28
|
-
|
29
|
-
def starting_namespace
|
30
|
-
"" # Used to determine where to store downloaded file - this is the start point directory, relative to the bcome install directory
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|