97a2c496119c93df2d89f814ac133cb63aa2ce94
Dev Now detecting difference in...

Dev authored 7 years ago

1) #!/usr/bin/ruby
2) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

3) require_relative 'objects/rcm_file'
4) require_relative 'objects/rcm_package'
5) require_relative 'objects/rcm_service'
6) require_relative 'managers/rcm_package_manager'
Dev Now detecting difference in...

Dev authored 7 years ago

7) require_relative 'managers/rcm_file_manager'
8) require_relative 'managers/rcm_service_manager'
9) require_relative 'rcm_utils'
Dev Initial commit

Dev authored 7 years ago

10) require 'yaml'
Dev Now detecting difference in...

Dev authored 7 years ago

11) require 'logger'
Dev Initial commit

Dev authored 7 years ago

12) 
13) module RCM
Dev Now detecting difference in...

Dev authored 7 years ago

14)   PACKAGES = 'packages'.freeze
15)   FILES = 'files'.freeze
16)   SERVICES = 'services'.freeze
17)   VALID_LOG_LEVELS = %w(fatal error info debug).freeze
18)   RCM_ENV = ENV.fetch('ENVIRONMENT', '')
Dev Initial commit

Dev authored 7 years ago

19) 
20)   @@wanted = {
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

21)     PACKAGES => {},
22)     FILES => {},
23)     SERVICES => {}
Dev Initial commit

Dev authored 7 years ago

24)   }
25) 
26)   @@got = {
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

27)     PACKAGES => {},
28)     FILES => {},
29)     SERVICES => {}
Dev Initial commit

Dev authored 7 years ago

30)   }
31) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

32)   @@crackalackin = {
Dev Now detecting difference in...

Dev authored 7 years ago

33)     PACKAGES => [],
34)     FILES => [],
35)     SERVICES => []
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

36)   }
37) 
Dev Now detecting difference in...

Dev authored 7 years ago

38)   @@logger = ::Logger.new(STDOUT)
39) 
40)   @@pkg_mgr = ::RCM::Apt.new(@@logger)
41)   @@file_mgr = ::RCM::FileManager.new(@@logger)
42)   @@svc_mgr = ::RCM::ServiceManager.new(@@logger)
43) 
44)   def self.configure_logger
45)     # Can be exposed as settings but was expanding the scope as this
46)     # object will need to be passed to all other objects
47)     @@logger.level = ::Logger::DEBUG
48)     @@logger.progname = 'rcm'
49)   end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

50) 
51)   def self.parse_packages(markup)
Dev Now detecting difference in...

Dev authored 7 years ago

52)     @@logger.info("Environment = #{RCM_ENV}")
53)     @@pkg_mgr.update unless RCM_ENV == 'dev'
54) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

55)     markup.each do |d|
56)       # ensure package version exists, if mentioned.
57)       version = d.fetch('version', '')
58)       desired_state = d.fetch('desired_state', ::RCM::Package::INSTALLED)
59) 
60)       valid_package_states = [::RCM::Package::INSTALLED, ::RCM::Package::REMOVED]
61) 
62)       if (valid_package_states & [desired_state]).empty?
63)         raise "Unknown desired_state: #{desired_state}. Valid states: #{valid_package_states.join(', ')}"
64)       end
Dev Initial commit

Dev authored 7 years ago

65) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

66)       unless version.empty?
67)         available_versions = @@pkg_mgr.get_versions(d['name'])
68)         if (available_versions & [version]).empty?
69)           raise "\n\n#{d['name']} = #{version} is not available.\nAvailable versions: #{available_versions.join(', ')}"
70)         end
71)       end
72)       p = RCM::Package.new(d['name'], version, desired_state)
73)       @@wanted[PACKAGES][d['name']] = p
74)     end
Dev Initial commit

Dev authored 7 years ago

75)   end
76) 
Dev Now detecting difference in...

Dev authored 7 years ago

