discourse/chef/cookbooks/omnibus_updater/recipes/set_remote_path.rb

140 lines
4.6 KiB
Ruby

# RULES
if(node[:omnibus_updater][:version].nil? && !node[:omnibus_updater][:version_search])
raise "Omnibus Updater cannot determine version installation request. Please set version of enable version search"
end
if(node[:omnibus_updater][:version_search])
Chef::Log.warn "Omnibus Updater is set to automatically upgrade via search!"
if(node[:omnibus_updater][:allow_release_clients])
Chef::Log.warn "Omnibus Updater will allow installation of release clients found via search!"
end
end
if(!node[:omnibus_updater][:version].to_s.include?('-') || node[:omnibus_updater][:version_search])
require 'open-uri'
require 'rexml/document'
pkgs_doc = REXML::Document.new(open(node[:omnibus_updater][:base_uri]))
pkgs_avail = pkgs_doc.elements.to_a('//Contents//Key').map(&:text).find_all do |f|
(f.include?('.rpm') || f.include?('.deb')) && f.include?('chef') &&
!f.include?('server') && (node[:omnibus_updater][:allow_release_clients] || !f.include?('.rc')) &&
!f.scan(/\d+\.\d+\.\d+-\d+\./).empty?
end
unless(node[:omnibus_updater][:version_search])
searched_ver = pkgs_avail.find_all{|x| x.include?(node[:omnibus_updater][:version]) }.sort.last
unless(searched_ver)
raise "Omnibus Updater failed to find a valid version string. Base version requested: #{node[:omnibus_updater][:version]}"
else
node.set[:omnibus_updater][:full_version] = searched_ver.scan(/\d+\.\d+\.\d+-\d+/).first
node.set[:omnibus_updater][:version] = node[:omnibus_updater][:full_version].sub(/-\d+$/,'')
end
end
else
node.set[:omnibus_updater][:full_version] = node[:omnibus_updater][:version]
end
platform_name = node.platform
platform_majorversion = ""
kernel_name = node.kernel.machine
case node.platform_family
when 'debian'
if(node.platform == 'ubuntu')
platform_version = case node.platform_version
when '10.10', '10.04'
platform_majorversion << '10.04'
'10.04'
when '12.10', '12.04', '11.10', '11.04'
platform_majorversion << '11.04'
'11.04'
else
raise 'Unsupported ubuntu version for deb packaged omnibus'
end
else
platform_version = case pv = node.platform_version.split('.').first
when '6', '5'
platform_majorversion << '6'
'6.0.5'
else
platform_majorversion << pv
pv
end
end
when 'fedora', 'rhel'
platform_version = node.platform_version.split('.').first
platform_name = 'el'
platform_majorversion << platform_version
else
platform_version = node.platform_version
end
if(node[:omnibus_updater][:install_via])
install_via = node[:omnibus_updater][:install_via]
else
install_via = case node.platform_family
when 'debian'
'deb'
when 'fedora', 'rhel', 'centos'
'rpm'
else
raise 'Unsupported omnibus install method requested'
end
end
case install_via
when 'deb'
if(pkgs_avail)
path_name = pkgs_avail.find_all{ |path|
ver = node[:omnibus_updater][:version] || '.'
path.include?('.deb') && path.include?(platform_name) &&
path.include?(platform_version) && path.include?(node.kernel.machine) &&
path.include?(ver)
}.sort.last
else
kernel_name = ""
file_name = "chef_#{node[:omnibus_updater][:full_version]}.#{platform_name}.#{platform_version}_"
if(node.kernel.machine.include?('64'))
file_name << 'amd64'
kernel_name << 'x86_64'
else
file_name << 'i386'
kernel_name << 'i686'
end
file_name << '.deb'
end
when 'rpm'
if(pkgs_avail)
path_name = pkgs_avail.find_all{ |path|
ver = node[:omnibus_updater][:version] || '.'
path.include?('.rpm') && path.include?(platform_name) &&
path.include?(platform_version) && path.include?(node.kernel.machine) &&
path.include?(ver)
}.sort.last
else
file_name = "chef-#{node[:omnibus_updater][:full_version]}.#{platform_name}#{platform_version}.#{node.kernel.machine}.rpm"
end
else
raise 'Unsupported install via provided'
end
remote_omnibus_file = if(path_name)
File.join(node[:omnibus_updater][:base_uri], path_name)
else
File.join(
node[:omnibus_updater][:base_uri],
platform_name,
platform_majorversion,
kernel_name,
file_name
)
end
unless(remote_omnibus_file == node[:omnibus_updater][:full_uri])
node.override[:omnibus_updater][:full_uri] = remote_omnibus_file
Chef::Log.info "Omnibus remote file location: #{remote_omnibus_file}"
end
unless(node[:omnibus_updater][:full_version])
node.set[:omnibus_updater][:version] = remote_omnibus_file.scan(%r{chef[_-](\d+.\d+.\d+-\d+)}).flatten.first
node.set[:omnibus_updater][:full_version] = node[:omnibus_updater][:version]
end