choria-mcorpc-support 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/bin/mco +64 -0
  3. data/lib/mcollective.rb +63 -0
  4. data/lib/mcollective/agent.rb +5 -0
  5. data/lib/mcollective/agents.rb +149 -0
  6. data/lib/mcollective/aggregate.rb +85 -0
  7. data/lib/mcollective/aggregate/average.ddl +33 -0
  8. data/lib/mcollective/aggregate/average.rb +29 -0
  9. data/lib/mcollective/aggregate/base.rb +40 -0
  10. data/lib/mcollective/aggregate/result.rb +9 -0
  11. data/lib/mcollective/aggregate/result/base.rb +25 -0
  12. data/lib/mcollective/aggregate/result/collection_result.rb +19 -0
  13. data/lib/mcollective/aggregate/result/numeric_result.rb +13 -0
  14. data/lib/mcollective/aggregate/sum.ddl +33 -0
  15. data/lib/mcollective/aggregate/sum.rb +18 -0
  16. data/lib/mcollective/aggregate/summary.ddl +33 -0
  17. data/lib/mcollective/aggregate/summary.rb +53 -0
  18. data/lib/mcollective/application.rb +365 -0
  19. data/lib/mcollective/application/completion.rb +104 -0
  20. data/lib/mcollective/application/describe_filter.rb +87 -0
  21. data/lib/mcollective/application/facts.rb +62 -0
  22. data/lib/mcollective/application/find.rb +23 -0
  23. data/lib/mcollective/application/help.rb +28 -0
  24. data/lib/mcollective/application/inventory.rb +344 -0
  25. data/lib/mcollective/application/ping.rb +82 -0
  26. data/lib/mcollective/application/plugin.rb +369 -0
  27. data/lib/mcollective/application/rpc.rb +111 -0
  28. data/lib/mcollective/applications.rb +134 -0
  29. data/lib/mcollective/cache.rb +145 -0
  30. data/lib/mcollective/client.rb +353 -0
  31. data/lib/mcollective/config.rb +245 -0
  32. data/lib/mcollective/connector.rb +18 -0
  33. data/lib/mcollective/connector/base.rb +26 -0
  34. data/lib/mcollective/data.rb +91 -0
  35. data/lib/mcollective/data/agent_data.ddl +22 -0
  36. data/lib/mcollective/data/agent_data.rb +17 -0
  37. data/lib/mcollective/data/base.rb +67 -0
  38. data/lib/mcollective/data/collective_data.ddl +20 -0
  39. data/lib/mcollective/data/collective_data.rb +9 -0
  40. data/lib/mcollective/data/fact_data.ddl +28 -0
  41. data/lib/mcollective/data/fact_data.rb +55 -0
  42. data/lib/mcollective/data/fstat_data.ddl +89 -0
  43. data/lib/mcollective/data/fstat_data.rb +56 -0
  44. data/lib/mcollective/data/result.rb +45 -0
  45. data/lib/mcollective/ddl.rb +113 -0
  46. data/lib/mcollective/ddl/agentddl.rb +253 -0
  47. data/lib/mcollective/ddl/base.rb +217 -0
  48. data/lib/mcollective/ddl/dataddl.rb +56 -0
  49. data/lib/mcollective/ddl/discoveryddl.rb +52 -0
  50. data/lib/mcollective/ddl/validatorddl.rb +6 -0
  51. data/lib/mcollective/discovery.rb +143 -0
  52. data/lib/mcollective/discovery/flatfile.ddl +11 -0
  53. data/lib/mcollective/discovery/flatfile.rb +48 -0
  54. data/lib/mcollective/discovery/mc.ddl +11 -0
  55. data/lib/mcollective/discovery/mc.rb +30 -0
  56. data/lib/mcollective/discovery/stdin.ddl +11 -0
  57. data/lib/mcollective/discovery/stdin.rb +68 -0
  58. data/lib/mcollective/exceptions.rb +28 -0
  59. data/lib/mcollective/facts.rb +39 -0
  60. data/lib/mcollective/facts/base.rb +100 -0
  61. data/lib/mcollective/facts/yaml_facts.rb +65 -0
  62. data/lib/mcollective/generators.rb +7 -0
  63. data/lib/mcollective/generators/agent_generator.rb +51 -0
  64. data/lib/mcollective/generators/base.rb +46 -0
  65. data/lib/mcollective/generators/data_generator.rb +51 -0
  66. data/lib/mcollective/generators/templates/action_snippet.erb +13 -0
  67. data/lib/mcollective/generators/templates/data_input_snippet.erb +7 -0
  68. data/lib/mcollective/generators/templates/ddl.erb +8 -0
  69. data/lib/mcollective/generators/templates/plugin.erb +7 -0
  70. data/lib/mcollective/log.rb +118 -0
  71. data/lib/mcollective/logger.rb +5 -0
  72. data/lib/mcollective/logger/base.rb +77 -0
  73. data/lib/mcollective/logger/console_logger.rb +61 -0
  74. data/lib/mcollective/logger/file_logger.rb +53 -0
  75. data/lib/mcollective/logger/syslog_logger.rb +53 -0
  76. data/lib/mcollective/matcher.rb +224 -0
  77. data/lib/mcollective/matcher/parser.rb +128 -0
  78. data/lib/mcollective/matcher/scanner.rb +241 -0
  79. data/lib/mcollective/message.rb +248 -0
  80. data/lib/mcollective/monkey_patches.rb +152 -0
  81. data/lib/mcollective/optionparser.rb +197 -0
  82. data/lib/mcollective/pluginmanager.rb +180 -0
  83. data/lib/mcollective/pluginpackager.rb +98 -0
  84. data/lib/mcollective/pluginpackager/agent_definition.rb +94 -0
  85. data/lib/mcollective/pluginpackager/debpackage_packager.rb +237 -0
  86. data/lib/mcollective/pluginpackager/modulepackage_packager.rb +127 -0
  87. data/lib/mcollective/pluginpackager/ospackage_packager.rb +59 -0
  88. data/lib/mcollective/pluginpackager/rpmpackage_packager.rb +180 -0
  89. data/lib/mcollective/pluginpackager/standard_definition.rb +69 -0
  90. data/lib/mcollective/pluginpackager/templates/debian/Makefile.erb +7 -0
  91. data/lib/mcollective/pluginpackager/templates/debian/changelog.erb +5 -0
  92. data/lib/mcollective/pluginpackager/templates/debian/compat.erb +1 -0
  93. data/lib/mcollective/pluginpackager/templates/debian/control.erb +15 -0
  94. data/lib/mcollective/pluginpackager/templates/debian/copyright.erb +8 -0
  95. data/lib/mcollective/pluginpackager/templates/debian/rules.erb +6 -0
  96. data/lib/mcollective/pluginpackager/templates/module/Modulefile.erb +5 -0
  97. data/lib/mcollective/pluginpackager/templates/module/README.md.erb +37 -0
  98. data/lib/mcollective/pluginpackager/templates/module/_manifest.pp.erb +9 -0
  99. data/lib/mcollective/pluginpackager/templates/redhat/rpm_spec.erb +63 -0
  100. data/lib/mcollective/registration/base.rb +91 -0
  101. data/lib/mcollective/rpc.rb +182 -0
  102. data/lib/mcollective/rpc/actionrunner.rb +158 -0
  103. data/lib/mcollective/rpc/agent.rb +374 -0
  104. data/lib/mcollective/rpc/audit.rb +38 -0
  105. data/lib/mcollective/rpc/client.rb +1066 -0
  106. data/lib/mcollective/rpc/helpers.rb +321 -0
  107. data/lib/mcollective/rpc/progress.rb +63 -0
  108. data/lib/mcollective/rpc/reply.rb +87 -0
  109. data/lib/mcollective/rpc/request.rb +86 -0
  110. data/lib/mcollective/rpc/result.rb +90 -0
  111. data/lib/mcollective/rpc/stats.rb +294 -0
  112. data/lib/mcollective/runnerstats.rb +90 -0
  113. data/lib/mcollective/security.rb +26 -0
  114. data/lib/mcollective/security/base.rb +244 -0
  115. data/lib/mcollective/shell.rb +126 -0
  116. data/lib/mcollective/ssl.rb +285 -0
  117. data/lib/mcollective/util.rb +579 -0
  118. data/lib/mcollective/validator.rb +85 -0
  119. data/lib/mcollective/validator/array_validator.ddl +7 -0
  120. data/lib/mcollective/validator/array_validator.rb +9 -0
  121. data/lib/mcollective/validator/ipv4address_validator.ddl +7 -0
  122. data/lib/mcollective/validator/ipv4address_validator.rb +16 -0
  123. data/lib/mcollective/validator/ipv6address_validator.ddl +7 -0
  124. data/lib/mcollective/validator/ipv6address_validator.rb +16 -0
  125. data/lib/mcollective/validator/length_validator.ddl +7 -0
  126. data/lib/mcollective/validator/length_validator.rb +11 -0
  127. data/lib/mcollective/validator/regex_validator.ddl +7 -0
  128. data/lib/mcollective/validator/regex_validator.rb +9 -0
  129. data/lib/mcollective/validator/shellsafe_validator.ddl +7 -0
  130. data/lib/mcollective/validator/shellsafe_validator.rb +13 -0
  131. data/lib/mcollective/validator/typecheck_validator.ddl +7 -0
  132. data/lib/mcollective/validator/typecheck_validator.rb +28 -0
  133. metadata +215 -0
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+ module MCollective
3
+ class Application::Ping<Application
4
+ description "Ping all nodes"
5
+
6
+ option :graph,
7
+ :description => "Shows a graph of ping distribution",
8
+ :arguments => ["--graph", "-g"],
9
+ :default => false,
10
+ :type => :bool
11
+
12
+ # Convert the times structure into a array representing
13
+ # buckets of responses in 50 ms intervals. Return a small
14
+ # sparkline graph using UTF8 characters
15
+ def spark(resp_times)
16
+ return "" unless configuration[:graph] || Config.instance.pluginconf["rpc.graph"]
17
+
18
+ ticks=%w[▁ ▂ ▃ ▄ ▅ ▆ ▇]
19
+
20
+ histo = {}
21
+
22
+ # round each time to its nearest 50ms
23
+ # and keep a count for each 50ms
24
+ resp_times.each do |time|
25
+ time = Integer(time + 50 - (time % 50))
26
+ histo[time] ||= 0
27
+ histo[time] += 1
28
+ end
29
+
30
+ # set the 50ms intervals that saw no traffic to 0
31
+ ((histo.keys.max - histo.keys.min) / 50).times do |i|
32
+ time = (i * 50) + histo.keys.min
33
+ histo[time] = 0 unless histo[time]
34
+ end
35
+
36
+ # get a numerically sorted list of times
37
+ histo = histo.keys.sort.map{|k| histo[k]}
38
+
39
+ range = histo.max - histo.min
40
+ scale = ticks.size - 1
41
+ distance = histo.max.to_f / scale
42
+
43
+ histo.map do |val|
44
+ tick = (val / distance).round
45
+ tick = 0 if tick < 0
46
+
47
+ ticks[tick]
48
+ end.join
49
+ end
50
+
51
+ def main
52
+ # If the user did not override the default timeout include the discovery timeout
53
+ if options[:timeout] == 5
54
+ discovery_timeout = options[:disctimeout] || Config.instance.discovery_timeout || 0
55
+ options[:timeout] = options[:timeout] + discovery_timeout
56
+ end
57
+ client = MCollective::Client.new(options)
58
+
59
+ start = Time.now.to_f
60
+ times = []
61
+
62
+ client.req("ping", "discovery") do |resp|
63
+ times << (Time.now.to_f - start) * 1000
64
+
65
+ puts "%-40s time=%.2f ms" % [resp[:senderid], times.last]
66
+ end
67
+
68
+ puts("\n\n---- ping statistics ----")
69
+
70
+ if times.size > 0
71
+ sum = times.inject(0){|acc,i|acc +i}
72
+ avg = sum / times.length.to_f
73
+
74
+ puts "%d replies max: %.2f min: %.2f avg: %.2f %s" % [times.size, times.max, times.min, avg, spark(times)]
75
+ else
76
+ puts("No responses received")
77
+ end
78
+
79
+ halt client.stats
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,369 @@
1
+ module MCollective
2
+ class Application::Plugin<Application
3
+
4
+ exclude_argument_sections "common", "filter", "rpc"
5
+
6
+ description "MCollective Plugin Application"
7
+ usage <<-END_OF_USAGE
8
+ mco plugin package [options] <directory>
9
+ mco plugin info <directory>
10
+ mco plugin doc <plugin>
11
+ mco plugin doc <type/plugin>
12
+ mco plugin generate agent <pluginname> [actions=val,val]
13
+ mco plugin generate data <pluginname> [outputs=val,val]
14
+
15
+ info : Display plugin information including package details.
16
+ package : Create all available plugin packages.
17
+ doc : Display documentation for a specific plugin.
18
+ END_OF_USAGE
19
+
20
+ option :pluginname,
21
+ :description => 'Plugin name',
22
+ :arguments => ['-n', '--name NAME'],
23
+ :type => String
24
+
25
+ option :postinstall,
26
+ :description => 'Post install script',
27
+ :arguments => ['--postinstall POSTINSTALL'],
28
+ :type => String
29
+
30
+ option :preinstall,
31
+ :description => 'Pre install script',
32
+ :arguments => ['--preinstall PREINSTALL'],
33
+ :type => String
34
+
35
+ option :revision,
36
+ :description => 'Revision number',
37
+ :arguments => ['--revision REVISION'],
38
+ :type => String
39
+
40
+ option :iteration,
41
+ :description => 'DEPRECATED - Use --revision instead',
42
+ :arguments => ['--iteration ITERATION'],
43
+ :type => String
44
+
45
+ option :vendor,
46
+ :description => 'Vendor name',
47
+ :arguments => ['--vendor VENDOR'],
48
+ :type => String
49
+
50
+ option :pluginpath,
51
+ :description => 'MCollective plugin path',
52
+ :arguments => ['--pluginpath PATH'],
53
+ :type => String
54
+
55
+ option :mcname,
56
+ :description => 'MCollective type (mcollective, pe-mcollective) that the packages depend on',
57
+ :arguments => ['--mcname NAME'],
58
+ :type => String
59
+
60
+ option :mcversion,
61
+ :description => 'Version of MCollective that the packages depend on',
62
+ :arguments => ['--mcversion MCVERSION'],
63
+ :type => String
64
+
65
+ option :dependency,
66
+ :description => 'Adds a dependency to the plugin',
67
+ :arguments => ['--dependency DEPENDENCIES'],
68
+ :type => :array
69
+
70
+ option :format,
71
+ :description => 'Package output format. Defaults to rpmpackage or debpackage',
72
+ :arguments => ['--format OUTPUTFORMAT'],
73
+ :type => String
74
+
75
+ option :sign,
76
+ :description => 'Embed a signature in the package',
77
+ :arguments => ['--sign'],
78
+ :type => :boolean
79
+
80
+ option :rpctemplate,
81
+ :description => 'Template to use.',
82
+ :arguments => ['--template HELPTEMPLATE'],
83
+ :type => String
84
+
85
+ option :description,
86
+ :description => 'Plugin description',
87
+ :arguments => ['--description DESCRIPTION'],
88
+ :type => String
89
+
90
+ option :author,
91
+ :description => 'The author of the plugin',
92
+ :arguments => ['--author AUTHOR'],
93
+ :type => String
94
+
95
+ option :license,
96
+ :description => 'The license under which the plugin is distributed',
97
+ :arguments => ['--license LICENSE'],
98
+ :type => String
99
+
100
+ option :version,
101
+ :description => 'The version of the plugin',
102
+ :arguments => ['--pluginversion VERSION'],
103
+ :type => String
104
+
105
+ option :url,
106
+ :description => 'Url at which information about the plugin can be found',
107
+ :arguments => ['--url URL'],
108
+ :type => String
109
+
110
+ option :timeout,
111
+ :description => "The plugin's timeout",
112
+ :arguments => ['--timeout TIMEOUT'],
113
+ :type => Integer
114
+
115
+ option :actions,
116
+ :description => 'Actions to be generated for an Agent Plugin',
117
+ :arguments => ['--actions [ACTIONS]'],
118
+ :type => Array
119
+
120
+ option :outputs,
121
+ :description => 'Outputs to be generated for an Data Plugin',
122
+ :arguments => ['--outputs [OUTPUTS]'],
123
+ :type => Array
124
+
125
+ option :keep_artifacts,
126
+ :description => "Don't remove artifacts after building packages",
127
+ :arguments => ['--keep-artifacts'],
128
+ :type => :boolean
129
+
130
+ option :module_template,
131
+ :description => "Path to the template used by the modulepackager",
132
+ :arguments => ['--module-template PATH'],
133
+ :type => String
134
+
135
+ # Handle alternative format that optparser can't parse.
136
+ def post_option_parser(configuration)
137
+ if ARGV.length >= 1
138
+ configuration[:action] = ARGV.delete_at(0)
139
+
140
+ configuration[:target] = ARGV.delete_at(0) || "."
141
+
142
+ if configuration[:action] == "generate"
143
+ unless ARGV[0] && ARGV[0].match(/(actions|outputs)=(.+)/i)
144
+ unless configuration[:pluginname]
145
+ configuration[:pluginname] = ARGV.delete_at(0)
146
+ else
147
+ ARGV.delete_at(0)
148
+ end
149
+ end
150
+
151
+ ARGV.each do |argument|
152
+ if argument.match(/(actions|outputs)=(.+)/i)
153
+ configuration[$1.downcase.to_sym]= $2.split(",")
154
+ else
155
+ raise "Could not parse --arg '#{argument}'"
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+
162
+ # Display info about plugin
163
+ def info_command
164
+ plugin = prepare_plugin
165
+ packager = PluginPackager["#{configuration[:format].capitalize}Packager"]
166
+ packager.new(plugin).package_information
167
+ end
168
+
169
+ # Generate a plugin skeleton
170
+ def generate_command
171
+ raise "undefined plugin type. cannot generate plugin. valid types are 'agent' and 'data'" if configuration["target"] == '.'
172
+
173
+ unless configuration[:pluginname]
174
+ puts "No plugin name specified. Using 'new_plugin'"
175
+ configuration[:pluginname] = "new_plugin"
176
+ end
177
+
178
+ load_plugin_config_values
179
+
180
+ case configuration[:target].downcase
181
+ when 'agent'
182
+ Generators::AgentGenerator.new(configuration[:pluginname], configuration[:actions], configuration[:pluginname],
183
+ configuration[:description], configuration[:author], configuration[:license],
184
+ configuration[:version], configuration[:url], configuration[:timeout])
185
+ when 'data'
186
+ raise "data plugin must have at least one output" unless configuration[:outputs]
187
+ Generators::DataGenerator.new(configuration[:pluginname], configuration[:outputs], configuration[:pluginname],
188
+ configuration[:description], configuration[:author], configuration[:license],
189
+ configuration[:version], configuration[:url], configuration[:timeout])
190
+ else
191
+ raise "invalid plugin type. cannot generate plugin '#{configuration[:target]}'"
192
+ end
193
+ end
194
+
195
+ # Package plugin
196
+ def package_command
197
+ if configuration[:sign] && Config.instance.pluginconf.include?("debian_packager.keyname")
198
+ configuration[:sign] = Config.instance.pluginconf["debian_packager.keyname"]
199
+ configuration[:sign] = "\"#{configuration[:sign]}\"" unless configuration[:sign].match(/\".*\"/)
200
+ end
201
+
202
+ plugin = prepare_plugin
203
+ (configuration[:pluginpath] = configuration[:pluginpath] + "/") if (configuration[:pluginpath] && !configuration[:pluginpath].match(/^.*\/$/))
204
+ packager = PluginPackager["#{configuration[:format].capitalize}Packager"]
205
+ packager.new(plugin, configuration[:pluginpath], configuration[:sign],
206
+ options[:verbose], configuration[:keep_artifacts],
207
+ configuration[:module_template]).create_packages
208
+ end
209
+
210
+ # Agents are just called 'agent' but newer plugin types are
211
+ # called plugin_plugintype for example facter_facts etc so
212
+ # this will first try the old way then the new way.
213
+ def load_plugin_ddl(plugin, type)
214
+ [plugin, "#{plugin}_#{type}"].each do |p|
215
+ ddl = DDL.new(p, type, false)
216
+ if ddl.findddlfile(p, type)
217
+ ddl.loadddlfile
218
+ return ddl
219
+ end
220
+ end
221
+
222
+ return nil
223
+ end
224
+
225
+ # Show application list and plugin help
226
+ def doc_command
227
+ known_plugin_types = [["Agents", :agent], ["Aggregate", :aggregate],
228
+ ["Connectors", :connector], ["Data Queries", :data],
229
+ ["Discovery Methods", :discovery], ["Validator Plugins", :validator]]
230
+
231
+ if configuration.include?(:target) && configuration[:target] != "."
232
+ if configuration[:target] =~ /^(.+?)\/(.+)$/
233
+ ddl = load_plugin_ddl($2.to_sym, $1)
234
+ else
235
+ found_plugin_type = nil
236
+
237
+ known_plugin_types.each do |plugin_type|
238
+ PluginManager.find(plugin_type[1], "ddl").each do |ddl|
239
+ pluginname = ddl.gsub(/_#{plugin_type[1]}$/, "")
240
+ if pluginname == configuration[:target]
241
+ abort "Duplicate plugin name found, please specify a full path like agent/rpcutil" if found_plugin_type
242
+ found_plugin_type = plugin_type[1]
243
+ end
244
+ end
245
+ end
246
+
247
+ abort "Could not find a plugin named '%s' in any supported plugin type" % configuration[:target] unless found_plugin_type
248
+ ddl = load_plugin_ddl(configuration[:target], found_plugin_type)
249
+ end
250
+
251
+ if ddl
252
+ puts ddl.help(configuration[:rpctemplate])
253
+ else
254
+ abort "Could not find a '%s' plugin named '%s'" % configuration[:target].split('/')
255
+ end
256
+
257
+ else
258
+ puts "Please specify a plugin. Available plugins are:"
259
+ puts
260
+
261
+ load_errors = []
262
+
263
+ known_plugin_types.each do |plugin_type|
264
+ puts "%s:" % plugin_type[0]
265
+
266
+ PluginManager.find(plugin_type[1], "ddl").each do |ddl|
267
+ begin
268
+ help = DDL.new(ddl, plugin_type[1])
269
+ pluginname = ddl.gsub(/_#{plugin_type[1]}$/, "")
270
+ puts " %-25s %s" % [pluginname, help.meta[:description]]
271
+ rescue => e
272
+ load_errors << [plugin_type[1], ddl, e]
273
+ end
274
+ end
275
+
276
+ puts
277
+ end
278
+
279
+ unless load_errors.empty?
280
+ puts "Plugin Load Errors:"
281
+
282
+ load_errors.each do |e|
283
+ puts " %-25s %s" % ["#{e[0]}/#{e[1]}", Util.colorize(:yellow, e[2])]
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ # Creates the correct package plugin object.
290
+ def prepare_plugin
291
+ plugintype = set_plugin_type unless configuration[:plugintype]
292
+ configuration[:format] = "ospackage" unless configuration[:format]
293
+ PluginPackager.load_packagers
294
+ plugin_class = PluginPackager[configuration[:plugintype]]
295
+
296
+ if configuration[:dependency] && configuration[:dependency].size == 1
297
+ configuration[:dependency] = configuration[:dependency][0].split(" ")
298
+ elsif configuration[:dependency]
299
+ configuration[:dependency].map!{|dep| {:name => dep, :version => nil}}
300
+ end
301
+
302
+ mcdependency = {:mcname => configuration[:mcname], :mcversion => configuration[:mcversion]}
303
+
304
+ # Deprecation warning for --iteration
305
+ if configuration[:iteration]
306
+ puts 'Warning. The --iteration flag has been deprecated. Please use --revision instead.'
307
+ configuration[:revision] = configuration[:iteration] unless configuration[:revision]
308
+ end
309
+
310
+ plugin_class.new(configuration, mcdependency, plugintype)
311
+ end
312
+
313
+ def plugin_directory_exists?(plugin_type)
314
+ File.directory?(File.join(PluginPackager.get_plugin_path(configuration[:target]), plugin_type))
315
+ end
316
+
317
+ # Identify plugin type if not provided.
318
+ def set_plugin_type
319
+ if plugin_directory_exists?("agent") || plugin_directory_exists?("application")
320
+ configuration[:plugintype] = "AgentDefinition"
321
+ return "Agent"
322
+ elsif plugin_directory_exists?(plugintype = identify_plugin)
323
+ configuration[:plugintype] = "StandardDefinition"
324
+ return plugintype
325
+ else
326
+ raise RuntimeError, "target directory is not a valid mcollective plugin"
327
+ end
328
+ end
329
+
330
+ # If plugintype is StandardDefinition, identify which of the special
331
+ # plugin types we are dealing with based on directory structure.
332
+ # To keep it simple we limit it to one type per target directory.
333
+ # Return the name of the type of plugin as a string
334
+ def identify_plugin
335
+ plugintype = Dir.glob(File.join(configuration[:target], "*")).select do |file|
336
+ File.directory?(file) && file.match(/(connector|facts|registration|security|audit|pluginpackager|data|discovery|validator)/)
337
+ end
338
+
339
+ raise RuntimeError, "more than one plugin type detected in directory" if plugintype.size > 1
340
+ raise RuntimeError, "no plugins detected in directory" if plugintype.size < 1
341
+
342
+ File.basename(plugintype[0])
343
+ end
344
+
345
+ # Load preset metadata values from config if they are present
346
+ # This makes it possible to override metadata values in a local
347
+ # client config file.
348
+ #
349
+ # Example : plugin.metadata.license = Apache 2
350
+ def load_plugin_config_values
351
+ config = Config.instance
352
+ [:pluginname, :description, :author, :license, :version, :url, :timeout].each do |confoption|
353
+ configuration[confoption] = config.pluginconf["metadata.#{confoption}"] unless configuration[confoption]
354
+ end
355
+ end
356
+
357
+ def main
358
+ abort "No action specified, please run 'mco help plugin' for help" unless configuration.include?(:action)
359
+
360
+ cmd = "#{configuration[:action]}_command"
361
+
362
+ if respond_to? cmd
363
+ send cmd
364
+ else
365
+ abort "Invalid action #{configuration[:action]}, please run 'mco help plugin' for help."
366
+ end
367
+ end
368
+ end
369
+ end