kontena-plugin-shell 0.1.3 → 0.2.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
- SHA1:
3
- metadata.gz: 801cf73c70dd8538e82d12cadda2b3053a22c653
4
- data.tar.gz: 09f9479d92170bdd9184280a08649201b2d667a8
2
+ SHA256:
3
+ metadata.gz: 09358261da75699f6afc793984e370be07c06c5cdda3ceaf24d2a7bd93804007
4
+ data.tar.gz: ea48df5a69dcb362faa3d9cb47a2949d4aaea1c191ccc908ebd0bb57e9c803b1
5
5
  SHA512:
6
- metadata.gz: 144d82873724fd87cab4b4e6cf92b3e0d99aa78ab0a7cefbc486474b324492c5eca52eeb0429464c997fbe3a80d1e7ba3a126943c98558d22b2f21942bf2fee3
7
- data.tar.gz: 3b6cddff8ec0b27a3a08982f937df571e558a919c4bdce1218e13dac2f1b9e99430d906642f92dd488c3f5bca68e6d0f539831eb08a81f19aec2b6144bd82c52
6
+ metadata.gz: f0344b8bd9795dbd7288f17ed58618f393f3d7d00dc7e03036a7a266e223906063bd872173fa4bbdbf09c6f695790a849f7d916a3eecd2bee70244cd75cc8f7a
7
+ data.tar.gz: b35ea14e3b3d9d69022f0cee239bd467b8aadb06247ada4edc8dd335dbc54dd87d06662f5c6c3e0b45722b376392044d5ed87e9bd8669c207c1d909a4cd95bd8
@@ -28,7 +28,7 @@ module Kontena::Plugin
28
28
  end
29
29
  rescue Clamp::HelpWanted => ex
30
30
  if args.include?('--help') || args.include?('-h')
31
- puts cmd.class.help('')
31
+ puts subcommand_class.help('')
32
32
  else
33
33
  context.concat(args)
34
34
  end
