chef/cookbooks/redisio/providers/install.rb

94 lines
3.1 KiB
Ruby

action :run do
# Package install
if node['redisio']['package_install']
package_resource = package 'redisio_package_name' do
package_name node['redisio']['package_name']
version node['redisio']['version']
action :nothing
end
package_resource.run_action(:install)
new_resource.updated_by_last_action(true) if package_resource.updated_by_last_action?
# freeBSD does not support from source since ports does not support versioning (without a lot of hassle)
elsif platform_family?('freebsd')
raise 'Source install not supported for freebsd'
# Tarball install
else
@tarball = "#{new_resource.base_name}#{new_resource.version}.#{new_resource.artifact_type}"
unless current_resource.version == new_resource.version || (redis_exists? && new_resource.safe_install)
Chef::Log.info("Installing Redis #{new_resource.version} from source")
download
unpack
build
install
new_resource.updated_by_last_action(true)
end
end
end
def download
Chef::Log.info("Downloading redis tarball from #{new_resource.download_url}")
remote_file "#{new_resource.download_dir}/#{@tarball}" do
source new_resource.download_url
end
end
def unpack
install_dir = "#{new_resource.base_name}#{new_resource.version}"
case new_resource.artifact_type
when 'tar.gz', '.tgz'
execute %(cd #{new_resource.download_dir} ; mkdir -p '#{install_dir}' ; tar zxf '#{@tarball}' --strip-components=1 -C '#{install_dir}' --no-same-owner)
else
raise Chef::Exceptions::UnsupportedAction, "Current package type #{new_resource.artifact_type} is unsupported"
end
end
def build
execute "cd #{new_resource.download_dir}/#{new_resource.base_name}#{new_resource.version} && make clean && make"
end
def install
install_prefix = if new_resource.install_dir
"PREFIX=#{new_resource.install_dir}"
else
''
end
execute "cd #{new_resource.download_dir}/#{new_resource.base_name}#{new_resource.version} && make #{install_prefix} install"
new_resource.updated_by_last_action(true)
end
def redis_exists?
bin_path = if node['redisio']['install_dir']
::File.join(node['redisio']['install_dir'], 'bin')
else
node['redisio']['bin_path']
end
redis_server = ::File.join(bin_path, 'redis-server')
::File.exist?(redis_server)
end
def version
if redis_exists?
bin_path = if node['redisio']['install_dir']
::File.join(node['redisio']['install_dir'], 'bin')
else
node['redisio']['bin_path']
end
redis_server = ::File.join(bin_path, 'redis-server')
redis_version = Mixlib::ShellOut.new("#{redis_server} -v")
redis_version.run_command
version = redis_version.stdout[/version (\d*.\d*.\d*)/, 1] || redis_version.stdout[/v=(\d*.\d*.\d*)/, 1]
Chef::Log.info("The Redis server version is: #{version}")
return version.delete("\n")
end
nil
end
def load_current_resource
@current_resource = Chef::Resource.resource_for_node(:redisio_install, node).new(new_resource.name)
@current_resource.version(version)
@current_resource
end