logstash/lib/pluginmanager/generate.rb
2016-06-01 16:15:37 +00:00

92 lines
2.9 KiB
Ruby

# encoding: utf-8
require "pluginmanager/command"
require "pluginmanager/templates/render_context"
require "erb"
require "ostruct"
require "fileutils"
require "pathname"
class LogStash::PluginManager::Generate < LogStash::PluginManager::Command
TYPES = [ "input", "filter", "output", "codec" ]
option "--type", "TYPE", "Type of the plugin {input, filter, codec, output}s", :required => true
option "--name", "PLUGIN", "Name of the new plugin", :required => true
option "--path", "PATH", "Location where the plugin skeleton will be created", :default => Dir.pwd
def execute
validate_params
source = File.join(File.dirname(__FILE__), "templates", "#{type}-plugin")
@target_path = File.join(path, full_plugin_name)
FileUtils.mkdir(@target_path)
puts " Creating #{@target_path}"
begin
create_scaffold(source, @target_path)
rescue Errno::EACCES => exception
report_exception("Permission denied when executing the plugin manager", exception)
rescue => exception
report_exception("Plugin creation Aborted", exception)
end
end
private
def validate_params
raise(ArgumentError, "should be one of: input, filter, codec or output") unless TYPES.include?(type)
end
def create_scaffold(source, target)
transform_r(source, target)
end
def transform_r(source, target)
Dir.entries(source).each do |entry|
next if [ ".", ".." ].include?(entry)
source_entry = File.join(source, entry)
target_entry = File.join(target, entry)
if File.directory?(source_entry)
FileUtils.mkdir(target_entry) unless File.exists?(target_entry)
transform_r(source_entry, target_entry)
else
# copy the new file, in case of being an .erb file should render first
if source_entry.end_with?("erb")
target_entry = target_entry.gsub(/.erb$/,"").gsub("example", name)
File.open(target_entry, "w") { |f| f.write(render(source_entry)) }
else
FileUtils.cp(source_entry, target_entry)
end
puts "\t create #{File.join(full_plugin_name, Pathname.new(target_entry).relative_path_from(Pathname.new(@target_path)))}"
end
end
end
def render(source)
template = File.read(source)
renderer = ERB.new(template)
context = LogStash::PluginManager::RenderContext.new(options)
renderer.result(context.get_binding)
end
def options
git_data = get_git_info
@options ||= {
:plugin_name => name,
:author => git_data.author,
:email => git_data.email,
:min_version => "2.0",
}
end
def get_git_info
git = OpenStruct.new
git.author = %x{ git config --get user.name }.strip rescue "your_username"
git.email = %x{ git config --get user.email }.strip rescue "your_username@example.com"
git
end
def full_plugin_name
@full_plugin_name ||= "logstash-#{type}-#{name.downcase}"
end
end