choria-mcorpc-support 2.24.1 → 2.25.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mcollective/agent/choria_provision.ddl +214 -0
- data/lib/mcollective/agent/choria_provision.json +272 -0
- data/lib/mcollective/agent/choria_util.ddl +226 -107
- data/lib/mcollective/agent/choria_util.json +125 -25
- data/lib/mcollective/agent/rpcutil.ddl +242 -183
- data/lib/mcollective/agent/rpcutil.json +53 -57
- data/lib/mcollective/agent/scout.ddl +1 -1
- data/lib/mcollective/agent/scout.json +108 -136
- data/lib/mcollective/application/plugin.rb +7 -159
- data/lib/mcollective/config.rb +10 -0
- data/lib/mcollective/discovery/delegate.rb +4 -2
- data/lib/mcollective/log.rb +1 -2
- data/lib/mcollective/util/choria.rb +14 -8
- data/lib/mcollective/util/tasks_support.rb +27 -5
- data/lib/mcollective/util.rb +2 -4
- data/lib/mcollective.rb +0 -1
- metadata +10 -8
- data/lib/mcollective/generators/agent_generator.rb +0 -50
- data/lib/mcollective/generators/base.rb +0 -45
- data/lib/mcollective/generators/templates/action_snippet.erb +0 -13
- data/lib/mcollective/generators/templates/ddl.erb +0 -8
- data/lib/mcollective/generators/templates/plugin.erb +0 -7
- data/lib/mcollective/generators.rb +0 -6
@@ -8,18 +8,14 @@ mco plugin package [options] <directory>
|
|
8
8
|
mco plugin info <directory>
|
9
9
|
mco plugin doc <plugin>
|
10
10
|
mco plugin doc <type/plugin>
|
11
|
-
mco plugin generate
|
11
|
+
mco plugin generate client <ddl> <target>
|
12
|
+
mco plugin generate ddl <json_output> <ruby_output>
|
12
13
|
|
13
14
|
info : Display plugin information including package details.
|
14
15
|
package : Create all available plugin packages.
|
15
16
|
doc : Display documentation for a specific plugin.
|
16
17
|
END_OF_USAGE
|
17
18
|
|
18
|
-
option :pluginname,
|
19
|
-
:description => "Plugin name",
|
20
|
-
:arguments => ["-n", "--name NAME"],
|
21
|
-
:type => String
|
22
|
-
|
23
19
|
option :postinstall,
|
24
20
|
:description => "Post install script",
|
25
21
|
:arguments => ["--postinstall POSTINSTALL"],
|
@@ -66,7 +62,7 @@ mco plugin package [options] <directory>
|
|
66
62
|
:type => :array
|
67
63
|
|
68
64
|
option :format,
|
69
|
-
:description => "Package output format. Defaults to
|
65
|
+
:description => "Package output format. Defaults to forge",
|
70
66
|
:arguments => ["--format OUTPUTFORMAT"],
|
71
67
|
:type => String
|
72
68
|
|
@@ -80,41 +76,11 @@ mco plugin package [options] <directory>
|
|
80
76
|
:arguments => ["--template HELPTEMPLATE"],
|
81
77
|
:type => String
|
82
78
|
|
83
|
-
option :description,
|
84
|
-
:description => "Plugin description",
|
85
|
-
:arguments => ["--description DESCRIPTION"],
|
86
|
-
:type => String
|
87
|
-
|
88
|
-
option :author,
|
89
|
-
:description => "The author of the plugin",
|
90
|
-
:arguments => ["--author AUTHOR"],
|
91
|
-
:type => String
|
92
|
-
|
93
|
-
option :license,
|
94
|
-
:description => "The license under which the plugin is distributed",
|
95
|
-
:arguments => ["--license LICENSE"],
|
96
|
-
:type => String
|
97
|
-
|
98
79
|
option :version,
|
99
80
|
:description => "The version of the plugin",
|
100
81
|
:arguments => ["--pluginversion VERSION"],
|
101
82
|
:type => String
|
102
83
|
|
103
|
-
option :url,
|
104
|
-
:description => "Url at which information about the plugin can be found",
|
105
|
-
:arguments => ["--url URL"],
|
106
|
-
:type => String
|
107
|
-
|
108
|
-
option :timeout,
|
109
|
-
:description => "The plugin's timeout",
|
110
|
-
:arguments => ["--timeout TIMEOUT"],
|
111
|
-
:type => Integer
|
112
|
-
|
113
|
-
option :actions,
|
114
|
-
:description => "Actions to be generated for an Agent Plugin",
|
115
|
-
:arguments => ["--actions [ACTIONS]"],
|
116
|
-
:type => Array
|
117
|
-
|
118
84
|
option :keep_artifacts,
|
119
85
|
:description => "Don't remove artifacts after building packages",
|
120
86
|
:arguments => ["--keep-artifacts"],
|
@@ -131,53 +97,12 @@ mco plugin package [options] <directory>
|
|
131
97
|
configuration[:action] = ARGV.delete_at(0)
|
132
98
|
|
133
99
|
configuration[:target] = ARGV.delete_at(0) || "."
|
134
|
-
|
135
|
-
if configuration[:action] == "generate"
|
136
|
-
unless ARGV[0] && ARGV[0].match(/(actions|outputs)=(.+)/i)
|
137
|
-
if configuration[:pluginname] # rubocop:disable Metrics/BlockNesting
|
138
|
-
ARGV.delete_at(0)
|
139
|
-
else
|
140
|
-
configuration[:pluginname] = ARGV.delete_at(0)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
ARGV.each do |argument|
|
145
|
-
if argument.match(/(actions|outputs)=(.+)/i)
|
146
|
-
configuration[$1.downcase.to_sym] = $2.split(",")
|
147
|
-
else
|
148
|
-
raise "Could not parse --arg '#{argument}'"
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
100
|
end
|
153
101
|
end
|
154
102
|
|
155
|
-
# Display info about plugin
|
156
|
-
def info_command
|
157
|
-
plugin = prepare_plugin
|
158
|
-
packager = PluginPackager["#{configuration[:format].capitalize}Packager"]
|
159
|
-
packager.new(plugin).package_information
|
160
|
-
end
|
161
|
-
|
162
103
|
# Generate a plugin skeleton
|
163
104
|
def generate_command
|
164
|
-
|
165
|
-
|
166
|
-
unless configuration[:pluginname]
|
167
|
-
puts "No plugin name specified. Using 'new_plugin'"
|
168
|
-
configuration[:pluginname] = "new_plugin"
|
169
|
-
end
|
170
|
-
|
171
|
-
load_plugin_config_values
|
172
|
-
|
173
|
-
case configuration[:target].downcase
|
174
|
-
when "agent"
|
175
|
-
Generators::AgentGenerator.new(configuration[:pluginname], configuration[:actions], configuration[:pluginname],
|
176
|
-
configuration[:description], configuration[:author], configuration[:license],
|
177
|
-
configuration[:version], configuration[:url], configuration[:timeout])
|
178
|
-
else
|
179
|
-
raise "invalid plugin type. cannot generate plugin '#{configuration[:target]}'"
|
180
|
-
end
|
105
|
+
puts "CRITICAL: mco plugin generate is deprecated, please use 'choria plugin generate'"
|
181
106
|
end
|
182
107
|
|
183
108
|
# Package plugin
|
@@ -211,75 +136,10 @@ mco plugin package [options] <directory>
|
|
211
136
|
end
|
212
137
|
|
213
138
|
# Show application list and plugin help
|
214
|
-
def doc_command
|
215
|
-
|
216
|
-
["Agents", :agent],
|
217
|
-
["Aggregate", :aggregate],
|
218
|
-
["Connectors", :connector],
|
219
|
-
["Discovery Methods", :discovery],
|
220
|
-
["Validator Plugins", :validator]
|
221
|
-
]
|
222
|
-
|
223
|
-
if configuration.include?(:target) && configuration[:target] != "."
|
224
|
-
if configuration[:target] =~ /^(.+?)\/(.+)$/
|
225
|
-
ddl = load_plugin_ddl($2.to_sym, $1)
|
226
|
-
else
|
227
|
-
found_plugin_type = nil
|
228
|
-
|
229
|
-
known_plugin_types.each do |plugin_type|
|
230
|
-
PluginManager.find(plugin_type[1], "ddl").each do |ddlf|
|
231
|
-
pluginname = ddlf.gsub(/_#{plugin_type[1]}$/, "")
|
232
|
-
|
233
|
-
abort "Duplicate plugin name found, please specify a full path like agent/rpcutil" if pluginname == configuration[:target] && found_plugin_type
|
234
|
-
|
235
|
-
found_plugin_type = plugin_type[1] if pluginname == configuration[:target]
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
abort "Could not find a plugin named '%s' in any supported plugin type" % configuration[:target] unless found_plugin_type
|
240
|
-
ddl = load_plugin_ddl(configuration[:target], found_plugin_type)
|
241
|
-
end
|
242
|
-
|
243
|
-
if ddl
|
244
|
-
puts ddl.help(configuration[:rpctemplate])
|
245
|
-
else
|
246
|
-
abort "Could not find a '%s' plugin named '%s'" % configuration[:target].split("/")
|
247
|
-
end
|
248
|
-
|
249
|
-
else
|
250
|
-
puts "Please specify a plugin. Available plugins are:"
|
251
|
-
puts
|
252
|
-
|
253
|
-
load_errors = []
|
254
|
-
|
255
|
-
known_plugin_types.each do |plugin_type|
|
256
|
-
puts "%s:" % plugin_type[0]
|
257
|
-
|
258
|
-
PluginManager.find(plugin_type[1], "ddl").each do |ddlf|
|
259
|
-
begin
|
260
|
-
help = DDL.new(ddlf, plugin_type[1], false)
|
139
|
+
def doc_command
|
140
|
+
puts "WARNING: mco plugin doc is deprecated, please use choria plugin doc"
|
261
141
|
|
262
|
-
|
263
|
-
|
264
|
-
help.loadddlfile
|
265
|
-
pluginname = ddlf.gsub(/_#{plugin_type[1]}$/, "")
|
266
|
-
puts " %-25s %s" % [pluginname, help.meta[:description]]
|
267
|
-
rescue => e
|
268
|
-
load_errors << [plugin_type[1], ddlf, e]
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
puts
|
273
|
-
end
|
274
|
-
|
275
|
-
unless load_errors.empty?
|
276
|
-
puts "Plugin Load Errors:"
|
277
|
-
|
278
|
-
load_errors.each do |e|
|
279
|
-
puts " %-25s %s" % ["#{e[0]}/#{e[1]}", Util.colorize(:yellow, e[2])]
|
280
|
-
end
|
281
|
-
end
|
282
|
-
end
|
142
|
+
exec("choria plugin doc %s" % [configuration[:target]])
|
283
143
|
end
|
284
144
|
|
285
145
|
# Creates the correct package plugin object.
|
@@ -341,18 +201,6 @@ mco plugin package [options] <directory>
|
|
341
201
|
File.basename(plugintype[0])
|
342
202
|
end
|
343
203
|
|
344
|
-
# Load preset metadata values from config if they are present
|
345
|
-
# This makes it possible to override metadata values in a local
|
346
|
-
# client config file.
|
347
|
-
#
|
348
|
-
# Example : plugin.metadata.license = Apache 2
|
349
|
-
def load_plugin_config_values
|
350
|
-
config = Config.instance
|
351
|
-
[:pluginname, :description, :author, :license, :version, :url, :timeout].each do |confoption|
|
352
|
-
configuration[confoption] = config.pluginconf["metadata.#{confoption}"] unless configuration[confoption]
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
204
|
def main
|
357
205
|
abort "No action specified, please run 'mco help plugin' for help" unless configuration.include?(:action)
|
358
206
|
|
data/lib/mcollective/config.rb
CHANGED
@@ -137,6 +137,8 @@ module MCollective
|
|
137
137
|
|
138
138
|
raise('Identities can only match /\w\.\-/') unless @identity =~ /^[\w.\-]+$/
|
139
139
|
|
140
|
+
check_deprecations
|
141
|
+
|
140
142
|
@configured = true
|
141
143
|
|
142
144
|
libdirs.each do |dir|
|
@@ -254,5 +256,13 @@ module MCollective
|
|
254
256
|
end
|
255
257
|
end
|
256
258
|
end
|
259
|
+
|
260
|
+
def check_deprecations
|
261
|
+
if @pluginconf["choria.use_srv_records"]
|
262
|
+
Log.warn("Configuration set 'choria.use_srv_records' which is deprecated in favor of 'choria.use_srv'.")
|
263
|
+
@pluginconf["choria.use_srv"] = @pluginconf["choria.use_srv_records"]
|
264
|
+
@pluginconf.delete("choria.use_srv_records")
|
265
|
+
end
|
266
|
+
end
|
257
267
|
end
|
258
268
|
end
|
@@ -10,6 +10,9 @@ module MCollective
|
|
10
10
|
|
11
11
|
cmd = [binary_name, "discover", "-j", "--silent"]
|
12
12
|
|
13
|
+
config = client.options.fetch(:config)
|
14
|
+
cmd << "--config" << config if config
|
15
|
+
|
13
16
|
cmd << "-T" << filter["collective"] if filter["collective"]
|
14
17
|
|
15
18
|
filter.fetch("identity", []).each do |i|
|
@@ -53,6 +56,7 @@ module MCollective
|
|
53
56
|
|
54
57
|
begin
|
55
58
|
Timeout.timeout(timeout + 0.5) do
|
59
|
+
nodes.concat(JSON.parse(stdout.read))
|
56
60
|
status = wait_thr.value
|
57
61
|
|
58
62
|
raise("Choria discovery failed: %s" % stderr.read) unless status.exitstatus == 0
|
@@ -62,8 +66,6 @@ module MCollective
|
|
62
66
|
Process.kill("KILL", wait_thr[:pid])
|
63
67
|
raise("Choria failed to complete discovery within %d timeout" % timeout)
|
64
68
|
end
|
65
|
-
|
66
|
-
nodes.concat(JSON.parse(stdout.read))
|
67
69
|
end
|
68
70
|
|
69
71
|
nodes
|
data/lib/mcollective/log.rb
CHANGED
@@ -96,9 +96,8 @@ module MCollective
|
|
96
96
|
end
|
97
97
|
|
98
98
|
@logger.start
|
99
|
-
rescue Exception
|
99
|
+
rescue Exception # rubocop:disable Lint/RescueException
|
100
100
|
@configured = false
|
101
|
-
warn "Could not start logger: #{e.class} #{e}"
|
102
101
|
end
|
103
102
|
|
104
103
|
# figures out the filename that called us
|
@@ -157,19 +157,19 @@ module MCollective
|
|
157
157
|
|
158
158
|
# Determines if SRV records should be used
|
159
159
|
#
|
160
|
-
# Setting choria.
|
160
|
+
# Setting choria.use_srv to anything other than t, true, yes or 1 will disable
|
161
161
|
# SRV records
|
162
162
|
#
|
163
163
|
# @return [Boolean]
|
164
164
|
def should_use_srv?
|
165
|
-
["t", "true", "yes", "1"].include?(get_option("choria.
|
165
|
+
["t", "true", "yes", "1"].include?(get_option("choria.use_srv", "1").downcase)
|
166
166
|
end
|
167
167
|
|
168
168
|
# Query DNS for a series of records
|
169
169
|
#
|
170
170
|
# The given records will be passed through {#srv_records} to figure out the domain to query in.
|
171
171
|
#
|
172
|
-
# Querying of records can be bypassed by setting choria.
|
172
|
+
# Querying of records can be bypassed by setting choria.use_srv to false
|
173
173
|
#
|
174
174
|
# @yield [Hash] each record for modification by the caller
|
175
175
|
# @param records [Array<String>] the records to query without their domain parts
|
@@ -634,21 +634,27 @@ module MCollective
|
|
634
634
|
|
635
635
|
# The PuppetDB server to connect to
|
636
636
|
#
|
637
|
-
#
|
638
|
-
# then
|
639
|
-
# to puppet:8081
|
637
|
+
# Use choria.puppetdb_host if set, otherwise query
|
638
|
+
# _x-puppet-db._tcp.example.net then _x-puppet._tcp.example.net if SRV
|
639
|
+
# lookup is enabled, and fallback to puppet:8081 if nothing else worked.
|
640
640
|
#
|
641
641
|
# @return [Hash] with :target and :port
|
642
642
|
def puppetdb_server
|
643
|
-
d_host = get_option("choria.puppetdb_host", "puppet")
|
644
643
|
d_port = get_option("choria.puppetdb_port", "8081")
|
645
644
|
|
645
|
+
answer = {
|
646
|
+
:target => get_option("choria.puppetdb_host", nil),
|
647
|
+
:port => d_port
|
648
|
+
}
|
649
|
+
|
650
|
+
return answer if answer[:target]
|
651
|
+
|
646
652
|
answer = try_srv(["_x-puppet-db._tcp"], nil, nil)
|
647
653
|
return answer if answer[:target]
|
648
654
|
|
649
655
|
# In the case where we take _x-puppet._tcp SRV records we unfortunately have
|
650
656
|
# to force the port else it uses the one from Puppet which will 404
|
651
|
-
answer = try_srv(["_x-puppet._tcp"],
|
657
|
+
answer = try_srv(["_x-puppet._tcp"], "puppet", d_port)
|
652
658
|
answer[:port] = d_port
|
653
659
|
|
654
660
|
answer
|
@@ -65,7 +65,7 @@ module MCollective
|
|
65
65
|
# AIO path to binaries like wrappers etc
|
66
66
|
def aio_bin_path
|
67
67
|
if Util.windows?
|
68
|
-
'C:\Program Files\Puppet Labs\Puppet\bin'
|
68
|
+
'C:\Program Files\Puppet Labs\Puppet\puppet\bin'
|
69
69
|
else
|
70
70
|
"/opt/puppetlabs/puppet/bin"
|
71
71
|
end
|
@@ -88,6 +88,13 @@ module MCollective
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
# Is this an AIO install?
|
92
|
+
#
|
93
|
+
# @return [Boolean]
|
94
|
+
def aio?
|
95
|
+
File.directory?(aio_bin_path)
|
96
|
+
end
|
97
|
+
|
91
98
|
# Path to the task wrapper executable
|
92
99
|
#
|
93
100
|
# @return [String]
|
@@ -157,7 +164,7 @@ module MCollective
|
|
157
164
|
# @return [String] path to the command
|
158
165
|
def task_command(spooldir, task)
|
159
166
|
file_spec = task["files"][0]
|
160
|
-
file_name = File.join(spooldir, "files", file_spec["filename"])
|
167
|
+
file_name = File.join(spooldir, "files", task_module(task["task"]), "tasks", file_spec["filename"])
|
161
168
|
|
162
169
|
command = platform_specific_command(file_name)
|
163
170
|
|
@@ -179,6 +186,8 @@ module MCollective
|
|
179
186
|
"_choria_task_caller" => task_caller
|
180
187
|
}
|
181
188
|
|
189
|
+
environment["PATH"] = "#{aio_bin_path}#{File::PATH_SEPARATOR}#{ENV['PATH']}" if aio?
|
190
|
+
|
182
191
|
return environment unless task["input"]
|
183
192
|
return environment unless ["both", "environment"].include?(task_input_method(task))
|
184
193
|
|
@@ -186,6 +195,7 @@ module MCollective
|
|
186
195
|
environment["PT_%s" % k] = v.to_s
|
187
196
|
end
|
188
197
|
|
198
|
+
environment["PT__task"] = task["task"]
|
189
199
|
environment["PT__installdir"] = File.join(request_spooldir(task_id), "files")
|
190
200
|
|
191
201
|
environment
|
@@ -220,7 +230,10 @@ module MCollective
|
|
220
230
|
# @param task [Hash] task specification
|
221
231
|
def populate_spooldir(spooldir, task)
|
222
232
|
task["files"].each do |file|
|
223
|
-
|
233
|
+
filename = file["filename"]
|
234
|
+
filename = File.join(task_module(task["task"]), "tasks", filename) unless filename.index("/")
|
235
|
+
|
236
|
+
spool_filename = File.join(spooldir, "files", filename)
|
224
237
|
|
225
238
|
FileUtils.mkdir_p(File.dirname(spool_filename), :mode => 0o0750)
|
226
239
|
FileUtils.cp(task_file_name(file), spool_filename)
|
@@ -246,7 +259,7 @@ module MCollective
|
|
246
259
|
# act on these tasks either by asking for their status or perhaps killing
|
247
260
|
# them?
|
248
261
|
#
|
249
|
-
# @param command [
|
262
|
+
# @param command [String] command to run
|
250
263
|
# @param environment [Hash] environment to run with
|
251
264
|
# @param stdin [String] stdin to send to the command
|
252
265
|
# @param spooldir [String] path to the spool for this specific request
|
@@ -287,7 +300,7 @@ module MCollective
|
|
287
300
|
Process.exec(environment, command, options)
|
288
301
|
end
|
289
302
|
else
|
290
|
-
pid = Process.spawn(environment, command, options)
|
303
|
+
pid = Process.spawn(environment, [command, command], options)
|
291
304
|
end
|
292
305
|
|
293
306
|
sleep 0.1 until File.exist?(wrapper_stdout)
|
@@ -569,6 +582,15 @@ module MCollective
|
|
569
582
|
parts
|
570
583
|
end
|
571
584
|
|
585
|
+
# Return a task's module
|
586
|
+
#
|
587
|
+
# @param task [String]
|
588
|
+
# @return [String] the module name
|
589
|
+
# @raise [StandardError] for invalid task names
|
590
|
+
def task_module(task)
|
591
|
+
parse_task(task)[0]
|
592
|
+
end
|
593
|
+
|
572
594
|
# Determines the cache path for a task file
|
573
595
|
#
|
574
596
|
# @param file [Hash] a file hash as per the task metadata
|
data/lib/mcollective/util.rb
CHANGED
@@ -147,13 +147,11 @@ module MCollective
|
|
147
147
|
|
148
148
|
# Returns the PuppetLabs mcollective path for windows
|
149
149
|
def self.windows_prefix
|
150
|
-
|
151
|
-
File.join(Dir::COMMON_APPDATA, "PuppetLabs", "choria")
|
150
|
+
File.join(ENV["ALLUSERSPROFILE"], "PuppetLabs", "choria")
|
152
151
|
end
|
153
152
|
|
154
153
|
def self.choria_windows_prefix
|
155
|
-
|
156
|
-
File.join(Dir::COMMON_APPDATA, "ChoriaIO", "choria")
|
154
|
+
File.join(ENV["ALLUSERSPROFILE"], "choria")
|
157
155
|
end
|
158
156
|
|
159
157
|
def self.config_paths_for_user
|