d16ba154fce4313396a8dccc4ca8382793c280f7
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

1) require_relative '../rcm_utils'
2) 
3) module RCM
4)   class Apt
5)     APT_GET = '/usr/bin/apt-get'.freeze
6)     DPKG_QUERY = '/usr/bin/dpkg-query'.freeze
7)     APT_CACHE = '/usr/bin/apt-cache'.freeze
Dev Now detecting difference in...

Dev authored 7 years ago

8)     APT_PARTIAL_DIR = '/var/lib/apt/lists/partial'.freeze
9) 
10)     def initialize(logger)
11)       @logger = logger
12)     end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

13) 
14)     def update()
Dev Now detecting difference in...

Dev authored 7 years ago

15)       @logger.info('Updating apt cache.')
16)       unless ::File.readable?(APT_PARTIAL_DIR)
17)         @logger.warn('Skipping apt cache update as we are not running with right privilege.')
18)         return
19)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

20)       status = ::RCM.cmd("#{APT_GET} update")
Dev Now detecting difference in...

Dev authored 7 years ago

21)       unless status[:exit_code] == 0
22)         @logger.warn("Updating apt cache failed. \n\n#{status[:error]}\n\nstdout:\n#{status[:output]}")
23)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

24)     end
25) 
26)     def status(pkg_name)
27)       ::RCM.cmd("#{DPKG_QUERY} --status #{pkg_name}")
28)     end
29) 
30)     def install(pkg_name, version = '')
Dev Now detecting difference in...

Dev authored 7 years ago

31)       raise "\n\nPlease ensure you are running with root privileges" unless ::File.readable?(APT_PARTIAL_DIR)
32) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

33)       name = ''
34)       version_string = "=#{version}" unless version.empty?
35)       if pkg_name.is_a?(String)
36)         name = pkg_name
37)         version_string = "=#{version}" unless version.empty?
38)       elsif pkg_name.is_a?(::RCM::Package)
39)         name = pkg_name.name
40)         v = pkg_name.version
41)         version_string = "=#{v}" unless v.empty?
42)       end
43) 
44)       ::RCM.cmd("#{APT_GET} install --yes #{name}#{version_string}")
45)     end
46) 
47)     def multi_install(pkgs)
Dev Now detecting difference in...

Dev authored 7 years ago

48)       raise "\n\nPlease ensure you are running with root privileges\n\n" unless ::File.readable?(APT_PARTIAL_DIR)
49) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

50)       raise 'multi_install expects array of ::RCM.Package' unless pkgs.is_a?(Array)
51) 
52)       # Construct string of packages to install in one go.
53)       pkgs_string = ''
54)       pkgs.each do |pkg|
55)         version_string = "=#{pkg.version}" unless pkg.version.empty?
56)         pkgs_string += "#{pkg.name}#{version_string} "
57)       end
58) 
59)       ::RCM.cmd("#{APT_GET} install --yes #{pkgs_string}")
60)     end
61) 
62)     def get_versions(pkg_name)
63)       name = ''
64)       if pkg_name.is_a?(String)
65)         name = pkg_name
66)       elsif pkg_name.is_a?(::RCM::Package)
67)         name = pkg_name.name
68)       end
69)       status = ::RCM.cmd("#{APT_CACHE} madison #{name}")
70)       return [] if !status[:output] || status[:output] =~ /Unable to locate package/
71) 
72)       # Collect all versions by splitting on new line, and then collecting second
73)       # field from every line with delimiter ' | '
74)       available_versions = status[:output].split("\n").collect { |l| l.split(' | ')[1] }
75)       available_versions.uniq
76)     end
77) 
78)     def remove(pkg_name)
Dev Now detecting difference in...

Dev authored 7 years ago

79)       raise "\n\nPlease ensure you are running with root privileges\n\n" unless ::File.readable?(APT_PARTIAL_DIR)
80) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

81)       # Remove is idempotent and returns with success even if package is not installed.
82)       status = ::RCM.cmd("#{APT_GET} remove --yes #{pkg_name}")
83)       error_message = "Removing #{pkg_name} failed!\n\nstderr:\n#{status[:error]}\n\nstdout:\n#{status[:output]}"
84)       raise error_message unless status[:exit_code] == 0
85)     end
Dev Now detecting difference in...

Dev authored 7 years ago

86) 
87)     def get_current_state(wanted_packages)
88)       got = {}
89)       wanted_packages.each do |name, p|
90)         state = ::RCM::Package::REMOVED
91)         version = 'idk'
92)         status = status(p.name)
93) 
94)         if status[:exit_code] == 0
95)           state = ::RCM::Package::INSTALLED if status[:output] =~ 'ok installed'
96)           version = /Version: (?<version>\d+.+)/.match(status[:output])[:version]
97)         end
98) 
99)         current_pkg = ::RCM::Package.new(name, version, state)
100) 
101)         got[name] = current_pkg
102)       end
103) 
104)       got
105) 
106)     end