125 lines
4.8 KiB
Ruby
125 lines
4.8 KiB
Ruby
#
|
|
# Cookbook:: omnibus_updater
|
|
# Recipe:: installer
|
|
#
|
|
# Copyright:: 2014-2017, Heavy Water Ops, LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
include_recipe 'omnibus_updater'
|
|
remote_path = node['omnibus_updater']['full_url']
|
|
|
|
service 'chef-client-omnibus' do
|
|
service_name 'chef-client'
|
|
supports status: true, restart: true
|
|
action :nothing
|
|
end
|
|
|
|
if platform?('windows')
|
|
version = node['omnibus_updater']['version'] || remote_path.scan(/chef-windows|client-(\d+\.\d+.\d+)/).flatten.first
|
|
Chef::Recipe.send(:include, Chef::Mixin::ShellOut)
|
|
chef_version = shell_out('chef-client -v')
|
|
chef_version = chef_version.stdout
|
|
|
|
# clean up previous upgrades
|
|
directory 'c:/opscode/chef.upgrade' do
|
|
action :delete
|
|
recursive true
|
|
end
|
|
|
|
if node['chef_packages']['chef']['version'] != node['omnibus_updater']['version']
|
|
execute 'chef-move' do
|
|
command 'move c:/opscode/chef c:/opscode/chef.upgrade'
|
|
action :nothing
|
|
end
|
|
execute 'chef-uninstall' do
|
|
command 'wmic product where "name like \'Chef Client%% %%\'" call uninstall /nointeractive'
|
|
action :nothing
|
|
end
|
|
execute 'chef-install' do
|
|
command "msiexec.exe /qn /i #{File.basename(remote_path)} ADDLOCAL=\"#{node['omnibus_updater']['addlocal']}\""
|
|
cwd node['omnibus_updater']['cache_dir']
|
|
action :nothing
|
|
end
|
|
execute 'chef-service-kill' do
|
|
command 'taskkill /F /FI "SERVICES eq chef-client"'
|
|
action :nothing
|
|
end
|
|
|
|
ruby_block 'Omnibus Chef Update' do
|
|
block { true }
|
|
notifies :run, 'execute[chef-service-kill]', :immediately
|
|
notifies :run, 'execute[chef-move]', :immediately
|
|
notifies :run, 'execute[chef-uninstall]', :immediately
|
|
notifies :run, 'execute[chef-install]', :immediately
|
|
notifies :start, 'service[chef-client-omnibus]', :immediately if node['omnibus_updater']['restart_chef_service']
|
|
not_if { chef_version == "Chef: #{version}\r\n" }
|
|
end
|
|
end
|
|
else
|
|
file '/tmp/nocheck' do
|
|
content 'conflict=nocheck\naction=nocheck'
|
|
only_if { node['os'] =~ /^solaris/ }
|
|
end
|
|
|
|
ruby_block 'omnibus chef killer' do
|
|
block do
|
|
Chef::Application.fatal!('New omnibus chef version installed. Killing Chef run!', node['omnibus_updater']['kill_chef_on_upgrade_exit_code'])
|
|
end
|
|
action :nothing
|
|
only_if { node['omnibus_updater']['kill_chef_on_upgrade'] }
|
|
end
|
|
|
|
execute "omnibus_install[#{File.basename(remote_path)}]" do # ~FC009
|
|
case File.extname(remote_path)
|
|
when '.deb'
|
|
command "dpkg -i #{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))}"
|
|
when '.rpm'
|
|
if node['platform'] == 'amazon'
|
|
command "rpm -e chef && rpm -Uvh --oldpackage #{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))}"
|
|
else
|
|
command "rpm -Uvh --oldpackage #{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))}"
|
|
end
|
|
when '.sh'
|
|
command "/bin/sh #{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))}"
|
|
when '.solaris'
|
|
command "pkgadd -n -d #{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))} -a /tmp/nocheck chef"
|
|
when '.dmg'
|
|
command <<-EOF
|
|
hdiutil detach "/Volumes/chef_software" >/dev/null 2>&1 || true
|
|
hdiutil attach "#{File.join(node['omnibus_updater']['cache_dir'], File.basename(remote_path))}" -mountpoint "/Volumes/chef_software"
|
|
cd / && /usr/sbin/installer -pkg `find "/Volumes/chef_software" -name \*.pkg` -target /
|
|
hdiutil detach "/Volumes/chef_software"
|
|
EOF
|
|
else
|
|
raise "Unknown package type encountered for install: #{File.extname(remote_path)}"
|
|
end
|
|
action :nothing
|
|
if node['omnibus_updater']['restart_chef_service']
|
|
notifies :restart, 'service[chef-client-omnibus]', :immediately
|
|
end
|
|
notifies :create, 'ruby_block[omnibus chef killer]', :immediately
|
|
end
|
|
|
|
ruby_block 'Omnibus Chef install notifier' do
|
|
block { true }
|
|
action :nothing
|
|
subscribes :create, "remote_file[omnibus_remote[#{File.basename(remote_path)}]]", :immediately
|
|
notifies :run, "execute[omnibus_install[#{File.basename(remote_path)}]]", :delayed
|
|
only_if { node['chef_packages']['chef']['version'] != node['omnibus_updater']['version'] }
|
|
end
|
|
end
|
|
|
|
include_recipe 'omnibus_updater::old_package_cleaner'
|