class BoxGrinder::RPMDependencyValidator

Public Class Methods

new( config, appliance_config, dir, options = {} ) click to toggle source
# File lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb, line 36
def initialize( config, appliance_config, dir, options = {} )
  @config           = config
  @appliance_config = appliance_config
  @dir              = dir

  @log          = options[:log]         || LogHelper.new
  @exec_helper  = options[:exec_helper] || ExecHelper.new( :log => @log )

  @yum_config_file = "#{@dir.tmp}/yum.conf"

  # Because we're using repoquery command from our building environment, we must ensure, that our repository
  # names are unique
  @magic_hash = "boxgrinder-"
end

Public Instance Methods

generate_package_list() click to toggle source
# File lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb, line 97
def generate_package_list
  packages = []
  for package in @appliance_config.packages
    packages << package unless package.match /^@/ or package.match /^-/
  end
  packages
end
generate_yum_config() click to toggle source
# File lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb, line 105
def generate_yum_config
  File.open( @yum_config_file, "w") do |f|

    f.puts( "[main]\r\ncachedir=#{Dir.pwd}/#{@dir.tmp}/#{@magic_hash}#{@appliance_config.hardware.arch}-yum-cache/\r\n\r\n" )

    for repo in @appliance_config.repos
      f.puts( "[#{@magic_hash}#{repo['name']}]" )
      f.puts( "name=#{repo['name']}" )
      f.puts( "baseurl=#{repo['baseurl']}" ) unless repo['baseurl'].nil?
      f.puts( "mirrorlist=#{repo['mirrorlist']}" ) unless repo['mirrorlist'].nil?
      f.puts( "enabled=1" )
      f.puts
    end
  end
end
invalid_names( repo_list, package_list ) click to toggle source
# File lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb, line 66
def invalid_names( repo_list, package_list )
  @log.debug "Querying package database..."

  unless @appliance_config.is64bit?
    arches = "i386,i486,i586,i686"
  else
    arches = "x86_64"
  end

  root = (@config.dir.root.end_with?('/') ? '' : @config.dir.root)
  repoquery_output = @exec_helper.execute( "repoquery --quiet --disablerepo=* --enablerepo=#{@appliance_config.repos.collect {|r| "#{@magic_hash}#{r['name']}"}.join(",")} -c '#{root}/#{@yum_config_file}' list available #{package_list.join( ' ' )} --nevra --archlist=#{arches},noarch" )

  package_list.inject([]) do |invalid_names, name|
    found = repoquery_output.each_line.reduce(false) do |_, line|
      line.strip!
      
      package       = line.match( /^([\S]+)-\d+:/ ) 
      package       = package ? package[1] : line
      package_regex = Regexp.new('^' << Regexp.quote(package))
      
      if package.size > 0 && name =~ package_regex
        break package
      end
      false
    end

    found || invalid_names << name
    invalid_names
  end
end
resolve_packages() click to toggle source
# File lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb, line 51
def resolve_packages
  @log.info "Resolving packages added to #{@appliance_config.name} appliance definition file..."

  package_list = generate_package_list
  generate_yum_config

  invalid = invalid_names( @appliance_config.repos, package_list )

  if invalid.empty?
    @log.info "All additional packages for #{@appliance_config.name} appliance successfully resolved."
  else
    raise "Package#{invalid.size > 1 ? "s" : ""} #{invalid.join(', ')} for #{@appliance_config.name} appliance not found in repositories. Please check package names in appliance definition file."
  end
end