Module: Unix::Pkg

Includes:
Beaker::CommandFactory
Included in:
Host
Defined in:
lib/beaker/host/unix/pkg.rb

Instance Attribute Summary

Attributes included from Beaker::CommandFactory

#assertions

Instance Method Summary collapse

Methods included from Beaker::CommandFactory

#execute, #fail_test

Instance Method Details

#check_for_command(name) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/beaker/host/unix/pkg.rb', line 10

def check_for_command(name)
  result = exec(Beaker::Command.new("which #{name}"), :accept_all_exit_codes => true)
  case self['platform']
  when /solaris-10/
    # solaris 10 appears to have considered `which` to have run successfully,
    # even if the command didn't exist, so it'll return a 0 exit code in
    # either case. Instead we match for the phrase output when a match isn't
    # found: "no #{name} in $PATH", reversing it to match our API
    !( result.stdout.match(/^no\ #{name}\ in\ /) )
  else
    result.exit_code == 0
  end
end

#check_for_package(name, opts = {}) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/beaker/host/unix/pkg.rb', line 24

def check_for_package(name, opts = {})
  opts = {:accept_all_exit_codes => true}.merge(opts)
  case self['platform']
    when /sles-10/
      result = execute("zypper se -i --match-exact #{name}", opts) { |result| result }
      result.stdout =~ /No packages found/ ? (return false) : (return result.exit_code == 0)
    when /sles-/
      result = execute("zypper se -i --match-exact #{name}", opts) { |result| result }
    when /el-4/
      @logger.debug("Package query not supported on rhel4")
      return false
    when /cisco|fedora|centos|eos|el-/
      result = execute("rpm -q #{name}", opts) { |result| result }
    when /ubuntu|debian|cumulus/
      result = execute("dpkg -s #{name}", opts) { |result| result }
    when /solaris-11/
      result = execute("pkg info #{name}", opts) { |result| result }
    when /solaris-10/
      result = execute("pkginfo #{name}", opts) { |result| result }
      if result.exit_code == 1
        result = execute("pkginfo CSW#{name}", opts) { |result| result }
      end
    when /openbsd/
      result = execute("pkg_info #{name}", opts) { |result| result }
    else
      raise "Package #{name} cannot be queried on #{self}"
  end
  result.exit_code == 0
end

#deploy_apt_repo(path, name, version) ⇒ Object

Note:

Due to the debian use of codenames in repos, the DEBIAN_PLATFORM_CODENAMES map must be kept up-to-date as support for new versions is added.

Deploy apt configuration generated by the packaging tooling



208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/beaker/host/unix/pkg.rb', line 208

def deploy_apt_repo(path, name, version)
  codename = self['platform'].codename

  if codename.nil?
    @logger.warning "Could not determine codename for debian platform #{self['platform']}. Skipping deployment of repo #{name}"
    return
  end

  repo_file = "#{path}/deb/pl-#{name}-#{version}-#{codename}.list"
  do_scp_to repo_file, "/etc/apt/sources.list.d/#{name}.list", {}
  @apt_needs_update = true
end

#deploy_package_repo(path, name, version) ⇒ Object

Deploy configuration generated by the packaging tooling to this host.

This method calls one of #deploy_apt_repo, #deploy_yum_repo, or #deploy_zyp_repo depending on the platform of this Host.



249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/beaker/host/unix/pkg.rb', line 249

def deploy_package_repo(path, name, version)
  if not File.exists? path
    @logger.warning "Was asked to deploy package repository from #{path}, but it doesn't exist!"
    return
  end

  case self['platform']
    when /el-4/
      @logger.debug("Package repo deploy is not supported on rhel4")
    when /fedora|centos|eos|el-/
      deploy_yum_repo(path, name, version)
    when /ubuntu|debian|cumulus/
      deploy_apt_repo(path, name, version)
    when /sles/
      deploy_zyp_repo(path, name, version)
    else
      # solaris, windows
      raise "Package repo cannot be deployed on #{self}; the platform is not supported"
  end
end

#deploy_yum_repo(path, name, version) ⇒ Object

Deploy yum configuration generated by the packaging tooling



225
226
227
228
# File 'lib/beaker/host/unix/pkg.rb', line 225

def deploy_yum_repo(path, name, version)
  repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
  do_scp_to repo_file, "/etc/yum.repos.d/#{name}.repo", {}
end

#deploy_zyp_repo(path, name, version) ⇒ Object

Deploy zypper repo configuration generated by the packaging tooling



234
235
236
237
238
239
240
# File 'lib/beaker/host/unix/pkg.rb', line 234

def deploy_zyp_repo(path, name, version)
  repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
  repo = IniFile.load(repo_file)
  repo_name = repo.sections[0]
  repo_url = repo[repo_name]["baseurl"]
  execute("zypper ar -t YUM #{repo_url} #{repo_name}")
end

#determine_if_x86_64Boolean

Examine the host system to determine the architecture

Returns:

  • (Boolean)

    true if x86_64, false otherwise



272
273
274
275
276
277
278
279
280
# File 'lib/beaker/host/unix/pkg.rb', line 272

def determine_if_x86_64
  if self[:platform] =~ /solaris/
    result = exec(Beaker::Command.new("uname -a | grep x86_64"), :accept_all_exit_codes => true)
      result.exit_code == 0
  else
    result = exec(Beaker::Command.new("arch | grep x86_64"), :accept_all_exit_codes => true)
    result.exit_code == 0
  end
end

#extract_rpm_proxy_options(url) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Extract RPM command’s proxy options from URL

Parameters:

Returns:

  • (String)

    httpproxy and httport options for rpm

Raises:

  • (StandardError)

    When encountering a string that cannot be parsed



290
291
292
293
294
295
296
297
298
# File 'lib/beaker/host/unix/pkg.rb', line 290

def extract_rpm_proxy_options(url)
  begin
    host, port = url.match(/https?:\/\/(.*):(\d*)/)[1,2]
    raise if host.empty? or port.empty?
    "--httpproxy #{host} --httpport #{port}"
  rescue
    raise "Cannot extract host and port from '#{url}'"
  end
end

#install_package(name, cmdline_args = '', version = nil, opts = {}) ⇒ Object



65
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/beaker/host/unix/pkg.rb', line 65

def install_package(name, cmdline_args = '', version = nil, opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive in #{name}", opts)
    when /el-4/
      @logger.debug("Package installation not supported on rhel4")
    when /fedora-22/
      if version
        name = "#{name}-#{version}"
      end
      execute("dnf -y #{cmdline_args} install #{name}", opts)
    when /cisco|fedora|centos|eos|el-/
      if version
        name = "#{name}-#{version}"
      end
      execute("yum -y #{cmdline_args} install #{name}", opts)
    when /ubuntu|debian|cumulus/
      if version
        name = "#{name}=#{version}"
      end
      update_apt_if_needed
      execute("apt-get install --force-yes #{cmdline_args} -y #{name}", opts)
    when /solaris-11/
      if opts[:acceptable_exit_codes]
        opts[:acceptable_exit_codes] << 4
      else
        opts[:acceptable_exit_codes] = [0, 4] unless opts[:accept_all_exit_codes]
      end
      execute("pkg #{cmdline_args} install #{name}", opts)
    when /solaris-10/
      execute("pkgutil -i -y #{cmdline_args} #{name}", opts)
    when /openbsd/
      begin
        execute("pkg_add -I #{cmdline_args} #{name}", opts) do |command|
          # Handles where there are multiple rubies, installs the latest one
          if command.stderr =~ /^Ambiguous: #{name} could be (.+)$/
            name = $1.chomp.split(' ').collect { |x|
              x =~ /-(\d[^-p]+)/
              [x, $1]
            }.select { |x|
              # Blacklist Ruby 2.2.0+ for the sake of Puppet 3.x
              Gem::Version.new(x[1]) < Gem::Version.new('2.2.0')
            }.sort { |a,b|
              Gem::Version.new(b[1]) <=> Gem::Version.new(a[1])
            }.collect { |x|
              x[0]
            }.first
            raise ArgumentException
          end
          # If the package advises symlinks to be created, do it
          command.stdout.split(/\n/).select { |x| x =~ /^\s+ln\s/ }.each do |ln|
            execute(ln, opts)
          end
        end
      rescue
        retry
      end
    else
      raise "Package #{name} cannot be installed on #{self}"
  end
end

#install_package_with_rpm(name, cmdline_args = '', opts = {}) ⇒ Object

Install a package using RPM

Parameters:

  • name (String)

    The name of the package to install. It may be a filename or a URL.

  • cmdline_args (String) (defaults to: '')

    Additional command line arguments for the package manager.

  • opts (Hash) (defaults to: {})

    a customizable set of options

Options Hash (opts):

  • :package_proxy (String)

    A proxy of form host:port

Returns:

  • nil



137
138
139
140
141
142
143
# File 'lib/beaker/host/unix/pkg.rb', line 137

def install_package_with_rpm(name, cmdline_args = '', opts = {})
  proxy = ''
  if name =~ /^http/ and opts[:package_proxy]
    proxy = extract_rpm_proxy_options(opts[:package_proxy])
  end
  execute("rpm #{cmdline_args} -ivh #{name} #{proxy}")
end

#pkg_initializeObject

This method overrides Beaker::Host#pkg_initialize to provide unix-specific package management setup



6
7
8
# File 'lib/beaker/host/unix/pkg.rb', line 6

def pkg_initialize
  @apt_needs_update = true
end

#uninstall_package(name, cmdline_args = '', opts = {}) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/beaker/host/unix/pkg.rb', line 145

def uninstall_package(name, cmdline_args = '', opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive rm #{name}", opts)
    when /el-4/
      @logger.debug("Package uninstallation not supported on rhel4")
    when /fedora-22/
      execute("dnf -y #{cmdline_args} remove #{name}", opts)
    when /cisco|fedora|centos|eos|el-/
      execute("yum -y #{cmdline_args} remove #{name}", opts)
    when /ubuntu|debian|cumulus/
      execute("apt-get purge #{cmdline_args} -y #{name}", opts)
    when /solaris-11/
      execute("pkg #{cmdline_args} uninstall #{name}", opts)
    when /solaris-10/
      execute("pkgrm -n #{cmdline_args} #{name}", opts)
    when /aix/
      execute("rpm #{cmdline_args} -e #{name}", opts)
    else
      raise "Package #{name} cannot be installed on #{self}"
  end
end

#update_apt_if_neededObject

If apt has not been updated since the last repo deployment it is updated. Otherwise this is a noop



56
57
58
59
60
61
62
63
# File 'lib/beaker/host/unix/pkg.rb', line 56

def update_apt_if_needed
  if self['platform'] =~ /debian|ubuntu|cumulus/
    if @apt_needs_update
      execute("apt-get update")
      @apt_needs_update = false
    end
  end
end

#upgrade_package(name, cmdline_args = '', opts = {}) ⇒ Object

Upgrade an installed package to the latest available version

Parameters:

  • name (String)

    The name of the package to update

  • cmdline_args (String) (defaults to: '')

    Additional command line arguments for the package manager



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/beaker/host/unix/pkg.rb', line 173

def upgrade_package(name, cmdline_args = '', opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive --no-gpg-checks up #{name}", opts)
    when /el-4/
      @logger.debug("Package upgrade is not supported on rhel4")
    when /fedora-22/
      execute("dnf -y #{cmdline_args} update #{name}", opts)
    when /cisco|fedora|centos|eos|el-/
      execute("yum -y #{cmdline_args} update #{name}", opts)
    when /ubuntu|debian|cumulus/
      update_apt_if_needed
      execute("apt-get install -o Dpkg::Options::='--force-confold' #{cmdline_args} -y --force-yes #{name}", opts)
    when /solaris-11/
      if opts[:acceptable_exit_codes]
        opts[:acceptable_exit_codes] << 4
      else
        opts[:acceptable_exit_codes] = [0, 4] unless opts[:accept_all_exit_codes]
      end
      execute("pkg #{cmdline_args} update #{name}", opts)
    when /solaris-10/
      execute("pkgutil -u -y #{cmdline_args} #{name}", opts)
    else
      raise "Package #{name} cannot be upgraded on #{self}"
  end
end