class ForemanMaintain::PackageManager::Dnf

Constants

PROTECTOR_CONFIG_FILE
PROTECTOR_WHITELIST_FILE

Public Class Methods

parse_envra(envra) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 6
def self.parse_envra(envra)
  # envra format: 0:foreman-1.20.1.10-1.el7sat.noarch
  parsed = envra.match(/\d*:?(?<name>.*)-[^-]+-[^-]+\.[^.]+/)
  parsed ? Hash[parsed.names.map(&:to_sym).zip(parsed.captures)].merge(:envra => envra) : nil
end

Public Instance Methods

check_update(packages: nil, with_status: false) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 72
def check_update(packages: nil, with_status: false)
  dnf_action(
    'check-update',
    packages,
    assumeyes: true,
    valid_exit_statuses: [0, 100],
    with_status: with_status
  )
end
clean_cache(assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 100
def clean_cache(assumeyes: false)
  dnf_action('clean', 'metadata', :assumeyes => assumeyes)
end
enable_module(name) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 113
def enable_module(name)
  dnf_action('module enable', name, assumeyes: true)
end
files_not_owned_by_package(directory) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 87
def files_not_owned_by_package(directory)
  find_cmd = "find #{directory} -exec /bin/sh -c 'rpm -qf {} &> /dev/null || echo {}' \\;"
  sys.execute(find_cmd).split("\n")
end
find_installed_package(name, queryformat = '') click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 39
def find_installed_package(name, queryformat = '')
  rpm_cmd = "rpm -q '#{name}'"
  unless queryformat.empty?
    rpm_cmd += " --qf '#{queryformat}'"
  end
  status, result = sys.execute_with_status(rpm_cmd, interactive: false)
  if status == 0
    result
  end
end
info(name) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 126
def info(name)
  dnf_action('module info', name, with_status: true, assumeyes: true)
end
install(packages, assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 50
def install(packages, assumeyes: false)
  dnf_action('install', packages, assumeyes: assumeyes)
end
installed?(packages) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 34
def installed?(packages)
  packages_list = [packages].flatten(1).map { |pkg| "'#{pkg}'" }.join(' ')
  sys.execute?(%(rpm -q #{packages_list}))
end
list_installed_packages(queryformat = '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n') click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 92
def list_installed_packages(queryformat = '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n')
  # The queryformat should only include valid tag(s) as per `rpm --querytags` list.
  # If any special formatting is required with querytag then it should be provided with tag i.e,
  # "--%{VENDOR}"
  # The queryformat string must end with '\n'
  sys.execute!("rpm -qa --qf '#{queryformat}'").split("\n")
end
lock_versions() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 12
def lock_versions
  enable_protector
end
module_enabled?(name) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 108
def module_enabled?(name)
  _status, result = info(name)
  result.match?(/Stream.+\[e\].+/)
end
module_exists?(name) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 121
def module_exists?(name)
  status, _result = info(name)
  status == 0
end
modules_supported?() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 104
def modules_supported?
  true
end
protector_whitelist_file_nonzero?() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 25
def protector_whitelist_file_nonzero?
  File.exist?(PROTECTOR_WHITELIST_FILE) &&
    !File.zero?(PROTECTOR_WHITELIST_FILE)
end
reboot_required?() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 130
def reboot_required?
  sys.execute_with_status('dnf needs-restarting --reboothint', :interactive => false)
end
reinstall(packages, assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 54
def reinstall(packages, assumeyes: false)
  dnf_action('reinstall', packages, assumeyes: assumeyes)
end
remove(packages, assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 58
def remove(packages, assumeyes: false)
  dnf_action('remove', packages, assumeyes: assumeyes)
end
switch_module(name) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 117
def switch_module(name)
  dnf_action('module switch-to', name, assumeyes: true)
end
unlock_versions() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 16
def unlock_versions
  disable_protector
end
update(packages = [], assumeyes: false, download_only: false, enabled_repos: []) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 62
def update(packages = [], assumeyes: false, download_only: false, enabled_repos: [])
  dnf_action(
    'update',
    packages,
    assumeyes: assumeyes,
    download_only: download_only,
    enabled_repos: enabled_repos
  )
end
update_available?(package) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 82
def update_available?(package)
  cmd_output = dnf_action('check-update -q', package, with_status: true, assumeyes: false)
  cmd_output[0] == 100
end
version_locking_supported?() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 30
def version_locking_supported?
  true
end
versions_locked?() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 20
def versions_locked?
  !!(protector_config =~ /^\s*enabled\s*=\s*1/) &&
    protector_whitelist_file_nonzero?
end

Private Instance Methods

disable_protector() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 180
def disable_protector
  setup_protector(false)
end
dnf_action(action, packages, with_status: false, assumeyes: false, dnf_options: [], valid_exit_statuses: [0], download_only: false, enabled_repos: []) click to toggle source

rubocop:disable Layout/LineLength, Metrics/ParameterLists, Metrics/MethodLength

# File lib/foreman_maintain/package_manager/dnf.rb, line 137
def dnf_action(action, packages, with_status: false, assumeyes: false, dnf_options: [], valid_exit_statuses: [0], download_only: false, enabled_repos: [])
  packages = [packages].flatten(1)

  dnf_options << '-y' if assumeyes
  dnf_options << '--downloadonly' if download_only
  dnf_options << '--disableplugin=foreman-protector'

  enabled_repos.map do |id|
    dnf_options << "--enablerepo=#{id}"
  end

  command = ['dnf', dnf_options.join(' '), action]

  command.push(packages.join(' ')) unless packages.empty?
  command = command.join(' ')

  if with_status
    sys.execute_with_status(
      command,
      :interactive => !assumeyes
    )
  else
    sys.execute!(
      command,
      :interactive => !assumeyes,
      :valid_exit_statuses => valid_exit_statuses
    )
  end
end
enable_protector() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 176
def enable_protector
  setup_protector(true)
end
protector_config() click to toggle source

rubocop:enable Layout/LineLength, Metrics/ParameterLists, Metrics/MethodLength

# File lib/foreman_maintain/package_manager/dnf.rb, line 168
def protector_config
  File.exist?(protector_config_file) ? File.read(protector_config_file) : ''
end
protector_config_file() click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 172
def protector_config_file
  PROTECTOR_CONFIG_FILE
end
setup_protector(enabled) click to toggle source
# File lib/foreman_maintain/package_manager/dnf.rb, line 184
def setup_protector(enabled)
  config = protector_config
  config += "\n" unless config[-1] == "\n"
  enabled_re = /^\s*enabled\s*=.*$/
  if enabled_re.match(config)
    config = config.gsub(enabled_re, "enabled = #{enabled ? '1' : '0'}")
  else
    config += "enabled = #{enabled ? '1' : '0'}\n"
  end
  File.open(protector_config_file, 'w') { |file| file.puts config }
end