From 86351718f34c92d673d79104aef54c85fc0c0e84 Mon Sep 17 00:00:00 2001 From: uu59 Date: Tue, 25 Nov 2014 17:51:57 +0900 Subject: [PATCH] Add JSON API for changing config by section --- app/controllers/api/settings_controller.rb | 45 +++++++++++++++++++ app/models/fluentd/setting/config.rb | 10 ++++- app/views/api/settings/_element.json.jbuilder | 6 +++ app/views/api/settings/index.json.jbuilder | 3 ++ app/views/api/settings/show.json.jbuilder | 1 + config/application.rb | 1 + config/routes.rb | 2 + 7 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 app/controllers/api/settings_controller.rb create mode 100644 app/views/api/settings/_element.json.jbuilder create mode 100644 app/views/api/settings/index.json.jbuilder create mode 100644 app/views/api/settings/show.json.jbuilder diff --git a/app/controllers/api/settings_controller.rb b/app/controllers/api/settings_controller.rb new file mode 100644 index 0000000..8a6f68c --- /dev/null +++ b/app/controllers/api/settings_controller.rb @@ -0,0 +1,45 @@ +class Api::SettingsController < ApplicationController + before_action :login_required + before_action :find_fluentd + before_action :set_config + before_action :set_section, only: [:show, :update, :destroy] + helper_method :element_id + respond_to :json + + def index + end + + def update + coming = Fluent::Config::V1Parser.parse(params[:body], @fluentd.config_file) + current = @section + index = @config.elements.index current + @config.elements[index] = coming.elements.first + @config.write_to_file + head :no_content # 204 + end + + def destroy + @config.elements.delete @section + @config.write_to_file + head :no_content # 204 + end + + private + + def set_config + # TODO: not found + @config = Fluentd::Setting::Config.new(@fluentd.config_file) + end + + def set_section + # TODO: not found + @section = @config.elements.find do |elm| + element_id(elm) == params[:id] + end + end + + def element_id(element) + index = @config.elements.index(element) # TODO: not found + "#{"%06d" % index}#{Digest::MD5.hexdigest(element.to_s)}" + end +end diff --git a/app/models/fluentd/setting/config.rb b/app/models/fluentd/setting/config.rb index ed5ba74..45d0fed 100644 --- a/app/models/fluentd/setting/config.rb +++ b/app/models/fluentd/setting/config.rb @@ -4,7 +4,7 @@ class Fluentd module Setting class Config attr_reader :fl_config, :file - delegate :elements, :to_s, to: :fl_config + delegate :elements, to: :fl_config def initialize(config_file) @fl_config = Fluent::Config.parse(IO.read(config_file), config_file, nil, true) @@ -26,6 +26,14 @@ class Fluentd elm.name == "match" end end + + def write_to_file + File.open(file, "w"){|f| f.write formatted } + end + + def formatted + fl_config.to_s.gsub(/<\/?ROOT>/, "").strip_heredoc.gsub(%r|^$|, "\\0\n") + end end end end diff --git a/app/views/api/settings/_element.json.jbuilder b/app/views/api/settings/_element.json.jbuilder new file mode 100644 index 0000000..bc58a7d --- /dev/null +++ b/app/views/api/settings/_element.json.jbuilder @@ -0,0 +1,6 @@ +json.id element_id(element) +json.name element.name +json.type element["type"] +json.arg element.arg +json.settings element +json.content element.to_s diff --git a/app/views/api/settings/index.json.jbuilder b/app/views/api/settings/index.json.jbuilder new file mode 100644 index 0000000..2b565f8 --- /dev/null +++ b/app/views/api/settings/index.json.jbuilder @@ -0,0 +1,3 @@ +json.array! @config.elements do |elm| + json.partial! "api/settings/element", element: elm +end diff --git a/app/views/api/settings/show.json.jbuilder b/app/views/api/settings/show.json.jbuilder new file mode 100644 index 0000000..a4e3486 --- /dev/null +++ b/app/views/api/settings/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/settings/element", element: @section diff --git a/config/application.rb b/config/application.rb index 1d09d9e..dfbc258 100644 --- a/config/application.rb +++ b/config/application.rb @@ -19,6 +19,7 @@ require "jquery-rails" require "sucker_punch" require "settingslogic" require "kramdown-haml" +require "jbuilder" module FluentdUi class Application < Rails::Application diff --git a/config/routes.rb b/config/routes.rb index 6bfc44d..c698a5d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -93,5 +93,7 @@ Rails.application.routes.draw do get "file_preview" post "regexp_preview" post "grok_to_regexp" + + resources :settings, only: [:index, :show, :update, :destroy], defaults: { format: "json" } end end