choria-mcorpc-support 2.21.0 → 2.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mcollective.rb +1 -1
  3. data/lib/mcollective/agent/bolt_tasks.ddl +235 -0
  4. data/lib/mcollective/agent/bolt_tasks.json +347 -0
  5. data/lib/mcollective/agent/bolt_tasks.rb +176 -0
  6. data/lib/mcollective/agent/choria_util.ddl +152 -0
  7. data/lib/mcollective/agent/choria_util.json +244 -0
  8. data/lib/mcollective/agent/rpcutil.ddl +7 -3
  9. data/lib/mcollective/agent/rpcutil.json +333 -0
  10. data/lib/mcollective/agent/scout.ddl +169 -0
  11. data/lib/mcollective/agent/scout.json +224 -0
  12. data/lib/mcollective/agents.rb +7 -6
  13. data/lib/mcollective/aggregate.rb +4 -4
  14. data/lib/mcollective/aggregate/average.rb +2 -2
  15. data/lib/mcollective/aggregate/base.rb +2 -2
  16. data/lib/mcollective/aggregate/result.rb +3 -3
  17. data/lib/mcollective/aggregate/result/collection_result.rb +2 -2
  18. data/lib/mcollective/aggregate/result/numeric_result.rb +2 -2
  19. data/lib/mcollective/aggregate/sum.rb +2 -2
  20. data/lib/mcollective/aggregate/summary.rb +3 -4
  21. data/lib/mcollective/application.rb +57 -21
  22. data/lib/mcollective/application/choria.rb +249 -0
  23. data/lib/mcollective/application/completion.rb +6 -6
  24. data/lib/mcollective/application/describe_filter.rb +20 -20
  25. data/lib/mcollective/application/facts.rb +19 -11
  26. data/lib/mcollective/application/federation.rb +239 -0
  27. data/lib/mcollective/application/find.rb +4 -4
  28. data/lib/mcollective/application/help.rb +3 -3
  29. data/lib/mcollective/application/inventory.rb +3 -341
  30. data/lib/mcollective/application/ping.rb +3 -77
  31. data/lib/mcollective/application/playbook.rb +207 -0
  32. data/lib/mcollective/application/plugin.rb +106 -106
  33. data/lib/mcollective/application/rpc.rb +3 -108
  34. data/lib/mcollective/application/tasks.rb +416 -0
  35. data/lib/mcollective/applications.rb +11 -10
  36. data/lib/mcollective/audit/choria.rb +33 -0
  37. data/lib/mcollective/cache.rb +2 -4
  38. data/lib/mcollective/client.rb +11 -10
  39. data/lib/mcollective/config.rb +21 -34
  40. data/lib/mcollective/connector/base.rb +2 -1
  41. data/lib/mcollective/connector/nats.ddl +9 -0
  42. data/lib/mcollective/connector/nats.rb +450 -0
  43. data/lib/mcollective/data.rb +8 -3
  44. data/lib/mcollective/data/agent_data.rb +1 -1
  45. data/lib/mcollective/data/base.rb +6 -5
  46. data/lib/mcollective/data/bolt_task_data.ddl +90 -0
  47. data/lib/mcollective/data/bolt_task_data.rb +32 -0
  48. data/lib/mcollective/data/collective_data.rb +1 -1
  49. data/lib/mcollective/data/fact_data.rb +6 -6
  50. data/lib/mcollective/data/fstat_data.rb +2 -4
  51. data/lib/mcollective/data/result.rb +7 -2
  52. data/lib/mcollective/ddl/agentddl.rb +5 -17
  53. data/lib/mcollective/ddl/base.rb +10 -13
  54. data/lib/mcollective/discovery.rb +12 -26
  55. data/lib/mcollective/discovery/choria.ddl +11 -0
  56. data/lib/mcollective/discovery/choria.rb +223 -0
  57. data/lib/mcollective/discovery/flatfile.rb +7 -8
  58. data/lib/mcollective/discovery/mc.rb +2 -2
  59. data/lib/mcollective/discovery/stdin.rb +17 -18
  60. data/lib/mcollective/exceptions.rb +13 -0
  61. data/lib/mcollective/facts/base.rb +9 -9
  62. data/lib/mcollective/facts/yaml_facts.rb +12 -12
  63. data/lib/mcollective/generators.rb +3 -3
  64. data/lib/mcollective/generators/agent_generator.rb +3 -4
  65. data/lib/mcollective/generators/base.rb +14 -15
  66. data/lib/mcollective/generators/data_generator.rb +5 -6
  67. data/lib/mcollective/log.rb +2 -2
  68. data/lib/mcollective/logger/base.rb +3 -2
  69. data/lib/mcollective/logger/console_logger.rb +10 -10
  70. data/lib/mcollective/logger/file_logger.rb +7 -7
  71. data/lib/mcollective/logger/syslog_logger.rb +11 -15
  72. data/lib/mcollective/matcher.rb +14 -14
  73. data/lib/mcollective/matcher/parser.rb +31 -41
  74. data/lib/mcollective/matcher/scanner.rb +69 -74
  75. data/lib/mcollective/message.rb +10 -17
  76. data/lib/mcollective/monkey_patches.rb +2 -4
  77. data/lib/mcollective/optionparser.rb +1 -0
  78. data/lib/mcollective/pluginmanager.rb +3 -5
  79. data/lib/mcollective/pluginpackager.rb +1 -3
  80. data/lib/mcollective/pluginpackager/agent_definition.rb +3 -8
  81. data/lib/mcollective/pluginpackager/forge_packager.rb +7 -9
  82. data/lib/mcollective/pluginpackager/standard_definition.rb +1 -2
  83. data/lib/mcollective/registration/base.rb +18 -16
  84. data/lib/mcollective/rpc.rb +2 -4
  85. data/lib/mcollective/rpc/actionrunner.rb +16 -18
  86. data/lib/mcollective/rpc/agent.rb +26 -43
  87. data/lib/mcollective/rpc/audit.rb +1 -0
  88. data/lib/mcollective/rpc/client.rb +67 -85
  89. data/lib/mcollective/rpc/helpers.rb +55 -62
  90. data/lib/mcollective/rpc/progress.rb +2 -2
  91. data/lib/mcollective/rpc/reply.rb +17 -19
  92. data/lib/mcollective/rpc/request.rb +7 -5
  93. data/lib/mcollective/rpc/result.rb +6 -8
  94. data/lib/mcollective/rpc/stats.rb +49 -58
  95. data/lib/mcollective/security/base.rb +29 -36
  96. data/lib/mcollective/security/choria.rb +765 -0
  97. data/lib/mcollective/shell.rb +9 -4
  98. data/lib/mcollective/signer/base.rb +28 -0
  99. data/lib/mcollective/signer/choria.rb +185 -0
  100. data/lib/mcollective/ssl.rb +8 -6
  101. data/lib/mcollective/util.rb +58 -55
  102. data/lib/mcollective/util/bolt_support.rb +176 -0
  103. data/lib/mcollective/util/bolt_support/plan_runner.rb +167 -0
  104. data/lib/mcollective/util/bolt_support/task_result.rb +94 -0
  105. data/lib/mcollective/util/bolt_support/task_results.rb +128 -0
  106. data/lib/mcollective/util/choria.rb +1103 -0
  107. data/lib/mcollective/util/indifferent_hash.rb +12 -0
  108. data/lib/mcollective/util/natswrapper.rb +242 -0
  109. data/lib/mcollective/util/playbook.rb +435 -0
  110. data/lib/mcollective/util/playbook/data_stores.rb +201 -0
  111. data/lib/mcollective/util/playbook/data_stores/base.rb +99 -0
  112. data/lib/mcollective/util/playbook/data_stores/consul_data_store.rb +88 -0
  113. data/lib/mcollective/util/playbook/data_stores/environment_data_store.rb +33 -0
  114. data/lib/mcollective/util/playbook/data_stores/etcd_data_store.rb +42 -0
  115. data/lib/mcollective/util/playbook/data_stores/file_data_store.rb +106 -0
  116. data/lib/mcollective/util/playbook/data_stores/shell_data_store.rb +103 -0
  117. data/lib/mcollective/util/playbook/inputs.rb +265 -0
  118. data/lib/mcollective/util/playbook/nodes.rb +207 -0
  119. data/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb +86 -0
  120. data/lib/mcollective/util/playbook/nodes/pql_nodes.rb +40 -0
  121. data/lib/mcollective/util/playbook/nodes/shell_nodes.rb +55 -0
  122. data/lib/mcollective/util/playbook/nodes/terraform_nodes.rb +65 -0
  123. data/lib/mcollective/util/playbook/nodes/yaml_nodes.rb +47 -0
  124. data/lib/mcollective/util/playbook/playbook_logger.rb +47 -0
  125. data/lib/mcollective/util/playbook/puppet_logger.rb +51 -0
  126. data/lib/mcollective/util/playbook/report.rb +152 -0
  127. data/lib/mcollective/util/playbook/task_result.rb +55 -0
  128. data/lib/mcollective/util/playbook/tasks.rb +196 -0
  129. data/lib/mcollective/util/playbook/tasks/base.rb +45 -0
  130. data/lib/mcollective/util/playbook/tasks/graphite_event_task.rb +64 -0
  131. data/lib/mcollective/util/playbook/tasks/mcollective_task.rb +356 -0
  132. data/lib/mcollective/util/playbook/tasks/shell_task.rb +93 -0
  133. data/lib/mcollective/util/playbook/tasks/slack_task.rb +105 -0
  134. data/lib/mcollective/util/playbook/tasks/webhook_task.rb +136 -0
  135. data/lib/mcollective/util/playbook/template_util.rb +98 -0
  136. data/lib/mcollective/util/playbook/uses.rb +169 -0
  137. data/lib/mcollective/util/tasks_support.rb +733 -0
  138. data/lib/mcollective/util/tasks_support/cli.rb +260 -0
  139. data/lib/mcollective/util/tasks_support/default_formatter.rb +138 -0
  140. data/lib/mcollective/util/tasks_support/json_formatter.rb +108 -0
  141. data/lib/mcollective/validator.rb +6 -1
  142. data/lib/mcollective/validator/bolt_task_name_validator.ddl +7 -0
  143. data/lib/mcollective/validator/bolt_task_name_validator.rb +11 -0
  144. data/lib/mcollective/validator/length_validator.rb +1 -3
  145. metadata +65 -2
