mirror of
https://github.com/elastic/logstash.git
synced 2025-04-23 14:17:58 -04:00
92 lines
2.9 KiB
Ruby
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
|