app/models/fluentd/setting/config.rb
require 'fluent/config'
class Fluentd
module Setting
class Config
attr_reader :fl_config, :file
delegate :elements, to: :fl_config
def initialize(config_file)
@fl_config = Fluent::Config.parse(IO.read(config_file), config_file, nil, true)
@file = config_file
end
def empty?
elements.length.zero?
end
def sources
elements.find_all do |elm|
elm.name == "source"
end
end
def filters
elements.find_all do |elm|
elm.name == "filter"
end
end
def matches
elements.find_all do |elm|
elm.name == "match"
end
end
def labels
elements.find_all do |elm|
elm.name == "label"
end
end
def group_by_label
hash = Hash.new{|h, k| h[k] = {} }
sources.each do |source|
label = source["@label"] || source["label"]
if label
hash[label][:sources] = [source]
else
hash["ROOT"][:sources] = [source]
end
end
hash["ROOT"][:filters] = filters unless filters.empty?
hash["ROOT"][:matches] = matches unless matches.empty?
labels.each do |label|
hash[label.arg][:filters] = label.elements.find_all do |e|
e.name == "filter"
end
hash[label.arg][:matches] = label.elements.find_all do |e|
e.name == "match"
end
end
hash
end
def delete_element(name, arg, element)
if name == "label"
label_section = fl_config.elements(name: name, arg: arg).first
original_size = label_section.elements.size
remaining_elements = label_section.elements.reject do |e|
element == e
end
if remaining_elements.empty?
remaining_elements = fl_config.elements.reject do |e|
label_section == e
end
fl_config.elements = remaining_elements
return element
else
label_section.elements = remaining_elements
if original_size == label_section.elements.size
return nil
else
return element
end
end
else
original_size = fl_config.elements.size
remaining_elements = fl_config.elements.reject do |e|
element == e
end
fl_config.elements = remaining_elements
if original_size == fl_config.elements.size
return nil
else
return element
end
end
end
def write_to_file
return unless Fluentd.instance
Fluentd.instance.agent.config_write formatted
end
def formatted
fl_config.to_s.gsub(/<\/?ROOT>/, "").strip_heredoc.gsub(%r|^</.*?>$|, "\\0\n")
end
end
end
end