@@ -0,0 +1,11 @@
1
+ metadata :name => "choria",
2
+ :description => "PuppetDB based discovery for the Choria plugin suite",
3
+ :author => "R.I.Pienaar <rip@devco.net>",
4
+ :license => "Apache-2.0",
5
+ :version => "0.19.0",
6
+ :url => "https://github.com/choria-io",
7
+ :timeout => 0
8
+
9
+ discovery do
10
+ capabilities [:classes, :facts, :identity, :agents]
11
+ end
@@ -0,0 +1,223 @@
1
+ require "net/http"
2
+ require_relative "../util/choria"
3
+
4
+ module MCollective
5
+ class Discovery
6
+ class Choria
7
+ def self.discover(filter, timeout, limit=0, client=nil)
8
+ Choria.new(filter, timeout, limit, client).discover
9
+ end
10
+
11
+ attr_reader :timeout, :limit, :client, :config
12
+ attr_accessor :filter
13
+
14
+ def initialize(filter, timeout, limit, client)
15
+ @filter = filter
16
+ @timeout = timeout
17
+ @limit = limit
18
+ @client = client
19
+ @config = Config.instance
20
+ end
21
+
22
+ # Search for nodes
23
+ #
24
+ # @return [Array<String>] list of certnames found
25
+ def discover
26
+ queries = []
27
+
28
+ if choria.proxied_discovery?
29
+ Log.debug("Performing discovery against a PuppetDB Proxy")
30
+
31
+ choria.proxy_discovery_query(proxy_request)
32
+ else
33
+ Log.debug("Performing direct discovery against PuppetDB")
34
+ queries << discover_collective(filter["collective"]) if filter["collective"]
35
+ queries << discover_nodes(filter["identity"]) unless filter["identity"].empty?
36
+ queries << discover_classes(filter["cf_class"]) unless filter["cf_class"].empty?
37
+ queries << discover_facts(filter["fact"]) unless filter["fact"].empty?
38
+ queries << discover_agents(filter["agent"]) unless filter["agent"].empty?
39
+
40
+ choria.pql_query(node_search_string(queries.compact), true)
41
+ end
42
+ end
43
+
44
+ # Creates a request hash for the discovery proxy
45
+ #
46
+ # @return [Hash]
47
+ def proxy_request
48
+ request = {}
49
+
50
+ request["collective"] = filter["collective"] if filter["collective"]
51
+ request["identities"] = filter["identity"] unless filter["identity"].empty?
52
+ request["classes"] = filter["cf_class"] unless filter["cf_class"].empty?
53
+ request["facts"] = filter["fact"] unless filter["fact"].empty?
54
+ request["agents"] = filter["agent"] unless filter["agent"].empty?
55
+
56
+ request
57
+ end
58
+
59
+ # Discovers nodes in a specific collective
60
+ #
61
+ # @param filter [String] a collective name
62
+ # @return [String] a query string
63
+ def discover_collective(filter)
64
+ 'certname in inventory[certname] { facts.mcollective.server.collectives.match("\d+") = "%s" }' % filter
65
+ end
66
+
67
+ # Searches for facts
68
+ #
69
+ # Nodes are searched using an `and` operator via the discover_classes method
70
+ #
71
+ # When the `rpcutil` or `scout` agent is required it will look for `Mcollective` class
72
+ # otherwise `Mcollective_avent_agentname` thus it will only find plugins
73
+ # installed using the `choria/mcollective` AIO plugin packager
74
+ #
75
+ # @param filter [Array<String>] agent names
76
+ # @return [Array<String>] list of nodes found
77
+ def discover_agents(filter)
78
+ pql = filter.map do |agent|
79
+ if ["rpcutil", "scout"].include?(agent)
80
+ "(%s or %s)" % [discover_classes(["mcollective::service"]), discover_classes(["choria::service"])]
81
+ elsif agent =~ /^\/(.+)\/$/
82
+ 'resources {type = "File" and tag ~ "mcollective_agent_.*?%s.*?_server"}' % [string_regexi($1)]
83
+ else
84
+ 'resources {type = "File" and tag = "mcollective_agent_%s_server"}' % [agent]
85
+ end
86
+ end
87
+
88
+ pql.join(" and ") unless pql.empty?
89
+ end
90
+
91
+ # Turns a string into a case insensitive regex string
92
+ #
93
+ # @param value [String]
94
+ # @return [String]
95
+ def string_regexi(value)
96
+ value =~ /^\/(.+)\/$/ ? derived_value = $1 : derived_value = value.dup
97
+
98
+ derived_value.each_char.map do |char|
99
+ if char =~ /[[:alpha:]]/
100
+ "[%s%s]" % [char.downcase, char.upcase]
101
+ else
102
+ char
103
+ end
104
+ end.join
105
+ end
106
+
107
+ # Capitalize a Puppet Resource
108
+ #
109
+ # foo::bar => Foo::Bar
110
+ #
111
+ # @param resource [String] a resource title
112
+ # @return [String]
113
+ def capitalize_resource(resource)
114
+ resource.split("::").map(&:capitalize).join("::")
115
+ end
116
+
117
+ # Searches for facts
118
+ #
119
+ # Nodes are searched using an `and` operator
120
+ #
121
+ # @param filter [Array<Hash>] hashes with :fact, :operator and :value
122
+ # @return [Array<String>] list of nodes found
123
+ def discover_facts(filter)
124
+ pql = filter.map do |q|
125
+ fact = q[:fact]
126
+ operator = q[:operator]
127
+ value = q[:value]
128
+
129
+ case operator
130
+ when "=~"
131
+ regex = string_regexi(value)
132
+
133
+ 'inventory {facts.%s ~ "%s"}' % [fact, regex]
134
+ when "=="
135
+ if ["true", "false"].include?(value) || numeric?(value)
136
+ 'inventory {facts.%s = %s or facts.%s = "%s"}' % [fact, value, fact, value]
137
+ else
138
+ 'inventory {facts.%s = "%s"}' % [fact, value]
139
+ end
140
+ when "!="
141
+ if ["true", "false"].include?(value) || numeric?(value)
142
+ 'inventory {!(facts.%s = %s or facts.%s = "%s")}' % [fact, value, fact, value]
143
+ else
144
+ 'inventory {!(facts.%s = "%s")}' % [fact, value]
145
+ end
146
+ when ">=", ">", "<=", "<"
147
+ raise("Do not know how to do string fact comparisons using the '%s' operator with PuppetDB" % operator) unless numeric?(value)
148
+
149
+ "inventory {facts.%s %s %s}" % [fact, operator, value]
150
+ else
151
+ raise("Do not know how to do fact comparisons using the '%s' operator with PuppetDB" % operator)
152
+ end
153
+ end
154
+
155
+ pql.join(" and ") unless pql.empty?
156
+ end
157
+
158
+ # Searches for classes
159
+ #
160
+ # Nodes are searched using an `and` operator
161
+ #
162
+ # @return [Array<String>] list of nodes found
163
+ def discover_classes(filter)
164
+ pql = filter.map do |klass|
165
+ if klass =~ /^\/(.+)\/$/
166
+ 'resources {type = "Class" and title ~ "%s"}' % [string_regexi($1)]
167
+ else
168
+ 'resources {type = "Class" and title = "%s"}' % [capitalize_resource(klass)]
169
+ end
170
+ end
171
+
172
+ pql.join(" and ") unless pql.empty?
173
+ end
174
+
175
+ # Searches for nodes
176
+ #
177
+ # Nodes are searched using an `or` operator
178
+ #
179
+ # @return [Array<String>] list of nodes found
180
+ def discover_nodes(filter)
181
+ if filter.empty?
182
+ Log.debug("Empty node filter found, discovering all nodes")
183
+ nil
184
+ else
185
+ pql = filter.map do |ident|
186
+ case ident
187
+ when /^pql:\s*(.+)$/
188
+ "certname in %s" % $1
189
+ when /^\/(.+)\/$/
190
+ 'certname ~ "%s"' % string_regexi($1)
191
+ else
192
+ 'certname = "%s"' % ident
193
+ end
194
+ end
195
+
196
+ pql.join(" or ") unless pql.empty?
197
+ end
198
+ end
199
+
200
+ # Produce a nodes query with the supplied sub query included
201
+ #
202
+ # @param queries [Array<String>] PQL queries to be used as a sub query
203
+ # @return [String] nodes search string
204
+ def node_search_string(queries)
205
+ filter_queries = queries.map {|q| "(%s)" % q}.join(" and ")
206
+
207
+ "nodes[certname, deactivated] { %s }" % [filter_queries]
208
+ end
209
+
210
+ # Determines if a string is a number, either float or integer
211
+ #
212
+ # @param string [String]
213
+ # @return [boolean]
214
+ def numeric?(string)
215
+ true if Float(string) rescue false
216
+ end
217
+
218
+ def choria
219
+ @_choria ||= Util::Choria.new(false)
220
+ end
221
+ end
222
+ end
223
+ end
@@ -5,10 +5,10 @@ module MCollective
5
5
  class Discovery
