bcome 1.3.6 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- 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 -130
- data/lib/objects/node/attributes.rb +13 -21
- data/lib/objects/node/base.rb +113 -71
- 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 +27 -28
- 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 +88 -66
- 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 -230
- 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 +27 -3
- data/patches/string-encrypt.rb +20 -23
- data/patches/string.rb +5 -1
- data/patches/string_stylesheet.rb +2 -0
- metadata +95 -18
- 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 -40
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module LoadingBar
|
5
|
+
module Indicator
|
6
|
+
class Base
|
7
|
+
CHARACTERS = %w[⣾ ⣷ ⣯ ⣟ ⡿ ⢿ ⣻ ⣽].freeze
|
8
|
+
|
9
|
+
SIGNAL_SUCCESS = 'USR1'
|
10
|
+
SIGNAL_FAILURE = 'USR2'
|
11
|
+
SIGNAL_STOP = 'SIGKILL'
|
12
|
+
|
13
|
+
def initialize(config = {})
|
14
|
+
@progress_size = config[:size]
|
15
|
+
@title = config[:title]
|
16
|
+
@completed_title = config[:completed_title]
|
17
|
+
|
18
|
+
@current_character = 0
|
19
|
+
@progression = ''
|
20
|
+
@results = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def indicate
|
24
|
+
print "\n"
|
25
|
+
loop do
|
26
|
+
increment
|
27
|
+
show
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def show
|
32
|
+
raise 'Should be overidden'
|
33
|
+
end
|
34
|
+
|
35
|
+
def increment_success
|
36
|
+
raise 'Should be overidden'
|
37
|
+
end
|
38
|
+
|
39
|
+
def increment_failure
|
40
|
+
raise 'Should be overidden'
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def increment
|
46
|
+
@current_character += 1
|
47
|
+
@current_character = 0 if completed_cycle?
|
48
|
+
end
|
49
|
+
|
50
|
+
def completed_cycle?
|
51
|
+
@current_character == CHARACTERS.length
|
52
|
+
end
|
53
|
+
|
54
|
+
def progressed_glyph
|
55
|
+
CHARACTERS[0]
|
56
|
+
end
|
57
|
+
|
58
|
+
def glyph
|
59
|
+
CHARACTERS[@current_character]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module LoadingBar
|
5
|
+
module Indicator
|
6
|
+
class Basic < Base
|
7
|
+
def initialize(*params)
|
8
|
+
super
|
9
|
+
@progress_colour = :bc_green
|
10
|
+
end
|
11
|
+
|
12
|
+
def show(done = false)
|
13
|
+
print "\r#{progress_prefix}#{done ? "\s#{@completed_title}\s" : ''}\s"
|
14
|
+
rescue ThreadError
|
15
|
+
end
|
16
|
+
|
17
|
+
def progress_prefix
|
18
|
+
"#{@title}\s#{glyph.send(progress_colour)}"
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :progress_colour
|
22
|
+
|
23
|
+
def increment_success
|
24
|
+
done = true
|
25
|
+
show(done)
|
26
|
+
end
|
27
|
+
|
28
|
+
def increment_failure
|
29
|
+
@progress_colour = :bc_red
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module LoadingBar
|
5
|
+
module Indicator
|
6
|
+
class Progress < Base
|
7
|
+
def show
|
8
|
+
line = ''
|
9
|
+
@results.map { |r| line += (r == 1 ? progressed_glyph.to_s.bc_green.bold : progressed_glyph.to_s.bc_red.bold) }
|
10
|
+
line += glyph.bc_orange.to_s * (@progress_size - @results.size)
|
11
|
+
print "\r#{@title}\s#{line}\s(#{@results.size}/#{@progress_size})\s"
|
12
|
+
end
|
13
|
+
|
14
|
+
def increment_success
|
15
|
+
@results << 1
|
16
|
+
@progression += progressed_glyph.bc_green.bold
|
17
|
+
end
|
18
|
+
|
19
|
+
def increment_failure
|
20
|
+
@results << 0
|
21
|
+
@progression += progressed_glyph.bc_red.bold
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module LoadingBar
|
5
|
+
class PidBucket
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@pids = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(pid)
|
13
|
+
@pids << pid
|
14
|
+
end
|
15
|
+
|
16
|
+
def -(pid)
|
17
|
+
@pids -= [pid]
|
18
|
+
end
|
19
|
+
|
20
|
+
def stop_all
|
21
|
+
@pids.map do |pid|
|
22
|
+
::Process.kill(::Bcome::LoadingBar::Indicator::Base::SIGNAL_STOP, pid)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,13 +1,17 @@
|
|
1
|
-
|
2
|
-
def is_current_context?
|
3
|
-
::Bcome::Workspace.instance.object_is_current_context?(self)
|
4
|
-
end
|
1
|
+
# frozen_string_literal: true
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module Bcome
|
4
|
+
module Context
|
5
|
+
def current_context?
|
6
|
+
::Bcome::Workspace.instance.object_is_current_context?(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
def irb_workspace=(workspace)
|
10
|
+
@irb_workspace = workspace
|
11
|
+
end
|
9
12
|
|
10
|
-
|
11
|
-
|
13
|
+
def previous_irb_workspace=(workspace)
|
14
|
+
@previous_workspace = workspace
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
@@ -1,14 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Node
|
5
|
+
module RegistryManagement
|
6
|
+
def user_command_wrapper
|
7
|
+
@user_command_wrapper ||= ::Bcome::Registry::CommandList.instance.group_for_node(self)
|
8
|
+
end
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
def registry
|
11
|
+
command_group = user_command_wrapper
|
12
|
+
if command_group&.has_commands?
|
13
|
+
command_group.pretty_print
|
14
|
+
else
|
15
|
+
puts "\nYou have no registry commands configured for this namespace.\n".warning
|
16
|
+
end
|
17
|
+
end
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
@@ -1,9 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module UiOutput
|
5
|
+
def output_error(string)
|
6
|
+
no_console_output(string.error)
|
7
|
+
end
|
5
8
|
|
6
|
-
|
7
|
-
|
9
|
+
def no_console_output(string)
|
10
|
+
puts "\t\n#{string}\n\n"
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
@@ -1,197 +1,201 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module WorkspaceCommands
|
5
|
+
def ssh_connect(params = {})
|
6
|
+
::Bcome::Ssh::Connector.connect(self, params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def ls(node = self, active_only = false)
|
10
|
+
if node != self && (resource = resources.for_identifier(node))
|
11
|
+
resource.send(:ls, active_only)
|
12
|
+
else
|
13
|
+
puts "\n\n" + visual_hierarchy.hierarchy + "\n"
|
14
|
+
puts "\t" + "Available #{list_key}s:" + "\n\n"
|
15
|
+
|
16
|
+
iterate_over = active_only ? @resources.active : @resources
|
17
|
+
|
18
|
+
if iterate_over.any?
|
19
|
+
|
20
|
+
iterate_over.sort_by(&:identifier).each do |resource|
|
21
|
+
next if resource.hide?
|
22
|
+
|
23
|
+
is_active = @resources.is_active_resource?(resource)
|
24
|
+
puts resource.pretty_description(is_active)
|
25
|
+
|
26
|
+
puts "\n"
|
27
|
+
end
|
28
|
+
else
|
29
|
+
puts "\tNo resources found".informational
|
30
|
+
end
|
31
|
+
|
32
|
+
new_line
|
33
|
+
nil
|
13
34
|
end
|
14
|
-
else
|
15
|
-
puts "\tNo resources found".informational
|
16
35
|
end
|
17
36
|
|
18
|
-
|
19
|
-
|
20
|
-
|
37
|
+
def lsa
|
38
|
+
show_active_only = true
|
39
|
+
ls(self, show_active_only)
|
40
|
+
end
|
21
41
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
42
|
+
def interactive
|
43
|
+
::Bcome::Interactive::Session.run(self, :interactive_ssh)
|
44
|
+
end
|
26
45
|
|
27
|
-
|
28
|
-
|
29
|
-
|
46
|
+
def tree
|
47
|
+
puts "\nTree view\n".title
|
48
|
+
tab = ''
|
49
|
+
print_tree_view_for_resource(tab, self)
|
50
|
+
list_in_tree("#{tab}\t", resources)
|
51
|
+
print "\n"
|
52
|
+
end
|
30
53
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
print_tree_view_for_resource(tab, p)
|
36
|
-
tab = "#{tab}\t"
|
54
|
+
def parents
|
55
|
+
ps = []
|
56
|
+
ps << [parent, parent.parents] if has_parent?
|
57
|
+
ps.flatten
|
37
58
|
end
|
38
|
-
print_tree_view_for_resource(tab, self)
|
39
|
-
list_in_tree("#{tab}\t", resources)
|
40
|
-
print "\n"
|
41
|
-
end
|
42
59
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
60
|
+
def list_in_tree(tab, resources)
|
61
|
+
resources.sort_by(&:identifier).each do |resource|
|
62
|
+
next if resource.parent && !resource.parent.resources.is_active_resource?(resource)
|
63
|
+
next if resource.hide?
|
48
64
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
print_tree_view_for_resource(tab, resource)
|
54
|
-
list_in_tree("#{tab}\t", resource.resources)
|
65
|
+
resource.load_nodes if resource.inventory? && !resource.nodes_loaded?
|
66
|
+
print_tree_view_for_resource(tab, resource)
|
67
|
+
list_in_tree("#{tab}\t", resource.resources)
|
68
|
+
end
|
55
69
|
end
|
56
|
-
end
|
57
70
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
71
|
+
def print_tree_view_for_resource(tab, resource)
|
72
|
+
separator = '-'
|
73
|
+
tree_item = tab.to_s + separator.resource_key + " #{resource.type.resource_key} \s#{resource.identifier.resource_value}"
|
74
|
+
tree_item += ' (empty set)' if !resource.server? && !resource.resources.has_active_nodes?
|
75
|
+
puts tree_item
|
76
|
+
end
|
64
77
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
78
|
+
def cd(identifier)
|
79
|
+
if (resource = resources.for_identifier(identifier))
|
80
|
+
if resource.parent.resources.is_active_resource?(resource)
|
81
|
+
::Bcome::Workspace.instance.set(current_context: self, context: resource)
|
82
|
+
else
|
83
|
+
puts "\nCannot enter context - #{identifier} is disabled. To enable enter 'enable #{identifier}'\n".error
|
84
|
+
end
|
69
85
|
else
|
70
|
-
|
86
|
+
raise Bcome::Exception::InvalidBreadcrumb, "Cannot find a node named '#{identifier}'"
|
87
|
+
puts "#{identifier} not found"
|
71
88
|
end
|
72
|
-
else
|
73
|
-
raise Bcome::Exception::InvalidBreadcrumb, "Cannot find a node named '#{identifier}'"
|
74
|
-
puts "#{identifier} not found"
|
75
89
|
end
|
76
|
-
end
|
77
90
|
|
78
|
-
|
79
|
-
|
80
|
-
|
91
|
+
def run(*raw_commands)
|
92
|
+
raise Bcome::Exception::MethodInvocationRequiresParameter, "Please specify commands when invoking 'run'" if raw_commands.empty?
|
93
|
+
|
94
|
+
results = {}
|
81
95
|
|
82
|
-
|
96
|
+
ssh_connect(show_progress: true)
|
83
97
|
|
84
|
-
|
85
|
-
|
86
|
-
|
98
|
+
machines.pmap do |machine|
|
99
|
+
commands = machine.do_run(raw_commands)
|
100
|
+
results[machine.namespace] = commands
|
101
|
+
end
|
102
|
+
results
|
87
103
|
end
|
88
|
-
results
|
89
|
-
end
|
90
104
|
|
91
|
-
|
92
|
-
|
93
|
-
|
105
|
+
def ping
|
106
|
+
ssh_connect(is_ping: true, show_progress: true)
|
107
|
+
end
|
94
108
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
attribute_value = send(value)
|
100
|
-
next unless attribute_value
|
101
|
-
|
102
|
-
desc += "\t"
|
103
|
-
desc += is_active ? key.to_s.resource_key : key.to_s.resource_key_inactive
|
104
|
-
desc += "\s" * (12 - key.length)
|
105
|
-
desc += is_active ? attribute_value.resource_value : attribute_value.resource_value_inactive
|
106
|
-
desc += "\n"
|
107
|
-
desc = desc unless is_active
|
108
|
-
end
|
109
|
-
desc
|
110
|
-
end
|
109
|
+
def pretty_description(is_active = true)
|
110
|
+
desc = ''
|
111
|
+
list_attributes.each do |key, value|
|
112
|
+
next unless respond_to?(value) || instance_variable_defined?("@#{value}")
|
111
113
|
|
112
|
-
|
113
|
-
|
114
|
-
end
|
114
|
+
attribute_value = send(value)
|
115
|
+
next unless attribute_value
|
115
116
|
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
desc += "\t"
|
118
|
+
desc += is_active ? key.to_s.resource_key : key.to_s.resource_key_inactive
|
119
|
+
desc += "\s" * (12 - key.length)
|
120
|
+
desc += is_active ? attribute_value.resource_value : attribute_value.resource_value_inactive
|
121
|
+
desc += "\n"
|
122
|
+
desc = desc unless is_active
|
123
|
+
end
|
124
|
+
desc
|
125
|
+
end
|
119
126
|
|
120
|
-
|
121
|
-
|
122
|
-
|
127
|
+
def back
|
128
|
+
exit
|
129
|
+
end
|
123
130
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
resources.each(&:clear!)
|
128
|
-
nil
|
129
|
-
end
|
131
|
+
def disable(*ids)
|
132
|
+
ids.each { |id| resources.do_disable(id) }
|
133
|
+
end
|
130
134
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
puts "\nYou are now working on '#{ids.join(', ')}\n".informational
|
135
|
-
end
|
135
|
+
def enable(*ids)
|
136
|
+
ids.each { |id| resources.do_enable(id) }
|
137
|
+
end
|
136
138
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
def clear!
|
140
|
+
# Clear any disabled selection at this level and at all levels below
|
141
|
+
resources.clear!
|
142
|
+
resources.each(&:clear!)
|
143
|
+
nil
|
144
|
+
end
|
142
145
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
146
|
+
def workon(*ids)
|
147
|
+
resources.disable!
|
148
|
+
ids.each { |id| resources.do_enable(id) }
|
149
|
+
puts "\nYou are now working on '#{ids.join(', ')}\n".informational
|
150
|
+
end
|
148
151
|
|
149
|
-
|
152
|
+
def disable!
|
153
|
+
resources.disable!
|
154
|
+
resources.each(&:disable!)
|
155
|
+
nil
|
156
|
+
end
|
150
157
|
|
151
|
-
|
152
|
-
|
153
|
-
|
158
|
+
def enable!
|
159
|
+
resources.enable!
|
160
|
+
resources.each(&:enable!)
|
161
|
+
nil
|
162
|
+
end
|
154
163
|
|
155
|
-
|
156
|
-
respond_to?(method_sym) || method_is_available_on_node?(method_sym)
|
157
|
-
end
|
164
|
+
## Helpers --
|
158
165
|
|
159
|
-
|
160
|
-
|
161
|
-
raise NameError, "NameError: undefined local variable or method '#{method_sym}'"
|
166
|
+
def resource_identifiers
|
167
|
+
resources.collect(&:identifier)
|
162
168
|
end
|
163
169
|
|
164
|
-
|
165
|
-
method_sym
|
166
|
-
elsif instance_variable_defined?("@#{method_sym}")
|
167
|
-
instance_variable_get("@#{method_sym}")
|
168
|
-
else
|
169
|
-
command = user_command_wrapper.command_for_console_command_name(method_sym)
|
170
|
-
command.execute(self, arguments)
|
170
|
+
def is_node_level_method?(method_sym)
|
171
|
+
respond_to?(method_sym) || method_is_available_on_node?(method_sym)
|
171
172
|
end
|
172
|
-
end
|
173
173
|
|
174
|
-
|
175
|
-
|
176
|
-
|
174
|
+
def method_in_registry?(method_sym)
|
175
|
+
::Bcome::Registry::CommandList.instance.command_in_list?(self, method_sym)
|
176
|
+
end
|
177
177
|
|
178
|
-
|
179
|
-
|
180
|
-
|
178
|
+
def method_is_available_on_node?(method_sym)
|
179
|
+
resource_identifiers.include?(method_sym.to_s) || method_in_registry?(method_sym) || respond_to?(method_sym) || instance_variable_defined?("@#{method_sym}")
|
180
|
+
end
|
181
181
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
182
|
+
def visual_hierarchy
|
183
|
+
tabs = 0
|
184
|
+
hierarchy = ''
|
185
|
+
tree_descriptions.each do |d|
|
186
|
+
hierarchy += "#{"\s\s\s" * tabs}|- #{d}\n"
|
187
|
+
tabs += 1
|
188
|
+
end
|
189
|
+
hierarchy
|
190
|
+
end
|
188
191
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
192
|
+
def tree_descriptions
|
193
|
+
d = parent ? parent.tree_descriptions + [description] : [description]
|
194
|
+
d.flatten
|
195
|
+
end
|
193
196
|
|
194
|
-
|
195
|
-
|
197
|
+
def new_line
|
198
|
+
puts "\n"
|
199
|
+
end
|
196
200
|
end
|
197
201
|
end
|