56a02d6672b8ed9a8a6754f2ed06648e05f78e2a
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) 
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

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) 
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

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 Minor cleanup and bug fix f...

Dev authored 7 years ago

32)   @logger = ::Logger.new(STDOUT)
Dev Now detecting difference in...

Dev authored 7 years ago

33) 
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

34)   @pkg_mgr = ::RCM::Apt.new(@logger)
35)   @file_mgr = ::RCM::FileManager.new(@logger)
36)   @svc_mgr = ::RCM::ServiceManager.new(@logger)
Dev Now detecting difference in...

Dev authored 7 years ago

37) 
38)   def self.configure_logger
39)     # Can be exposed as settings but was expanding the scope as this
40)     # object will need to be passed to all other objects
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

41)     @logger.level = ::Logger::DEBUG
42)     @logger.progname = 'rcm'
Dev Now detecting difference in...

Dev authored 7 years ago

43)   end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

44) 
45)   def self.parse_packages(markup)
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

46)     @logger.info("Environment = #{RCM_ENV}")
47)     @pkg_mgr.update unless RCM_ENV == 'dev'
Dev Now detecting difference in...

Dev authored 7 years ago

48) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

49)     markup.each do |d|
50)       # ensure package version exists, if mentioned.
51)       version = d.fetch('version', '')
52)       desired_state = d.fetch('desired_state', ::RCM::Package::INSTALLED)
53) 
54)       valid_package_states = [::RCM::Package::INSTALLED, ::RCM::Package::REMOVED]
55) 
56)       if (valid_package_states & [desired_state]).empty?
57)         raise "Unknown desired_state: #{desired_state}. Valid states: #{valid_package_states.join(', ')}"
58)       end
Dev Initial commit

Dev authored 7 years ago

59) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

60)       unless version.empty?
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

61)         available_versions = @pkg_mgr.get_versions(d['name'])
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

62)         if (available_versions & [version]).empty?
63)           raise "\n\n#{d['name']} = #{version} is not available.\nAvailable versions: #{available_versions.join(', ')}"
64)         end
65)       end
66)       p = RCM::Package.new(d['name'], version, desired_state)
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

67)       @wanted[PACKAGES][d['name']] = p
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

68)     end
Dev Initial commit

Dev authored 7 years ago

69)   end
70) 
Dev Now detecting difference in...

Dev authored 7 years ago

71)   def self.parse_files(markup)
Dev Working everything.

Dev authored 7 years ago

72)     valid_file_states = [::RCM::File::PRESENT, ::RCM::File::ABSENT]
Dev Now detecting difference in...

Dev authored 7 years ago

73)     markup.each do |d|
Dev Working everything.

Dev authored 7 years ago

74)       raise "\n\nFile state can only be one of #{valid_file_states.join (', ')}" if (valid_file_states | [d['desired_state']]).empty?
75)       raise "\n\n'#{d['local_file']}' is not readable.\n\n" if d['desired_state'] == ::RCM::File::PRESENT && !::File.readable?(d['local_file'])
76)       f = RCM::File.new(d['path'], d['owner'], d['group'], d['mode'], d['local_file'], d['desired_state'])
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

77)       @wanted[FILES][d['path']] = f
Dev Now detecting difference in...

Dev authored 7 years ago

78)     end
79)   end
80) 
81)   def self.parse_services(markup)
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

82)     pkgs = @wanted[PACKAGES]
83)     files = @wanted[FILES]
Dev Now detecting difference in...

Dev authored 7 years ago

84)     file_dependencies = {}
85)     package_dependencies = {}
86)     markup.each do |d|
87)       dependencies = d.fetch('dependencies', {})
Dev Converging the state as def...

Dev authored 7 years ago

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

Dev authored 7 years ago

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

Dev authored 7 years ago

108) 
Dev Now detecting difference in...

Dev authored 7 years ago

109)       end
110)       s = RCM::Service.new(d['name'], file_dependencies, package_dependencies)
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

111)       @wanted[SERVICES][d['name']] = s
Dev Now detecting difference in...

Dev authored 7 years ago

112)     end
113)   end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

114) 
Dev Converging the state as def...

Dev authored 7 years ago

115)   def self.whachuwant # or parse_config
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

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

Dev authored 7 years ago

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

Dev authored 7 years ago

118) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

119)     raise "#{config_file} not found." unless ::File.readable?(config_file)
120) 
121)     config = YAML.load_file(config_file)
Dev Initial commit

Dev authored 7 years ago

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

Dev authored 7 years ago

123)       yaml_objects.each do |collection, resource_definition|
124)         case collection
Dev Initial commit

Dev authored 7 years ago

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

Dev authored 7 years ago

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

Dev authored 7 years ago

127) 
128)         when FILES
Dev Now detecting difference in...

Dev authored 7 years ago

129)           parse_files(resource_definition)
Dev Initial commit

Dev authored 7 years ago

130) 
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

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

Dev authored 7 years ago

132)           parse_services(resource_definition)
Dev Initial commit

