puppet-debugger 0.17.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +12 -26
- data/.rubocop.yml +64 -232
- data/.rubocop_todo.yml +89 -147
- data/.vscode/launch.json +15 -0
- data/CHANGELOG.md +29 -0
- data/Gemfile +9 -6
- data/README.md +27 -14
- data/Rakefile +11 -12
- data/bin/pdb +1 -1
- data/lib/awesome_print/ext/awesome_puppet.rb +10 -8
- data/lib/plugins/puppet-debugger/input_responders/benchmark.rb +5 -4
- data/lib/plugins/puppet-debugger/input_responders/classes.rb +14 -2
- data/lib/plugins/puppet-debugger/input_responders/classification.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/commands.rb +18 -18
- data/lib/plugins/puppet-debugger/input_responders/datatypes.rb +22 -6
- data/lib/plugins/puppet-debugger/input_responders/environment.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/exit.rb +5 -3
- data/lib/plugins/puppet-debugger/input_responders/facterdb_filter.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/facts.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/functions.rb +34 -32
- data/lib/plugins/puppet-debugger/input_responders/help.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/krt.rb +4 -2
- data/lib/plugins/puppet-debugger/input_responders/play.rb +22 -24
- data/lib/plugins/puppet-debugger/input_responders/reset.rb +5 -3
- data/lib/plugins/puppet-debugger/input_responders/resources.rb +16 -7
- data/lib/plugins/puppet-debugger/input_responders/set.rb +34 -32
- data/lib/plugins/puppet-debugger/input_responders/stacktrace.rb +31 -0
- data/lib/plugins/puppet-debugger/input_responders/types.rb +6 -2
- data/lib/plugins/puppet-debugger/input_responders/vars.rb +8 -7
- data/lib/plugins/puppet-debugger/input_responders/whereami.rb +5 -3
- data/lib/puppet-debugger/cli.rb +129 -91
- data/lib/puppet-debugger/code/code_file.rb +13 -14
- data/lib/puppet-debugger/code/code_range.rb +5 -3
- data/lib/puppet-debugger/code/loc.rb +1 -1
- data/lib/puppet-debugger/debugger_code.rb +2 -0
- data/lib/puppet-debugger/hooks.rb +15 -16
- data/lib/puppet-debugger/input_responder_plugin.rb +54 -52
- data/lib/puppet-debugger/monkey_patches.rb +4 -1
- data/lib/puppet-debugger/plugin_test_helper.rb +9 -8
- data/lib/puppet-debugger/support.rb +44 -18
- data/lib/puppet-debugger/support/environment.rb +6 -5
- data/lib/puppet-debugger/support/errors.rb +25 -27
- data/lib/puppet-debugger/support/facts.rb +5 -5
- data/lib/puppet-debugger/support/node.rb +4 -7
- data/lib/puppet-debugger/support/scope.rb +29 -0
- data/lib/puppet-debugger/trollop.rb +38 -31
- data/lib/puppet-debugger/version.rb +1 -1
- data/lib/puppet/application/debugger.rb +151 -126
- data/output.json +1 -0
- data/puppet-debugger.gemspec +18 -15
- data/spec/awesome_print/ext/awesome_puppet_spec.rb +30 -30
- data/spec/fixtures/pe-xl-core-0.puppet.vm.json +1 -0
- data/spec/fixtures/sample_start_debugger.pp +3 -2
- data/spec/hooks_spec.rb +33 -35
- data/spec/input_responder_plugin_spec.rb +7 -6
- data/spec/input_responders/benchmark_spec.rb +3 -1
- data/spec/input_responders/classes_spec.rb +12 -13
- data/spec/input_responders/classification_spec.rb +4 -2
- data/spec/input_responders/commands_spec.rb +2 -0
- data/spec/input_responders/datatypes_spec.rb +8 -2
- data/spec/input_responders/environment_spec.rb +2 -0
- data/spec/input_responders/exit_spec.rb +9 -11
- data/spec/input_responders/facterdb_filter_spec.rb +2 -0
- data/spec/input_responders/facts_spec.rb +2 -0
- data/spec/input_responders/functions_spec.rb +30 -28
- data/spec/input_responders/help_spec.rb +5 -3
- data/spec/input_responders/krt_spec.rb +3 -1
- data/spec/input_responders/play_spec.rb +10 -20
- data/spec/input_responders/reset_spec.rb +2 -0
- data/spec/input_responders/resources_spec.rb +7 -1
- data/spec/input_responders/set_spec.rb +3 -1
- data/spec/input_responders/stacktrace_spec.rb +15 -0
- data/spec/input_responders/types_spec.rb +2 -0
- data/spec/input_responders/vars_spec.rb +4 -4
- data/spec/input_responders/whereami_spec.rb +2 -0
- data/spec/pdb_spec.rb +0 -9
- data/spec/puppet/application/debugger_spec.rb +35 -17
- data/spec/puppet_debugger_spec.rb +81 -84
- data/spec/remote_node_spec.rb +1 -5
- data/spec/spec_helper.rb +22 -18
- data/spec/support_spec.rb +3 -5
- data/test_matrix.rb +1 -1
- metadata +54 -21
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Exit < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
6
|
-
SUMMARY = 'Quit Puppet Debugger
|
7
|
+
COMMAND_WORDS = %w[exit].freeze
|
8
|
+
SUMMARY = 'Quit Puppet Debugger, or use control-d'
|
7
9
|
COMMAND_GROUP = :help
|
8
10
|
|
9
|
-
def run(
|
11
|
+
def run(_args = [])
|
10
12
|
exit 0
|
11
13
|
end
|
12
14
|
end
|
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class FacterdbFilter < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[facterdb_filter ff].freeze
|
6
8
|
SUMMARY = 'Set the facterdb filter'
|
7
9
|
COMMAND_GROUP = :node
|
8
10
|
|
9
11
|
# displays the facterdb filter
|
10
12
|
# @param [Array] - args is not used
|
11
|
-
def run(
|
13
|
+
def run(_args = [])
|
12
14
|
debugger.dynamic_facterdb_filter.ai
|
13
15
|
end
|
14
16
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Facts < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[facts].freeze
|
6
8
|
SUMMARY = 'List all the facts associated with the node.'
|
7
9
|
COMMAND_GROUP = :node
|
8
10
|
|
9
|
-
def run(
|
11
|
+
def run(_args = [])
|
10
12
|
variables = debugger.node.facts.values
|
11
13
|
variables.ai(sort_keys: true, indent: -1)
|
12
14
|
end
|
@@ -1,23 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'puppet-debugger/input_responder_plugin'
|
4
|
+
require 'table_print'
|
3
5
|
require 'fileutils'
|
4
6
|
require 'bundler'
|
5
7
|
|
6
8
|
module PuppetDebugger
|
7
9
|
module InputResponders
|
8
10
|
class Functions < InputResponderPlugin
|
9
|
-
COMMAND_WORDS = %w
|
10
|
-
SUMMARY =
|
11
|
+
COMMAND_WORDS = %w[functions].freeze
|
12
|
+
SUMMARY = 'List all the functions available in the environment.'
|
11
13
|
COMMAND_GROUP = :environment
|
12
|
-
FUNC_NATIVE_NAME_REGEX =
|
13
|
-
FUNC_V4_NAME_REGEX =
|
14
|
+
FUNC_NATIVE_NAME_REGEX = /\Afunction\s([\w\:]+)/.freeze
|
15
|
+
FUNC_V4_NAME_REGEX = /Puppet\:\:Functions.create_function\s?\(?\:?\'?([\w\:]+)/.freeze
|
14
16
|
|
15
17
|
def run(args = [])
|
16
|
-
filter = args.first ||
|
17
|
-
TablePrint::Printer.table_print(sorted_list(filter), [
|
18
|
+
filter = args.first || ''
|
19
|
+
TablePrint::Printer.table_print(sorted_list(filter), %i[full_name mod_name])
|
18
20
|
end
|
19
21
|
|
20
|
-
def sorted_list(filter =
|
22
|
+
def sorted_list(filter = '')
|
21
23
|
search = /#{Regexp.escape(filter)}/
|
22
24
|
function_map.values.find_all do |v|
|
23
25
|
"#{v[:mod_name]}_#{v[:full_name]}" =~ search
|
@@ -27,7 +29,7 @@ module PuppetDebugger
|
|
27
29
|
# append a () to functions so we know they are functions
|
28
30
|
def func_list
|
29
31
|
# ideally we should get a list of function names via the puppet loader
|
30
|
-
function_map.map { |
|
32
|
+
function_map.map { |_name, metadata| "#{metadata[:full_name]}()" }
|
31
33
|
end
|
32
34
|
|
33
35
|
# @return [Hash] - a map of all the functions
|
@@ -45,8 +47,8 @@ module PuppetDebugger
|
|
45
47
|
def current_module_dir
|
46
48
|
@current_module_dir ||= begin
|
47
49
|
File.dirname(::Bundler.default_gemfile)
|
48
|
-
|
49
|
-
|
50
|
+
rescue ::Bundler::GemfileNotFound
|
51
|
+
Dir.pwd
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
@@ -62,26 +64,26 @@ module PuppetDebugger
|
|
62
64
|
namespace = nil
|
63
65
|
name = nil
|
64
66
|
if file =~ /\.pp/
|
65
|
-
File.readlines(file, :
|
67
|
+
File.readlines(file, encoding: 'UTF-8').find do |line|
|
66
68
|
# TODO: not getting namespace for functio
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
next unless line.match(FUNC_NATIVE_NAME_REGEX)
|
70
|
+
|
71
|
+
namespace, name = Regexp.last_match(1).split('::', 2)
|
72
|
+
name = namespace if name.nil?
|
73
|
+
namespace = '' if namespace == name
|
72
74
|
end
|
73
|
-
elsif file.include?(
|
74
|
-
File.readlines(file, :
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
elsif file.include?('lib/puppet/functions')
|
76
|
+
File.readlines(file, encoding: 'UTF-8').find do |line|
|
77
|
+
next unless line.match(FUNC_V4_NAME_REGEX)
|
78
|
+
|
79
|
+
namespace, name = Regexp.last_match(1).split('::', 2)
|
80
|
+
name = namespace if name.nil?
|
81
|
+
namespace = '' if namespace == name
|
80
82
|
end
|
81
83
|
end
|
82
84
|
name ||= File.basename(file, File.extname(file))
|
83
85
|
match = file.match('\/(?<mod>[\w\-\.]+)\/(lib|functions|manifests)')
|
84
|
-
summary_match = File.read(file, :
|
86
|
+
summary_match = File.read(file, encoding: 'UTF-8').match(/@summary\s(.*)/)
|
85
87
|
summary = summary_match[1] if summary_match
|
86
88
|
# fetch the puppet version if this is a function from puppet gem
|
87
89
|
captures = file.match(/(puppet-[\d\.]+)/)
|
@@ -106,15 +108,15 @@ module PuppetDebugger
|
|
106
108
|
# in the future we may want to utilize the puppet loaders to find these things
|
107
109
|
def function_files
|
108
110
|
search_dirs = lib_dirs.map do |lib_dir|
|
109
|
-
[File.join(lib_dir,
|
110
|
-
File.join(lib_dir,
|
111
|
-
File.join(File.dirname(lib_dir),
|
112
|
-
File.join(lib_dir,
|
111
|
+
[File.join(lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
112
|
+
File.join(lib_dir, 'functions', '**', '*.rb'),
|
113
|
+
File.join(File.dirname(lib_dir), 'functions', '**', '*.pp'),
|
114
|
+
File.join(lib_dir, 'puppet', 'parser', 'functions', '*.rb')]
|
113
115
|
end
|
114
116
|
|
115
117
|
# add puppet lib directories
|
116
|
-
search_dirs << [File.join(puppet_lib_dir,
|
117
|
-
File.join(puppet_lib_dir,
|
118
|
+
search_dirs << [File.join(puppet_lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
119
|
+
File.join(puppet_lib_dir, 'puppet', 'parser', 'functions', '*.rb')]
|
118
120
|
Dir.glob(search_dirs.flatten)
|
119
121
|
end
|
120
122
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Help < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[help].freeze
|
6
8
|
SUMMARY = 'Show the help screen with version information.'
|
7
9
|
COMMAND_GROUP = :help
|
8
10
|
|
9
|
-
def run(
|
11
|
+
def run(_args = [])
|
10
12
|
PuppetDebugger::Cli.print_repl_desc
|
11
13
|
end
|
12
14
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Krt < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[krt].freeze
|
6
8
|
SUMMARY = 'List all the known resource types.'
|
7
9
|
COMMAND_GROUP = :scope
|
8
10
|
|
9
|
-
def run(
|
11
|
+
def run(_args = [])
|
10
12
|
debugger.known_resource_types.ai(sort_keys: true, indent: -1)
|
11
13
|
end
|
12
14
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Play < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[play].freeze
|
6
8
|
SUMMARY = 'Playback a file or URL as input.'
|
7
9
|
COMMAND_GROUP = :editing
|
8
10
|
|
@@ -20,7 +22,7 @@ module PuppetDebugger
|
|
20
22
|
elsif File.exist? config[:play]
|
21
23
|
play_back_string(File.read(config[:play]))
|
22
24
|
else config[:play]
|
23
|
-
|
25
|
+
debugger.out_buffer.puts "puppet-debugger can't play #{config[:play]}'"
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
@@ -29,29 +31,29 @@ module PuppetDebugger
|
|
29
31
|
require 'uri'
|
30
32
|
url_data = URI(url)
|
31
33
|
case url_data.host
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
when /^gist\.github*/
|
35
|
+
url = url += '.txt' unless url_data.path =~ /raw/
|
36
|
+
url
|
37
|
+
when /^github.com/
|
38
|
+
url.gsub('blob', 'raw') if url_data.path =~ /blob/
|
39
|
+
when /^gist.github.com/
|
40
|
+
url = url += '.txt' unless url_data.path =~ /raw/
|
41
|
+
url
|
42
|
+
when /^gitlab.com/
|
43
|
+
if url_data.path =~ /snippets/
|
44
|
+
url += '/raw' unless url_data.path =~ /raw/
|
39
45
|
url
|
40
|
-
when /^gitlab.com/
|
41
|
-
if url_data.path =~ /snippets/
|
42
|
-
url += '/raw' unless url_data.path =~ /raw/
|
43
|
-
url
|
44
|
-
else
|
45
|
-
url.gsub('blob', 'raw')
|
46
|
-
end
|
47
46
|
else
|
48
|
-
url
|
47
|
+
url.gsub('blob', 'raw')
|
48
|
+
end
|
49
|
+
else
|
50
|
+
url
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
54
|
# opens the url and reads the data
|
53
55
|
def fetch_url_data(url)
|
54
|
-
open(url).read
|
56
|
+
URI.open(url).read # open(url).read
|
55
57
|
end
|
56
58
|
|
57
59
|
def play_back_url(url)
|
@@ -72,12 +74,8 @@ module PuppetDebugger
|
|
72
74
|
begin
|
73
75
|
full_buffer += buf
|
74
76
|
# unless this is puppet code, otherwise skip repl keywords
|
75
|
-
|
76
|
-
|
77
|
-
else
|
78
|
-
debugger.parser.parse_string(full_buffer)
|
79
|
-
debugger.out_buffer.write('>> ')
|
80
|
-
end
|
77
|
+
debugger.parser.parse_string(full_buffer) unless PuppetDebugger::InputResponders::Commands.command_list_regex.match(buf)
|
78
|
+
debugger.out_buffer.write('>> ')
|
81
79
|
rescue Puppet::ParseErrorWithIssue => e
|
82
80
|
if debugger.multiline_input?(e)
|
83
81
|
full_buffer += "\n"
|
@@ -1,19 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Reset < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[reset].freeze
|
6
8
|
SUMMARY = 'Reset the debugger to a clean state.'
|
7
9
|
COMMAND_GROUP = :context
|
8
10
|
|
9
|
-
def run(
|
11
|
+
def run(_args = [])
|
10
12
|
debugger.set_scope(nil)
|
11
13
|
debugger.set_remote_node_name(nil)
|
12
14
|
debugger.set_node(nil)
|
13
15
|
debugger.set_facts(nil)
|
14
16
|
debugger.set_environment(nil)
|
15
17
|
debugger.set_compiler(nil)
|
16
|
-
#debugger.handle_input(":set loglevel #{debugger.log_level}")
|
18
|
+
# debugger.handle_input(":set loglevel #{debugger.log_level}")
|
17
19
|
nil
|
18
20
|
end
|
19
21
|
end
|
@@ -1,20 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Resources < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[resources].freeze
|
6
8
|
SUMMARY = 'List all the resources current in the catalog.'
|
7
9
|
COMMAND_GROUP = :scope
|
8
10
|
|
9
11
|
def run(args = [])
|
10
|
-
|
12
|
+
filter = args
|
13
|
+
resources = find_resources(debugger.catalog.resources, filter)
|
14
|
+
modified = resources.map do |res|
|
11
15
|
res.to_s.gsub(/\[/, "['").gsub(/\]/, "']") # ensure the title has quotes
|
12
16
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
output = "Resources not shown in any specific order\n".warning
|
18
|
+
output + modified.ai
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resources(resources, filter = [])
|
22
|
+
return resources if filter.nil? || filter.empty?
|
23
|
+
|
24
|
+
filter_string = filter.join(' ').downcase
|
25
|
+
resources.find_all do |resource|
|
26
|
+
resource.name.to_s.downcase.include?(filter_string) || resource.type.to_s.downcase.include?(filter_string)
|
18
27
|
end
|
19
28
|
end
|
20
29
|
end
|
@@ -1,28 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'puppet-debugger/input_responder_plugin'
|
2
4
|
module PuppetDebugger
|
3
5
|
module InputResponders
|
4
6
|
class Set < InputResponderPlugin
|
5
|
-
COMMAND_WORDS = %w
|
7
|
+
COMMAND_WORDS = %w[set :set].freeze
|
6
8
|
SUMMARY = 'Set the a puppet debugger config'
|
7
9
|
COMMAND_GROUP = :scope
|
8
|
-
KEYWORDS = %w
|
9
|
-
LOGLEVELS = %w
|
10
|
+
KEYWORDS = %w[node loglevel].freeze
|
11
|
+
LOGLEVELS = %w[debug info].freeze
|
10
12
|
|
11
13
|
def self.command_completion(buffer_words)
|
12
14
|
next_word = buffer_words.shift
|
13
15
|
case next_word
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
else
|
18
|
-
LOGLEVELS
|
19
|
-
end
|
20
|
-
when 'debug', 'info','node'
|
21
|
-
[]
|
22
|
-
when nil
|
23
|
-
%w(node loglevel)
|
16
|
+
when 'loglevel'
|
17
|
+
if buffer_words.count.positive?
|
18
|
+
LOGLEVELS.grep(/^#{Regexp.escape(buffer_words.first)}/)
|
24
19
|
else
|
25
|
-
|
20
|
+
LOGLEVELS
|
21
|
+
end
|
22
|
+
when 'debug', 'info', 'node'
|
23
|
+
[]
|
24
|
+
when nil
|
25
|
+
%w[node loglevel]
|
26
|
+
else
|
27
|
+
KEYWORDS.grep(/^#{Regexp.escape(next_word)}/)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -37,24 +39,24 @@ module PuppetDebugger
|
|
37
39
|
# args = input.split(' ')
|
38
40
|
# args.shift # throw away the set
|
39
41
|
case input.shift
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
42
|
+
when /node/
|
43
|
+
if name = input.shift
|
44
|
+
output = "Resetting to use node #{name}"
|
45
|
+
debugger.set_scope(nil)
|
46
|
+
debugger.set_node(nil)
|
47
|
+
debugger.set_facts(nil)
|
48
|
+
debugger.set_environment(nil)
|
49
|
+
debugger.set_compiler(nil)
|
50
|
+
set_log_level(debugger.log_level)
|
51
|
+
debugger.set_remote_node_name(name)
|
52
|
+
else
|
53
|
+
debugger.out_buffer.puts 'Must supply a valid node name'
|
54
|
+
end
|
55
|
+
when /loglevel/
|
56
|
+
if level = input.shift
|
57
|
+
set_log_level(level)
|
58
|
+
output = "loglevel #{Puppet::Util::Log.level} is set"
|
59
|
+
end
|
58
60
|
end
|
59
61
|
output
|
60
62
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'puppet-debugger/input_responder_plugin'
|
4
|
+
module PuppetDebugger
|
5
|
+
module InputResponders
|
6
|
+
class Stacktrace < InputResponderPlugin
|
7
|
+
COMMAND_WORDS = %w[stacktrace].freeze
|
8
|
+
SUMMARY = 'Show the stacktrace for how we got here'
|
9
|
+
COMMAND_GROUP = :tools
|
10
|
+
|
11
|
+
# @return [Array]- returns a array of pp files that are involved in the stacktrace
|
12
|
+
def run(_args = [])
|
13
|
+
s = stacktrace
|
14
|
+
s.empty? ? 'stacktrace not available'.warning : s.ai
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Array] - an array of files with line numbers
|
18
|
+
# @example
|
19
|
+
# [
|
20
|
+
# "/nwops/puppetlabs-peadm/spec/fixtures/modules/peadm/plans/status.pp:23",
|
21
|
+
# "/nwops/puppetlabs-peadm/spec/fixtures/modules/peadm/plans/status.pp:20"
|
22
|
+
# ]
|
23
|
+
def stacktrace
|
24
|
+
stack = Puppet::Pops::PuppetStack.stacktrace.find_all { |line| !line.include?('unknown') }
|
25
|
+
stack.each_with_object([]) do |item, acc|
|
26
|
+
acc << item.join(':')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|