theforeman/foreman_maintain

View on GitHub
definitions/procedures/backup/metadata.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Procedures::Backup
  class Metadata < ForemanMaintain::Procedure
    metadata do
      description 'Generate metadata'
      tags :backup
      preparation_steps { Checks::Foreman::DBUp.new if feature(:foreman_server) }
      param :backup_dir, 'Directory where to backup to', :required => true
      param :incremental_dir, 'Changes since specified backup only'
      param :online_backup, 'Select for online backup', :flag => true, :default => false
    end

    PROXY_CONFIG_ENTRIES = %w[dns dns_interface dhcp dhcp_interface].freeze

    def run
      with_spinner('Collecting metadata') do |spinner|
        metadata = {}
        metadata['os_version'] = release_info(spinner)
        metadata['plugin_list'] = plugin_list(spinner) || []
        metadata['proxy_features'] = proxy_feature_list(spinner) || []
        installed_pkgs(metadata)
        metadata['incremental'] = @incremental_dir || false
        metadata['online'] = @online_backup
        metadata['hostname'] = hostname
        metadata['proxy_config'] = proxy_config(spinner)
        save_metadata(metadata, spinner)
      end
    end

    private

    def installed_pkgs(metadata)
      installed_pkgs = package_manager.list_installed_packages
      if el?
        metadata[:rpms] = installed_pkgs
      else
        metadata[:debs] = installed_pkgs
      end
    end

    def save_metadata(metadata, spinner)
      spinner.update('Saving metadata to metadata.yml')
      File.open(File.join(@backup_dir, 'metadata.yml'), 'w') do |metadata_file|
        metadata_file.puts metadata.to_yaml
      end
    end

    def release_info(spinner)
      spinner.update('Collecting system release info')
      "#{os_name} #{os_version}"
    end

    def plugin_list(spinner)
      if feature(:foreman_server)
        spinner.update('Collecting list of plugins')
        feature(:foreman_server).plugins
      end
    end

    def proxy_feature_list(spinner)
      if feature(:foreman_proxy)
        spinner.update('Collecting list of proxy features')
        feature(:foreman_proxy).features
      end
    end

    def proxy_config(spinner)
      if feature(:installer)
        spinner.update('Collecting proxy configuration')
        feature(:installer).answers['foreman_proxy'].select do |key, _|
          PROXY_CONFIG_ENTRIES.include?(key)
        end
      end
    end
  end
end