77)   def self.parse_files(markup)
78)     markup.each do |d|
79)       raise "\n\n'#{d['local_file']}' is not readable.\n\n" unless ::File.readable?(d['local_file'])
80)       f = RCM::File.new(d['path'], d['owner'], d['group'], d['mode'], d['local_file'])
81)       @@wanted[FILES][d['path']] = f
82)     end
83)   end
84) 
85)   def self.parse_services(markup)
86)     pkgs = @@wanted[PACKAGES]
87)     files = @@wanted[FILES]
88)     file_dependencies = {}
89)     package_dependencies = {}
90)     markup.each do |d|
91)       dependencies = d.fetch('dependencies', {})
Dev Converging the state as def...

Dev authored 7 years ago

92)       dependencies.each do |values|
93)         values.each do |dep_type, dep|
94)           case dep_type
95)           when PACKAGES
96)             dep.each do |pkg_definition|
97)               pkg_name = pkg_definition['name']
98)               raise "\n\nPlease ensure #{pkg_name} is managed by this program before adding it as a dependency.\n\n" unless pkgs.key?(pkg_name)
99)               p = pkgs[pkg_name]
100)               package_dependencies[pkg_name] = p
101)             end
102)           when FILES
103)             dep.each do |file_defnition|
104)               path = file_defnition['path']
105)               raise "\n\nPlease ensure #{path} is managed by this program before adding it as a dependency.\n\n" unless files.key?(path)
106) 
107)               f = files[path]
108)               file_dependencies[path] = f
109)             end
110)           end
Dev Now detecting difference in...

Dev authored 7 years ago

111)         end
Dev Converging the state as def...

Dev authored 7 years ago

112) 
Dev Now detecting difference in...

Dev authored 7 years ago

113)       end
114)       s = RCM::Service.new(d['name'], file_dependencies, package_dependencies)
115)       @@wanted[SERVICES][d['name']] = s
116)     end
117)   end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

118) 
Dev Converging the state as def...

Dev authored 7 years ago

119)   def self.whachuwant # or parse_config
Dev Initial commit

Dev authored 7 years ago

120)     # Consume config from YAML, and convert it to usable objects in @@wanted.
Dev Now detecting difference in...

Dev authored 7 years ago

121)     config_file = RCM_ENV.empty? ? 'config.yaml' : "config_#{RCM_ENV}.yaml"
Dev Initial commit

Dev authored 7 years ago

122) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

123)     raise "#{config_file} not found." unless ::File.readable?(config_file)
124) 
125)     config = YAML.load_file(config_file)
Dev Initial commit

Dev authored 7 years ago

126)     config.each do |yaml_objects|
Dev Now detecting difference in...

Dev authored 7 years ago

127)       yaml_objects.each do |collection, resource_definition|
128)         case collection
Dev Initial commit

Dev authored 7 years ago

129)         when PACKAGES
Dev Now detecting difference in...

Dev authored 7 years ago

130)           parse_packages(resource_definition)
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

131) 
132)         when FILES
Dev Now detecting difference in...

Dev authored 7 years ago

133)           parse_files(resource_definition)
Dev Initial commit

Dev authored 7 years ago

134) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

135)         when SERVICES
Dev Now detecting difference in...

Dev authored 7 years ago

136)           parse_services(resource_definition)
Dev Initial commit

Dev authored 7 years ago

137)         end
138)       end
139)     end
140) 
141)   end
142) 
Dev Converging the state as def...

Dev authored 7 years ago

143)   def self.whachugot # or get_current_state
Dev Now detecting difference in...

Dev authored 7 years ago

144)     @@got[PACKAGES] = @@pkg_mgr.get_current_state(@@wanted[PACKAGES])
145)     @@got[FILES] = @@file_mgr.get_current_state(@@wanted[FILES])
146)     # @@got[SERVICES] = @@svc_mgr.get_current_state(@@wanted[SERVICES])
Dev Initial commit

Dev authored 7 years ago

147)   end
148) 
Dev Converging the state as def...

Dev authored 7 years ago

