require_relative '../rcm_utils' module RCM class Apt APT_GET = '/usr/bin/apt-get'.freeze DPKG_QUERY = '/usr/bin/dpkg-query'.freeze APT_CACHE = '/usr/bin/apt-cache'.freeze def update() status = ::RCM.cmd("#{APT_GET} update") raise "Updating apt cache failed. \n\n#{status[:error]}\n\nstdout:\n#{status[:output]}" end def status(pkg_name) ::RCM.cmd("#{DPKG_QUERY} --status #{pkg_name}") end def install(pkg_name, version = '') name = '' version_string = "=#{version}" unless version.empty? if pkg_name.is_a?(String) name = pkg_name version_string = "=#{version}" unless version.empty? elsif pkg_name.is_a?(::RCM::Package) name = pkg_name.name v = pkg_name.version version_string = "=#{v}" unless v.empty? end ::RCM.cmd("#{APT_GET} install --yes #{name}#{version_string}") end def multi_install(pkgs) raise 'multi_install expects array of ::RCM.Package' unless pkgs.is_a?(Array) # Construct string of packages to install in one go. pkgs_string = '' pkgs.each do |pkg| version_string = "=#{pkg.version}" unless pkg.version.empty? pkgs_string += "#{pkg.name}#{version_string} " end ::RCM.cmd("#{APT_GET} install --yes #{pkgs_string}") end def get_versions(pkg_name) name = '' if pkg_name.is_a?(String) name = pkg_name elsif pkg_name.is_a?(::RCM::Package) name = pkg_name.name end status = ::RCM.cmd("#{APT_CACHE} madison #{name}") return [] if !status[:output] || status[:output] =~ /Unable to locate package/ # Collect all versions by splitting on new line, and then collecting second # field from every line with delimiter ' | ' available_versions = status[:output].split("\n").collect { |l| l.split(' | ')[1] } available_versions.uniq end def remove(pkg_name) # Remove is idempotent and returns with success even if package is not installed. status = ::RCM.cmd("#{APT_GET} remove --yes #{pkg_name}") error_message = "Removing #{pkg_name} failed!\n\nstderr:\n#{status[:error]}\n\nstdout:\n#{status[:output]}" raise error_message unless status[:exit_code] == 0 end end end