Skip to content

Commit 238d9dc

Browse files
committed
system_config: support built-in config files
In the previous versions, if you want to manage multiple configuration files, you must use @include directive. In this commit, add an option to specify the directory (e.g. /etc/fluent/conf.d) which stores additional configuration files. If there are such files under specified directory, they are loaded by default without @include directive. If you want to disable this feature, set empty string for config_include_dir "". Signed-off-by: Kentaro Hayashi <hayashi@clear-code.com>
1 parent 3a6826a commit 238d9dc

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

lib/fluent/config/v1_parser.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
require 'strscan'
1818
require 'uri'
19+
require 'find'
1920

2021
require 'fluent/config/error'
2122
require 'fluent/config/basic_parser'
@@ -38,6 +39,7 @@ def initialize(strscan, include_basepath, fname, eval_context)
3839
@include_basepath = include_basepath
3940
@fname = fname
4041
@logger = defined?($log) ? $log : nil
42+
@included_config_files = []
4143
end
4244

4345
def parse!
@@ -96,6 +98,10 @@ def parse_element(root_element, elem_name, attrs = {}, elems = [])
9698
e_attrs, e_elems = parse_element(false, e_name)
9799
new_e = Element.new(e_name, e_arg, e_attrs, e_elems)
98100
new_e.v1_config = true
101+
if e_name == "system" and not e_attrs["config_include_dir"]&.empty?
102+
# include additional configuration files
103+
include_additional_config_files(attrs, elems, e_attrs["config_include_dir"])
104+
end
99105
elems << new_e
100106

101107
elsif root_element && skip(/(\@include|include)#{SPACING}/)
@@ -143,6 +149,9 @@ def parse_element(root_element, elem_name, attrs = {}, elems = [])
143149

144150
def parse_include(attrs, elems)
145151
uri = scan_string(LINE_END)
152+
if @included_config_files.include?(File.expand_path(File.join(@include_basepath, uri)))
153+
return
154+
end
146155
eval_include(attrs, elems, uri)
147156
line_end
148157
end
@@ -183,6 +192,30 @@ def eval_include(attrs, elems, uri)
183192
raise cpe
184193
end
185194

195+
def include_additional_config_files(attrs, elems, config_dir)
196+
if config_dir.empty?
197+
@logger.info "disable additional config directory" if @logger
198+
return
199+
end
200+
unless File.directory?(config_dir)
201+
@logger.warn "no valid config directory: <#{config_dir}>" if @logger
202+
return
203+
end
204+
Find.find("#{config_dir}") do |path|
205+
next if File.directory?(path)
206+
unless path.end_with?(".conf")
207+
@logger.debug "ignore non config file: #{path}" if @logger
208+
next
209+
end
210+
expanded_config_path = File.expand_path(path)
211+
unless @included_config_files.include?(expanded_config_path)
212+
@included_config_files << expanded_config_path
213+
@logger.info "include additional #{expanded_config_path}" if @logger
214+
eval_include(attrs, elems, expanded_config_path)
215+
end
216+
end
217+
end
218+
186219
# override
187220
def error_sample
188221
"#{@fname} #{super}"

lib/fluent/env.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module Fluent
2424
DEFAULT_PLUGIN_DIR = ENV['FLUENT_PLUGIN'] || '/etc/fluent/plugin'
2525
DEFAULT_SOCKET_PATH = ENV['FLUENT_SOCKET'] || '/var/run/fluent/fluent.sock'
2626
DEFAULT_BACKUP_DIR = ENV['FLUENT_BACKUP_DIR'] || '/tmp/fluent'
27+
DEFAULT_CONFIG_DIR = ENV['FLUENT_CONF_DIR'] || '/etc/fluent/conf.d'
2728
DEFAULT_OJ_OPTIONS = Fluent::OjOptions.load_env
2829
DEFAULT_DIR_PERMISSION = 0755
2930
DEFAULT_FILE_PERMISSION = 0644

lib/fluent/system_config.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class SystemConfig
2828
:without_source, :with_source_only, :rpc_endpoint, :enable_get_dump, :process_name,
2929
:file_permission, :dir_permission, :counter_server, :counter_client,
3030
:strict_config_value, :enable_msgpack_time_support, :disable_shared_socket,
31-
:metrics, :enable_input_metrics, :enable_size_metrics, :enable_jit, :source_only_buffer
31+
:metrics, :enable_input_metrics, :enable_size_metrics, :enable_jit, :source_only_buffer,
32+
:config_include_dir
3233
]
3334

3435
config_param :workers, :integer, default: 1
@@ -58,6 +59,7 @@ class SystemConfig
5859
config_param :dir_permission, default: nil do |v|
5960
v.to_i(8)
6061
end
62+
config_param :config_include_dir, default: ENV["FLUENT_CONF_DIR"] || '/etc/fluent/conf.d'
6163
config_section :log, required: false, init: true, multi: false do
6264
config_param :path, :string, default: nil
6365
config_param :format, :enum, list: [:text, :json], default: :text

0 commit comments

Comments
 (0)