diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index d605dfa..1b45fd1 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -1,31 +1,61 @@ class Admin::SettingsController < Admin::BaseController + before_action :fetch_configuration_settings, only: [:edit, :update, :reset] + # GET /admin/settings def index @settings = ConfigurationSetting.last || ConfigurationSetting.new end - # GET /admin/settings/1 - def show - end - # GET /admin/settings/new def new @setting = ConfigurationSetting.new end # GET /admin/settings/1/edit def edit end # POST /admin/settings def create + @setting = ConfigurationSetting.new(fetch_params) + if @setting.save + flash[:success] = 'Configuration Submitted' + redirect_to admin_settings_path + else + flash[:error] = 'Configuration was not submitted' + render :new + end end # PATCH /admin/settings/1/update def update + if fetch_params.present? && @setting.update_attributes(fetch_params) + flash[:success] = 'Configuration Submitted' + redirect_to admin_settings_path + else + flash[:error] = 'Configuration was not submitted' + render :edit + end + end + + # DELETE /admin/settings/1/reset + def reset + @setting.destroy + redirect_to admin_settings_path + end + + private + + def fetch_configuration_settings + @setting = ConfigurationSetting.find(params[:id]) end - # DELETE /admin/settings/1/delete - def destroy + def fetch_params + params.require(:configuration_setting). + permit( + job: [:storage, :pool, :messages, :priority, :'Write Bootstrap'], + client: [:catalog, :file_retention, :file_retention_period_type, :job_retention, + :job_retention_period_type, :autoprune] + ) end end diff --git a/app/models/configuration_setting.rb b/app/models/configuration_setting.rb index 4011253..01451d3 100644 --- a/app/models/configuration_setting.rb +++ b/app/models/configuration_setting.rb @@ -1,60 +1,80 @@ # ConfigurationSetting class describes a model that keeps the current Bacula # configuration. # # It has some hard coded settings as defaults. # Archiving's admins can enter new settings concerning: # # * jobs # * clients # # and override the default ones. # # ConfigurationSetting is supposed to have only one record in persisted in the database # which will hold the altered configuration as a patch to the defaults. # Admins can reset this change at any time. class ConfigurationSetting < ActiveRecord::Base serialize :job, JSON serialize :client, JSON JOB = { storage: :File, pool: :Default, messages: :Standard, priority: 10, :'Write Bootstrap' => '"/var/lib/bacula/%c.bsr"' } CLIENT = { catalog: 'MyCatalog', file_retention: 60, file_retention_period_type: 'days', job_retention: 180, job_retention_period_type: 'days', autoprune: 'yes' } RETENTION_PERIODS = %w{seconds minutes hours days weeks months quarters years} AUTOPRUNE_OPTIONS = ['yes', 'no'] # Fetches the current configuration for jobs. # # The current configuration is the last submitted record, patched to the default # settings. # If there is no record, the default settings are returned # # @return [Hash] with settings def self.current_job_settings (last || new).job.symbolize_keys.reverse_merge(JOB.dup) end # Fetches the current configuration for clients. # # The current configuration is the last submitted record, patched to the default # settings. # If there is no record, the default settings are returned # # @return [Hash] with settings def self.current_client_settings (last || new).client.symbolize_keys.reverse_merge(CLIENT.dup) end + + # Fetches the record's configuration for jobs. + # + # The configuration is the record's configuration patched to the default + # settings. + # + # @return [Hash] with settings + def current_job_settings + job.symbolize_keys.reverse_merge(JOB.dup) + end + + # Fetches the record's configuration for clients. + # + # The configuration is the record's configuration patched to the default + # settings. + # + # @return [Hash] with settings + def current_client_settings + client.symbolize_keys.reverse_merge(CLIENT.dup) + end end diff --git a/app/models/pool.rb b/app/models/pool.rb index 295a7c3..301263a 100644 --- a/app/models/pool.rb +++ b/app/models/pool.rb @@ -1,33 +1,37 @@ class Pool < ActiveRecord::Base self.table_name = :Pool self.primary_key = :PoolId alias_attribute :pool_id, :PoolId alias_attribute :name, :Name alias_attribute :num_vols, :NumVols alias_attribute :max_vols, :MaxVols alias_attribute :use_once, :UseOnce alias_attribute :use_catalog, :UseCatalog alias_attribute :accept_any_volume, :AcceptAnyVolume alias_attribute :vol_retention, :VolRetention alias_attribute :vol_use_duration, :VolUseDuration alias_attribute :max_vol_jobs, :MaxVolJobs alias_attribute :max_vol_files, :MaxVolFiles alias_attribute :max_vol_bytes, :MaxVolBytes alias_attribute :auto_prune, :AutoPrune alias_attribute :recycle, :Recycle alias_attribute :action_on_purge, :ActionOnPurge alias_attribute :pool_type, :PoolType alias_attribute :label_type, :LabelType alias_attribute :label_format, :LabelFormat alias_attribute :enabled, :Enabled alias_attribute :scratch_pool_id, :ScratchPoolId alias_attribute :recycle_pool_id, :RecyclePoolId alias_attribute :next_pool_id, :NextPoolId alias_attribute :migration_high_bytes, :MigrationHighBytes alias_attribute :migration_low_bytes, :MigrationLowBytes alias_attribute :migration_time, :MigrationTime has_many :jobs, foreign_key: :PoolId has_many :media, foreign_key: :PoolId + + def self.available_options + pluck(:Name) + end end diff --git a/app/models/storage.rb b/app/models/storage.rb index bb6249e..f99950d 100644 --- a/app/models/storage.rb +++ b/app/models/storage.rb @@ -1,10 +1,14 @@ class Storage < ActiveRecord::Base self.table_name = :Storage self.primary_key = :StorageId alias_attribute :storage_id, :StorageId alias_attribute :name, :Name alias_attribute :auto_changer, :AutoChanger has_many :media, foreign_key: :StorageId + + def self.available_options + pluck(:Name) + end end diff --git a/app/views/admin/settings/_form.html.erb b/app/views/admin/settings/_form.html.erb new file mode 100644 index 0000000..66aa233 --- /dev/null +++ b/app/views/admin/settings/_form.html.erb @@ -0,0 +1,53 @@ +
+ <%= bootstrap_form_for(@setting, url: path, layout: :horizontal, + label_col: 'col-xs-5', control_col: 'col-xs-6') do |f| %> +
+
+

