bcome 1.3.2 → 1.4.0
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 +5 -5
- data/bin/bcome +13 -8
- data/lib/bcome.rb +7 -11
- data/lib/objects/bcome/version.rb +19 -1
- data/lib/objects/bootup.rb +13 -5
- data/lib/objects/command/local.rb +2 -0
- data/lib/objects/config_factory.rb +3 -0
- data/lib/objects/driver/base.rb +36 -4
- data/lib/objects/driver/bucket.rb +6 -4
- data/lib/objects/driver/ec2.rb +35 -4
- data/lib/objects/driver/gcp.rb +124 -0
- data/lib/objects/driver/gcp/authentication/api_key.rb +6 -0
- data/lib/objects/driver/gcp/authentication/oauth.rb +101 -0
- data/lib/objects/driver/gcp/authentication/service_account.rb +7 -0
- data/lib/objects/driver/static.rb +2 -0
- data/lib/objects/encryptor.rb +26 -24
- data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +8 -4
- data/lib/objects/exception/base.rb +14 -10
- data/lib/objects/exception/can_only_subselect_on_inventory.rb +8 -4
- data/lib/objects/exception/cannot_authenticate_to_gcp.rb +11 -0
- data/lib/objects/exception/cannot_find_internal_registry_klass.rb +8 -4
- data/lib/objects/exception/cannot_find_inventory.rb +11 -0
- data/lib/objects/exception/cannot_find_subselection_parent.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_metadata.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +8 -4
- data/lib/objects/exception/could_not_retrieve_terraform_output.rb +11 -0
- data/lib/objects/exception/deprecation_warning.rb +9 -7
- data/lib/objects/exception/duplicate_command_line_argument_key.rb +8 -4
- data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +8 -4
- data/lib/objects/exception/failed_to_run_local_command.rb +8 -4
- data/lib/objects/exception/generic.rb +11 -0
- data/lib/objects/exception/interactive_session_halt.rb +6 -2
- data/lib/objects/exception/invalid_bcome_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_context_command.rb +8 -4
- data/lib/objects/exception/invalid_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/invalid_identifier.rb +8 -4
- data/lib/objects/exception/invalid_machines_cache_config.rb +8 -4
- data/lib/objects/exception/invalid_matcher_query.rb +8 -4
- data/lib/objects/exception/invalid_meta_data_config.rb +8 -4
- data/lib/objects/exception/invalid_metadata_encryption_key.rb +8 -4
- data/lib/objects/exception/invalid_network_config.rb +8 -4
- data/lib/objects/exception/invalid_network_driver_type.rb +8 -4
- data/lib/objects/exception/invalid_port_forward_request.rb +11 -0
- data/lib/objects/exception/invalid_proxy_config.rb +8 -4
- data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_registry_arguments_type.rb +8 -4
- data/lib/objects/exception/invalid_registry_command_name_length.rb +8 -4
- data/lib/objects/exception/invalid_registry_data_config.rb +8 -4
- data/lib/objects/exception/invalid_restriction_key_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_ssh_config.rb +8 -4
- data/lib/objects/exception/inventories_cannot_have_subviews.rb +8 -4
- data/lib/objects/exception/malformed_command_line_arguments.rb +8 -4
- data/lib/objects/exception/method_invocation_requires_parameter.rb +8 -4
- data/lib/objects/exception/method_name_conflict_in_registry.rb +8 -4
- data/lib/objects/exception/missing_argument_for_registry_command.rb +8 -4
- data/lib/objects/exception/missing_description_on_view.rb +8 -4
- data/lib/objects/exception/missing_execute_on_registry_object.rb +8 -4
- data/lib/objects/exception/missing_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/missing_gcp_service_scopes.rb +11 -0
- data/lib/objects/exception/missing_identifier_on_view.rb +8 -4
- data/lib/objects/exception/missing_inventory_contributors.rb +11 -0
- data/lib/objects/exception/missing_ip_address_on_server.rb +8 -4
- data/lib/objects/exception/missing_network_config.rb +8 -4
- data/lib/objects/exception/missing_or_invalid_client_secrets.rb +11 -0
- data/lib/objects/exception/missing_params_for_rsync.rb +8 -4
- data/lib/objects/exception/missing_params_for_scp.rb +8 -4
- data/lib/objects/exception/missing_subselection_key.rb +8 -4
- data/lib/objects/exception/missing_type_on_view.rb +8 -4
- data/lib/objects/exception/no_node_found_for_breadcrumb.rb +8 -4
- data/lib/objects/exception/no_node_named_by_identifier.rb +8 -4
- data/lib/objects/exception/node_identifiers_must_be_unique.rb +8 -4
- data/lib/objects/exception/orchestration_script_does_not_exist.rb +8 -4
- data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +8 -4
- data/lib/objects/exception/unknown_dynamic_server_type.rb +11 -0
- data/lib/objects/exception/unknown_method_for_namespace.rb +8 -4
- data/lib/objects/interactive/session.rb +4 -1
- data/lib/objects/interactive/session_item/base.rb +2 -0
- data/lib/objects/interactive/session_item/capture_input.rb +2 -0
- data/lib/objects/interactive/session_item/transparent_ssh.rb +29 -23
- data/lib/objects/loading_bar/handler.rb +80 -0
- data/lib/objects/loading_bar/indicator/base.rb +64 -0
- data/lib/objects/loading_bar/indicator/basic.rb +34 -0
- data/lib/objects/loading_bar/indicator/progress.rb +26 -0
- data/lib/objects/loading_bar/pid_bucket.rb +27 -0
- data/lib/objects/modules/context.rb +13 -9
- data/lib/objects/modules/registry_management.rb +16 -10
- data/lib/objects/modules/ui_output.rb +10 -6
- data/lib/objects/modules/workspace_commands.rb +159 -155
- data/lib/objects/modules/workspace_menu.rb +129 -124
- data/lib/objects/node/attributes.rb +13 -21
- data/lib/objects/node/base.rb +116 -67
- data/lib/objects/node/cache_handler.rb +2 -0
- data/lib/objects/node/collection.rb +10 -9
- data/lib/objects/node/factory.rb +35 -28
- data/lib/objects/node/inventory/base.rb +100 -100
- data/lib/objects/node/inventory/defined.rb +110 -89
- data/lib/objects/node/inventory/merge.rb +43 -0
- data/lib/objects/node/inventory/subselect.rb +64 -46
- data/lib/objects/node/kube/base.rb +51 -0
- data/lib/objects/node/kube/container.rb +9 -0
- data/lib/objects/node/kube/estate.rb +19 -0
- data/lib/objects/node/kube/namespace.rb +24 -0
- data/lib/objects/node/kube/pod.rb +24 -0
- data/lib/objects/node/kube_wrap.rb +26 -0
- data/lib/objects/node/meta/base.rb +8 -1
- data/lib/objects/node/meta/cloud.rb +2 -0
- data/lib/objects/node/meta/local.rb +2 -0
- data/lib/objects/node/meta_data_factory.rb +3 -1
- data/lib/objects/node/meta_data_loader.rb +29 -23
- data/lib/objects/node/resources/base.rb +5 -1
- data/lib/objects/node/resources/inventory.rb +7 -5
- data/lib/objects/node/resources/merged.rb +38 -0
- data/lib/objects/node/resources/sub_inventory.rb +7 -4
- data/lib/objects/node/server/base.rb +91 -65
- data/lib/objects/node/server/dynamic/base.rb +23 -0
- data/lib/objects/node/server/{dynamic.rb → dynamic/ec2.rb} +14 -13
- data/lib/objects/node/server/dynamic/gcp.rb +47 -0
- data/lib/objects/node/server/static.rb +13 -2
- data/lib/objects/orchestration/base.rb +10 -0
- data/lib/objects/orchestration/interactive_terraform.rb +62 -27
- data/lib/objects/orchestrator.rb +22 -0
- data/lib/objects/parser/bread_crumb.rb +3 -1
- data/lib/objects/registry/arguments/base.rb +3 -1
- data/lib/objects/registry/arguments/command_line.rb +6 -1
- data/lib/objects/registry/arguments/console.rb +4 -1
- data/lib/objects/registry/command/base.rb +3 -0
- data/lib/objects/registry/command/external.rb +4 -2
- data/lib/objects/registry/command/group.rb +6 -3
- data/lib/objects/registry/command/internal.rb +3 -1
- data/lib/objects/registry/command/shortcut.rb +17 -9
- data/lib/objects/registry/command_list.rb +2 -0
- data/lib/objects/registry/loader.rb +10 -10
- data/lib/objects/ssh/bootstrap.rb +3 -1
- data/lib/objects/ssh/command.rb +10 -5
- data/lib/objects/ssh/command_exec.rb +13 -9
- data/lib/objects/ssh/connection_wrangler.rb +105 -0
- data/lib/objects/ssh/connector.rb +100 -0
- data/lib/objects/ssh/driver.rb +27 -215
- data/lib/objects/ssh/driver_concerns/command_strings.rb +17 -0
- data/lib/objects/ssh/driver_concerns/connection.rb +78 -0
- data/lib/objects/ssh/driver_concerns/functions.rb +89 -0
- data/lib/objects/ssh/driver_concerns/user.rb +32 -0
- data/lib/objects/ssh/{proxy_data.rb → proxy_hop.rb} +52 -7
- data/lib/objects/ssh/script_exec.rb +4 -1
- data/lib/objects/ssh/tunnel/local_port_forward.rb +5 -6
- data/lib/objects/ssh/tunnel_keeper.rb +21 -0
- data/lib/objects/ssh/window.rb +31 -0
- data/lib/objects/startup.rb +52 -0
- data/lib/objects/system/local.rb +3 -0
- data/lib/objects/terraform/output.rb +41 -0
- data/lib/objects/workspace.rb +3 -14
- data/patches/irb.rb +29 -6
- data/patches/string-encrypt.rb +20 -23
- data/patches/string.rb +5 -1
- data/patches/string_stylesheet.rb +2 -0
- metadata +101 -23
- data/lib/objects/progress_bar.rb +0 -30
- data/lib/objects/ssh/connection_handler.rb +0 -101
- data/lib/objects/terraform/parser.rb +0 -23
- data/lib/objects/terraform/state.rb +0 -34
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ::Bcome::Ssh
|
4
|
+
module DriverCommandStrings
|
5
|
+
def ssh_command(as_pseudo_tty = false)
|
6
|
+
connection_wrangler.get_ssh_command(as_pseudo_tty: as_pseudo_tty)
|
7
|
+
end
|
8
|
+
|
9
|
+
def rsync_command(local_path, remote_path)
|
10
|
+
connection_wrangler.get_rsync_command(local_path, remote_path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def local_port_forward_command(start_port, end_port)
|
14
|
+
connection_wrangler.get_local_port_forward_command(start_port, end_port)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ::Bcome::Ssh
|
4
|
+
module DriverConnection
|
5
|
+
DEFAULT_TIMEOUT_IN_SECONDS = 1
|
6
|
+
|
7
|
+
attr_reader :connection
|
8
|
+
|
9
|
+
## CONNECTION --
|
10
|
+
|
11
|
+
def ssh_connect!
|
12
|
+
@connection = nil
|
13
|
+
begin
|
14
|
+
raise ::Bcome::Exception::InvalidProxyConfig, "missing target ip address for #{@context_node.identifier}. Perhaps you meant to configure a proxy?" unless node_host_or_ip
|
15
|
+
|
16
|
+
@connection = ::Net::SSH.start(node_host_or_ip, user, net_ssh_params)
|
17
|
+
rescue Net::SSH::Proxy::ConnectError, Net::SSH::ConnectionTimeout => e
|
18
|
+
raise Bcome::Exception::CouldNotInitiateSshConnection, @context_node.namespace + "\s-\s#{e.message}"
|
19
|
+
end
|
20
|
+
@connection
|
21
|
+
end
|
22
|
+
|
23
|
+
def close_ssh_connection
|
24
|
+
return unless @connection
|
25
|
+
|
26
|
+
begin
|
27
|
+
@connection.close unless @connection.closed?
|
28
|
+
@connection = nil
|
29
|
+
rescue Net::SCP::Error
|
30
|
+
@connection = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def ssh_connection(ping = false)
|
35
|
+
if ping
|
36
|
+
# We do not cache ping results
|
37
|
+
ssh_connect!
|
38
|
+
else
|
39
|
+
has_open_ssh_con? ? @connection : ssh_connect!
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def has_open_ssh_con?
|
44
|
+
!@connection.nil? && !@connection.closed?
|
45
|
+
end
|
46
|
+
|
47
|
+
def node_host_or_ip
|
48
|
+
has_proxy? ? @context_node.internal_ip_address : @context_node.public_ip_address
|
49
|
+
end
|
50
|
+
|
51
|
+
def net_ssh_params
|
52
|
+
raise Bcome::Exception::InvalidSshConfig, "Missing ssh keys for #{@context_node.namespace}" unless ssh_keys
|
53
|
+
|
54
|
+
params = { keys: ssh_keys, paranoid: false }
|
55
|
+
params[:proxy] = proxy if has_proxy?
|
56
|
+
params[:timeout] = timeout_in_seconds
|
57
|
+
params[:verbose] = :fatal # All but silent
|
58
|
+
|
59
|
+
params
|
60
|
+
end
|
61
|
+
|
62
|
+
def timeout_in_seconds
|
63
|
+
@config[:timeout_in_seconds] ||= DEFAULT_TIMEOUT_IN_SECONDS
|
64
|
+
end
|
65
|
+
|
66
|
+
## SSH KEYS
|
67
|
+
|
68
|
+
def ssh_keys
|
69
|
+
@config[:ssh_keys]
|
70
|
+
end
|
71
|
+
|
72
|
+
## PROXYING --
|
73
|
+
|
74
|
+
def proxy
|
75
|
+
connection_wrangler.proxy
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ::Bcome::Ssh
|
4
|
+
module DriverFunctions
|
5
|
+
def do_ssh
|
6
|
+
cmd = ssh_command
|
7
|
+
@context_node.execute_local(cmd)
|
8
|
+
end
|
9
|
+
|
10
|
+
def rsync(local_path, remote_path)
|
11
|
+
raise Bcome::Exception::MissingParamsForRsync, "'rsync' requires a local_path and a remote_path" if local_path.to_s.empty? || remote_path.to_s.empty?
|
12
|
+
|
13
|
+
command = rsync_command(local_path, remote_path)
|
14
|
+
@context_node.execute_local(command)
|
15
|
+
end
|
16
|
+
|
17
|
+
def local_port_forward(start_port, end_port)
|
18
|
+
tunnel_command = local_port_forward_command(start_port, end_port)
|
19
|
+
|
20
|
+
if ::Bcome::Workspace.instance.console_set?
|
21
|
+
puts "\sOpening ssh tunnel:\s".informational + tunnel_command.to_s.terminal_prompt
|
22
|
+
tunnel = ::Bcome::Ssh::Tunnel::LocalPortForward.new(tunnel_command)
|
23
|
+
::Bcome::Ssh::TunnelKeeper.instance << tunnel
|
24
|
+
tunnel.open!
|
25
|
+
tunnel
|
26
|
+
else
|
27
|
+
puts "\n\nOpening ssh tunnel".informational + "\slocalhost:#{start_port} ~> #{@context_node.namespace}:#{end_port}"
|
28
|
+
puts "\nTo use, navigate to another terminal window or application."
|
29
|
+
puts "\nctrl+c to close."
|
30
|
+
::Bcome::Command::Local.run(tunnel_command)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def ping
|
35
|
+
ssh_connect!
|
36
|
+
{ success: true }
|
37
|
+
rescue Exception => e
|
38
|
+
{ success: false, error: e }
|
39
|
+
end
|
40
|
+
|
41
|
+
def scp
|
42
|
+
ssh_connection.scp
|
43
|
+
end
|
44
|
+
|
45
|
+
def put(local_path, remote_path)
|
46
|
+
raise Bcome::Exception::MissingParamsForScp, "'put' requires a local_path and a remote_path" if local_path.to_s.empty? || remote_path.to_s.empty?
|
47
|
+
|
48
|
+
puts "\n(#{@context_node.namespace})\s".namespace + "Uploading #{local_path} to #{remote_path}\n".informational
|
49
|
+
|
50
|
+
begin
|
51
|
+
scp.upload!(local_path, remote_path, recursive: true) do |_ch, name, sent, total|
|
52
|
+
puts "#{name}: #{sent}/#{total}".progress
|
53
|
+
end
|
54
|
+
rescue Exception => e # scp just throws generic exceptions :-/
|
55
|
+
puts e.message.error
|
56
|
+
end
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def put_str(string, remote_path)
|
61
|
+
raise Bcome::Exception::MissingParamsForScp, "'put' requires a string and a remote_path" if string.to_s.empty? || remote_path.to_s.empty?
|
62
|
+
|
63
|
+
puts "\n(#{@context_node.namespace})\s".namespace + "Uploading from string to #{remote_path}\n".informational
|
64
|
+
|
65
|
+
begin
|
66
|
+
scp.upload!(StringIO.new(string), remote_path) do |_ch, name, sent, total|
|
67
|
+
puts "#{name}: #{sent}/#{total}".progress
|
68
|
+
end
|
69
|
+
rescue Exception => e # scp just throws generic exceptions :-/
|
70
|
+
puts e.message.error
|
71
|
+
end
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
|
75
|
+
def get(remote_path, local_path)
|
76
|
+
raise Bcome::Exception::MissingParamsForScp, "'get' requires a local_path and a remote_path" if local_path.to_s.empty? || remote_path.to_s.empty?
|
77
|
+
|
78
|
+
puts "\n(#{@context_node.namespace})\s".namespace + "Downloading #{remote_path} to #{local_path}\n".informational
|
79
|
+
|
80
|
+
begin
|
81
|
+
scp.download!(remote_path, local_path, recursive: true) do |_ch, name, sent, total|
|
82
|
+
puts "#{name}: #{sent}/#{total}".progress
|
83
|
+
end
|
84
|
+
rescue Exception => e
|
85
|
+
puts e.message.error
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ::Bcome::Ssh
|
4
|
+
module DriverUser
|
5
|
+
def user
|
6
|
+
# If we have a user explictly set in the config, then return it
|
7
|
+
return @config[:user] if @config[:user]
|
8
|
+
|
9
|
+
# If the local user has explicitly overriden their user, return that
|
10
|
+
return overriden_local_user if overriden_local_user
|
11
|
+
|
12
|
+
# Else fall back to whichever local user is using bcome
|
13
|
+
fallback_local_user
|
14
|
+
end
|
15
|
+
|
16
|
+
def overriden_local_user
|
17
|
+
@overriden_local_user ||= get_overriden_local_user
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_overriden_local_user
|
21
|
+
::Bcome::Node::Factory.instance.local_data[:ssh_user]
|
22
|
+
end
|
23
|
+
|
24
|
+
def fallback_local_user
|
25
|
+
@fallback_local_user ||= ::Bcome::System::Local.instance.local_user
|
26
|
+
end
|
27
|
+
|
28
|
+
def fallback_bastion_host_user
|
29
|
+
user
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,16 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bcome::Ssh
|
2
|
-
class
|
3
|
-
|
4
|
+
class ProxyHop
|
5
|
+
attr_reader :parent
|
6
|
+
|
7
|
+
def initialize(config, context_node, parent)
|
4
8
|
@config = config
|
5
9
|
@context_node = context_node
|
10
|
+
@parent = parent
|
11
|
+
end
|
12
|
+
|
13
|
+
def proxy_details
|
14
|
+
@config.merge(
|
15
|
+
proxy_host: host,
|
16
|
+
user: user
|
17
|
+
)
|
6
18
|
end
|
7
19
|
|
8
20
|
def host
|
9
21
|
@host ||= get_host
|
10
22
|
end
|
11
23
|
|
12
|
-
def
|
13
|
-
@
|
24
|
+
def user
|
25
|
+
@user ||= get_user
|
26
|
+
end
|
27
|
+
|
28
|
+
def has_parent?
|
29
|
+
!parent.nil?
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_ssh_string(_is_first_hop = false)
|
33
|
+
con_str = "#{user}@#{host}"
|
34
|
+
con_str
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_rsync_string
|
38
|
+
con_str = ''
|
39
|
+
|
40
|
+
con_str += "#{parent.get_rsync_string}\s" if has_parent?
|
41
|
+
|
42
|
+
con_str += "'ssh -o \"ProxyCommand ssh -A #{user}@#{host} -W %h:%p\"'"
|
43
|
+
con_str
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_local_port_forward_string
|
47
|
+
con_str = ''
|
48
|
+
|
49
|
+
con_str += parent.get_local_port_forward_string.to_s if has_parent?
|
50
|
+
|
51
|
+
con_str += "#{user}@#{host}\s"
|
52
|
+
con_str
|
14
53
|
end
|
15
54
|
|
16
55
|
private
|
@@ -23,16 +62,20 @@ module Bcome::Ssh
|
|
23
62
|
}
|
24
63
|
end
|
25
64
|
|
26
|
-
def
|
27
|
-
@config[:bastion_host_user]
|
65
|
+
def get_user
|
66
|
+
@config[:bastion_host_user] || @config[:fallback_bastion_host_user]
|
28
67
|
end
|
29
68
|
|
30
69
|
def get_host
|
31
70
|
raise Bcome::Exception::InvalidProxyConfig, 'Missing host id or namespace' unless @config[:host_id] || @config[:namespace]
|
32
71
|
raise Bcome::Exception::InvalidProxyConfig, 'Missing host lookup method' unless @config[:host_lookup]
|
72
|
+
|
33
73
|
host_lookup_method = valid_host_lookups[@config[:host_lookup].to_sym]
|
34
74
|
raise Bcome::Exception::InvalidProxyConfig, "#{@config[:host_lookup]} is not a valid host lookup method" unless host_lookup_method
|
35
|
-
|
75
|
+
|
76
|
+
h = send(host_lookup_method)
|
77
|
+
|
78
|
+
h
|
36
79
|
end
|
37
80
|
|
38
81
|
def get_host_or_ip_from_config
|
@@ -44,12 +87,14 @@ module Bcome::Ssh
|
|
44
87
|
resource = @context_node.recurse_resource_for_identifier(identifier)
|
45
88
|
raise Bcome::Exception::CantFindProxyHostByIdentifier, identifier unless resource
|
46
89
|
raise Bcome::Exception::ProxyHostNodeDoesNotHavePublicIp, identifier unless resource.public_ip_address
|
90
|
+
|
47
91
|
resource.public_ip_address
|
48
92
|
end
|
49
93
|
|
50
94
|
def get_host_by_namespace
|
51
95
|
node = ::Bcome::Orchestrator.instance.get(@config[:namespace])
|
52
96
|
raise Bcome::Exception::CantFindProxyHostByNamespace, @config[:namespace] unless node
|
97
|
+
|
53
98
|
node.public_ip_address
|
54
99
|
end
|
55
100
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ::Bcome::Ssh
|
2
4
|
class ScriptExec
|
3
|
-
SCRIPTS_PATH = 'bcome/scripts'
|
5
|
+
SCRIPTS_PATH = 'bcome/scripts'
|
4
6
|
|
5
7
|
class << self
|
6
8
|
def execute(server, script_name)
|
@@ -24,6 +26,7 @@ module ::Bcome::Ssh
|
|
24
26
|
def execute_command
|
25
27
|
local_path_to_script = "#{SCRIPTS_PATH}/#{@script_name}.sh"
|
26
28
|
raise Bcome::Exception::OrchestrationScriptDoesNotExist, local_path_to_script unless File.exist?(local_path_to_script)
|
29
|
+
|
27
30
|
execute_script_command = "#{@ssh_driver.ssh_command} \"bash -s\" < #{local_path_to_script}"
|
28
31
|
command = ::Bcome::Command::Local.run(execute_script_command)
|
29
32
|
command
|
@@ -1,20 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bcome::Ssh::Tunnel
|
2
4
|
class LocalPortForward
|
3
|
-
|
4
5
|
def initialize(tunnel_command)
|
5
6
|
@tunnel_command = tunnel_command
|
6
7
|
@process_pid = nil
|
7
|
-
end
|
8
|
+
end
|
8
9
|
|
9
10
|
def open!
|
10
|
-
puts "Opening tunnel: #{@tunnel_command}".informational
|
11
11
|
@process_pid = spawn(@tunnel_command)
|
12
12
|
end
|
13
13
|
|
14
14
|
def close!
|
15
|
-
puts "Closing tunnel
|
16
|
-
::Process.kill(
|
15
|
+
puts "Closing tunnel:\s".informational + @tunnel_command.to_s.terminal_prompt
|
16
|
+
::Process.kill('HUP', @process_pid)
|
17
17
|
end
|
18
|
-
|
19
18
|
end
|
20
19
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Ssh
|
5
|
+
class TunnelKeeper
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@tunnels = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(tunnel)
|
13
|
+
@tunnels << tunnel
|
14
|
+
end
|
15
|
+
|
16
|
+
def close_tunnels
|
17
|
+
@tunnels.each(&:close!)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Ssh
|
5
|
+
class Window
|
6
|
+
attr_reader :lines
|
7
|
+
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
def initialize(*_params)
|
11
|
+
@lines = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(node, log_line)
|
15
|
+
multi_line = log_line =~ /\n/ ? true : false
|
16
|
+
|
17
|
+
@lines << if ::Bcome::Orchestrator.instance.is_multi_node?
|
18
|
+
"\n#{node.namespace}".terminal_prompt + "\n#{log_line}"
|
19
|
+
else
|
20
|
+
log_line
|
21
|
+
end
|
22
|
+
|
23
|
+
pop
|
24
|
+
end
|
25
|
+
|
26
|
+
def pop
|
27
|
+
print @lines.pop
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
class Startup
|
5
|
+
def initialize(breadcrumbs, arguments)
|
6
|
+
@breadcrumbs = breadcrumbs
|
7
|
+
@arguments = arguments
|
8
|
+
end
|
9
|
+
|
10
|
+
def do
|
11
|
+
case @breadcrumbs
|
12
|
+
when '-v', '--version', '--v'
|
13
|
+
puts ::Bcome::Version.display
|
14
|
+
when 'pack_metadata'
|
15
|
+
::Bcome::Encryptor.instance.pack
|
16
|
+
when 'unpack_metadata'
|
17
|
+
::Bcome::Encryptor.instance.unpack
|
18
|
+
else
|
19
|
+
bootup
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def bootup
|
24
|
+
spawn_into_console = true
|
25
|
+
::Bcome::Bootup.set_and_do({ breadcrumbs: @breadcrumbs, arguments: @arguments }, spawn_into_console)
|
26
|
+
clean_up
|
27
|
+
rescue ::Bcome::Exception::Base => e
|
28
|
+
clean_up
|
29
|
+
puts e.pretty_display
|
30
|
+
rescue Excon::Error::Socket => e
|
31
|
+
clean_up
|
32
|
+
puts "\nNo network access - please check your connection and try again\n".error
|
33
|
+
rescue Exception => e
|
34
|
+
clean_up
|
35
|
+
raise e
|
36
|
+
end
|
37
|
+
|
38
|
+
def clean_up
|
39
|
+
stop_loading_bars
|
40
|
+
close_connections
|
41
|
+
end
|
42
|
+
|
43
|
+
def close_connections
|
44
|
+
::Bcome::Bootup.instance.close_ssh_connections
|
45
|
+
::Bcome::Ssh::TunnelKeeper.instance.close_tunnels
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop_loading_bars
|
49
|
+
::Bcome::LoadingBar::PidBucket.instance.stop_all
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|