choria-mcorpc-support 2.20.8 → 2.23.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mcollective.rb +1 -1
- data/lib/mcollective/agent/bolt_tasks.ddl +235 -0
- data/lib/mcollective/agent/bolt_tasks.json +347 -0
- data/lib/mcollective/agent/bolt_tasks.rb +176 -0
- data/lib/mcollective/agent/choria_util.ddl +152 -0
- data/lib/mcollective/agent/choria_util.json +244 -0
- data/lib/mcollective/agent/rpcutil.ddl +7 -3
- data/lib/mcollective/agent/rpcutil.json +333 -0
- data/lib/mcollective/agent/scout.ddl +169 -0
- data/lib/mcollective/agent/scout.json +224 -0
- data/lib/mcollective/agents.rb +7 -6
- data/lib/mcollective/aggregate.rb +4 -4
- data/lib/mcollective/aggregate/average.rb +2 -2
- data/lib/mcollective/aggregate/base.rb +2 -2
- data/lib/mcollective/aggregate/result.rb +3 -3
- data/lib/mcollective/aggregate/result/collection_result.rb +2 -2
- data/lib/mcollective/aggregate/result/numeric_result.rb +2 -2
- data/lib/mcollective/aggregate/sum.rb +2 -2
- data/lib/mcollective/aggregate/summary.rb +3 -4
- data/lib/mcollective/application.rb +57 -21
- data/lib/mcollective/application/choria.rb +249 -0
- data/lib/mcollective/application/completion.rb +6 -6
- data/lib/mcollective/application/describe_filter.rb +20 -20
- data/lib/mcollective/application/facts.rb +19 -11
- data/lib/mcollective/application/federation.rb +239 -0
- data/lib/mcollective/application/find.rb +4 -4
- data/lib/mcollective/application/help.rb +3 -3
- data/lib/mcollective/application/inventory.rb +3 -341
- data/lib/mcollective/application/ping.rb +3 -77
- data/lib/mcollective/application/playbook.rb +207 -0
- data/lib/mcollective/application/plugin.rb +106 -106
- data/lib/mcollective/application/rpc.rb +3 -108
- data/lib/mcollective/application/tasks.rb +416 -0
- data/lib/mcollective/applications.rb +11 -10
- data/lib/mcollective/audit/choria.rb +33 -0
- data/lib/mcollective/cache.rb +2 -4
- data/lib/mcollective/client.rb +11 -10
- data/lib/mcollective/config.rb +21 -34
- data/lib/mcollective/connector/base.rb +2 -1
- data/lib/mcollective/connector/nats.ddl +9 -0
- data/lib/mcollective/connector/nats.rb +450 -0
- data/lib/mcollective/data.rb +8 -3
- data/lib/mcollective/data/agent_data.rb +1 -1
- data/lib/mcollective/data/base.rb +6 -5
- data/lib/mcollective/data/bolt_task_data.ddl +90 -0
- data/lib/mcollective/data/bolt_task_data.rb +32 -0
- data/lib/mcollective/data/collective_data.rb +1 -1
- data/lib/mcollective/data/fact_data.rb +6 -6
- data/lib/mcollective/data/fstat_data.rb +2 -4
- data/lib/mcollective/data/result.rb +7 -2
- data/lib/mcollective/ddl/agentddl.rb +5 -17
- data/lib/mcollective/ddl/base.rb +11 -14
- data/lib/mcollective/discovery.rb +12 -26
- data/lib/mcollective/discovery/choria.ddl +11 -0
- data/lib/mcollective/discovery/choria.rb +223 -0
- data/lib/mcollective/discovery/flatfile.rb +7 -8
- data/lib/mcollective/discovery/mc.rb +2 -2
- data/lib/mcollective/discovery/stdin.rb +17 -18
- data/lib/mcollective/exceptions.rb +13 -0
- data/lib/mcollective/facts/base.rb +9 -9
- data/lib/mcollective/facts/yaml_facts.rb +12 -12
- data/lib/mcollective/generators.rb +3 -3
- data/lib/mcollective/generators/agent_generator.rb +3 -4
- data/lib/mcollective/generators/base.rb +14 -15
- data/lib/mcollective/generators/data_generator.rb +5 -6
- data/lib/mcollective/log.rb +2 -2
- data/lib/mcollective/logger/base.rb +3 -2
- data/lib/mcollective/logger/console_logger.rb +10 -10
- data/lib/mcollective/logger/file_logger.rb +7 -7
- data/lib/mcollective/logger/syslog_logger.rb +11 -15
- data/lib/mcollective/matcher.rb +14 -14
- data/lib/mcollective/matcher/parser.rb +31 -41
- data/lib/mcollective/matcher/scanner.rb +69 -74
- data/lib/mcollective/message.rb +10 -17
- data/lib/mcollective/monkey_patches.rb +2 -4
- data/lib/mcollective/optionparser.rb +1 -0
- data/lib/mcollective/pluginmanager.rb +3 -5
- data/lib/mcollective/pluginpackager.rb +1 -3
- data/lib/mcollective/pluginpackager/agent_definition.rb +10 -11
- data/lib/mcollective/pluginpackager/forge_packager.rb +7 -9
- data/lib/mcollective/pluginpackager/standard_definition.rb +1 -2
- data/lib/mcollective/registration/base.rb +18 -16
- data/lib/mcollective/rpc.rb +2 -4
- data/lib/mcollective/rpc/actionrunner.rb +16 -18
- data/lib/mcollective/rpc/agent.rb +26 -43
- data/lib/mcollective/rpc/audit.rb +1 -0
- data/lib/mcollective/rpc/client.rb +67 -85
- data/lib/mcollective/rpc/helpers.rb +55 -62
- data/lib/mcollective/rpc/progress.rb +2 -2
- data/lib/mcollective/rpc/reply.rb +17 -19
- data/lib/mcollective/rpc/request.rb +7 -5
- data/lib/mcollective/rpc/result.rb +6 -8
- data/lib/mcollective/rpc/stats.rb +49 -58
- data/lib/mcollective/security/base.rb +29 -36
- data/lib/mcollective/security/choria.rb +765 -0
- data/lib/mcollective/shell.rb +9 -4
- data/lib/mcollective/signer/base.rb +28 -0
- data/lib/mcollective/signer/choria.rb +185 -0
- data/lib/mcollective/ssl.rb +8 -6
- data/lib/mcollective/util.rb +58 -55
- data/lib/mcollective/util/bolt_support.rb +176 -0
- data/lib/mcollective/util/bolt_support/plan_runner.rb +167 -0
- data/lib/mcollective/util/bolt_support/task_result.rb +94 -0
- data/lib/mcollective/util/bolt_support/task_results.rb +128 -0
- data/lib/mcollective/util/choria.rb +1103 -0
- data/lib/mcollective/util/indifferent_hash.rb +12 -0
- data/lib/mcollective/util/natswrapper.rb +242 -0
- data/lib/mcollective/util/playbook.rb +435 -0
- data/lib/mcollective/util/playbook/data_stores.rb +201 -0
- data/lib/mcollective/util/playbook/data_stores/base.rb +99 -0
- data/lib/mcollective/util/playbook/data_stores/consul_data_store.rb +88 -0
- data/lib/mcollective/util/playbook/data_stores/environment_data_store.rb +33 -0
- data/lib/mcollective/util/playbook/data_stores/etcd_data_store.rb +42 -0
- data/lib/mcollective/util/playbook/data_stores/file_data_store.rb +106 -0
- data/lib/mcollective/util/playbook/data_stores/shell_data_store.rb +103 -0
- data/lib/mcollective/util/playbook/inputs.rb +265 -0
- data/lib/mcollective/util/playbook/nodes.rb +207 -0
- data/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb +86 -0
- data/lib/mcollective/util/playbook/nodes/pql_nodes.rb +40 -0
- data/lib/mcollective/util/playbook/nodes/shell_nodes.rb +55 -0
- data/lib/mcollective/util/playbook/nodes/terraform_nodes.rb +65 -0
- data/lib/mcollective/util/playbook/nodes/yaml_nodes.rb +47 -0
- data/lib/mcollective/util/playbook/playbook_logger.rb +47 -0
- data/lib/mcollective/util/playbook/puppet_logger.rb +51 -0
- data/lib/mcollective/util/playbook/report.rb +152 -0
- data/lib/mcollective/util/playbook/task_result.rb +55 -0
- data/lib/mcollective/util/playbook/tasks.rb +196 -0
- data/lib/mcollective/util/playbook/tasks/base.rb +45 -0
- data/lib/mcollective/util/playbook/tasks/graphite_event_task.rb +64 -0
- data/lib/mcollective/util/playbook/tasks/mcollective_task.rb +356 -0
- data/lib/mcollective/util/playbook/tasks/shell_task.rb +93 -0
- data/lib/mcollective/util/playbook/tasks/slack_task.rb +105 -0
- data/lib/mcollective/util/playbook/tasks/webhook_task.rb +136 -0
- data/lib/mcollective/util/playbook/template_util.rb +98 -0
- data/lib/mcollective/util/playbook/uses.rb +169 -0
- data/lib/mcollective/util/tasks_support.rb +733 -0
- data/lib/mcollective/util/tasks_support/cli.rb +260 -0
- data/lib/mcollective/util/tasks_support/default_formatter.rb +138 -0
- data/lib/mcollective/util/tasks_support/json_formatter.rb +108 -0
- data/lib/mcollective/validator.rb +8 -3
- data/lib/mcollective/validator/bolt_task_name_validator.ddl +7 -0
- data/lib/mcollective/validator/bolt_task_name_validator.rb +11 -0
- data/lib/mcollective/validator/length_validator.rb +1 -3
- data/lib/mcollective/validator/typecheck_validator.rb +4 -0
- metadata +67 -4
@@ -1,13 +1,13 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Facts
|
3
|
-
require
|
3
|
+
require "yaml"
|
4
4
|
|
5
5
|
# A factsource that reads a hash of facts from a YAML file
|
6
6
|
#
|
7
7
|
# Multiple files can be specified seperated with a : in the
|
8
8
|
# config file, they will be merged with later files overriding
|
9
9
|
# earlier ones in the list.
|
10
|
-
class Yaml_facts<Base
|
10
|
+
class Yaml_facts < Base
|
11
11
|
def initialize
|
12
12
|
@yaml_file_mtimes = {}
|
13
13
|
|
@@ -23,15 +23,15 @@ module MCollective
|
|
23
23
|
fact_files.each do |file|
|
24
24
|
begin
|
25
25
|
if File.exist?(file)
|
26
|
-
|
27
|
-
facts.merge!(YAML.safe_load(File.read(file)))
|
28
|
-
|
29
|
-
facts.merge!(YAML.load(File.read(file)))
|
26
|
+
if YAML.respond_to? :safe_load
|
27
|
+
facts.merge!(YAML.safe_load(File.read(file)))
|
28
|
+
else
|
29
|
+
facts.merge!(YAML.load(File.read(file)))
|
30
30
|
end
|
31
31
|
else
|
32
32
|
raise("Can't find YAML file to load: #{file}")
|
33
33
|
end
|
34
|
-
rescue Exception => e
|
34
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
35
35
|
Log.error("Failed to load yaml facts from #{file}: #{e.class}: #{e}")
|
36
36
|
end
|
37
37
|
end
|
@@ -49,13 +49,13 @@ module MCollective
|
|
49
49
|
@yaml_file_mtimes[file] ||= File.stat(file).mtime
|
50
50
|
mtime = File.stat(file).mtime
|
51
51
|
|
52
|
-
|
53
|
-
@yaml_file_mtimes[file] = mtime
|
52
|
+
next unless mtime > @yaml_file_mtimes[file]
|
54
53
|
|
55
|
-
|
54
|
+
@yaml_file_mtimes[file] = mtime
|
56
55
|
|
57
|
-
|
58
|
-
|
56
|
+
Log.debug("Forcing fact reload due to age of #{file}")
|
57
|
+
|
58
|
+
return true
|
59
59
|
end
|
60
60
|
|
61
61
|
false
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Generators
|
3
|
-
require "mcollective/generators/base
|
4
|
-
require "mcollective/generators/data_generator
|
5
|
-
require "mcollective/generators/agent_generator
|
3
|
+
require "mcollective/generators/base"
|
4
|
+
require "mcollective/generators/data_generator"
|
5
|
+
require "mcollective/generators/agent_generator"
|
6
6
|
end
|
7
7
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Generators
|
3
|
-
class AgentGenerator<Base
|
4
|
-
|
3
|
+
class AgentGenerator < Base
|
5
4
|
attr_accessor :ddl, :content
|
6
5
|
|
7
|
-
def initialize(plugin_name, actions
|
8
|
-
license
|
6
|
+
def initialize(plugin_name, actions=[], name=nil, description=nil, author=nil,
|
7
|
+
license=nil, version=nil, url=nil, timeout=nil)
|
9
8
|
|
10
9
|
super(name, description, author, license, version, url, timeout)
|
11
10
|
@plugin_name = plugin_name
|
@@ -2,6 +2,7 @@ module MCollective
|
|
2
2
|
module Generators
|
3
3
|
class Base
|
4
4
|
attr_accessor :meta, :plugin_name, :mod_name
|
5
|
+
|
5
6
|
def initialize(name, description, author, license, version, url, timeout)
|
6
7
|
@meta = {:name => name,
|
7
8
|
:description => description,
|
@@ -23,23 +24,21 @@ module MCollective
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def write_plugins
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
puts "Created plugin directory : #{@plugin_name}"
|
27
|
+
Dir.mkdir @plugin_name
|
28
|
+
dirname = File.join(@plugin_name, @mod_name.downcase)
|
29
|
+
Dir.mkdir dirname
|
30
|
+
puts "Created plugin directory : #{@plugin_name}"
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
File.open(File.join(dirname, "#{@plugin_name}.ddl"), "w") {|f| f.puts @ddl}
|
33
|
+
puts "Created DDL file : #{File.join(dirname, "#{@plugin_name}.ddl")}"
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
35
|
+
File.open(File.join(dirname, "#{@plugin_name}.rb"), "w") {|f| f.puts @plugin}
|
36
|
+
puts "Created #{@mod_name} file : #{File.join(dirname, "#{@plugin_name}.rb")}"
|
37
|
+
rescue Errno::EEXIST
|
38
|
+
raise "cannot generate '#{@plugin_name}' : plugin directory already exists."
|
39
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
40
|
+
FileUtils.rm_rf(@plugin_name) if File.directory?(@plugin_name)
|
41
|
+
raise "cannot generate plugin - #{e}"
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Generators
|
3
|
-
class DataGenerator<Base
|
4
|
-
|
3
|
+
class DataGenerator < Base
|
5
4
|
attr_accessor :ddl, :content
|
6
5
|
|
7
|
-
def initialize(plugin_name, outputs
|
8
|
-
license
|
6
|
+
def initialize(plugin_name, outputs=[], name=nil, description=nil, author=nil,
|
7
|
+
license=nil, version=nil, url=nil, timeout=nil)
|
9
8
|
|
10
9
|
super(name, description, author, license, version, url, timeout)
|
11
10
|
@mod_name = "Data"
|
@@ -22,7 +21,7 @@ module MCollective
|
|
22
21
|
query_text = "dataquery :description => \"Query information\" do\n"
|
23
22
|
query_text += ERB.new(File.read(File.join(File.dirname(__FILE__), "templates", "data_input_snippet.erb"))).result
|
24
23
|
|
25
|
-
@outputs.each_with_index do |output,i|
|
24
|
+
@outputs.each_with_index do |output, i|
|
26
25
|
query_text += "%2s%s" % [" ", "output :#{output},\n"]
|
27
26
|
query_text += "%9s%s" % [" ", ":description => \"%DESCRIPTION%\",\n"]
|
28
27
|
query_text += "%9s%s" % [" ", ":display_as => \"%DESCRIPTION%\"\n"]
|
@@ -39,7 +38,7 @@ module MCollective
|
|
39
38
|
content_text = "%6s%s" % [" ", "query do |what|\n"]
|
40
39
|
|
41
40
|
@outputs.each do |output|
|
42
|
-
|
41
|
+
content_text += "%8s%s" % [" ", "result[:#{output}] = nil\n"]
|
43
42
|
end
|
44
43
|
content_text += "%6s%s" % [" ", "end\n"]
|
45
44
|
|
data/lib/mcollective/log.rb
CHANGED
@@ -60,7 +60,7 @@ module MCollective
|
|
60
60
|
else
|
61
61
|
t = Time.new.strftime("%H:%M:%S")
|
62
62
|
|
63
|
-
|
63
|
+
warn "#{t}: #{level}: #{from}: #{msg}"
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -98,7 +98,7 @@ module MCollective
|
|
98
98
|
@logger.start
|
99
99
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
100
100
|
@configured = false
|
101
|
-
|
101
|
+
warn "Could not start logger: #{e.class} #{e}"
|
102
102
|
end
|
103
103
|
|
104
104
|
# figures out the filename that called us
|
@@ -29,7 +29,7 @@ module MCollective
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# Sets a new level and record it in @active_level
|
32
|
-
def set_level(level)
|
32
|
+
def set_level(level) # rubocop:disable Naming/AccessorMethodName
|
33
33
|
set_logging_level(level)
|
34
34
|
@active_level = level.to_sym
|
35
35
|
end
|
@@ -47,6 +47,7 @@ module MCollective
|
|
47
47
|
end
|
48
48
|
|
49
49
|
private
|
50
|
+
|
50
51
|
def map_level(level)
|
51
52
|
raise "Logger class do not know how to handle #{level} messages" unless valid_levels.include?(level.to_sym)
|
52
53
|
|
@@ -54,7 +55,7 @@ module MCollective
|
|
54
55
|
end
|
55
56
|
|
56
57
|
# Gets the next level in the list, cycles down to the firt once it reaches the end
|
57
|
-
def get_next_level
|
58
|
+
def get_next_level # rubocop:disable Naming/AccessorMethodName
|
58
59
|
# if all else fails, always go to debug mode
|
59
60
|
nextlvl = :debug
|
60
61
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Logger
|
3
3
|
# Implements a syslog based logger using the standard ruby syslog class
|
4
|
-
class Console_logger<Base
|
4
|
+
class Console_logger < Base
|
5
5
|
def start
|
6
6
|
set_level(:info)
|
7
7
|
|
@@ -9,19 +9,19 @@ module MCollective
|
|
9
9
|
set_level(config.loglevel.to_sym) if config.configured
|
10
10
|
end
|
11
11
|
|
12
|
-
def set_logging_level(level)
|
12
|
+
def set_logging_level(level) # rubocop:disable Naming/AccessorMethodName
|
13
13
|
# nothing to do here, we ignore high levels when we log
|
14
14
|
end
|
15
15
|
|
16
16
|
def valid_levels
|
17
|
-
{:info
|
18
|
-
:warn
|
17
|
+
{:info => :info,
|
18
|
+
:warn => :warning,
|
19
19
|
:debug => :debug,
|
20
20
|
:fatal => :crit,
|
21
21
|
:error => :err}
|
22
22
|
end
|
23
23
|
|
24
|
-
def log(level, from, msg, normal_output
|
24
|
+
def log(level, from, msg, normal_output=$stderr, last_resort_output=$stderr)
|
25
25
|
if @known_levels.index(level) >= @known_levels.index(@active_level)
|
26
26
|
time = Time.new.strftime("%Y/%m/%d %H:%M:%S")
|
27
27
|
|
@@ -41,20 +41,20 @@ module MCollective
|
|
41
41
|
|
42
42
|
colors = {:error => Util.color(:red),
|
43
43
|
:fatal => Util.color(:red),
|
44
|
-
:warn
|
45
|
-
:info
|
44
|
+
:warn => Util.color(:yellow),
|
45
|
+
:info => Util.color(:green),
|
46
46
|
:reset => Util.color(:reset)}
|
47
47
|
|
48
48
|
if colorize
|
49
|
-
|
49
|
+
colors[level] || ""
|
50
50
|
else
|
51
|
-
|
51
|
+
""
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
# Helper to return a string in specific color
|
56
56
|
def colorize(level, msg)
|
57
|
-
"%s%s%s" % [
|
57
|
+
"%s%s%s" % [color(level), msg, color(:reset)]
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "logger"
|
2
2
|
|
3
3
|
module MCollective
|
4
4
|
module Logger
|
@@ -9,7 +9,7 @@ module MCollective
|
|
9
9
|
# - config.logfile
|
10
10
|
# - config.keeplogs defaults to 2097152
|
11
11
|
# - config.max_log_size defaults to 5
|
12
|
-
class File_logger<Base
|
12
|
+
class File_logger < Base
|
13
13
|
def start
|
14
14
|
config = Config.instance
|
15
15
|
|
@@ -19,16 +19,16 @@ module MCollective
|
|
19
19
|
set_level(config.loglevel.to_sym)
|
20
20
|
end
|
21
21
|
|
22
|
-
def set_logging_level(level)
|
22
|
+
def set_logging_level(level) # rubocop:disable Naming/AccessorMethodName
|
23
23
|
@logger.level = map_level(level)
|
24
|
-
rescue Exception => e
|
24
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
25
25
|
@logger.level = ::Logger::DEBUG
|
26
26
|
log(:error, "", "Could not set logging to #{level} using debug instead: #{e.class} #{e}")
|
27
27
|
end
|
28
28
|
|
29
29
|
def valid_levels
|
30
|
-
{:info
|
31
|
-
:warn
|
30
|
+
{:info => ::Logger::INFO,
|
31
|
+
:warn => ::Logger::WARN,
|
32
32
|
:debug => ::Logger::DEBUG,
|
33
33
|
:fatal => ::Logger::FATAL,
|
34
34
|
:error => ::Logger::ERROR}
|
@@ -39,7 +39,7 @@ module MCollective
|
|
39
39
|
rescue
|
40
40
|
# if this fails we probably cant show the user output at all,
|
41
41
|
# STDERR it as last resort
|
42
|
-
|
42
|
+
warn("#{level}: #{msg}")
|
43
43
|
end
|
44
44
|
|
45
45
|
def reopen
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MCollective
|
2
2
|
module Logger
|
3
3
|
# Implements a syslog based logger using the standard ruby syslog class
|
4
|
-
class Syslog_logger<Base
|
5
|
-
require
|
4
|
+
class Syslog_logger < Base
|
5
|
+
require "syslog"
|
6
6
|
|
7
7
|
include Syslog::Constants
|
8
8
|
|
@@ -19,34 +19,30 @@ module MCollective
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def syslog_facility(facility)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
Syslog::LOG_USER
|
27
|
-
end
|
22
|
+
Syslog.const_get("LOG_#{facility.upcase}")
|
23
|
+
rescue NameError
|
24
|
+
warn "Invalid syslog facility #{facility} supplied, reverting to USER"
|
25
|
+
Syslog::LOG_USER
|
28
26
|
end
|
29
27
|
|
30
|
-
def set_logging_level(level)
|
28
|
+
def set_logging_level(level) # rubocop:disable Naming/AccessorMethodName
|
31
29
|
# noop
|
32
30
|
end
|
33
31
|
|
34
32
|
def valid_levels
|
35
|
-
{:info
|
36
|
-
:warn
|
33
|
+
{:info => :info,
|
34
|
+
:warn => :warning,
|
37
35
|
:debug => :debug,
|
38
36
|
:fatal => :crit,
|
39
37
|
:error => :err}
|
40
38
|
end
|
41
39
|
|
42
40
|
def log(level, from, msg)
|
43
|
-
if @known_levels.index(level) >= @known_levels.index(@active_level)
|
44
|
-
Syslog.send(map_level(level), "#{from} #{msg}")
|
45
|
-
end
|
41
|
+
Syslog.send(map_level(level), "#{from} #{msg}") if @known_levels.index(level) >= @known_levels.index(@active_level)
|
46
42
|
rescue
|
47
43
|
# if this fails we probably cant show the user output at all,
|
48
44
|
# STDERR it as last resort
|
49
|
-
|
45
|
+
warn("#{level}: #{msg}")
|
50
46
|
end
|
51
47
|
end
|
52
48
|
end
|
data/lib/mcollective/matcher.rb
CHANGED
@@ -102,9 +102,9 @@ module MCollective
|
|
102
102
|
# If data field has not been set we set the comparison result to nil
|
103
103
|
eval_result = nil
|
104
104
|
end
|
105
|
-
|
105
|
+
eval_result
|
106
106
|
else
|
107
|
-
|
107
|
+
result
|
108
108
|
end
|
109
109
|
rescue NoMethodError
|
110
110
|
Log.debug("cannot execute discovery function '#{function_hash['name']}'. data plugin not found")
|
@@ -113,9 +113,10 @@ module MCollective
|
|
113
113
|
|
114
114
|
# Evaluates a compound statement
|
115
115
|
def self.eval_compound_statement(expression)
|
116
|
-
|
116
|
+
case expression.values.first
|
117
|
+
when /^\//
|
117
118
|
Util.has_cf_class?(expression.values.first)
|
118
|
-
|
119
|
+
when />=|<=|=|<|>/
|
119
120
|
optype = expression.values.first.match(/>=|<=|=|<|>/)
|
120
121
|
name, value = expression.values.first.split(optype[0])
|
121
122
|
if value.split("")[0] == "/"
|
@@ -160,20 +161,21 @@ module MCollective
|
|
160
161
|
result = l_compare.match(r_compare)
|
161
162
|
# Flip return value for != operator
|
162
163
|
if function_hash["operator"] == "!=~"
|
163
|
-
|
164
|
+
!result
|
164
165
|
else
|
165
|
-
|
166
|
+
!!result
|
166
167
|
end
|
167
168
|
else
|
168
169
|
Log.debug("Cannot do a regex check on a non string value.")
|
169
|
-
|
170
|
+
false
|
170
171
|
end
|
171
172
|
# Otherwise do a normal comparison while taking the type into account
|
172
173
|
else
|
173
174
|
if l_compare.is_a? String
|
174
175
|
r_compare = r_compare.to_s
|
175
176
|
elsif r_compare.is_a? String
|
176
|
-
|
177
|
+
case l_compare
|
178
|
+
when Numeric
|
177
179
|
r_compare = r_compare.strip
|
178
180
|
begin
|
179
181
|
r_compare = Integer(r_compare)
|
@@ -184,7 +186,7 @@ module MCollective
|
|
184
186
|
raise(ArgumentError, "invalid numeric value: #{r_compare}")
|
185
187
|
end
|
186
188
|
end
|
187
|
-
|
189
|
+
when TrueClass, FalseClass
|
188
190
|
r_compare = r_compare.strip
|
189
191
|
if r_compare == true.to_s # rubocop:disable Metrics/BlockNesting
|
190
192
|
r_compare = true
|
@@ -201,8 +203,8 @@ module MCollective
|
|
201
203
|
else
|
202
204
|
raise(ArgumentError, "invalid operator: #{operator}")
|
203
205
|
end
|
204
|
-
|
205
|
-
|
206
|
+
l_compare.send(operator, r_compare)
|
207
|
+
|
206
208
|
end
|
207
209
|
end
|
208
210
|
|
@@ -210,9 +212,7 @@ module MCollective
|
|
210
212
|
def self.create_compound_callstack(call_string)
|
211
213
|
callstack = Matcher::Parser.new(call_string).execution_stack
|
212
214
|
callstack.each_with_index do |statement, i|
|
213
|
-
if statement.keys.first == "fstatement"
|
214
|
-
callstack[i]["fstatement"] = create_function_hash(statement.values.first)
|
215
|
-
end
|
215
|
+
callstack[i]["fstatement"] = create_function_hash(statement.values.first) if statement.keys.first == "fstatement"
|
216
216
|
end
|
217
217
|
callstack
|
218
218
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Metrics/BlockNesting
|
1
2
|
module MCollective
|
2
3
|
module Matcher
|
3
4
|
class Parser
|
@@ -10,9 +11,9 @@ module MCollective
|
|
10
11
|
@token_errors = []
|
11
12
|
@paren_errors = []
|
12
13
|
parse
|
13
|
-
exit_with_token_errors
|
14
|
-
exit_with_parse_errors
|
15
|
-
exit_with_paren_errors
|
14
|
+
exit_with_token_errors unless @token_errors.empty?
|
15
|
+
exit_with_parse_errors unless @parse_errors.empty?
|
16
|
+
exit_with_paren_errors unless @paren_errors.empty?
|
16
17
|
end
|
17
18
|
|
18
19
|
# Exit and highlight any malformed tokens
|
@@ -31,7 +32,7 @@ module MCollective
|
|
31
32
|
@scanner.arguments[i] = Util.colorize(:red, @scanner.arguments[i])
|
32
33
|
end
|
33
34
|
end
|
34
|
-
raise "Parse errors found while parsing -S input #{
|
35
|
+
raise "Parse errors found while parsing -S input #{@scanner.arguments.join}"
|
35
36
|
end
|
36
37
|
|
37
38
|
def exit_with_paren_errors
|
@@ -42,13 +43,12 @@ module MCollective
|
|
42
43
|
end
|
43
44
|
|
44
45
|
# Parse the input string, one token at a time a contruct the call stack
|
45
|
-
def parse
|
46
|
+
def parse # rubocop:disable Metrics/MethodLength
|
46
47
|
pre_index = @scanner.token_index
|
47
|
-
p_token
|
48
|
-
c_token,c_token_value = @scanner.get_token
|
49
|
-
parenth = 0
|
48
|
+
p_token = nil
|
49
|
+
c_token, c_token_value = @scanner.get_token
|
50
50
|
|
51
|
-
|
51
|
+
until c_token.nil?
|
52
52
|
@scanner.token_index += 1
|
53
53
|
n_token, n_token_value = @scanner.get_token
|
54
54
|
|
@@ -58,67 +58,56 @@ module MCollective
|
|
58
58
|
@token_errors << c_token_value
|
59
59
|
|
60
60
|
when "and"
|
61
|
-
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !
|
61
|
+
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !n_token.nil?
|
62
62
|
@parse_errors << [pre_index, scanner.token_index]
|
63
63
|
end
|
64
64
|
|
65
|
-
|
65
|
+
case p_token
|
66
|
+
when nil
|
66
67
|
@parse_errors << [pre_index - c_token.size, scanner.token_index]
|
67
|
-
|
68
|
+
when "and", "or"
|
68
69
|
@parse_errors << [pre_index - 1 - p_token.size, pre_index - 1]
|
69
70
|
end
|
70
71
|
|
71
72
|
when "or"
|
72
|
-
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !
|
73
|
+
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !n_token.nil?
|
73
74
|
@parse_errors << [pre_index, scanner.token_index]
|
74
75
|
end
|
75
76
|
|
76
|
-
|
77
|
+
case p_token
|
78
|
+
when nil
|
77
79
|
@parse_errors << [pre_index - c_token.size, scanner.token_index]
|
78
|
-
|
80
|
+
when "and", "or"
|
79
81
|
@parse_errors << [pre_index - 1 - p_token.size, pre_index - 1]
|
80
82
|
end
|
81
83
|
|
82
84
|
when "not"
|
83
|
-
unless n_token =~ /fstatement|statement|\(|not/ && !
|
84
|
-
@parse_errors << [pre_index, scanner.token_index]
|
85
|
-
end
|
85
|
+
@parse_errors << [pre_index, scanner.token_index] unless n_token =~ /fstatement|statement|\(|not/ && !n_token.nil?
|
86
86
|
|
87
|
-
when "statement","fstatement"
|
88
|
-
|
89
|
-
unless scanner.token_index == scanner.arguments.size
|
90
|
-
@parse_errors << [pre_index, scanner.token_index]
|
91
|
-
end
|
92
|
-
end
|
87
|
+
when "statement", "fstatement"
|
88
|
+
@parse_errors << [pre_index, scanner.token_index] if n_token !~ /and|or|\)/ && scanner.token_index != scanner.arguments.size
|
93
89
|
|
94
90
|
when ")"
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
99
|
-
end
|
100
|
-
unless @paren_errors.empty?
|
101
|
-
@paren_errors.pop
|
91
|
+
@parse_errors << [pre_index, scanner.token_index] if n_token !~ /|and|or|not|\(/ && scanner.token_index != scanner.arguments.size
|
92
|
+
if @paren_errors.empty?
|
93
|
+
@paren_errors.push(n_token.nil? ? scanner.token_index - 1 : scanner.token_index - n_token_value.size)
|
102
94
|
else
|
103
|
-
@paren_errors.
|
95
|
+
@paren_errors.pop
|
104
96
|
end
|
105
97
|
|
106
98
|
when "("
|
107
|
-
unless n_token =~ /fstatement|statement|not|\(/
|
108
|
-
|
109
|
-
end
|
110
|
-
@paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size)
|
99
|
+
@parse_errors << [pre_index, scanner.token_index] unless n_token =~ /fstatement|statement|not|\(/
|
100
|
+
@paren_errors.push(n_token.nil? ? scanner.token_index - 1 : scanner.token_index - n_token_value.size)
|
111
101
|
|
112
102
|
else
|
113
103
|
@parse_errors << [pre_index, scanner.token_index]
|
114
104
|
end
|
115
105
|
|
116
|
-
unless n_token == " " ||c_token == "bad_token"
|
117
|
-
@execution_stack << {c_token => c_token_value}
|
118
|
-
end
|
106
|
+
@execution_stack << {c_token => c_token_value} unless n_token == " " || c_token == "bad_token"
|
119
107
|
|
120
|
-
p_token
|
121
|
-
c_token
|
108
|
+
p_token = c_token
|
109
|
+
c_token = n_token
|
110
|
+
c_token_value = n_token_value
|
122
111
|
end
|
123
112
|
pre_index = @scanner.token_index
|
124
113
|
end
|
@@ -126,3 +115,4 @@ module MCollective
|
|
126
115
|
end
|
127
116
|
end
|
128
117
|
end
|
118
|
+
# rubocop:enable Metrics/BlockNesting
|