6
6
  class Flatfile
7
7
  def self.discover(filter, timeout, limit=0, client=nil)
8
- unless client.options[:discovery_options].empty?
9
- file = client.options[:discovery_options].first
10
- else
8
+ if client.options[:discovery_options].empty?
11
9
  raise "The flatfile discovery method needs a path to a text file"
10
+ else
11
+ file = client.options[:discovery_options].first
12
12
  end
13
13
 
14
14
  raise "Cannot read the file %s specified as discovery source" % file unless File.readable?(file)
@@ -18,16 +18,15 @@ module MCollective
18
18
 
19
19
  File.readlines(file).each do |host|
20
20
  host = host.chomp.strip
21
- if host.empty? || host.match(/^#/)
22
- next
23
- end
24
- raise 'Identities can only match /^[\w\.\-]+$/' unless host.match(/^[\w\.\-]+$/)
21
+ next if host.empty? || host.match(/^#/)
22
+ raise 'Identities can only match /^[\w\.\-]+$/' unless host.match(/^[\w.\-]+$/)
23
+
25
24
  hosts << host
26
25
  end
27
26
 
28
27
  # this plugin only supports identity filters, do regex matches etc against
29
28
  # the list found in the flatfile
30
- if !(filter["identity"].empty?)
29
+ if !filter["identity"].empty?
31
30
  filter["identity"].each do |identity|
32
31
  identity = Regexp.new(identity.gsub("\/", "")) if identity.match("^/")
33
32
 
@@ -16,8 +16,8 @@ module MCollective
16
16
  return hosts if limit > 0 && hosts.size == limit
17
17
  end
18
18
  end
19
- rescue Timeout::Error => e
20
- rescue Exception => e
19
+ rescue Timeout::Error # rubocop:disable Lint/SuppressedException
20
+ rescue Exception # rubocop:disable Lint/RescueException
21
21
  raise
22
22
  ensure
23
23
  client.unsubscribe("discovery", :reply)
@@ -1,52 +1,54 @@
1
1
  # discovers against stdin instead of the traditional network discovery
2
2
  # the input must be a flat file with a node name per line which should match identities as configured,
3
3
  # or it should be a json string as output by the -j option of mco rpc
4
- require 'mcollective/rpc/helpers'
4
+ require "mcollective/rpc/helpers"
5
5
 
6
6
  module MCollective
7
7
  class Discovery
8
8
  class Stdin
9
9
  def self.discover(filter, timeout, limit=0, client=nil)
10
- unless client.options[:discovery_options].empty?
11
- type = client.options[:discovery_options].first.downcase
10
+ if client.options[:discovery_options].empty?
11
+ type = "auto"
12
12
  else
13
- type = 'auto'
13
+ type = client.options[:discovery_options].first.downcase
14
14
  end
15
15
 
16
16
  discovered = []
17
17
 
18
- file = STDIN.read
18
+ file = $stdin.read
19
19
 
20
- if file =~ /^\s*$/
21
- raise("data piped on STDIN contained only whitespace - could not discover hosts from it.")
22
- end
20
+ raise("data piped on STDIN contained only whitespace - could not discover hosts from it.") if file =~ /^\s*$/
23
21
 
24
- if type == 'auto'
22
+ if type == "auto"
25
23
  if file =~ /^\s*\[/
26
- type = 'json'
24
+ type = "json"
27
25
  else
28
- type = 'text'
26
+ type = "text"
29
27
  end
30
28
  end
31
29
 
32
30
  Log.debug("Parsing STDIN input as type %s" % type)
33
31
 
34
- if type == 'json'
32
+ case type
33
+ when "json"
35
34
  hosts = RPC::Helpers.extract_hosts_from_json(file)
36
- elsif type == 'text'
35
+ when "text"
37
36
  hosts = file.split("\n")
38
37
  else
39
38
  raise("stdin discovery plugin only knows the types auto/text/json, not \"#{type}\"")
40
39
  end
41
40
 
42
41
  hosts.map do |host|
43
- raise 'Identities can only match /\w\.\-/' unless host.match(/^[\w\.\-]+$/)
42
+ raise 'Identities can only match /\w\.\-/' unless host.match(/^[\w.\-]+$/)
43
+
44
44
  host
45
45
  end
46
46
 
47
47
  # this plugin only supports identity filters, do regex matches etc against
48
48
  # the list found in the flatfile
49
- unless filter["identity"].empty?
49
+ if filter["identity"].empty?
50
+ discovered = hosts
51
+ else
50
52
  filter["identity"].each do |identity|
51
53
  identity = Regexp.new(identity.gsub("\/", "")) if identity.match("^/")
52
54
 
@@ -56,8 +58,6 @@ module MCollective
56
58
  discovered << identity
57
59
  end
58
60
  end
59
- else
60
- discovered = hosts
61
61
  end
62
62
 
63
63
  discovered
@@ -65,4 +65,3 @@ module MCollective
65
65
  end
66
66
  end
67
67
  end
68
-
@@ -1,12 +1,19 @@
1
1
  module MCollective
2
2
  # Exceptions for the RPC system
3
3
  class DDLValidationError < RuntimeError; end
4
+
4
5
  class ValidatorError < RuntimeError; end
6
+
5
7
  class ClientTimeoutError < RuntimeError; end
8
+
6
9
  class MsgDoesNotMatchRequestID < RuntimeError; end
10
+
7
11
  class MsgTTLExpired < RuntimeError; end
12
+
8
13
  class NotTargettedAtUs < RuntimeError; end
14
+
9
15
  class RPCError < StandardError; end
16
+
10
17
  class SecurityValidationFailed < RuntimeError; end
11
18
 
12
19
  class BackoffSuggestion < StandardError
@@ -14,15 +21,21 @@ module MCollective
14
21
 
15
22
  def initialize(backoff=nil)
16
23
  @backoff = backoff
24
+ super
17
25
  end
18
26
  end
19
27
 
20
28
  class MessageNotReceived < BackoffSuggestion; end
29
+
21
30
  class UnexpectedMessageType < BackoffSuggestion; end
22
31
 
23
32
  class InvalidRPCData < RPCError; end
33
+
24
34
  class MissingRPCData < RPCError; end
35
+
25
36
  class RPCAborted < RPCError; end
37
+
26
38
  class UnknownRPCAction < RPCError; end
39
+
27
40
  class UnknownRPCError < RPCError; end
28
41
  end
@@ -17,6 +17,7 @@ module MCollective
17
17
  # Registers new fact sources into the plugin manager
18
18
  def self.inherited(klass)
19
19
  PluginManager << {:type => "facts_plugin", :class => klass.to_s}
20
+ super
20
21
  end
21
22
 
22
23
  # Returns the value of a single fact
@@ -27,7 +28,7 @@ module MCollective
27
28
 
28
29
  @mutex.synchronize do
29
30
  begin
30
- if (Time.now.to_i - @last_facts_load > cache_time.to_i ) || force_reload?
31
+ if (Time.now.to_i - @last_facts_load > cache_time.to_i) || force_reload?
31
32
  Log.debug("Resetting facter cache, now: #{Time.now.to_i} last-known-good: #{@last_facts_load}")
32
33
 
33
34
  tfacts = load_facts_from_source
@@ -42,7 +43,7 @@ module MCollective
42
43
  else
43
44
  Log.debug("Using cached facts now: #{Time.now.to_i} last-known-good: #{@last_facts_load}")
44
45
  end
45
- rescue Exception => e
46
+ rescue Exception => e # rubocop:disable Lint/RescueException
46
47
  Log.error("Failed to load facts: #{e.class}: #{e}")
47
48
 
48
49
  # Avoid loops where failing fact loads cause huge CPU
@@ -55,17 +56,16 @@ module MCollective
55
56
  end
56
57
  end
57
58
 
58
-
59
59
  # If you do not supply a specific fact all facts will be returned
60
60
  if fact.nil?
61
- return @facts
61
+ @facts
62
62
  else
63
63
  @facts.include?(fact) ? @facts[fact] : nil
64
64
  end
65
65
  end
66
66
 
67
67
  # Returns all facts
68
- def get_facts
68
+ def get_facts # rubocop:disable Naming/AccessorMethodName
69
69
  get_fact(nil)
70
70
  end
71
71
 
@@ -84,15 +84,15 @@ module MCollective
84
84
  def normalize_facts(value)
85
85
  case value
86
86
  when Array
87
- return value.map { |v| normalize_facts(v) }
87
+ value.map { |v| normalize_facts(v) }
88
88
  when Hash
89
89
  new_hash = {}
90
- value.each do |k,v|
90
+ value.each do |k, v|
91
91
  new_hash[k.to_s] = normalize_facts(v)
92
92
  end
93
- return new_hash
93
+ new_hash
94
94
  else
95
- return value.to_s
95
+ value.to_s
96
96
  end
97
97
  end
98
98
  end