bcome 0.4.1 → 0.5.0

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: 391c30036acc6805542513ea6b230e87a4fe0ef5
4
- data.tar.gz: 5ccd09087b73458c84d96d848387d0a40fc9e8ad
3
+ metadata.gz: da26ecc8e341d6c26a8b7243903ccfb64bb90627
4
+ data.tar.gz: 91d217becd8fa055b38b85fcc205efa85728911e
5
5
  SHA512:
6
- metadata.gz: dfcb18cf3e673189a9d19daae240dc2e4943a27c69c1c7d7c4ac8f40ec362f36348d5ffd95097858fe46a862898fafe711c5551c404df9016c3be29dc4dcc06d
7
- data.tar.gz: b2e0175e9e9a6ff23a1644024ad2f473e680911bed014e3c66d5cffd6587ca2c74091ace88bb36a81bbd6e2386d9aa208ac211c30b457e41cecdb159c7465ae7
6
+ metadata.gz: 08e3ea167a7bfd6a46fd00ca59d428ea46d8257a1c2dbed0c1e7e7f25d9bef25dfee264dc46e280c64ee74c069a2c9ba8bd1196af836cd4afc5ca91e7222b181
7
+ data.tar.gz: 1e097242ea3a069ebf5a80212d5817c87a92b170d7233bc06dda3804dcb0addd3fdf4082fbb1ee5b86bff6a91b87a260f963f769586a599811d2c26fee5e8413
@@ -0,0 +1,36 @@
1
+ # Interactive mode
2
+
3
+ ## Overview
4
+
5
+ Interactive mode lets you interact transparently from the shell with every machine at an Estate level, platform level, or with selections of machines (or all) at an environment level.
6
+
7
+ Put simply: One shell to control any number of machines, with input & output inline.
8
+
9
+ ### Use case example
10
+
11
+ You have a platform named "wbz", and an environment named "prod", and you wish to interact with the application servers:
12
+
13
+ #### Enter the shell
14
+
15
+ ```
16
+ > bundle exec bcome wbz:prod
17
+ ```
18
+
19
+ #### Pick the machines you want
20
+
21
+ Add all machines
22
+
23
+ ```
24
+ > add!
25
+ ```
26
+
27
+ Or just add the ones you want (hit 'menu' if you're unsure how to work with machine selections)
28
+
29
+ ```
30
+ > add [app_server1, app_server2, app_server3, ...]
31
+ ```
32
+
33
+ And then enter interctive mode
34
+ ```
35
+ > interactive
36
+ ```
@@ -1,3 +1,3 @@
1
1
  module Bcome
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,4 @@
1
+ module Bcome::Interactive
2
+ class SessionHalt < RuntimeError
3
+ end
4
+ end
@@ -0,0 +1,42 @@
1
+ module Bcome::Interactive
2
+ class Session
3
+
4
+ class << self
5
+ def run(irb_session)
6
+ irb_pre_session_return_format = irb_session.conf.return_format
7
+ session_end_message = "\ninteractive session ended".success
8
+ begin
9
+ session = ::Bcome::Interactive::Session.new(irb_session)
10
+ irb_session.conf.return_format = ""
11
+ system("clear")
12
+ session.prompt
13
+ rescue ::Bcome::Interactive::SessionHalt
14
+ irb_session.conf.return_format = irb_pre_session_return_format
15
+ puts session_end_message
16
+ end
17
+ end
18
+ end
19
+
20
+ attr_reader :responses, :irb_session
21
+
22
+ def initialize(irb_session)
23
+ @irb_session = irb_session
24
+ @responses = {}
25
+ end
26
+
27
+ def prompt
28
+ item = ::Bcome::Interactive::SessionItem::TransparentSsh.new(self)
29
+ print item.start_message
30
+ process_item(item)
31
+ end
32
+
33
+ def process_item(item)
34
+ begin
35
+ item.do
36
+ rescue
37
+ raise ::Bcome::Interactive::SessionHalt.new
38
+ end
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,30 @@
1
+ module Bcome::Interactive::SessionItem
2
+ class Base
3
+
4
+ def initialize(session)
5
+ @session = session
6
+ @irb_session = @session.irb_session
7
+ end
8
+
9
+ def bcome_identifier
10
+ @irb_session.become_identifier
11
+ end
12
+
13
+ def irb_session
14
+ @session.irb_session
15
+ end
16
+
17
+ def options
18
+ @session.options
19
+ end
20
+
21
+ def set_response_on_session
22
+ @session.responses[@key] = @response
23
+ end
24
+
25
+ def do(*params)
26
+ raise "Should be overidden"
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,82 @@
1
+ module Bcome::Interactive::SessionItem
2
+ class TransparentSsh < ::Bcome::Interactive::SessionItem::Base
3
+
4
+ END_SESSION_KEY = "\\q"
5
+ HELP_KEY = "\\?"
6
+ LIST_KEY = "\\l"
7
+
8
+ def do
9
+ input = get_input
10
+ raise ::Bcome::Interactive::SessionHalt.new if exit?(input)
11
+ if show_menu?(input)
12
+ show_menu
13
+ elsif list_machines?(input)
14
+ list_machines
15
+ else
16
+ execute_on_machines(input)
17
+ end
18
+ send(:do)
19
+ end
20
+
21
+ def show_menu
22
+ system("clear") ; print start_message
23
+ end
24
+
25
+ def start_message
26
+ warning = "\nCommands entered here will be executed on every machine in your selection.".danger
27
+ second_warning = "\nUse with CAUTION.".danger
28
+ info = "\n\n\\l list machines\n\\q to quit\n\\? this message".informational
29
+
30
+ return "#{warning}#{second_warning}#{info}\n"
31
+ end
32
+
33
+ def terminal_prompt
34
+ "#{bcome_identifier}>\s" + "interactive\s>\s".command # high voltage
35
+ end
36
+
37
+ def valid_response(response)
38
+ a = response.gsub("\s", "").downcase
39
+ valid_responses.include?(response)
40
+ end
41
+
42
+ def exit?(input)
43
+ input == END_SESSION_KEY
44
+ end
45
+
46
+ def show_menu?(input)
47
+ input == HELP_KEY
48
+ end
49
+
50
+ def list_machines?(input)
51
+ input == LIST_KEY
52
+ end
53
+
54
+ def get_input
55
+ return ::Readline.readline("\n#{terminal_prompt}", true).squeeze(" " ).to_s
56
+ end
57
+
58
+ def execute_on_machines(user_input)
59
+ machines.pmap {|machine|
60
+ machine.run(user_input)
61
+ }
62
+ end
63
+
64
+ def list_machines
65
+ listed = "\n#{machines.collect(&:identifier).join(", ")}\n"
66
+ print listed.friendly
67
+ end
68
+
69
+ def machines
70
+ @machines ||= has_selected_machines? ? selected_machines : @irb_session.machines
71
+ end
72
+
73
+ def has_selected_machines?
74
+ selected_machines.is_a?(Array) && selected_machines.any?
75
+ end
76
+
77
+ def selected_machines
78
+ @selections ||= @irb_session.instance_variable_get(:@objects)
79
+ end
80
+
81
+ end
82
+ end
@@ -9,6 +9,10 @@ module ::Bcome::Stack
9
9
  node.machines
10
10
  end
11
11
 
12
+ def interactive
13
+ ::Bcome::Interactive::Session.run(self)
14
+ end
15
+
12
16
  def self.const_missing(constant_name)
13
17
  ## Hook for direct access to stack level resources by constant name where
14
18
  ## cd ServerName should yield the same outcome as cd "ServerName" or cd :ServerName does
@@ -111,7 +115,8 @@ module ::Bcome::Stack
111
115
  { :command => "exit", :description => "Return to the previous context" },
112
116
  { :command => "exit!", :description => "Close all contexts, and exit Become."},
113
117
  { :command => "local", :description => "Execute a shell command on your local machine.", :usage => 'local "command"'},
114
- { :command => "machines", :description => "Return all servers below the current level to the console. These objects can be manipulated directly" }
118
+ { :command => "machines", :description => "Return all servers below the current level to the console. These objects can be manipulated directly" },
119
+ { :command => "interactive", :description => "Enter an interactive where you may transparently interact with all the machines in your selection at once" },
115
120
  ]
116
121
  end
117
122
 
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.4.1
4
+ version: 0.5.0
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: 2016-08-08 00:00:00.000000000 Z
11
+ date: 2016-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -143,6 +143,7 @@ files:
143
143
  - documentation/images/direct_cmd_execution.png
144
144
  - documentation/images/direct_ssh.png
145
145
  - documentation/installation.md
146
+ - documentation/interactive_mode.md
146
147
  - documentation/usage.md
147
148
  - filters/ec2_filter.rb
148
149
  - lib/bcome.rb
@@ -160,6 +161,10 @@ files:
160
161
  - lib/helpers/instance_command.rb
161
162
  - lib/helpers/instance_ssh.rb
162
163
  - lib/helpers/selections.rb
164
+ - lib/interactive/interactive_session_halt.rb
165
+ - lib/interactive/session.rb
166
+ - lib/interactive/session_item/base.rb
167
+ - lib/interactive/session_item/transparent_ssh.rb
163
168
  - lib/nodes/base.rb
164
169
  - lib/nodes/environment.rb
165
170
  - lib/nodes/estate.rb