GitList
Repositories
Help
Report an Issue
rcm
Code
Commits
Branches
Tags
Search
Tree:
d16ba15
Branches
Tags
master
rcm
managers
rcm_package_manager.rb
Now detecting difference in current and wanted state.
Dev
commited
d16ba15
at 2018-06-16 00:55:00
rcm_package_manager.rb
Blame
History
Raw
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 APT_PARTIAL_DIR = '/var/lib/apt/lists/partial'.freeze def initialize(logger) @logger = logger end def update() @logger.info('Updating apt cache.') unless ::File.readable?(APT_PARTIAL_DIR) @logger.warn('Skipping apt cache update as we are not running with right privilege.') return end status = ::RCM.cmd("#{APT_GET} update") unless status[:exit_code] == 0 @logger.warn("Updating apt cache failed. \n\n#{status[:error]}\n\nstdout:\n#{status[:output]}") end end def status(pkg_name) ::RCM.cmd("#{DPKG_QUERY} --status #{pkg_name}") end def install(pkg_name, version = '') raise "\n\nPlease ensure you are running with root privileges" unless ::File.readable?(APT_PARTIAL_DIR) 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 "\n\nPlease ensure you are running with root privileges\n\n" unless ::File.readable?(APT_PARTIAL_DIR) 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) raise "\n\nPlease ensure you are running with root privileges\n\n" unless ::File.readable?(APT_PARTIAL_DIR) # 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 def get_current_state(wanted_packages) got = {} wanted_packages.each do |name, p| state = ::RCM::Package::REMOVED version = 'idk' status = status(p.name) if status[:exit_code] == 0 state = ::RCM::Package::INSTALLED if status[:output] =~ 'ok installed' version = /Version: (?<version>\d+.+)/.match(status[:output])[:version] end current_pkg = ::RCM::Package.new(name, version, state) got[name] = current_pkg end got end end end