Dev authored 7 years ago

133)         end
134)       end
135)     end
136) 
137)   end
138) 
Dev Converging the state as def...

Dev authored 7 years ago

139)   def self.converge_packages
Dev Debugging why index.html wa...

Dev authored 7 years ago

140)     # We'll install them in one go (minor optimization)
141)     missing_packages = []
142) 
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

143)     @wanted[PACKAGES].each do |pkg_name, pkg_obj|
144)       current_pkg = @got[PACKAGES][pkg_name]
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

145) 
Dev Converging the state as def...

Dev authored 7 years ago

146)       if current_pkg == pkg_obj
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

147)         @logger.info("#{pkg_name} is in expected state.")
Dev Converging the state as def...

Dev authored 7 years ago

148)         next
149)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

150) 
Dev Converging the state as def...

Dev authored 7 years ago

151)       if current_pkg.version != pkg_obj.version && current_pkg.state == ::RCM::Package::INSTALLED
152)         # Wrong version is installed. Remove current version and install the correct one.
153)         # Not the best way to go about it... but we are not implementing a legit solution.
154)         @logger.debug("#{current_pkg.name}=#{current_pkg.version} is installed. Uninstalling first.")
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

155)         @pkg_mgr.remove(pkg_obj)
Dev Debugging why index.html wa...

Dev authored 7 years ago

156)         missing_packages.push(pkg_obj)
Dev Converging the state as def...

Dev authored 7 years ago

157)       elsif current_pkg.state == ::RCM::Package::REMOVED
Dev Debugging why index.html wa...

Dev authored 7 years ago

158)         missing_packages.push(pkg_obj)
Dev Converging the state as def...

Dev authored 7 years ago

159)       end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

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

Dev authored 7 years ago

161) 
Dev Debugging why index.html wa...

Dev authored 7 years ago

162)     @pkg_mgr.install(missing_packages)
163) 
Dev Now detecting difference in...

Dev authored 7 years ago

164)   end
165) 
Dev Converging the state as def...

Dev authored 7 years ago

166)   def self.converge_files
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

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

Dev authored 7 years ago

169) 
Dev Working everything.

Dev authored 7 years ago

170)       if file_on_fs.state == ::RCM::File::PRESENT && file_obj.state == ::RCM::File::ABSENT
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

171)         @logger.info("#{path} is present on disk when it should not be. Removing...")
172)         @file_mgr.remove(file_obj)
Dev Converging the state as def...

Dev authored 7 years ago

173)         next
174)       end
175) 
Dev Working everything.

Dev authored 7 years ago

176)       if file_on_fs == file_obj
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

177)         @logger.info("#{path} is in expected state (#{file_on_fs.state}).")
Dev Working everything.

Dev authored 7 years ago

178)         next
Dev Converging the state as def...

Dev authored 7 years ago

179)       end
Dev Now detecting difference in...

Dev authored 7 years ago

180) 
Dev Updating file info message...

Dev authored 7 years ago

181)       @logger.info("#{path} is not in expected state on disk.")
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

182)       status = @file_mgr.copy(file_obj)
183)       @file_mgr.apply_attributes(file_obj) if status == 0
Dev Working everything.

Dev authored 7 years ago

184) 
Dev Now detecting difference in...

Dev authored 7 years ago

185)     end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

186)   end
187) 
Dev Converging the state as def...

Dev authored 7 years ago

188)   def self.restart_services_if_needed
Dev Minor cleanup and bug fix f...

Dev authored 7 years ago

189)     @wanted[SERVICES].values.each do |svc_obj|
190)       @svc_mgr.restart(svc_obj) if @svc_mgr.dependencies_changed?(svc_obj)
Dev Converging the state as def...

Dev authored 7 years ago

191)     end
Dev Refactoring. Adding pkg mgmt.

Dev authored 7 years ago

192)   end
Dev Now detecting difference in...

Dev authored 7 years ago

193) 
194)   def main
Dev Converging the state as def...

Dev authored 7 years ago

195)     configure_logger
196)     whachuwant
Dev Handling files created upon...

Dev authored 7 years ago

197)     # Installing packages creates file that we want to delete.
198)     # So finish managing packages and then deal with files.
199)     @got[PACKAGES] = @pkg_mgr.get_current_state(@wanted[PACKAGES])
Dev Converging the state as def...

Dev authored 7 years ago

200)     converge_packages
Dev Handling files created upon...

Dev authored 7 years ago

201)     @got[FILES] = @file_mgr.get_current_state(@wanted[FILES])
Dev Converging the state as def...

Dev authored 7 years ago

202)     converge_files
203)     restart_services_if_needed
Dev Now detecting difference in...

Dev authored 7 years ago

204)   end
Dev Initial commit

Dev authored 7 years ago

205) 
Dev Converging the state as def...

Dev authored 7 years ago

206)   module_function :main
Dev Initial commit

Dev authored 7 years ago

207) end
208) 
Dev Now detecting difference in...

Dev authored 7 years ago

209) RCM.main