80 lines
3.1 KiB
Ruby
80 lines
3.1 KiB
Ruby
#
|
|
# Cookbook Name:: java
|
|
# Provider:: alternatives
|
|
#
|
|
# 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.
|
|
|
|
require 'chef/mixin/shell_out'
|
|
include Chef::Mixin::ShellOut
|
|
|
|
action :set do
|
|
if new_resource.bin_cmds
|
|
# I couldn't find a way to cleanly avoid repeating this variable declaration in both :set and :unset
|
|
alternatives_cmd = node['platform_family'] == 'rhel' ? 'alternatives' : 'update-alternatives'
|
|
new_resource.bin_cmds.each do |cmd|
|
|
|
|
bin_path = "/usr/bin/#{cmd}"
|
|
alt_path = "#{new_resource.java_location}/bin/#{cmd}"
|
|
priority = new_resource.priority
|
|
|
|
if !::File.exist?(alt_path)
|
|
Chef::Log.debug "Skipping setting alternative for #{cmd}. Command #{alt_path} does not exist."
|
|
next
|
|
end
|
|
|
|
# install the alternative if needed
|
|
alternative_exists = shell_out("#{alternatives_cmd} --display #{cmd} | grep #{alt_path}").exitstatus == 0
|
|
unless alternative_exists
|
|
description = "Add alternative for #{cmd}"
|
|
converge_by(description) do
|
|
Chef::Log.debug "Adding alternative for #{cmd}"
|
|
shell_out("rm /var/lib/alternatives/#{cmd}")
|
|
install_cmd = shell_out("#{alternatives_cmd} --install #{bin_path} #{cmd} #{alt_path} #{priority}")
|
|
unless install_cmd.exitstatus == 0
|
|
Chef::Application.fatal!(%Q[ set alternative failed ])
|
|
end
|
|
end
|
|
new_resource.updated_by_last_action(true)
|
|
end
|
|
|
|
# set the alternative if default
|
|
if new_resource.default
|
|
alternative_is_set = shell_out("#{alternatives_cmd} --display #{cmd} | grep \"link currently points to #{alt_path}\"").exitstatus == 0
|
|
unless alternative_is_set
|
|
description = "Set alternative for #{cmd}"
|
|
converge_by(description) do
|
|
Chef::Log.debug "Setting alternative for #{cmd}"
|
|
set_cmd = shell_out("#{alternatives_cmd} --set #{cmd} #{alt_path}")
|
|
unless set_cmd.exitstatus == 0
|
|
Chef::Application.fatal!(%Q[ set alternative failed ])
|
|
end
|
|
end
|
|
new_resource.updated_by_last_action(true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
action :unset do
|
|
# I couldn't find a way to cleanly avoid repeating this variable declaration in both :set and :unset
|
|
alternatives_cmd = node['platform_family'] == 'rhel' ? 'alternatives' : 'update-alternatives'
|
|
new_resource.bin_cmds.each do |cmd|
|
|
alt_path = "#{new_resource.java_location}/bin/#{cmd}"
|
|
cmd = shell_out("#{alternatives_cmd} --remove #{cmd} #{alt_path}")
|
|
if cmd.exitstatus == 0
|
|
new_resource.updated_by_last_action(true)
|
|
end
|
|
end
|
|
end
|