class ForemanMaintain::PackageManager::Yum

Constants

PROTECTOR_CONFIG_FILE
PROTECTOR_PLUGIN_FILE
PROTECTOR_WHITELIST_FILE

Public Class Methods

parse_envra(envra) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 7
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/yum.rb, line 64
def check_update(packages: nil, with_status: false)
  yum_action('check-update', packages, :assumeyes => true, :valid_exit_statuses => [100],
                                       :with_status => with_status)
end
clean_cache(assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 60
def clean_cache(assumeyes: false)
  yum_action('clean', 'all', :assumeyes => assumeyes)
end
files_not_owned_by_package(directory) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 74
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) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 41
def find_installed_package(name)
  status, result = sys.execute_with_status(%Q(rpm -q '#{name}'))
  if status == 0
    result
  end
end
install(packages, assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 48
def install(packages, assumeyes: false)
  yum_action('install', packages, :assumeyes => assumeyes)
end
install_version_locking(*) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 30
def install_version_locking(*)
  install_extras('foreman_protector/foreman-protector.py', PROTECTOR_PLUGIN_FILE)
  install_extras('foreman_protector/foreman-protector.conf', PROTECTOR_CONFIG_FILE)
  install_extras('foreman_protector/foreman-protector.whitelist', PROTECTOR_WHITELIST_FILE)
end
installed?(packages) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 36
def installed?(packages)
  packages_list = [packages].flatten(1).map { |pkg| "'#{pkg}'" }.join(' ')
  sys.execute?(%Q(rpm -q #{packages_list}))
end
list_installed_packages(queryfm = '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n') click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 79
def list_installed_packages(queryfm = '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n')
  # The queryfm should only include valid tag(s) as per `rpm --querytag` list.
  # If any special formatting is required with querytag then it should be provided with tag i.e,
  # querytag = "--%{VENDOR}"
  # The queryfm string must end with '\n'
  sys.execute!("rpm -qa --qf '#{queryfm}'").split("\n")
end
lock_versions() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 13
def lock_versions
  enable_protector
end
remove(packages, assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 52
def remove(packages, assumeyes: false)
  yum_action('remove', packages, :assumeyes => assumeyes)
end
unlock_versions() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 17
def unlock_versions
  disable_protector
end
update(packages = [], assumeyes: false) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 56
def update(packages = [], assumeyes: false)
  yum_action('update', packages, :assumeyes => assumeyes)
end
update_available?(package) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 69
def update_available?(package)
  cmd_output = yum_action('check-update -q', package, :with_status => true, :assumeyes => false)
  cmd_output[0] == 100
end
version_locking_enabled?() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 25
def version_locking_enabled?
  File.exist?(PROTECTOR_PLUGIN_FILE) && File.exist?(PROTECTOR_CONFIG_FILE) &&
    File.exist?(PROTECTOR_WHITELIST_FILE)
end
versions_locked?() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 21
def versions_locked?
  !!(protector_config =~ /^\s*enabled\s*=\s*1/)
end

Private Instance Methods

disable_protector() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 101
def disable_protector
  setup_protector(false)
end
enable_protector() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 97
def enable_protector
  setup_protector(true)
end
install_extras(src, dest, override: false) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 133
def install_extras(src, dest, override: false)
  extras_src = File.expand_path('../../../../extras', __FILE__)
  if override ||
     (File.directory?(dest) && !File.exist?(File.join(dest, src))) ||
     !File.exist?(dest)
    FileUtils.cp(File.join(extras_src, src), dest)
  end
end
protector_config() click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 89
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/yum.rb, line 93
def protector_config_file
  PROTECTOR_CONFIG_FILE
end
setup_protector(enabled) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 105
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
yum_action(action, packages, with_status: false, assumeyes: false, valid_exit_statuses: [0]) click to toggle source
# File lib/foreman_maintain/package_manager/yum.rb, line 117
def yum_action(action, packages, with_status: false, assumeyes: false, valid_exit_statuses: [0])
  yum_options = []
  packages = [packages].flatten(1)
  yum_options << '-y' if assumeyes
  yum_options << '--disableplugin=foreman-protector'
  yum_options_s = yum_options.empty? ? '' : ' ' + yum_options.join(' ')
  packages_s = packages.empty? ? '' : ' ' + packages.join(' ')
  if with_status
    sys.execute_with_status("yum#{yum_options_s} #{action}#{packages_s}",
                            :interactive => !assumeyes)
  else
    sys.execute!("yum#{yum_options_s} #{action}#{packages_s}",
                 :interactive => !assumeyes, :valid_exit_statuses => valid_exit_statuses)
  end
end