149)   def self.converge_packages
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

150)     @@wanted[PACKAGES].each do |pkg_name, pkg_obj|
151)       current_pkg = @@got[PACKAGES][pkg_name]
152) 
Dev Converging the state as def...

Dev authored 7 years ago

153)       if current_pkg == pkg_obj
154)         @@logger.info("#{pkg_name} is in expected state.")
155)         next
156)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

157) 
Dev Converging the state as def...

Dev authored 7 years ago

158)       @@logger.debug('Missing package:' + pkg_name)
159)       if current_pkg.version != pkg_obj.version && current_pkg.state == ::RCM::Package::INSTALLED
160)         # Wrong version is installed. Remove current version and install the correct one.
161)         # Not the best way to go about it... but we are not implementing a legit solution.
162)         @logger.debug("#{current_pkg.name}=#{current_pkg.version} is installed. Uninstalling first.")
163)         @@pkg_mgr.remove(pkg_obj)
164)         @@pkg_mgr.install(pkg_obj)
165)       elsif current_pkg.state == ::RCM::Package::REMOVED
166)         @@pkg_mgr.install(pkg_obj)
167)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

168)     end
Dev Converging the state as def...

Dev authored 7 years ago

169) 
Dev Now detecting difference in...

Dev authored 7 years ago

170)   end
171) 
Dev Converging the state as def...

Dev authored 7 years ago

172)   def self.converge_files
Dev Now detecting difference in...

Dev authored 7 years ago

173)     @@wanted[FILES].each do |path, file_obj|
174)       file_on_fs = @@got[FILES][path]
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

175) 
Dev Converging the state as def...

Dev authored 7 years ago

176)       if file_on_fs == file_obj
177)         @@logger.info("#{path} is in expected state.")
178)         next
179)       end
180) 
181)       # try to do minimal changes by finding what is different
182)       if file_on_fs.path.empty?
183)         # for files, we're not doing explicit state maintenance like we are doing for packages
184)         # If file is on disk, file obj will contain the path.
185)         @@logger.info("#{path} is not present on disk.")
186)         @@file_mgr.copy(file_obj)
187)         @@file_mgr.apply_attributes(file_obj)
188)       elsif file_on_fs.mode != file_obj.mode ||
189)           file_on_fs.owner != file_obj.owner ||
190)           file_on_fs.group != file_obj.group
191)         @@logger.debug("Attributes on #{path} are not in expected state.")
192)         @@file_mgr.apply_attributes(file_obj)
193)       elsif !::File.cmp(file_obj.src_path, path)
194)         @@logger.debug("File contents don't match, even though #{path} is on disk.")
195)         @@file_mgr.remove(file_obj)
196)         @@file_mgr.copy(file_obj)
197)         @@file_mgr.apply_attributes(file_obj)
198)       end
Dev Now detecting difference in...

Dev authored 7 years ago

199) 
200)       # Set the version correctly
201)       @@crackalackin[FILES].push(file_obj)
202)     end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

203)   end
204) 
Dev Converging the state as def...

Dev authored 7 years ago

205)   def self.restart_services_if_needed
206)     @@wanted[SERVICES].values.each do |svc_obj|
207)       @@svc_manager.restart(svc_obj) if @@svc_mgr.dependencies_changed?(svc_obj)
208)     end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

209)   end
Dev Now detecting difference in...

Dev authored 7 years ago

210) 
211)   def main
Dev Converging the state as def...

Dev authored 7 years ago

212)     configure_logger
213)     whachuwant
214)     whachugot
215)     converge_packages
216)     converge_files
217)     restart_services_if_needed
Dev Now detecting difference in...

Dev authored 7 years ago

218)   end
Dev Initial commit

Dev authored 7 years ago

219) 
Dev Converging the state as def...

Dev authored 7 years ago

220)   module_function :main
Dev Initial commit

Dev authored 7 years ago

221) end
222) 
Dev Now detecting difference in...

Dev authored 7 years ago

223) RCM.main