Class: BoxGrinder::RPMDependencyValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb

Instance Method Summary collapse

Constructor Details

#initialize(config, appliance_config, dir, options = {}) ⇒ RPMDependencyValidator

Returns a new instance of RPMDependencyValidator.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 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

Instance Method Details

#generate_package_listObject



97
98
99
100
101
102
103
# 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_configObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# 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) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 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_packagesObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 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