@@ -0,0 +1,27 @@
1
+ require 'kontena/cli/stacks/yaml/stack_file_loader'
2
+
3
+ module Kontena
4
+ module Plugin
5
+ module Shell
6
+ class PromptLoader < Kontena::Cli::Stacks::YAML::StackFileLoader
7
+ def self.match?(source, parent = nil)
8
+ source.end_with?('kontena.yml') && !Kontena::Cli::Stacks::YAML::FileLoader.match?(source, parent)
9
+ end
10
+
11
+ def read_content
12
+ content = Kontena.prompt.multiline("Enter or paste a stack YAML").join
13
+ raise "Invalid stack YAML" unless YAML.safe_load(content).kind_of?(Hash)
14
+ content
15
+ end
16
+
17
+ def origin
18
+ "prompt"
19
+ end
20
+
21
+ def registry
22
+ "prompt"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -27,6 +27,25 @@ module Kontena::Plugin
27
27
  tokens = buf.split(/\s(?=(?:[^"]|"[^"]*")*$)/).map(&:strip)
28
28
  runner = Shell.command(tokens.first) || Shell.command(context.first) || Kontena::Plugin::Shell::KontenaCommand
29
29
  command = runner.new(context, tokens, self)
30
+ if fork_supported? && forkable_command?(command)
31
+ execute_with_fork(command)
32
+ else
33
+ execute_with_thread(command)
34
+ end
35
+ end
36
+
37
+ def forkable_command?(command)
38
+ return false if !command.is_a?(Kontena::Plugin::Shell::KontenaCommand)
39
+ return false if command.subcommand_class.has_subcommands?
40
+
41
+ true
42
+ end
43
+
44
+ def fork_supported?
45
+ Process.respond_to?(:fork)
46
+ end
47
+
48
+ def execute_with_thread(command)
30
49
  old_trap = trap('INT', Proc.new { Thread.main[:command_thread] && Thread.main[:command_thread].kill })
31
50
  Thread.main[:command_thread] = Thread.new do
32
51
  command.run
@@ -35,6 +54,33 @@ module Kontena::Plugin
35
54
  trap('INT', old_trap)
36
55
  end
37
56
 
57
+ def execute_with_fork(command)
58
+ start = Time.now
59
+ pid = fork do
60
+ Process.setproctitle("kosh-runner")
61
+ command.run
62
+ end
63
+ trap('INT') {
64
+ begin
65
+ Process.kill('TERM', pid)
66
+ rescue Errno::ESRCH
67
+ raise SignalException, 'SIGINT'
68
+ end
69
+ }
70
+ Process.waitpid(pid)
71
+ if config_file_modified_since?(start)
72
+ puts ""
73
+ puts pastel.yellow("Config file has been modified, reloading configuration")
74
+ puts ""
75
+ config.reset_instance
76
+ end
77
+ end
78
+
79
+ def config_file_modified_since?(time)
80
+ return false unless config.config_file_available?
81
+ return true if File.mtime(config.config_filename) >= time
82
+ end
83
+
38
84
  def run
39
85
  puts File.read(__FILE__)[/__END__$(.*)/m, 1]
40
86
  puts "Kontena Shell v#{Kontena::Plugin::Shell::VERSION} (c) 2017 Kontena"
@@ -47,7 +93,17 @@ module Kontena::Plugin
47
93
  end
48
94
 
49
95
  # Hook stack command kontena.yml content prompting
50
- require 'kontena/plugin/shell/callbacks/stack_file'
96
+ if Gem::Version.new(Kontena::Cli::VERSION) >= Gem::Version.new('1.4.0')
97
+ require 'kontena/plugin/shell/prompt_loader'
98
+ else
99
+ require 'kontena/cli/stacks/validate_command'
100
+ require 'kontena/cli/stacks/install_command'
101
+ require 'kontena/cli/stacks/upgrade_command'
102
+ require 'kontena/plugin/shell/stacks_common_ext'
103
+ Kontena::Cli::Stacks::ValidateCommand.send(:include, Kontena::Plugin::Shell::StacksCommonExt)
104
+ Kontena::Cli::Stacks::InstallCommand.send(:include, Kontena::Plugin::Shell::StacksCommonExt)
105
+ Kontena::Cli::Stacks::UpgradeCommand.send(:include, Kontena::Plugin::Shell::StacksCommonExt)
106
+ end
51
107
 
52
108
  Readline.completion_proc = Proc.new do |word|
53
109
  line = Readline.line_buffer
@@ -92,7 +148,20 @@ module Kontena::Plugin
92
148
  end
93
149
 
94
150
  def prompt
95
- "#{master_name}/#{grid_name} #{pastel.yellow(context)} #{caret} "
151
+ if master_name && master_name.include?('/'.freeze)
152
+ org, name = master_name.split('/')
153
+ "#{pastel.bright_cyan(org)} / #{pastel.cyan(name)} #{pastel.yellow(context)} #{caret} "
154
+ elsif master_name && grid_name
155
+ "#{pastel.bright_cyan(master_name)} / #{pastel.cyan(grid_name)} #{pastel.yellow(context)} #{caret} "
156
+ elsif master_name
157
+ "#{pastel.bright_cyan(master_name)} / #{pastel.red('<no grid>')} #{pastel.yellow(context)} #{caret} "
158
+ else
159
+ if org = ENV['KONTENA_ORGANIZATION']
160
+ "#{pastel.bright_cyan(org)} #{pastel.yellow(context)} #{caret} "
161
+ else
162
+ "#{pastel.yellow(context)} #{caret} "
163
+ end
164
+ end
96
165
  end
97
166
 
98
167
  def caret
@@ -100,17 +169,17 @@ module Kontena::Plugin
100
169
  end
101
170
 
102
171
  def master_name
103
- config.current_master ? pastel.blue(config.current_master.name) : pastel.red('<no master>')
172
+ config.current_master.name if config.current_master
104
173
  end
105
174
 
106
175
  def grid_name
107
- config.current_grid ? pastel.blue(config.current_grid) : pastel.red('<no grid>')
176
+ config.current_grid
108
177
  end
109
178
  end
110
179
  end
111
180
  end
112
181
  __END__
113
- _ _
182
+ _ _
114
183
  | | _____ _ __ | |_ ___ _ __ __ _
115
184
  | |/ / _ \| '_ \| __/ _ \ '_ \ / _` |
116
185
  | < (_) | | | | || __/ | | | (_| |
@@ -0,0 +1,21 @@
1
+ require 'tempfile'
2
+
3
+ module Kontena
4
+ module Plugin
5
+ module Shell
6
+ module StacksCommonExt
7
+ def reader_from_yaml(*args)
8
+ if args.first == 'kontena.yml' && !File.exist?('kontena.yml')
9
+ tempfile = Tempfile.new('kontena.yml')
10
+ tempfile.write(Kontena.prompt.multiline("Enter or paste a stack YAML").join)
11
+ tempfile.close
12
+ args[0] = tempfile.path
13
+ end
14
+ reader = super(*args)
15
+ File.unlink(args[0]) if File.exist?(args[0])
16
+ reader
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,7 +1,7 @@
1
1
  module Kontena
2
2
  module Plugin
3
3
  module Shell
4
- VERSION = '0.1.3'
4
+ VERSION = '0.2.0'
5
5
  end
6
6
  end
7
7
  end
@@ -8,6 +8,7 @@ describe Kontena::Plugin::Shell::Session do
8
8
  let(:subject) { described_class.new(context) }
9
9
 
10
10
  it 'runs commands' do
11
+ allow(subject).to receive(:fork_supported?).and_return(false)
11
12
  expect(Readline).to receive(:readline).and_return('exit')
12
13
  expect{subject.run}.to output(/Bye/).to_stdout.and raise_error(SystemExit)
13
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kontena-plugin-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-06 00:00:00.000000000 Z
11
+ date: 2017-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kontena-cli
@@ -79,7 +79,6 @@ files:
79
79
  - README.md
80
80
  - bin/kosh
81
81
  - lib/kontena/plugin/shell.rb
82
- - lib/kontena/plugin/shell/callbacks/stack_file.rb
83
82
  - lib/kontena/plugin/shell/command.rb
84
83
  - lib/kontena/plugin/shell/commands/batch.rb
85
84
  - lib/kontena/plugin/shell/commands/batch_do.rb
@@ -92,8 +91,10 @@ files:
92
91
  - lib/kontena/plugin/shell/commands/kontena.rb
93
92
  - lib/kontena/plugin/shell/completer.rb
94
93
  - lib/kontena/plugin/shell/context.rb
94
+ - lib/kontena/plugin/shell/prompt_loader.rb
95
95
  - lib/kontena/plugin/shell/session.rb
96
96
  - lib/kontena/plugin/shell/shell_command.rb
97
+ - lib/kontena/plugin/shell/stacks_common_ext.rb
97
98
  - lib/kontena/plugin/shell/version.rb
98
99
  - lib/kontena_cli_plugin.rb
99
100
  - spec/helpers/cli_helper.rb
@@ -129,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
130
  version: '0'
130
131
  requirements: []
131
132
  rubyforge_project:
132
- rubygems_version: 2.6.13
133
+ rubygems_version: 2.7.2
133
134
  signing_key:
134
135
  specification_version: 4
135
136
  summary: Kontena interactive shell plugin
@@ -1,31 +0,0 @@
1
- require 'tempfile'
2
- module Kontena
3
- module Plugin
4
- module Shell
5
- module Callbacks
6
- class StackFile < Kontena::Callback
7
-
8
- matches_commands 'stacks install', 'stacks validate', 'stacks upgrade'
9
-
10
- def before
11
- Kontena::Cli::Stacks::YAML::Reader.class_eval do
12
- def self.new(*args)
13
- if args.first == 'kontena.yml' && !File.exist?('kontena.yml')
14
- @tempfile = Tempfile.new('kontena.yml')
15
- @tempfile.write(Kontena.prompt.multiline("Enter or paste a stack YAML").join)
16
- @tempfile.close
17
- args[0] = @tempfile.path
18
- end
19
- super *args
20
- end
21
- end
22
- end
23
-
24
- def after
25
- @tempfile.unlink if @tempfile
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end