kontena-cli 1.3.0.pre1 → 1.3.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/kontena +2 -1
- data/lib/kontena/callback.rb +1 -1
- data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +1 -2
- data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +2 -3
- data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +1 -2
- data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +2 -2
- data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +2 -2
- data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +9 -9
- data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +2 -2
- data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +1 -2
- data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +1 -2
- data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +2 -3
- data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +2 -2
- data/lib/kontena/cli/apps/common.rb +0 -1
- data/lib/kontena/cli/apps/init_command.rb +2 -0
- data/lib/kontena/cli/apps/kontena_yml_generator.rb +2 -1
- data/lib/kontena/cli/apps/list_command.rb +10 -2
- data/lib/kontena/cli/apps/yaml/reader.rb +2 -1
- data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -1
- data/lib/kontena/cli/cloud/login_command.rb +51 -7
- data/lib/kontena/cli/cloud/master/list_command.rb +14 -11
- data/lib/kontena/cli/common.rb +36 -83
- data/lib/kontena/cli/config.rb +46 -29
- data/lib/kontena/cli/containers/list_command.rb +30 -41
- data/lib/kontena/cli/etcd/list_command.rb +12 -7
- data/lib/kontena/cli/external_registries/list_command.rb +14 -8
- data/lib/kontena/cli/grids/list_command.rb +18 -10
- data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +7 -5
- data/lib/kontena/cli/grids/users/list_command.rb +9 -7
- data/lib/kontena/cli/localhost_web_server.rb +3 -3
- data/lib/kontena/cli/log_formatters/compact.rb +65 -0
- data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
- data/lib/kontena/cli/master/config/import_command.rb +2 -1
- data/lib/kontena/cli/master/config/set_command.rb +1 -1
- data/lib/kontena/cli/master/list_command.rb +16 -10
- data/lib/kontena/cli/master/token/list_command.rb +23 -12
- data/lib/kontena/cli/master/user/invite_command.rb +1 -1
- data/lib/kontena/cli/master/user/list_command.rb +17 -6
- data/lib/kontena/cli/nodes/labels/list_command.rb +3 -0
- data/lib/kontena/cli/nodes/list_command.rb +58 -37
- data/lib/kontena/cli/nodes/show_command.rb +1 -1
- data/lib/kontena/cli/plugins/install_command.rb +2 -2
- data/lib/kontena/cli/plugins/list_command.rb +19 -5
- data/lib/kontena/cli/plugins/uninstall_command.rb +1 -1
- data/lib/kontena/cli/services/containers_command.rb +7 -0
- data/lib/kontena/cli/services/envs/list_command.rb +6 -4
- data/lib/kontena/cli/services/list_command.rb +47 -36
- data/lib/kontena/cli/services/services_helper.rb +9 -16
- data/lib/kontena/cli/services/stats_command.rb +2 -1
- data/lib/kontena/cli/spinner.rb +3 -5
- data/lib/kontena/cli/stacks/common.rb +4 -4
- data/lib/kontena/cli/stacks/list_command.rb +42 -33
- data/lib/kontena/cli/stacks/registry/search_command.rb +6 -0
- data/lib/kontena/cli/stacks/registry/show_command.rb +2 -0
- data/lib/kontena/cli/stacks/registry_command.rb +1 -2
- data/lib/kontena/cli/stacks/validate_command.rb +1 -0
- data/lib/kontena/cli/stacks/yaml/reader.rb +3 -2
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +0 -1
- data/lib/kontena/cli/stacks/yaml/validations.rb +1 -1
- data/lib/kontena/cli/table_generator.rb +125 -0
- data/lib/kontena/cli/vault/export_command.rb +7 -4
- data/lib/kontena/cli/vault/import_command.rb +3 -0
- data/lib/kontena/cli/vault/list_command.rb +23 -10
- data/lib/kontena/cli/volumes/create_command.rb +8 -4
- data/lib/kontena/cli/volumes/list_command.rb +15 -7
- data/lib/kontena/client.rb +44 -33
- data/lib/kontena/command.rb +7 -4
- data/lib/kontena/debug_instrumentor.rb +10 -9
- data/lib/kontena/main_command.rb +1 -3
- data/lib/kontena/plugin_manager.rb +15 -7
- data/lib/kontena/stacks_cache.rb +7 -7
- data/lib/kontena/stacks_client.rb +24 -5
- data/lib/kontena/util.rb +43 -15
- data/lib/kontena_cli.rb +71 -14
- data/spec/kontena/cli/cloud/login_command_spec.rb +42 -0
- data/spec/kontena/cli/containers/list_command_spec.rb +1 -2
- data/spec/kontena/cli/nodes/list_command_spec.rb +153 -126
- data/spec/kontena/cli/registry/create_spec.rb +22 -0
- data/spec/kontena/cli/services/stats_command_spec.rb +22 -0
- data/spec/kontena/cli/table_generator_spec.rb +118 -0
- data/spec/kontena/cli/version_command_spec.rb +2 -2
- data/spec/kontena/client_spec.rb +4 -3
- data/spec/support/client_helpers.rb +3 -3
- data/spec/support/output_helpers.rb +54 -8
- metadata +11 -2
data/lib/kontena/command.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'clamp'
|
2
2
|
require 'kontena/cli/subcommand_loader'
|
3
|
-
require 'kontena/cli/common'
|
4
3
|
require 'kontena/util'
|
5
4
|
require 'kontena/cli/bytes_helper'
|
6
5
|
require 'kontena/cli/grid_options'
|
6
|
+
require 'excon/errors'
|
7
7
|
|
8
8
|
class Kontena::Command < Clamp::Command
|
9
9
|
|
10
10
|
option ['-D', '--debug'], :flag, "Enable debug", environment_variable: 'DEBUG' do
|
11
11
|
ENV['DEBUG'] ||= 'true'
|
12
|
+
Kontena.reset_logger
|
12
13
|
end
|
13
14
|
|
14
15
|
attr_accessor :arguments
|
@@ -182,7 +183,7 @@ class Kontena::Command < Clamp::Command
|
|
182
183
|
end
|
183
184
|
|
184
185
|
def run(arguments)
|
185
|
-
|
186
|
+
Kontena.logger.debug { "Running #{self.class.name} with #{arguments.inspect} -- callback matcher = '#{self.class.callback_matcher.nil? ? "nil" : self.class.callback_matcher.map(&:to_s).join(' ')}'" }
|
186
187
|
@arguments = arguments
|
187
188
|
|
188
189
|
run_callbacks :before_parse unless help_requested?
|
@@ -218,7 +219,8 @@ class Kontena::Command < Clamp::Command
|
|
218
219
|
end
|
219
220
|
rescue Kontena::Errors::StandardError => ex
|
220
221
|
raise ex if ENV['DEBUG']
|
221
|
-
|
222
|
+
Kontena.logger.error(ex)
|
223
|
+
abort(" [#{Kontena.pastel.red('error')}] #{ex.status} : #{ex.message}")
|
222
224
|
rescue Errno::EPIPE
|
223
225
|
# If user is piping the command outputs to some other command that might exit before CLI has outputted everything
|
224
226
|
abort
|
@@ -226,7 +228,8 @@ class Kontena::Command < Clamp::Command
|
|
226
228
|
raise
|
227
229
|
rescue => ex
|
228
230
|
raise ex if ENV['DEBUG']
|
229
|
-
|
231
|
+
Kontena.logger.error(ex)
|
232
|
+
abort(" [#{Kontena.pastel.red('error')}] #{ex.class.name} : #{ex.message}\n See #{Kontena.log_target} or run the command again with environment DEBUG=true set to see the full exception")
|
230
233
|
end
|
231
234
|
end
|
232
235
|
|
@@ -22,6 +22,7 @@ module Kontena
|
|
22
22
|
heads << "Accept: #{params[:headers]['Accept']}" if params[:headers]['Accept']
|
23
23
|
heads << "Content-Type: #{params[:headers]['Content-Type']}" if params[:headers]['Content-Type']
|
24
24
|
heads << "Authorization: #{params[:headers]['Authorization'].split(' ', 2).first}" if params[:headers]['Authorization']
|
25
|
+
heads << "X-Kontena-Version: #{params[:headers]['X-Kontena-Version']}" if params[:headers]['X-Kontena-Version']
|
25
26
|
str << heads.join(', ')
|
26
27
|
str << "} "
|
27
28
|
result << str
|
@@ -50,17 +51,17 @@ module Kontena
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
result << str
|
54
|
+
elsif params[:error]
|
55
|
+
result << params[:error]
|
53
56
|
end
|
54
57
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
$stderr.puts("[API Client #{direction}]: #{result.join(" | ")}")
|
63
|
-
end
|
58
|
+
color = case direction
|
59
|
+
when 'Request' then :blue
|
60
|
+
when 'Response' then :magenta
|
61
|
+
else :red
|
62
|
+
end
|
63
|
+
|
64
|
+
Kontena.logger.debug("CLIENT") { Kontena.pastel.send(color, "[#{direction}]: #{result.join(" | ")}") }
|
64
65
|
|
65
66
|
if block_given?
|
66
67
|
yield
|
data/lib/kontena/main_command.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'kontena/command'
|
2
2
|
|
3
3
|
class Kontena::MainCommand < Kontena::Command
|
4
|
-
include Kontena::Util
|
5
|
-
include Kontena::Cli::Common
|
6
|
-
|
7
4
|
option ['-v', '--version'], :flag, "Output Kontena CLI version #{Kontena::Cli::VERSION}" do
|
8
5
|
build_tags = [ 'ruby' + RUBY_VERSION ]
|
9
6
|
build_tags << RUBY_PLATFORM
|
@@ -44,6 +41,7 @@ class Kontena::MainCommand < Kontena::Command
|
|
44
41
|
|
45
42
|
def subcommand_missing(name)
|
46
43
|
if known_plugin_subcommand?(name)
|
44
|
+
extend Kontena::Cli::Common
|
47
45
|
exit_with_error "The '#{name}' plugin has not been installed. Use: kontena plugin install #{name}"
|
48
46
|
else
|
49
47
|
super(name)
|
@@ -159,6 +159,10 @@ module Kontena
|
|
159
159
|
SafeYAML::OPTIONS[:default_mode] = :safe if Object.const_defined?(:SafeYAML)
|
160
160
|
end
|
161
161
|
|
162
|
+
def plugin_debug?
|
163
|
+
@plugin_debug ||= ENV['DEBUG'] == 'plugin'
|
164
|
+
end
|
165
|
+
|
162
166
|
def load_plugins
|
163
167
|
plugins = []
|
164
168
|
Gem::Specification.to_a.each do |spec|
|
@@ -167,21 +171,25 @@ module Kontena
|
|
167
171
|
if File.exist?(plugin) && !plugins.find{ |p| p.name == spec.name }
|
168
172
|
begin
|
169
173
|
if spec_has_valid_dependency?(spec)
|
174
|
+
|
170
175
|
loaded_features_before = $LOADED_FEATURES.dup
|
171
176
|
load_path_before = $LOAD_PATH.dup
|
172
177
|
|
173
|
-
|
178
|
+
Kontena.logger.debug { "Activating plugin #{spec.name}" } if plugin_debug?
|
174
179
|
spec.activate
|
175
180
|
spec.activate_dependencies
|
176
181
|
|
177
|
-
|
182
|
+
Kontena.logger.debug { "Loading plugin #{spec.name}" }
|
178
183
|
require(plugin)
|
184
|
+
Kontena.logger.debug { "Loaded plugin #{spec.name}" } if plugin_debug?
|
179
185
|
|
180
|
-
if
|
186
|
+
if plugin_debug?
|
181
187
|
added_features = ($LOADED_FEATURES - loaded_features_before).map {|feat| "- #{feat}"}
|
182
188
|
added_paths = ($LOAD_PATH - load_path_before).map {|feat| "- #{feat}"}
|
183
|
-
|
184
|
-
|
189
|
+
Kontena.logger.debug { "Plugin manager loaded features for #{spec.name}:" } unless added_features.empty?
|
190
|
+
added_features.each { |feat| Kontena.logger.debug { feat } }
|
191
|
+
Kontena.logger.debug { "Plugin manager load paths added for #{spec.name}:" } unless added_paths.empty?
|
192
|
+
added_paths.each { |path| Kontena.logger.debug { path } }
|
185
193
|
end
|
186
194
|
|
187
195
|
plugins << spec
|
@@ -192,7 +200,7 @@ module Kontena
|
|
192
200
|
end
|
193
201
|
rescue ScriptError, StandardError => ex
|
194
202
|
warn " [#{Kontena.pastel.red('error')}] Failed to load plugin: #{spec.name}\n\tRerun the command with environment DEBUG=true set to get the full exception."
|
195
|
-
|
203
|
+
Kontena.logger.error(ex)
|
196
204
|
end
|
197
205
|
end
|
198
206
|
end
|
@@ -200,7 +208,7 @@ module Kontena
|
|
200
208
|
plugins
|
201
209
|
rescue => ex
|
202
210
|
$stderr.puts Kontena.pastel.red(ex.message)
|
203
|
-
|
211
|
+
Kontena.logger.error(ex)
|
204
212
|
end
|
205
213
|
|
206
214
|
def prefix(plugin_name)
|
data/lib/kontena/stacks_cache.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
require_relative 'stacks_client'
|
2
|
-
require_relative 'cli/common'
|
3
|
-
require_relative 'cli/stacks/common'
|
4
|
-
require 'yaml'
|
5
|
-
require 'uri'
|
6
|
-
|
7
1
|
module Kontena
|
2
|
+
autoload :StacksClient, 'kontena/stacks_client'
|
3
|
+
|
8
4
|
class StacksCache
|
9
5
|
class CachedStack
|
10
6
|
|
@@ -12,6 +8,8 @@ module Kontena
|
|
12
8
|
attr_accessor :version
|
13
9
|
|
14
10
|
def initialize(stack, version = nil)
|
11
|
+
require "safe_yaml"
|
12
|
+
SafeYAML::OPTIONS[:default_mode] = :safe
|
15
13
|
unless version
|
16
14
|
stack, version = stack.split(':', 2)
|
17
15
|
end
|
@@ -59,6 +57,8 @@ module Kontena
|
|
59
57
|
end
|
60
58
|
|
61
59
|
class RegistryClientFactory
|
60
|
+
require 'kontena/cli/common'
|
61
|
+
require 'kontena/cli/stacks/common'
|
62
62
|
include Kontena::Cli::Common
|
63
63
|
include Kontena::Cli::Stacks::Common
|
64
64
|
end
|
@@ -69,7 +69,7 @@ module Kontena
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def dputs(msg)
|
72
|
-
|
72
|
+
Kontena.logger.debug { msg }
|
73
73
|
end
|
74
74
|
|
75
75
|
def cache(stack, version = nil)
|
@@ -7,6 +7,19 @@ module Kontena
|
|
7
7
|
ACCEPT_YAML = { 'Accept' => 'application/yaml' }
|
8
8
|
CT_YAML = { 'Content-Type' => 'application/yaml' }
|
9
9
|
|
10
|
+
def raise_unless_token
|
11
|
+
unless token && token['access_token']
|
12
|
+
raise Kontena::Errors::StandardError.new(401, "Stack registry write operations require authentication")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def raise_unless_read_token
|
17
|
+
return false unless options[:read_requires_token]
|
18
|
+
unless token && token['access_token']
|
19
|
+
raise Kontena::Errors::StandardError.new(401, "Stack registry requires authentication")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
10
23
|
def full_uri(stack_name, version = nil)
|
11
24
|
URI.join(api_url, path_to(stack_name, version)).to_s
|
12
25
|
end
|
@@ -16,29 +29,35 @@ module Kontena
|
|
16
29
|
end
|
17
30
|
|
18
31
|
def push(stack_name, version, data)
|
19
|
-
|
32
|
+
raise_unless_token
|
33
|
+
post('/stack/', data, {}, CT_YAML, true)
|
20
34
|
end
|
21
35
|
|
22
36
|
def show(stack_name, stack_version = nil)
|
23
|
-
|
37
|
+
raise_unless_read_token
|
38
|
+
get("#{path_to(stack_name, stack_version)}", nil, ACCEPT_JSON, options[:read_requires_token])
|
24
39
|
end
|
25
40
|
|
26
41
|
def versions(stack_name)
|
27
|
-
|
42
|
+
raise_unless_read_token
|
43
|
+
get("#{path_to(stack_name, nil)}/versions", nil, ACCEPT_JSON, options[:read_requires_token])['versions']
|
28
44
|
end
|
29
45
|
|
30
46
|
def pull(stack_name, version = nil)
|
31
|
-
|
47
|
+
raise_unless_read_token
|
48
|
+
get(path_to(stack_name, version), nil, ACCEPT_YAML, options[:read_requires_token])
|
32
49
|
rescue StandardError => ex
|
33
50
|
ex.message << " : #{path_to(stack_name, version)}"
|
34
51
|
raise ex, ex.message
|
35
52
|
end
|
36
53
|
|
37
54
|
def search(query)
|
38
|
-
|
55
|
+
raise_unless_read_token
|
56
|
+
get('/search', { q: query }, ACCEPT_JSON, options[:read_requires_token])['stacks']
|
39
57
|
end
|
40
58
|
|
41
59
|
def destroy(stack_name, version = nil)
|
60
|
+
raise_unless_token
|
42
61
|
delete(path_to(stack_name, version), {})
|
43
62
|
end
|
44
63
|
end
|
data/lib/kontena/util.rb
CHANGED
@@ -1,9 +1,33 @@
|
|
1
1
|
module Kontena
|
2
2
|
module Util
|
3
3
|
def self.included(base)
|
4
|
-
|
4
|
+
base.extend(ClassMethods)
|
5
5
|
end
|
6
6
|
|
7
|
+
def symbolize_keys(obj)
|
8
|
+
case obj
|
9
|
+
when Hash
|
10
|
+
obj.map { |k,v| [k.to_sym, symbolize_keys(v)] }.to_h
|
11
|
+
when Array
|
12
|
+
obj.map { |v| symbolize_keys(v) }
|
13
|
+
else
|
14
|
+
obj
|
15
|
+
end
|
16
|
+
end
|
17
|
+
module_function :symbolize_keys
|
18
|
+
|
19
|
+
def symbolize_keys!(obj)
|
20
|
+
case obj
|
21
|
+
when Hash
|
22
|
+
obj.keys.each { |k| obj[k.to_sym] = symbolize_keys!(obj.delete(k)) }
|
23
|
+
when Array
|
24
|
+
obj.map! { |v| symbolize_keys!(v) }
|
25
|
+
else
|
26
|
+
end
|
27
|
+
obj
|
28
|
+
end
|
29
|
+
module_function :symbolize_keys!
|
30
|
+
|
7
31
|
# @param [String] cmd
|
8
32
|
def which(cmd)
|
9
33
|
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
@@ -30,26 +54,30 @@ module Kontena
|
|
30
54
|
|
31
55
|
def time_ago(time)
|
32
56
|
now = Time.now.to_i
|
33
|
-
time = DateTime.parse(time).to_time.to_i
|
57
|
+
time = time.kind_of?(Integer) ? time : DateTime.parse(time).to_time.to_i
|
34
58
|
diff = now - time
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
59
|
+
seconds_to_human(diff) + ' ago'
|
60
|
+
end
|
61
|
+
|
62
|
+
def time_until(seconds)
|
63
|
+
'in ' + seconds_to_human(seconds)
|
64
|
+
end
|
65
|
+
|
66
|
+
def seconds_to_human(seconds)
|
67
|
+
if seconds > 60 * 60 * 24
|
68
|
+
result = "#{seconds / 60 / 60 / 24} days"
|
69
|
+
elsif seconds > 60 * 60
|
70
|
+
result = "#{seconds / 60 / 60} hours"
|
71
|
+
elsif seconds > 60
|
72
|
+
result = "#{seconds / 60} minutes"
|
41
73
|
else
|
42
|
-
"#{
|
74
|
+
result = "#{seconds} seconds"
|
43
75
|
end
|
76
|
+
result.start_with?('1 ') ? result[0..-2] : result
|
44
77
|
end
|
45
78
|
|
46
79
|
def longest_string_in_array(array)
|
47
|
-
|
48
|
-
array.each do |item|
|
49
|
-
longest = item.length if item.length > longest
|
50
|
-
end
|
51
|
-
|
52
|
-
longest
|
80
|
+
array.max_by(&:length).length
|
53
81
|
end
|
54
82
|
|
55
83
|
module_function(:which)
|
data/lib/kontena_cli.rb
CHANGED
@@ -1,4 +1,26 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
$KONTENA_START_TIME = Time.now.to_f
|
4
|
+
at_exit do
|
5
|
+
Kontena.logger.debug { "Execution took #{(Time.now.to_f - $KONTENA_START_TIME).round(3)} seconds" }
|
6
|
+
Kontena.logger.debug { "#{$!.class.name}" + ($!.respond_to?(:status) ? " status #{$!.status}" : "") } if $!
|
7
|
+
end
|
8
|
+
|
1
9
|
module Kontena
|
10
|
+
module Cli
|
11
|
+
autoload :Config, 'kontena/cli/config'
|
12
|
+
autoload :Spinner, 'kontena/cli/spinner'
|
13
|
+
autoload :Common, 'kontena/cli/common'
|
14
|
+
autoload :TableGenerator, 'kontena/cli/table_generator'
|
15
|
+
end
|
16
|
+
|
17
|
+
autoload :Command, 'kontena/command'
|
18
|
+
autoload :Client, 'kontena/client'
|
19
|
+
autoload :StacksCache, 'kontena/stacks_cache'
|
20
|
+
autoload :PluginManager, 'kontena/plugin_manager'
|
21
|
+
autoload :MainCommand, 'kontena/main_command'
|
22
|
+
autoload :Errors, 'kontena/errors'
|
23
|
+
|
2
24
|
# Run a kontena command like it was launched from the command line. Re-raises any exceptions,
|
3
25
|
# except a SystemExit with status 0, which is considered a success.
|
4
26
|
#
|
@@ -12,16 +34,17 @@ module Kontena
|
|
12
34
|
else
|
13
35
|
command = cmdline
|
14
36
|
end
|
15
|
-
|
37
|
+
logger.debug { "Running Kontena.run(#{command.inspect}" }
|
16
38
|
result = Kontena::MainCommand.new(File.basename(__FILE__)).run(command)
|
17
|
-
|
39
|
+
logger.debug { "Command completed, result: #{result.inspect} status: 0" }
|
18
40
|
result
|
19
41
|
rescue SystemExit => ex
|
20
|
-
|
42
|
+
logger.debug { "Command caused SystemExit, status: #{ex.status}" }
|
21
43
|
return true if ex.status.zero?
|
22
44
|
raise ex
|
23
45
|
rescue => ex
|
24
|
-
|
46
|
+
logger.error { "Command #{cmdline.inspect} exception" }
|
47
|
+
logger.error { ex }
|
25
48
|
raise ex
|
26
49
|
end
|
27
50
|
|
@@ -37,6 +60,29 @@ module Kontena
|
|
37
60
|
false
|
38
61
|
end
|
39
62
|
|
63
|
+
def self.log_target
|
64
|
+
return @log_target if @log_target
|
65
|
+
|
66
|
+
@log_target = ENV['LOG_TARGET']
|
67
|
+
|
68
|
+
if ENV["DEBUG"]
|
69
|
+
@log_target ||= $stderr
|
70
|
+
elsif @log_target.nil?
|
71
|
+
@log_target = File.join(home, 'kontena.log')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.reset_logger
|
76
|
+
@log_target, @logger = nil
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.home
|
80
|
+
return @home if @home
|
81
|
+
@home = File.join(Dir.home, '.kontena')
|
82
|
+
Dir.mkdir(@home, 0700) unless File.directory?(@home)
|
83
|
+
@home
|
84
|
+
end
|
85
|
+
|
40
86
|
# @return [String] x.y
|
41
87
|
def self.minor_version
|
42
88
|
Kontena::Cli::VERSION.split('.')[0..1].join('.')
|
@@ -59,7 +105,9 @@ module Kontena
|
|
59
105
|
end
|
60
106
|
|
61
107
|
def self.pastel
|
62
|
-
@pastel
|
108
|
+
return @pastel if @pastel
|
109
|
+
require 'pastel'
|
110
|
+
@pastel = Pastel.new(enabled: !simple_terminal?)
|
63
111
|
end
|
64
112
|
|
65
113
|
def self.prompt
|
@@ -96,6 +144,23 @@ module Kontena
|
|
96
144
|
File.join(Kontena.root, 'lib/kontena/cli', *joinables)
|
97
145
|
end
|
98
146
|
end
|
147
|
+
|
148
|
+
def self.logger
|
149
|
+
return @logger if @logger
|
150
|
+
if log_target.respond_to?(:tty?) && log_target.tty?
|
151
|
+
logger = Logger.new(log_target)
|
152
|
+
require 'kontena/cli/log_formatters/compact'
|
153
|
+
logger.formatter = Kontena::Cli::LogFormatter::Compact.new
|
154
|
+
else
|
155
|
+
logger = Logger.new(log_target, 1, 1_048_576)
|
156
|
+
require 'kontena/cli/log_formatters/strip_color'
|
157
|
+
logger.formatter = Kontena::Cli::LogFormatter::StripColor.new
|
158
|
+
end
|
159
|
+
logger.level = ENV["DEBUG"] ? Logger::DEBUG : Logger::INFO
|
160
|
+
logger.progname = 'CLI'
|
161
|
+
@logger = logger
|
162
|
+
end
|
163
|
+
|
99
164
|
end
|
100
165
|
|
101
166
|
# Monkeypatching string to mimick 'colorize' gem
|
@@ -115,13 +180,5 @@ end
|
|
115
180
|
|
116
181
|
require 'ruby_dig'
|
117
182
|
require 'shellwords'
|
118
|
-
require "safe_yaml"
|
119
|
-
SafeYAML::OPTIONS[:default_mode] = :safe
|
120
183
|
require 'kontena/cli/version'
|
121
|
-
|
122
|
-
require 'kontena/command'
|
123
|
-
require 'kontena/client'
|
124
|
-
require 'kontena/stacks_cache'
|
125
|
-
require 'kontena/plugin_manager'
|
126
|
-
require 'kontena/main_command'
|
127
|
-
require 'kontena/cli/spinner'
|
184
|
+
Kontena.logger.debug { "Kontena CLI #{Kontena::Cli::VERSION} (ruby-#{RUBY_VERSION}+#{RUBY_PLATFORM})" }
|