diff --git a/app/models/host.rb b/app/models/host.rb index 648ab65..39389dc 100644 --- a/app/models/host.rb +++ b/app/models/host.rb @@ -1,75 +1,75 @@ class Host < ActiveRecord::Base establish_connection Baas::settings[:local_db] FILE_RETENTION_DAYS = 60 JOB_RETENTION_DAYS = 180 CATALOG = 'MyCatalog' AUTOPRUNE = 1 enum status: { draft: 0, pending: 1, config: 2, ready: 3 } belongs_to :client, class_name: :Client, foreign_key: :name, primary_key: :name has_many :filesets, dependent: :destroy has_many :job_templates, dependent: :destroy validates :file_retention, :job_retention, :port, :password, presence: true validates :port, numericality: true validates :name, presence: true, uniqueness: true validate :fqdn_format scope :not_baculized, -> { where(baculized: false) } before_validation :set_retention, :unset_baculized, :sanitize_name def baculize_config templates = job_templates.enabled.includes(:fileset, :schedule) - result = [self] + templates.map {|x| [x, x.fileset, x.schedule] }.flatten + result = [self] + templates.map {|x| [x, x.fileset, x.schedule] }.flatten.compact.uniq result.map(&:to_bacula_config_array) end def to_bacula_config_array [ "Client {", " Name = #{name}", " Address = #{fqdn}", " FDPort = #{port}", " Catalog = #{CATALOG}", " Password = \"#{password}\"", " File Retention = #{file_retention} days", " Job Retention = #{job_retention} days", " AutoPrune = yes", "}" ] end def auto_prune_human AUTOPRUNE == 1 ? 'yes' : 'no' end private def sanitize_name self.name = fqdn end def set_retention self.file_retention = FILE_RETENTION_DAYS self.job_retention = JOB_RETENTION_DAYS end def unset_baculized self.baculized = false if new_record? true end def fqdn_format regex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(? { where(enabled: true) } # configurable DEFAULT_OPTIONS = { storage: :File, pool: :Default, messages: :Standard, priority: 10, :'Write Bootstrap' => '"/var/lib/bacula/%c.bsr"' } def to_bacula_config_array ['Job {'] + - DEFAULT_OPTIONS.map { |k,v| " #{k.capitalize} = #{v}" } + options_array.map { |x| " #{x}" } + + DEFAULT_OPTIONS.map { |k,v| " #{k.capitalize} = #{v}" } + ['}'] end def priority DEFAULT_OPTIONS[:priority] end def enabled_human enabled? ? 'yes' : 'no' end def schedule_human schedule.present? ? schedule.name : '-' end def save_and_create_restore_job if save_status = save restore_job = JobTemplate.new(host: host, job_type: :restore, fileset: fileset, name: 'Restore_' + name) restore_job.save end save_status end private # Sets the default job_type as backup def set_job_type self.job_type = :backup if job_type.nil? end def options_array - result = restore? ? ['Where = "/tmp/bacula-restores"'] : [] - result += [ + result = [ "Name = \"#{name}\"", "FileSet = \"#{fileset.name}\"", "Client = \"#{host.name}\"", - "Type = \"#{job_type.capitalize}\"", - "Schedule = \"#{schedule.name}\"" + "Type = \"#{job_type.capitalize}\"" ] + if restore? + result += ['Where = "/tmp/bacula-restores"'] + else + result += ["Schedule = \"#{schedule.name}\""] + end + result end end