Job

+
+
+ + <%= f.fields_for :job do |jb| %> + <%= jb.select :storage, + options_for_select(Storage.available_options, @setting.current_job_settings[:storage]) %> + <%= jb.select :pool, + options_for_select(Pool.available_options, @setting.current_job_settings[:pool]) %> + <%= jb.text_field :messages, :value => @setting.current_job_settings[:messages] %> + <%= jb.text_field :'Write Bootstrap', + :value => @setting.current_job_settings[:'Write Bootstrap'] %> + <%= jb.number_field :priority, :value => @setting.current_job_settings[:priority] %> + <% end %> + +
+
+

Client

+
+
+ + <%= f.fields_for :client do |c| %> + <%= c.text_field :catalog, :value => @setting.current_client_settings[:catalog] %> + <%= c.number_field :file_retention, + :value => @setting.current_client_settings[:file_retention] %> + <%= c.select :file_retention_period_type, + options_for_select(ConfigurationSetting::RETENTION_PERIODS, + @setting.current_client_settings[:file_retention_period_type]) %> + <%= c.number_field :job_retention, + :value => @setting.current_client_settings[:job_retention] %> + <%= c.select :job_retention_period_type, + options_for_select(ConfigurationSetting::RETENTION_PERIODS, + @setting.current_client_settings[:job_retention_period_type]) %> + <%= c.select :autoprune, ConfigurationSetting::AUTOPRUNE_OPTIONS, + :value => @setting.current_client_settings[:autoprune] %> + <% end %> + +
+ +
+
+ <%= f.submit class: 'btn btn-success' %> +
+
+ +
+ <% end %> +
diff --git a/app/views/admin/settings/edit.html.erb b/app/views/admin/settings/edit.html.erb new file mode 100644 index 0000000..0b07f3e --- /dev/null +++ b/app/views/admin/settings/edit.html.erb @@ -0,0 +1,5 @@ +

Settings

+ +<%= render partial: 'form', locals: { path: admin_setting_path } %> + +<%= link_to 'Cancel', admin_settings_path %> diff --git a/app/views/admin/settings/index.html.erb b/app/views/admin/settings/index.html.erb index 6fc37b5..12ae87d 100644 --- a/app/views/admin/settings/index.html.erb +++ b/app/views/admin/settings/index.html.erb @@ -1,25 +1,42 @@

Settings

<% if !@settings.persisted? %> <% end %>

Client Settings

Job Settings

<%= table_for(ConfigurationSetting.current_job_settings) %>
<%= table_for(ConfigurationSetting.current_client_settings) %>
+ +
+
+ <%= link_to 'Change Config', + @settings.persisted? ? edit_admin_setting_path(@settings) : new_admin_setting_path, + class: 'btn btn-primary', role: 'button' + %> +
+ <% if @settings.persisted? %> +
+ <%= link_to 'Restore to defaults', reset_admin_setting_path(@settings), method: :delete, + data: { confirm: 'This will reset the configuration to the defaults' }, + class: 'btn btn-danger', role: 'button' + %> +
+ <% end %> +
diff --git a/app/views/admin/settings/new.html.erb b/app/views/admin/settings/new.html.erb new file mode 100644 index 0000000..3054847 --- /dev/null +++ b/app/views/admin/settings/new.html.erb @@ -0,0 +1,5 @@ +

Settings

+ +<%= render partial: 'form', locals: { path: admin_settings_path } %> + +<%= link_to 'Cancel', admin_settings_path %> diff --git a/config/routes.rb b/config/routes.rb index 140cbf4..fd1cd01 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,61 +1,65 @@ Rails.application.routes.draw do root 'clients#index' resources :clients, only: [:index, :show] do member do get :jobs get :logs get :stats post :stats end collection do post :index end end resources :hosts, only: [:new, :create, :show, :edit, :update, :destroy] do member do post :submit_config get :restore post :run_restore delete :revoke end resources :jobs, only: [:new, :create, :show, :edit, :update, :destroy] do member do patch :toggle_enable post :backup_now end end resources :filesets, only: [:show, :new, :create, :destroy] resources :schedules, only: [:show, :new, :edit, :create, :update, :destroy] end namespace :admin do match '/', to: 'base#index', via: [:get, :post] - resources :settings + resources :settings, only: [:index, :new, :create, :edit, :update] do + member do + delete :reset + end + end resources :clients, only: [:index, :show] do member do get :jobs get :logs get :stats post :stats get :configuration end end resources :hosts, only: [:show] do collection do get :unverified end member do post :verify end end end end